java学习——equals()和==的比较

equals 方法是 java.lang.Object 类的方法。

下面从两个方面来说明equals()和==的差别:
(1)对于字符串变量来说,使用“==”和“equals()”方法比较字符串时,其比较方法不同。
    “==”比较两个变量本身的值,即两个对象在内存中的首地址。
    “equals()”比较字符串中所包含的内容是否相同。

  【例子】    

String s1,s2,s3 = "abc", s4 ="abc" ;
s1 = new String("abc");
s2 = new String("abc");

s1==s2; //false,两个变量的内存地址不一样,也就是说它们指向的对象不 一样
s1.equals(s2);  //  true,两个变量所包含的内容是abc,故相等。
s1 == s3;  //false
s1.equals(s3); //true
s3 == s4; //true,字符串常量所生成的变量,存放于常量池中,故其中所存放的内存地址是相等的
s3.equals(s4);  //true

  【注意】

    在字符串构建中有个特殊字符串类型StringBuffer,StringBuffer类中没有重新定义equals这个方法,因此这个方法就来自Object类,
而Object类中的equals方法是用来比较“地址”的。所以会有如下情形出现:

StringBuffer s1 = new StringBuffer("a");

StringBuffer s2 = new StringBuffer("a");

 s1.equals(s2) //false

(2)对于非字符串变量来说,"=="和"equals"方法的作用是相同的都是用来比较其对象在堆内存的首地址,即用来比较两个引用变量是否指向同一个对象。

A obj1 = new A();
A obj2 = new A();
obj1==obj2; //false
obj1.equals(obj2); //false

A obj1 = new A();
obj2 = obj1;
obj1==obj2; //true
obj1.equals(obj2); //true

【总结】:

  1. equals方法对于字符串来说是比较内容的,而对于非字符串来说是比较其指向的对象是否相同的。

    == 比较符是比较指向的对象是否相同的,也就是对象在对内存中的的首地址。

  2. equals 方法是 java.lang.Object 类的方法,Object类中的equals方法是用来比较“地址”的,但是String类中重新定义了equals这个方法,而且比较的     是值,而不是地址。

  3. 如果是基本类型(byte, short, int, long, float, double, char,boolean)比较,那么只能用==来比较,不能用equals();

  4. 对于基本类型的包装类型,比如Boolean、Character、Byte、Shot、Integer、Long、Float、Double等的引用变量,==是比较地址的,而equals是     比较内容的。

  5. 注意一个基本的原则:在定义一个类的时候,如果涉及到对象的比较,应该重写equals()方法

重写equals()方法的一般规则:

a、先用“==”判断是否相等(是否指向同一对象)。

b、判断equals()方法的参数是否为null,如果为null,则返回false;因为当前对象不可能为null,如果为null,则不能调用其equals()方法,否则抛java.lang.NullPointerException异常。

c、当参数不为null,则如果两个对象的运行时类(通过getClass()获取)不相等,返回false,否则继续判断。

d、判断类的成员是否对应相等。往下就随意发挥了。

【例子】判断被比较对象user的username 属性和待比较对象的username相等:

    public class User {
        private String username;  

        @Override
        public boolean equals(Object obj){
            if(obj == null){
                return false;
            }else {
                    if(this.getClass() == obj.getClass()){
                            User u = (User) obj;
                            if(this.getUsername().equals(u.getUsername())){
                                return true;
                            }else{
                                return false;
                            }
                    }else{
                        return false;
                    }
            }
        }
    }  
时间: 2024-11-12 20:44:32

java学习——equals()和==的比较的相关文章

java学习-- equals和hashCode的关系

[JAVA编程]equals相等hashcode必然相等,反之不然 2018年03月28日 10:35:47 天路漫漫 阅读数:1786更多 个人分类: [JAVA] 1.equal()相等的两个对象他们的hashCode()肯定相等,也就是用equal()对比是绝对可靠. 2.hashCode()相等的两个对象他们的equal()不一定相等,就是hashCode()不是绝对可靠. hashCode是对象在内存地址通过hash算法得到的哈希码: 比较两个对象是否相等: 1.首先比较hashcod

java学习--equals()及其重写

