乐趣区

关于java:java学习笔记6哈希表

哈希表

哈希值
一个十进制的整数,由零碎随机给出(就是对象的地址值,是一个 逻辑地址 模仿进去的地址 不是 数据理论存储的 物理地址

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]
退出移动版