==对于基本数据类型是比较值,引用数据类型比较地址是否相等;equals一般是比较对象的地址,但是具体分析,如integer里面的equal,就是用里面的基本数据类型int的值取比较的。
integer缓存机制:用 a=5,或者a =Integer.valueOf()触发缓存机制。(new Integer这种不生效)这样,生成的两个对象用==就相等了。
Integer a = new Integer(10);
Integer b = new Integer(10);
System.out.println(a== b); // 都是new,地址必然不同
System.out.println(a.equals(b)); // 比较的是5
Integer c = 10;
Integer d = Integer.valueOf(10);
System.out.println(c==d); // 缓存,所以是同一份引用
System.out.println(c.equals(d));// 都是10
用map时,hashCode() 用来确定存在哪一个桶里面。
假设我们用对象作为key。且两个对象,用equals是相等的,但是hashcode是不相等的。
那么会出现:在put时,这两个对象被放到了0和1两个位置,但map.get(0).equals(map.get(1))== true
,这和我们的认知相违背。既然这俩对象相等,那么就应该是同一个key。
所以为了解决,一般需要equals和hashcode同时重写。
-
equals相等,hashcode(通常是内存地址通过哈希函数映射成数字)一定一样;
-
hashcode一样(hash冲突时),euqlas不一定相等,因此,这两个一般需要同时重写。
简而言之:在基于哈希实现的容器里,如果想使用某个类,不仅需要定义它的hashCode()方法,还需要定义equals()方法。这两个方法一起使用,才能实现对哈希容器的正确查找