哈希值与HashSet集合存储数据的结构(哈希表)
HashSet集合存储数据的结构(哈希表)
什么是哈希表呢?
在JDK1.8之前,哈希表底层采用数组+链表实现,即使用链表处理冲突,同一hash值的链表都存储在一个链表里
但是当位于一个桶中的元素较多,即hash值相等的元素较多时,通过key值依次查找的效率较低。而JDK1.8中,哈
希表存储采用数组+链表+红黑树实现,当链表长度超过阈值(8)时,将链表转换为红黑树,这样大大减少了查找时间。
哈希表
在jdk1.8版本之前,哈希表=数组+链表结构
在jdk1.8版本之后,值得注意的是。哈希表也=数组+链表,但是呢哈希表还=数组+红黑树(提高查询的速度)
所以说哈希表的特点:查询速度快
因为是一个集合,所以我们先画一个容器
package Demo01Set; /* 哈希值:是一个十进制的整数,由系统随机给出(就是对象的地址值,是一个逻辑地址,是模拟出来得到地址,不是数据实际存储的物理地址在object类有一个方法,可以获取对象的哈希值 在Object类有一个方法,可以获取对象的哈希值 int hashCode()返回该对象的哈希码值 hashcode方法的源码: public native int hashcode( ); native:代表该方法调用的是本地操作系统的方法 */ public class HashCode_Demo02 { public static void main(String[] args) { //Person类继承了object类,所以可以使用object类的hashcode方法 Person person = new Person(); int i = person.hashCode(); System.out.println(i); Person person1 = new Person(); int i1 = person1.hashCode(); System.out.println(i1); /* toString 方法的源码 return getclass( ).getName( ) +“@” + Integer.toHexString( hashcode()); */ System.out.println(person);//Demo01Set.Person@1b6d3586 System.out.println(person1);//Demo01Set.Person@4554617c System.out.println(person==person1); /* String类的哈希值 string类重写obejct类的hashcode方法 */ String s1 = new String("abc"); String s2 = new String("abc"); System.out.println(s1.hashCode()); System.out.println(s2.hashCode()); System.out.println("重地:".hashCode()); System.out.println("通话:".hashCode()); } }
HashSet集合存储数据的结构(哈希表)jdk1.8版本之前:哈希表=数组+链表jdk1.8版本之后:
哈希表=数组+链表;
哈希表=数组+红黑树(提高查询的速度)
哈希表的特点:速度快