集合归类总结

这一块东西较基础,但是零零碎碎的,所以想写一篇文章做个总结。其实可以归类总结,方便记忆。不然杂乱无章。

集合类分三个顶级接口:Set,List,Map,其中Set List 继承至Collection接口,Map为独立接口。

Set 元素唯一,无序;List 元素可重复,有序

 

Set下有HashSet,LinkedHashSet,TreeSet
List下有ArrayList,Vector,LinkedList
Map下有AbstractMap AbstractMap下 Hashtable,LinkedHashMap,HashMap,TreeMap

 

ArrayList优点: 底层数据结构是数组,查询快,增删慢。缺点: 线程不安全,效率
Vector优点: 底层数据结构是数组,查询快,增删慢。缺点: 线程安全,效率低
LinkedList优点: 底层数据结构是链表,查询慢,增删快。缺点: 线程不安全,效率高

 

HashSet

底层数据结构是哈希表。(无序,唯一)
如何来保证元素唯一性?
1.依赖两个方法:HashSet的构造方法其实就是在内部实例化了一个HashMap对象,通过hashCode()和equals()
如果hash码值相同,且equles判断相等,说明元素已经存在,不存;
如果hash码值相同,且equles判断不相等,说明元素不存在,存;

 

LinkedHashSet
底层数据结构是链表和哈希表。(FIFO插入有序,唯一)
1.由链表保证元素有序
2.由哈希表保证元素唯一

 

TreeSet
底层数据结构是红黑树。(唯一,有序)
1. 如何保证元素排序的呢?
自然排序
比较器排序
2.如何保证元素唯一性的呢?
根据比较的返回值是否是0来决定

 

线程安全的list:
synchronizedList,CopyOnWriteArrayList
CopyOnWriteArrayList是在执行修改操作时,copy一份新的数组进行相关的操作,在执行完修改操作后将原来集合指向新的集合来完成修改操作
synchronizedList线程安全的原因是因为它几乎在每个方法中都使用了synchronized同步锁。

 

为什么数组比链表查询速度更快?
数组由于是紧凑连续存储,可以随机访问,通过索引快速找到对应元素,而且相对节约存储空间。但正因为连续存储,内存空间必须一次性分配够,所以说数组如果要扩容,需要重新分配一块 更大的空间,再把数据全部复制过去,时间复杂度 O(N);而且你如果想在数组中间进行插入和删除,每次必须搬移后面的所有数据以保持连续,时间复杂度 O(N)。
链表因为元素不连续,而是靠指针指向下一个元素的位置,所以不存在数组的扩容问题;如果知道某一元素的前驱和后驱,操作指针即可删除该元素或者插入新元素,时间复杂度O(1)。但是 正因为存储空间不连续,你无法根据一个索引算出对应元素的地址,所以不能随机访问;而且由于每个元素必须存储指向前后元素位置的指针,会消耗相对更多的储存空间。

 

数组是怎么扩容的?

 

posted @   雪域飞魂  阅读(105)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· winform 绘制太阳,地球,月球 运作规律
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示