== 和 equals 区别是什么?

== 介绍

对于基本数据类型来说,==比较的是
对于引用数据类型来说,==比较的是对象的内存地址


equals() 介绍

类没重写 equals()方法 :等价于通过==去比较这两个对象;
类重写了 equals()方法 :通常的做法是若两个对象的内容相等则返回true;否则返回fasle;


java对equals()的要求

1. 对称性:如果x.equals(y)返回是"true",那么y.equals(x)也应该返回是"true"2. 反射性:x.equals(x)必须返回是"true"3. 类推性:如果x.equals(y)返回是"true",而且y.equals(z)返回是"true",那么z.equals(x)也应该返回是"true"4. 一致性:如果x.equals(y)返回是"true",只要x和y内容一直不变,不管你重复x.equals(y)多少次,返回都是"true"5. 非空性:x.equals(null),永远返回是"false";x.equals(和x不同类型的对象)永远返回是"false"

==equals()的区别

==      的作用:主要判断两个对象是否为同一个对象
equals()的作用:主要判断两个对象内容是否相等

hashCode()介绍

(1)hashCode() 的作用 是获取哈希码/散列码哈希码/散列码是一个int整数)

(2)哈希码/散列码的作用 是确定该对象在哈希表中的索引的位置

哈希表存储的是键值对 (key-value);
原理是:散列表的本质是通过数组实现的,计算 key 得到的哈希码确定了 value在数组中的索引的位置,所以知道了 key 就可以取出来 value;
所以它的特点是: 能根据 key 快速的检索出对应的 value

(3)hashCode() 是Object的方法,所以Java中的任何类有hashCode() 函数。

(4)仅当创建某个类的散列表时,该类的hashCode() 才有用,其它情况下类的hashCode() 没有作用

原因是:由哈希码来确定该类的每一个对象在散列表中的位置,不创建散列表也不需要哈希吗,自然就用不上hashCode()
散列表指的是:Java集合中本质是散列表的类,如HashMap,HashTable,HashSet


hashCode() 和 equals() 的关系

(1)一个类不会被哈希表收集时

我们不会在HashSet, Hashtable, HashMap等等这些本质是哈希表的数据结构中用到该类。
例如,不会创建该类的HashSet集合。
在这种情况下,该类的“hashCode() 和 equals() ”没有半毛钱关系的!

(2)一个类会被哈希表收集时

我们会在HashSet, Hashtable, HashMap等等这些本质是哈希表的数据结构中用到该类。
例如,会创建该类的HashSet集合。
在这种情况下,该类的“hashCode() 和 equals() ”是有关系

如果两个对象相等,不仅通过equals()比较两个对象时返回true,而且它们的hashCode()值也要一定相同。 所以: 除了要重写equals()之外,也要重写hashCode()函数。 如果不重写hashCode()函数。equals()会无效。
原因:如果重写equals(),没有重写hashCode(),即使这两个对象通过equals()比较返回true,但是他们的hashCode不相等。哈希表表中元素存储索引的位置就是通过hashCode获取的哈希码决定的,因为哈希码不同所以他们都会存进哈希表中,所以equals()即使为true,这两个对象也不是相等的。


String的hashCode()计算方法

"abc"
h = h * 31 + 97-- - (0 * 31 + 97)
h = h * 31 + 98-- - (0 * 31 + 97) * 31 + 98
h = h * 31 + 99-- - ((0 * 31 + 97) * 31 + 98) * 31 + 99

HashSet中已经有1000个元素。当插入第1001个元素时,需要怎么处理?

(1) 将第1001个元素逐个的和前面1000个元素进行比较 效率低下!!
(2)当把对象加入 HashSet 时,HashSet 会先计算对象的 hashcode 值,如果没有相同的hashcode,HashSet会视为对象没有重复出现。 如果发现有相同 hashcode 值的对象,这时会调用equals()方法来检查内容是否相同。如果相同,HashSet 不会让其加入。如果不同的话,就会重新散列到其他位置。 这样我们就大大减少了 equals 的次数,相应就大大提高了执行速度。

如果两个对象相等,那么它们的hashCode()值一定要相同
如果两个对象hashCode()相等,它们并不一定相等,也有可能是哈希冲突

参考

==和 equals 的区别
Java hashCode() 和 equals()的若干问题解答

你可能感兴趣的:(基础知识,java)