HashCode类型

特点:

//无序,不重复,无索引

 

        boolean r1 = s.add("aaa");
        boolean r2 = s.add("aaa");
        //输出布尔类型的值
        System.out.println(r1);//输出:ture
        System.out.println(r2); //输出:false,r1抢先添加了该元素,则第二次的添加失败
        System.out.println(s); //仅输出:[aaa]        

  两次添加的元素不能相同,而且即使添加了其他不同的元素,该类型集合输出元素的顺序随机

        boolean r1 = s.add("aaa");
        boolean r2 = s.add("bbb");
        boolean r3 = s.add("ccc");
        boolean r4 = s.add("ddd");

 /*s.forEach(new Consumer<String>() { //new这个没有名字的类的对象
            @Override
            public void accept(String str) {
                System.out.println(str); //全输出
            }
        });*/
        //Lambda表达式
        s.forEach(str->System.out.println(str)); //效果同上

  运行结果:

aaa
ccc
bbb
ddd

  如果创建了一个名叫“Student”的公开类并定义了两个私有变量、无参有参方法等。在另一个类中

Student s1 = new Student("李四",25);
        Student s2 = new Student("张三",24);

        //生成随机数值,没重写hashCode方法,不同对象计算出的哈希值是不同的
        //重写hasahCode方法后哈希值相同
        System.out.println(s1.hashCode());
        System.out.println(s2.hashCode());

  运行结果:

“26104877

24022544”

有个小概率事件:哈希碰撞

//哈希碰撞:小概率事件不同地址的哈希值相同
        System.out.println("abc".hashCode());
        System.out.println("acD".hashCode());

  此时运行输出:“96354  

         96354”

该类型集合特点:

//默认创建一个长度16,加载因子0.75的数组,数组名为:table
//根据元素哈希值与组长计算出应存入的位置,如果为null,则存入,如果有则equals方法比较属性值
//一样则不存,不同则存入,形成链表,新元素挂在老元素下面,形成链表 //当数据长度超过长度*加载因子时,则会扩容一倍长度,且当链表长度>8,数组>=64时,转换成红黑树

新建一个类,连接“Student”然后在新建的类里使用有参方法后建立一个接口,向里面添加元素

HashSet<Student> hs = new HashSet<>();

如果没有重写HasCode方法

在输出时会全部显示“ture”添加成功,如果重写HasCode方法则重复部分,后面的会显示“false”。输出全部元素时随机输出。

新建一个类,建立一个“LinkedHashSet”接口,并添加元素。

“LinkedHashSet”接口特点/*存取有顺序,不重复,无索引*/

该接口于上步区别在可以按顺序输出

 

posted @ 2024-07-11 11:11  昏睡的云雪  阅读(0)  评论(0编辑  收藏  举报