java学习笔记(6)——哈希表

哈希表

哈希值
一个十进制的整数,由系统随机给出(就是对象的地址值,是一个逻辑地址模拟出来的地址不是数据实际存储的物理地址数组

Object类中的hashCode()方法能够获取哈希值
hashCode()源码:spa

public native int hashCode();

native:表明该方法调用的是本地操做系统的方法操作系统

toString()的源码:
里面就包括hashCodecode

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返回值相同blog

System.out.println("重地".hashCode());
        System.out.println("通话".hashCode());

哈希表

无序,不容许重复,速度快
HashSet集合存储数据的结构字符串

在jdk1.8以前:哈希表 = 数组 + 链表get

在jdk1.8以后:源码

哈希表 = 数组 + 链表
哈希表 = 数组 + 红黑树(提升查询的速度)

数组结构:把元素进行了分组(相同哈希值的元素是一组)
链表 / 红黑树结构:把相同哈希值的元素链接到一块儿hash

因为数组查询速度快,把相同哈希值放入数组中,能够很快找到,这样即可以获得对应哈希值的数据。

1.存储数据到集合中,先计算元素的哈希值
image.png

2.若是数组中哈希值对应的链表数据挂载超过八位,链表便会转成红黑树(为了提升查询的速度)
image.png

image.png
前提:存储的元素必须重写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]
相关文章
相关标签/搜索