一、哈希值:由本地操作系统给出的一个随机十进制数值(就是对象的逻辑地址,是模拟出来的地址,不是实际物理地址),在object里面有一个方法hashCode(),可以返回哈希值。
二、hashCode方法源码:
public native int hashCode();
native:代表该方法调用的是本地操作系统的方法
三、哈希表的特点就是速度非常快,JDK1.8之后:
哈希表 = 数组 + 链表
哈希表 = 数组 + 红黑树(JDK1.8) =》
数组会将hash code相同的放在同一个数组位置,如果同一个哈希值数组下的元素超过8个,就会把链表转换成红黑树
四、有两个特殊字符的哈希值竟然相等:"重地"、“通话”
764977973
381259350
============================
cn.lwgk.Set05.HashCode02Person@2d98a335
cn.lwgk.Set05.HashCode02Person@16b98e56
==================================
字符st1:96354
字符st2:96354
==================================
重地:1179395
通话:1179395
public class HashCode02Person {
/*任何类都继承了object类,它包含了hashCode()、toString()等方法,因此可以重载*/
/*@Override
public int hashCode() {
System.out.println(1);
}*/
}
public class HashCode02 {
public static void main(String[] args) {
HashCode02Person p1 = new HashCode02Person();
HashCode02Person p2 = new HashCode02Person();
System.out.println(p1.hashCode());
System.out.println(p2.hashCode());
System.out.println("============================");
/*
* object类的toString就调用了hashCode方法,这里打印的是十六进制
* public String toString() {
return this.getClass().getName() + "@" + Integer.toHexString(this.hashCode());
}
* */
System.out.println(p1);
System.out.println(p2);
//字符串类重写了hashcode方法,而字符串内容相同在字符串池的地址就一样,所以hashCode值一样
System.out.println("==================================");
String st1 = "abc";
String st2 = "abc";
System.out.println("字符st1:" + st1.hashCode());
System.out.println("字符st2:" + st2.hashCode());
//有两个特殊的字符,它们的hashCode值竟然一样
System.out.println("==================================");
System.out.println("重地:" + "重地".hashCode());
System.out.println("通话:"+ "通话".hashCode());
}
}
输出:
764977973
381259350
============================
cn.lwgk.Set05.HashCode02Person@2d98a335
cn.lwgk.Set05.HashCode02Person@16b98e56
==================================
字符st1:96354
字符st2:96354
==================================
重地:1179395
通话:1179395