集合之Set【HashSet】

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
package com.Lucky;
 
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
import java.util.function.Consumer;
 
/**
 * Set集合:  无序/不可重复/没有索引
 *
 *    HashSet:
 *             底层采用【哈希表】存储结构
 *             JDK8之前:哈希表由数组+链表组成
 *             JDK8之后:哈希表由数组+链表+红黑树组成
 *
 */
 
/**
 *     哈希值:
 *           1.对象的整数形式
 *           没有重写hashCode方法,不同对象计算的哈希值也是不同的
 *           重写了hashCode方法,但是不同对象的属性值相同,计算出来的哈希值也是一样的
 *          注意点:哈希碰撞
 */
public class HashSetDemo {
    public static void main(String[] args) {
        //创建Set集合
        Set<String> set1=new HashSet<>();
        set1.add("唯易人生");   //返回的结果是booleam类型
        set1.add("YYDS");
        set1.add("什么鬼???");
        set1.add("什么鬼???");   //false  重复的数据无法添加
 
 
 
        //遍历获取数据
           /*
           1.迭代器遍历
            */
        System.out.println("-------- 1.迭代器遍历--------------");
        Iterator<String> it = set1.iterator();
        while (it.hasNext()){
            System.out.println(it.next());
        }
 
         
         /*
           2.增强for循环遍历
            */
        System.out.println("---------2.增强for循环遍历---------------");
        for (String s : set1) {
            System.out.println(s);
        }
 
        /*
          3.lamda表达式遍历
          */
        System.out.println("---------3.lamda表达式遍历---------------");
        //匿名内部类重写
        set1.forEach(new Consumer<String>() {
            @Override
            public void accept(String s) {
                System.out.println(s);
            }
        });
        //lamda表达式
        set1.forEach(str->System.out.println(str));
 
  //////////////////////////////////////////////////////////////////
        System.out.println("****************** hashSet ************************");
        //创建TestDemo对象
        TestDemo Demo1=new TestDemo("唯易人生",22);
        TestDemo Demo2=new TestDemo("唯易人生",22);
 
        //此时已经重写了hashCode方法
        System.out.println(Demo1.hashCode());  //计算出来的哈希值一样
        System.out.println(Demo2.hashCode());
 
        //特殊情况【哈希碰撞】
        System.out.println("---------【哈希碰撞】-----------");
        System.out.println("abc".hashCode());
        System.out.println("acD".hashCode());
 
        int index=(10-1) & 80;
        System.out.println(index);
    }
}

  底层数据结构分析:

 

 

链表结构:

 

 红黑树结构:

 

 

 

posted @   唯易人生  阅读(16)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示