哈希表
哈希值
一个十进制的整数,由零碎随机给出(就是对象的地址值,是一个逻辑地址,模仿进去的地址,不是数据理论存储的物理地址)
Object类中的hashCode()办法能够获取哈希值
hashCode()源码:
public native int hashCode();
native:代表该办法调用的是本地操作系统的办法
toString()的源码:
外面就包含hashCode
public String toString() { return getClass().getName() + "@" + Integer.toHexString(hashCode()); }
String类也重写了hashCode()办法,如果两个字符串雷同时,返回的hash值也雷同
String str = new String("ssd2"); String str2 = new String("ssd2"); System.out.println(str.hashCode()); System.out.println(str2.hashCode());
例外:当字符串为 重地 与 通话 时,他们的hashCode返回值雷同
System.out.println("重地".hashCode()); System.out.println("通话".hashCode());
哈希表
无序,不容许反复,速度快
HashSet汇合存储数据的构造
在jdk1.8之前:哈希表 = 数组 + 链表
在jdk1.8之后:
哈希表 = 数组 + 链表哈希表 = 数组 + 红黑树(进步查问的速度)
数组构造:把元素进行了分组(雷同哈希值的元素是一组)
链表 / 红黑树结构:把雷同哈希值的元素连贯到一起
因为数组查问速度快,把雷同哈希值放入数组中,能够很快找到,这样便能够失去对应哈希值的数据。
1.存储数据到汇合中,先计算元素的哈希值
2.如果数组中哈希值对应的链表数据挂载超过八位,链表便会转成红黑树(为了进步查问的速度)
前提:存储的元素必须重写hashCode办法和equals办法。
HashSet存储自定义类型元素
LinkedHashSet
HashSet的子类
特点:
底层是一个哈希表(数组 + 链表 / 红黑树) + 链表
多了一条链表(记录元素的存储程序),保障元素有序
有序,不容许元素反复
LinkedHashSet<String> set1 = new LinkedHashSet<>(); set1.add("abc"); set1.add("aioehw"); set1.add("abc"); set1.add("dhf"); System.out.println(set1); //[abc, aioehw, dhf]