Java 中 ==,equals,hashCode 的关系

1、==
1.判断两个数值类型是否相等
int a = 5;
int b =5;
if(a==b)  
2.判断对象是否相等
User user1 = new User();
User user2 = new User();
// 比较的是两个对象的内存地址
if(user1 == user2) 
2、Equals
//如果是字符串:
String str1 ="aaa";
String str2 ="aaa";
//判断两个字符串是否相等
str1.equals(str2) 
// 如果要比较两个对象,其实对比的就是内存地址
user1.equals(user2) 
Object 类中的方法:
public boolean equals(Object obj) {
    return (this == obj);
}
  • 如果两个对象相同,那么hashCode 一定是相同的
3、hashCode
  • 默认返回的是内存地址,但该方法的本意是散列。散列的话就必然涉及到在一定的空间中进行散列,所以hashcode方法一定是和集合配合使用的时候才用得到
  • 对象在空间散列化存储之后,其优势在于检索,如果散列算法处理得好,也就是能够保证对象在空间中尽可能均匀分布,则在检索时,一旦确定桶的方位(即下标值),就可以排除(n-1)/n的数据量,所有在大型数据集合中,hash之后的对象检索性能是非常高的。
 父类Object 类中的公共方法:
    /**
    
    Returns a hash code value for the object. This method is supported for the benefit of     hash tables such as those provided by java.util.HashMap. 
    */
    public int hashCode() {
        return identityHashCode(this);
    }
  • java中的HashMap集合的内部实现是数组+链表实现,即Node[]数组方式实现的。而Node的源代码如下:
static class Node<K,V> implements Map.Entry<K,V> {
    final int hash;
    final K key;
    V value;
    Node<K,V> next;
}
  • 可以看出,Entry就是数组中的元素,每个 Map.Entry 其实就是一个key-value对,它持有一个指向下一个元素的引用 next,这就构成了链表。


    HashMap 结构图
  • 简单来说,HashMap由数组+链表组成的,数组是HashMap的主体,链表则是主要为了解决哈希冲突而存在的,如果定位到的数组位置不含链表(当前entry的next指向null),那么对于查找,添加等操作很快,仅需一次寻址即可;如果定位到的数组包含链表,对于添加操作,其时间复杂度为O(n),首先遍历链表,存在即覆盖,否则新增;对于查找操作来讲,仍需遍历链表,然后通过key对象的equals方法逐一比对查找。所以,性能考虑,HashMap中的链表出现越少,性能才会越好。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容