哈希值与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版本之后:
哈希表=数组+链表;
哈希表=数组+红黑树(提高查询的速度)
哈希表的特点:速度快

 

posted @ 2022-07-06 17:35  zj勇敢飞,xx永相随  阅读(80)  评论(0编辑  收藏  举报