java中的 “==” 、“equals” 以及 hashCode都能起到比较的作用,那么它们的区别又是什么呢?
一、操作符 ==
如果是比较基本类型,如int,long等,它们的比较就是“值”的比较;如果是比较对象实例,那么比较的是它们两个所指向的对象在内存中的存储地址是否是一致的。而不是比较它们的内容。、
1.对基本类型使用操作符 ==
int类型的比较例子如下:
int x = 1;
int y = 1;
System.out.println(x == y);
输出结果:
true
2.对对象实例使用操作符 ==
对象比较例子如下:
(1)
Object obj1 = new Object();
Object obj2 = new Object();
System.out.println(obj1 == obj2);
输出结果:
false
解释:
在(1)new了两个内存对象,即分配了两个内存地址,当对比obj1和obj2的时候使用==判断,它们并不是指向相同的内存地址,所以得到的结果为false。
(2)
Object obj3 = new Object();
Object obj4 = obj3;
System.out.println(obj3 == obj4);
输出结果:
true
解释:
在(2)new了一个对象obj3,即分配了一个内存地址,然后又初始化了一个对象obj4指向这个内存地址,所以当使用==比较obj3和obj4的时候,它们是指向相同的内存地址的,所以得到的结果为true。
二、equals()方法
所有类中的equals()方法都是继承或者复写Object类的equals()方法的, 所以我们可以先看一下Object 类中的equals()方法:
可以看到,Object中的equals()里是使用==比较的,即比较俩个实例对象的引用地址是否一致。
注意:String类型的比较
根据上面的说法,大家可能会存在这么一个疑惑,那就是为什么使用String类型的对象时却能够比较里面的内容,如下:
String str1 = "str";
String str2 = "str";
System.out.println(str1.equals(str2));
输出结果:
true
如上结果,两个string对象str1和str2明显是指向不同的内存空间的,但是实际上结果是返回了true的。
别急,我们可以看看String类中的equals()方法的:
可以看到,String中的equals()方法是被复写的,先看是否指向同一个内存空间,如果不是的话就比较它们的内容是否一致。故如果内容一致而指向的内存空间不一致的话,依然是会返回true的。