hashcode方法?是什么?
引用资源:https://www.jianshu.com/p/417a192125f6
概念:
Java的Object类中有一个hashCode()方法,并且是本地方法,返回一个int类型数值
对于包含容器类型的程序设计语言来说,基本上都会涉及到hashCode。在Java中也一样,hashCode方法的主要作用是为了配合基于散列的集合一起正常运行,这样的散列集合包括HashSet、HashMap以及HashTable。
分析:
举个列子:当向集合中插入对象时,如何判别在集合中是否已经存在该对象?(集合中不允许重复的元素存在)
大多数人会想到equals方法来逐个进行比较,这个方法确实可行。但是如果集合中已经存在一万条数据或者更多的数据,效率必然是一个问题。所以,hashCode作用就体现出来了,当集合要添加新的对象时,先调用这个对象的hashCode方法,得到相应的hashCode值,实际上HashMap的具体实现中会用一个table保存已经存进去的对象的hashCode值,如果table中没有这个hashCode值,就可以直接存进去,不用再进行任何比较了;如果存在该hashCode值,就调用它的equals方法与新元素进行比较,相同的话就不存了,不相同就散列其他的地址,所以这里存在一个冲突解决的问题,这样一来实际调用equals方法的次数就大大降低了,通俗来说,Java中的hashCode方法就是根据一定规则将与对象相关的信息(比如对象的存储地址,对象的字段等)映射成一个数值,这个数值称作为散列值。
实例:
DataString dataString1 = new DataString("woshi",20);
DataString dataString2 = new DataString("woshi",20);
System.out.println(dataString1.hashCode());
System.out.println(dataString2.hashCode());
输出:
460141958
1163157884
第一个例子:
其实很容易知道,两个不同的对象,散列值一般是不同的,记住,这里说的是一般不同!为什么?因为两个不同的对象是可能生成同一个散列值的!
也就是说我们不能通过hashcode来判断两个对象相等,但是却可以判断两个对象不等。
也就是如果两个对象散列值相等,那么也不一定是同一个对象,但是如果散列值不同,那么一定是两个不同的对象!
String strx = "OK";
StringBuffer str2 = new StringBuffer(strx);
String str3 = new String(strx);
StringBuilder str4 = new StringBuilder(strx);
System.out.println(strx.hashCode());
System.out.println(str2.hashCode());
System.out.println(str3.hashCode());
System.out.println(str4.hashCode());
输出:
2524
1956725890
2524
356573597
第二个例子:
大家肯定有疑问,为什么strx和str3的散列值是一样的!而str2,str4不一样,这就涉及到String中对hashcode的方法进行了改写,String类里的hashcode是根据字符串内容进行生成的,也就是内容相同,那么散列值就相同。
而StringBuffer则是调用的Object方法中的hashcode,所以自然hashcode不同了!至于为什么String改写了equals方法还要改写hashcode方法,还没有学习到,我的下一篇博客中应该会写这个!https://blog.csdn.net/weixin_44844089/article/details/103681519