深入理解hashcode和equals

一、hashcode详解

1、hashcode()用于返回字符串的哈希码,hashcode是用于查找使用的,equals用于比较两个对象是否相等使用的。

class Test{
    public static void main(String[] args){
        String str = new String("www.baidu.com");
        System.out.print("字符串的哈希吗为:" + str.hashcode());
    }
}

 2、hashcode()方法:返回字符串对象的哈希值。

public int hashcode();

3、hashcode主要用于查找的快捷性,是用来在散列存储结构中确定对象的存储地址,也就是对象在hash表中的位置,物理上可以说对象存放在内存中地址。

4、如果两个对象相同,也就是A.equals(B)方法,那么A,B的两个对象的hashcode一定是相同的。

5、如果对象的hashcode方法被重写,那么对象的hashcode方法也应该被重写,产生的对象,一定要和equals方法的使用的对象一致。

6、两个对象的hashcode()相同,并不一定equals方法的两个对象相同,只能说明这两个对象在散列的存储结构中,产生的对象并不相等。

7、为什么hashcode查找的更快呢?

     现在我们要在内存中存放1000个不一样的数。普通的方法就是存储一个数字,一般存储一个,遍历一遍,看看有没有相同的数。假如存储10000条不一样的数据的时候,就得各个遍历,时间复杂度非常大,效率低。
     现在我们使用hashcode来记录对象的位置,进行查找。

     哈希存储:假设hash表中有1,2,3,4,5,6,7个哈希存储位置,存储第一个数,hashcode为1,该数放在hash表中1的位置,存到1000个数时候,hash表中的7个位置可能有很多数字了。位置1中可能有200个数字,,当存储1001个数字时候,先查hashcode对象的位置,假设对应的位置为1,因为在hash表中的位置相同,哈希值相同,1001只需要比较表中200个数字是否相同即可,如果和200个数都不相同,则存放在1的这个位置,减少了查询的次数。也就是hashcode码相同,对应的对象不一定相同。

二、equals详解以及 hashcode和equals的联系

1、equals方法,equals的作用是判断两个对象是否相等,如果对象重写了equals方法,比较两个对象的内容是否相等。如果没有重写,比较两个对象的地址是否相同,等价于“==”。

2、“==”是判断两个地址是否相等,equals适合比较对象的内容是否相等,前提是不使用散列表容器,比如HashSet,HashTable,HashMap。

3、equals方法和hashcode的关系?

     ①在不创建类对应的散列表的时候,equals用来比较的是两个对象是否相等,所以现在和hashcode()是没有关系的

     ②创建类对应的散列表,比如创建了HashSet,HashTable,HashMap等等,在这种情况下:

               <1> 如果两个对象相等,那么他们的hashcode()值一定是相等的,这里的相等是通过equals比较两个对象返回的true.

               <2>如果两个对象的hashcode值相等,他们并不一定相等。因为在散列表中,hashcode()相等,即两个键值对的哈希值相等,然而哈希值相等并不一定得出键值对相等,此时会出现哈希冲突。

三、总结

      Java基础真的很重要。一个一个知识点的过,慢慢熟悉基础,熟悉底层原理。

      加油!坚持!

     

猜你喜欢

转载自blog.csdn.net/Sunshineoe/article/details/111505051