Set集合、HashSet集合的底层原理

Set集合

注意:

1、Set要用到的常用方法,基本上就是Collection提供的

2、自己几乎没有额外新增一些常用功能

java 复制代码
package com.itheima.demo1hashset;

import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.Set;
import java.util.TreeSet;

public class SetDemo1 {
    //目标:认识set家族集合的特点
    public static void main(String[] args) {
        //创建一个Set集合。无序无重复无索引
        Set<String> set = new HashSet<>();//一行经典代码
        set.add("hello");
        set.add("world");
        set.add("java");
        set.add("hello");
        System.out.println(set);//[world, java, hello]

        System.out.println("=================================");

        //创建一个LinkedHashSet集合。有序无重复无索引
        Set<String> set2 = new LinkedHashSet<>();
        set2.add("hello");
        set2.add("world");
        set2.add("java");
        set2.add("hello");
        System.out.println(set2);//[hello, world, java]

        System.out.println("=================================");

        //创建一个TreeSet集合。排序(按照升序排序),不重复,无索引
        Set<Double> set3 = new TreeSet<>();
        set3.add(1.0);
        set3.add(1.2);
        set3.add(1.5);
        set3.add(1.0);
        System.out.println(set3);//[1.0, 1.2, 1.5]
    }
}

HashSet集合的底层原理

哈希值:Java中每个对象都有一个哈希值,是一个int类型的随机值

java 复制代码
        System.out.println(set.hashCode());//215735942
        System.out.println(set2.hashCode());//215735942
        System.out.println(set3.hashCode());//-1935147008

1、添加一个新元素后开始第一步

2、哈希值相同但存的数据不一样的新元素与旧元素形成链表

3、存入的位置是通过哈希值计算出来的

4、新家的数据可能到数组前面,后加的数据可能在数组后面

5、只要数组中16(数组长度)*0.75(默认加载因子)=12的元素被占有,就会开始扩容成原来数组长度的2倍(32)

7、红黑树中 小的元素往左边走,大的元素往右边走

8、对象没有大小时比较哈希值大小存数据

9、红黑树本质也是一个链表

10、红黑树增删改查速度都很快,但是不能重复,不能索引,比较耗费内存


小结


相关推荐
学长毕业设计2 小时前
基于SpringBoot的公益基金管理系统(源码+文档+讲解视频)
java·spring boot·后端
东小西2 小时前
【SAA实战】第 3 篇 · 工具调用全攻略:把业务能力交给 Agent 自己调度
java·后端·spring
东小西3 小时前
【SAA实战】第 4 篇 · Agent 短期记忆:saver 让 Agent 跨轮记得住(threadId 隔离)
java·后端·spring
许彰午3 小时前
22-DataCenter报文序列化
java·低代码·架构·状态模式
2601_962065253 小时前
[MySQL] SQL优化之性能分析
java·sql·mysql
小范同学_3 小时前
JDK1.7 与 JDK1.8 HashMap 底层原理对比 + 数组并发扩容死循环详解
java·开发语言
予昊4 小时前
从零实现“在线五子棋对战“:WebSocket 实时通信 + 段位匹配
java·开发语言·网络·websocket
2601_962203514 小时前
【SpringAI入门】初识SpringAI
java
weixin_461408585 小时前
Mybatis-flex小记
java·开发语言·mybatis
2601_962177135 小时前
【MySQL篇】聚合查询,联合查询
android·java·mysql