java中“==”和equals有时候的确不是很好区分。
1、“==”号是比较数据在内存中的存储地址,针对基本数据类型的话,一般都是用“==”来比较,例如:
int a =5,b=7;
if(a==b)
2、如果是对类进行比较,用“==”的情况下,如果比较双方是指向同一个对象(也就是在内存中是同一个地址),这时才为true,否则为false,例如:
Person P1 = new Person("张三",20);
Person P2 = new Person("李四",20);
Person P3 = P1;
这种比较结果就很明了了,P1==P2为false,P1==P3为true,其实不是在比较a和b或者a和c,而是比较他们这个引用所指向的对象是不是同一个(在内存中存储的地址是否相同)。
对String的比较和上面类似。
3、equals的应用主要针对字符串比较多,也可以用于其他类之间的比较。大家比较了解的就是在字符串String上的应用了,String类重写了equals方法,从而在比较的时候只需根据字符串中的值是否相同来判断相不相等。例如:
String s1 = "abc";
String s2 = "abc";
String s3 = new String("abc");
s1==s2为true,s1==s3为flase,s1.equals(s3)为true。
4、"=="和equals在字符串上的区别已经是老生长谈的问题了,说说他们之间的关系,equals方法源自Object这个类,在Object中equals的判断依据也是使用“==”去判断的,只是很多Object的子类都重写了equals方法,从而有了不一样的实现方式。如果一个类没有重写equals方法,那么调用equals的时候,还是去比较它们在内存中的存储位置是否相同。
例如上面的Person
Person P1 = new Person("张三",20);
Person P2 = new Person("张三",20);
在未重写equals方法时,P1.equals(P2)为false的,我们可以重写其equals方法,判断姓名年龄一样时就确定为同一个人,从而让结果为true。
5、很多情况下我们自己定义的类也需要重写equals方法,这时需要注意的一点就是,很多时候是将hashcode方法一同重写,这样会很大程度上提高比较时候的效率。并且在将我们自定义类的对象存入与哈希值相关的集合(HashMap、HashSet)中时,就必须重写hashcode方法。因为这会影响到集合的一些操作,例如add。
|