您的位置:首页 > 编程语言 > Java开发

Java中==,equals(),hashCode()的区别

2018-03-09 11:09 337 查看

Java中==, equals(), hashCode()的区别?

一、Java中数据类型:

Java种数据类型分为基本数据类型和引用数据类型。基本数据类型:byte,short,char,int,float,double,long,boolean。引用类型:类,接口,数组


二、== 运算符

基本数据类型:应该使用==比较他们的值。引用类型:对于引用类型使用==进行比较,是比较它们在内存中存放的地址,如果两个引用指向的是同一个对象则为true,否则为false。

三、equals()方法

下面是Object中的equals源码:
public boolean equals(Object obj) {
return (this == obj);
}

equals和hashCode方法都是Object类中的方法。
对于引用类型使用equals方法比较,如果该类没有重写equals方法,equals方法是比较两个对象在内存中的地址。要是重写了equals方法,那么equals方法是比较两个对象的内容是否相等。String类重写了父类的方法。下面是String类中的equals方法源码:public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = count;
if (n == anotherString.count) {
char v1[] = value;
char v2[] = anotherString.value;
int i = offset;
int j = anotherString.offset;
while (n-- != 0) {
if (v1[i++] != v2[j++])
return false;
}
return true;
}
}
return false;

4000
}equals方法应该满足下面几个性质:自反性:即x.equals(x)为true。对称性:即x.equals(y) 和y.equals(x)的结果相同。传递性:即x.equals(y)等于true,y.equals(z)等于true,则x.equals(z)等于true。一致性:如果参与比较的对象没有任何改变,则对象比较的结果也不应该有任何改变。非空性:任何非空的引用x,x.equals(null)返回的是false。

四、hashCode

hashCode方法给对象生成一个int类型的hash码,用于散列集合中(HashSet,HashMap,HashTable)。如果重写了equals()方法也要重写equals方法。equals和hashCode的关系:   (a)如果两个对象equals相等,那么他们的hashCode也一定相等。   (b)如果两个对象equals不等,那么他们的hashCode可能相同也可能不同。   (c)如果两个对象hashCode相等,但是他们equals不一定相等   (d)如果两个对象的hashCode不等,那么他们equals一定不等。

五、Integer和int的比较

Integer是int的包装类,int的初始值为0,Integer的初始值为null.
package j2se;
/**
* @author kaichen
* */
public class TestInteger {

public static void main(String[] args) {
int i1 = 127;
Integer i2 = 127;
Integer i3 = new Integer(127);
Integer i4 = 127;

Integer i5 = 128;
Integer i6 = 128;
Integer i7 = new Integer(128);
System.out.println("i1==i2: "+(i1 == i2));//int 和Integer进行比较,Integer 会执行拆箱操作,转换成int
System.out.println("i1==i3: "+(i1 == i3));

System.out.println("i2==i3: "+(i2 == i3)); //由于i2和i3所指向的地址不同。

/*Integer i2 = 127,会将int型127包装成Integer类型,调用的是Integer。valueOf(),对于-128~127之间的数直接会进行缓存。下次之间从缓存中取*/
System.out.println("i2==i3: "+(i2 == i4));

System.out.println("i5==i6: "+(i5 == i6));
System.out.println("i5==i7: "+(i5 == i7));

}
}
结果:i1==i3: truei2==i3: falsei2==i3: truei5==i6: falsei5==i7: false
Integer的valueOf源码:
public static Integer valueOf(int i) {
if(i >= -128 && i <= IntegerCache.high)
return IntegerCache.cache[i + 128];
else
return new Integer(i);
}


总结:(1)Integer i = intValue 和 new Integer(intValue)一定不等。(2)Integer i1 = intValue 和Integer i2 = intValue.如果 intValue的值在-128~127之间则相等,否则不等。(3)两个都是new出来的,不等。(4)int和Integer相比一定相等,因为Integer会拆箱城int类型。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java基础