265/266哈希值和HashSet集合储存数据的结构(哈希表)
哈希值
哈希值就是:对象的内存地址经过处理后的结构,由于每个对象的内存地址都不一样,所以哈希码也不一样。
更重要的是:这里的内存地址是JVM虚拟机虚拟出来的地址,并不是真实的物理内存地址。
哈希值是通过哈希算法散列得来的,而地址值是通过是和物理层面有关,
是系统分配的,是不存在相同的,而哈希值是可以通过强制手段设置为相同的(下面我们也会详细介绍怎么弄成相同的),
也就是说哈希值是一种逻辑上的确保唯一性,而地址值就是物理上确保唯一性。
public static void main(String[] args) {
//person类继承了Object类所以就可以使用Object类的hashcode方法
Person p1 = new Person();
int i1 = p1.hashCode();
System.out.println(i1);
Person p2 = new Person();
int i2 = p2.hashCode();
System.out.println(i2);
/**
* toString方法的源码
*/
System.out.println(p1);
System.out.println(p2);
} }
运行结果:

public class extends Object{
@Override
//重写hashset方法
public int hashCode(){
return 1;
/**
* String类的哈希值
* String类重写Object类的hashCode方法
*/
String s1 = new String("aaa");
String s2 = new String("bbb");
System.out.println(s1.hashCode());
System.out.println(s2.hashCode());
什么时哈希表
在DK1.8之前,哈希表底层采用数组+链表实现,即使用链表处理冲突,同hash值的链表都存储在一个链表里。
但是当位于一个桶中的元素较多,即hash值相等的元素较多时,通过key值依次查找的效率较低。
而DK1.8中,哈希表存储采用数组+链表+红黑树实现,当链表长度超过阈值(8)时
,将链表转换为红黑树,这样大大减少了查找时间
哈希值:是一个十进制的整数,由系统随机给岀(就是对彖的地址值,是一个逻辑地址,是模拟岀来得到地址,不是燚据实际存储的物理地址)
在 Object类有一个方法,可以获取对象的哈希值int hashcode()返回该对象的哈希码值。
int hashcode()返回该对象的哈希码值。
hashcode方法的源码:
public native int hashcode()
native:代表该方法调用的是本地操作系统的方法


浙公网安备 33010602011771号