集合专栏(待补充)

目录

Set系列集合:整体特点

一、HashSet集合的底层原理

1、HashSet集合中的哈希表结构是怎么存储数据的?        

2、哈希表扩容的条件是什么?

 二、LinkedHashSet集合

三、TreeSet集合

----------Map系列集合----------

一、Map系列集合:整体特点

二、Map系列集合:常用方法

三、Map系列集合:HashMap底层原理

四、Map系列集合:LinkedHashMap集合的原理

五、Map系列集合:TreeMap集合的原理

----------案例区----------

案例1:集合嵌套


Set系列集合:整体特点

Set<E>系列集合特点:------------------无序,不重复,无索引

HashSet<E>集合特点:-----------------无序,不重复,无索引

LinkedHashSet<E>集合特点:-------有序,不重复,无索引

TreeSet<E>集合特点:------------------排序,不重复,无索引



一、HashSet集合的底层原理

JDK8之前:数组+链表

JDK8开始:数组+链表+红黑树

1、HashSet集合中的哈希表结构是怎么存储数据的?

① 创建一个默认长度16的数组,默认加载因子为0.75,数组名table

② 使用元素的哈希值对数组的长度求余计算出应存入的位置

③ 判断当前位置是否为null,如果是null直接存入

④ 如果不为null,表示有元素,则调用equals方法比较是否相等:

有相等的元素,则不存;所有元素都不相等,则存入数组。

JDK 8之前,新元素存入数组,占老元素位置,老元素挂下面

JDK 8开始之后,新元素直接挂在老元素下面

⑤ 如果链表的长度达到8,数组的长度达到64,链表会转换为红黑树。

2、哈希表扩容的条件是什么?

当数组元素存储量达到 数组长度的 3/4 (0.75)时,数组会扩容为自身长度两倍。

这个过程中,元素会再次计算存放的位置。



 二、LinkedHashSet集合



三、TreeSet集合







----------Map系列集合----------

一、Map系列集合:整体特点

        Map集合称为双列集合(键值对集合)

格式为:{key1=value1,key2=value2,key3=value3,...},一次存入一对数据作为一个元素,在Map集合的所有键(key1,ke2,key3...)是不允许重复的,但值可以重复,键和值是一 一对应的,每一个键只能找到自己对应的值。

 



二、Map系列集合:常用方法



三、Map系列集合:HashMap底层原理

它是由一个键决定:无序,不重复,无索引。HashMap底层是哈希表结构的。

基于哈希表,增删改查的性能都较好。

提问:既然存在equals方法可以判断两个元素是否相同,那么hashCode方法存在的意义是什么?

      优化集合操作:在使用散列集合(如 HashSet 和 HashMap)进行添加、查找和删除操作时,hashCode() 方法可用于判断两个对象是否相等。在进行集合操作时,首先会调用对象的 hashCode() 方法来判断两个对象的哈希码是否相同,如果哈希码不同,则认为两个对象不相等,无需再调用 equals() 方法进一步比较;如果哈希码相同,再调用 equals() 方法进行深层比较来判断两个对象是否真正相等。这样可以减少不必要的 equals() 方法调用,提高集合操作的效率,我们叫做哈希加速。



四、Map系列集合:LinkedHashMap集合的原理

 



五、Map系列集合:TreeMap集合的原理

 






----------案例区----------

案例1:集合嵌套

 

import java.util.*;

/**
 * 目标:理解集合的嵌套。
 * 江苏省 = "南京市","扬州市","苏州市","无锡市","常州市"
 * 湖北省 = "武汉市","孝感市","十堰市","宜昌市","鄂州市"
 * 河北省 = "石家庄市","唐山市", "邢台市", "保定市", "张家口市"
 */
public class Test {
    public static void main(String[] args) {
        // 1、定义一个Map集合存储全部的省份信息,和其对应的城市信息。
        Map<String, Set<String>> map = new HashMap<>();

        //每个省的市用一个Set集合保存起来
        Set<String> cities1 = new HashSet<>();
        Collections.addAll(cities1, "南京市", "扬州市", "苏州市", "无锡市", "常州市");

        Set<String> cities2 = new HashSet<>();
        Collections.addAll(cities2, "武汉市", "孝感市", "十堰市", "宜昌市", "鄂州市");

        Set<String> cities3 = new HashSet<>();
        Collections.addAll(cities3, "石家庄市", "唐山市", "邢台市", "保定市", "张家口市");


        //将省市关联,放到Map集合中
        map.put("江苏省",cities1 );
        map.put("湖北省",cities2 );
        map.put("河北省",cities3 );


        //获取河北省的市

        Set<String> cities = map.get("河北省");
        for (String city : cities) {
            System.out.println("city = " + city);
        }


        //任何集合之间都可以进行嵌套

        //保存多个人的名字和身份证 Map<String,String>    键名字,值是身份证
        //保存多个部门,部门中的员工名字和身份证信息
        //  List   嵌套    Map<String,String>

        List<Map<String, String>> company = new ArrayList<>();



    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值