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中的equals,hashcode和==的区别
- Java中hashCode和equals的区别
- Java 中的 ==, equals 与 hashCode 的区别与联系
- java equals和hashcode、==、的关系,使用区别详细
- hashcode,==,equals的区别与联系(JAVA)
- java中equals,hashcode和==的区别
- Java知识点<1> java中==和equals和hashCode的区别
- Java--hashcode,equals,==的区别
- Java中equals和==的区别,hashCode和equals的关系
- Java中==和equals的区别,equals和hashCode的区别
- java ==和equals、equals和hashCode的区别
- Java基础之hashCode()的作用,以及==、equals()和hashCode()区别
- [厉害了,我的JAVA基础](十一)hashCode与equals的区别与联系
- Java中equals、==、hashcode的区别
- java中的==、equals和hashCode区别
- [Java基础] HashCode、equals、==的区别
- java中equals,hashcode和==的区别
- Java中的 = 4000 =,equals方法,hashCode方法的区别
- 【java】hashCode与equals的区别与联系
- Java中==、equals、hashcode的区别与重写equals以及hashcode方法实例(转)