/* String和String Buffer(在其保存) 类String中方法equals()--进行了重写和object类中的equal(); */ class A { public int i; public A(int i) { this.i=i; } public boolean equals(Object obj) //内容一样,内存不一样,返回true,重写(三重) { //obj为形参,指针, A aa=(A)obj; //父类调用子类特有的成员.先写需要aa=bb(先父类指向子

java学习中,object 对象的使用(toString、equals、hashCode)(java 学习中的小记录)

java学习中,object 对象的使用(java 学习中的小记录)作者:王可利(Star·星星) object 对象(参考API学习) 重点掌握三个方法: 1.toString 返回该对象的字符串表示. 2.equals(object obj)指示其他某个对象是否与这个对象相等. 3.hashCode() 返回对象的哈希码. 详见代码的注释分析(一个是Person类重写方法,一个是Star类使用方法) Star类代码: 1 package study; 2 3 public class sta

Java学习笔记3-操作符

Java基本操作符:+.-.*./.%.=.==.!=.+=.-=. 优先级:先乘除后加减,如果是连接符+号会优先往前匹配,比如 a+++++b,会被解释称 a++ ++ +b,所以会报错,需要自行使用括号隔离为 (a++) + (++b). 对象的引用如果赋值给了对象的引用后,2 个对象将指向同一个引用,有一个对象的引用重新赋值后将同时影响到另一个对象,比如 ClassName classA = new ClassName(); ClassName classB = new ClassName

Java学习-023-Properties 类 XML 配置文件读取及写入源代码

之前的几篇 Properties 文章已经讲述过了 Java 配置文件类 Properties 的基本用法,查看 JDK 的帮助文档时,也可看到在 Properties 类中还有两个方法 loadFromXML(InputStream) 和 storeToXml(OutputStream, String, String),由方法名中的 xml 不难确定这两个方法分别是读取/写入数据到 xml 文件.JDK 文档部分如下所示: 因而此文将通过源码实例演示 Properties 类是如何将数据写入

JAVA学习篇--JSTL基础

JSTL是什么 JSTL(JSP Standard TagLibrary,JSP标准标签库)是一个不断完善的开放源代码的JSP标签库. 为什么要用JSTL 我们JSP用于开发信息展现页非常方便;也可以嵌入java代码(scriptlet.表达式和声明)代码用来实现相关逻辑控制.看下面程序.但这样做会带来如下问题: jsp维护难度增加;出错提示不明确,不容易调试; 分工不明确;(即jsp开发者是美工,也是程序员); 最终增加程序的开发成本; <% if (session.getAttribute(

Java学习总结:飘逸的字符串

Java学习:飘逸的字符串 前言 相信不管我们运用Java语言来开发项目还是进行数据分析处理,都要运用到和字符串相关的处理方法.这个社会处处有着和字符串相关的影子:日志.文档.书籍等.既然我们离不开字符串,那么就来好好认识一下吧. 怎么构造一个字符串? 在Java语言里,有两种方法来创建一个字符串对象:一是用字符串直接量 1 String message=new String("Welcome to Java"); 2 String message2="Welcome to

java学习-关于字符串String

有必要总结记录一下java的学习,否则,永远只是记忆碎片化和always google(费时) 刚好,小伙伴给了一份自己做的review,在学习的过程中,update一下自己的见解和学习内容: 关于String: 1 package string_keywords; 2 /** 3 * 参考url: http://developer.51cto.com/art/201106/266454.htm 4 * 5 * 常量池(constant pool)指的是在编译期被确定,并被保存在已编译的.cla

Java学习-040-级联删除目录中的文件、目录

之前在写应用模块,进行单元测试编码的时候,居然脑洞大开居然创建了一个 N 层的目录,到后来删除测试结果目录的时候,才发现删除不了了,提示目录过长无法删除.网上找了一些方法,也找了一些粉碎机,都没能达到想要的结果,我就简写了一个小应用,用于删除自己脑洞大开创建的级联目录.此小应用没有代码注释,也没有进行容错处理,请大家知悉!哈哈哈哈哈.....若发现有错误,也请告知,我会去修改订正,非常感谢! 闲话少述,直接上码了! 1 /** 2 * Aaron.ffp Inc. 3 * Copyright (