目录
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<>();
}
}