集合之Set【HashSet】

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 @ 2022-12-12 09:21  唯易人生  阅读(20)  评论(0)    收藏  举报