java集合详解
集合概念
对象的容器,实现了对对象的常用操作,类似数组功能。
区别:
数组长度固定,集合长度不固定
数组可以包含基本数据类型和对象,集合只能包含对象
数组可以直接访问元素,集合需要通过迭代器或别的方式访问
collection接口
List接口的特点:
有序、有下标、元素可重复
Set接口的特点:
无序、无下标、元素不能重复
Map是键值对集合:
键、值之间的音声。key无序唯一,value不要求有序,允许重复。
没有集成collection,给出键元素,就能返回值对象。
TreeMap、.HashMap、.HashTable、.LinkedHashMap、.ConcurrentHashMap
collection父接口
特点:代表一组任意类型的对象,无序、无下标、不能重复。
集合的遍历:
增强for
迭代器遍历(只能使用迭代器的删除方法)
stream API
迭代器:
hasNext() 存在下一个元素
next() 获取下一个元素
remove()删除当前元素
迭代器并发修改异常:
迭代器在迭代过程中不能使用collection的其它方法进行,可以使用迭代器remove方法删除
Collections和Collection的区别
Collection是ava集合框架中的一个接口,它是所有集合类的基础接口。它定义了一组通用的操作和方法,如添加、删除、遍历等,用于操作和管理一组对象。Collection接口有许多实现类,如List、Set和Queues等。
Collections(注意有一个s)是ava提供的一个工具类,位于java.util包中。它提供了一系列静态方法,用于对集合进行操作和算法。Collections类中的方法包括排序、查找、替换、反转、随机化等等。这些方法可以对实现了Collection接口的集合进行操作,如List和Set。
list接口与实现类
list接口使用
有序,有下标,元素可以重复 (有序可以使用for遍历)
除了集合都有的方法外,有特有的方法:
list中的iterator--列表迭代器
可以向前/向后遍历,添加或修改,删除元素
实现类
Arraylist
ArrayList扩容机制
创建ArrayList时可以指定容量;或者是默认的10;元素达到容量时,会触发扩容:
新建一个数组,容量是前一个的1.5倍
元素的复制,新元素的添加
原数组引用指向新数组
ArrayList的remove操作
时间复杂度O(n),删除元素后,后续元素会向前移动
ArrayList线程不安全,怎么变成线程安全
collections类的synchronizedList方法
CopyOnWriteArrayList类代替ArrayList
Vector替换
Vector
线程安全,运行效率相对较低
LinkedList
双向链表
泛型和工具类
set接口与实现类
hashset
treeset
comparable接口实现
map接口与实现类
hashmap,LinkedHashMao,TreeMap
线程安全的Map集合:Hashtable,ConcurrentHashMap
map快速遍历
for-each循环和entrySet方法
迭代器:
lamda表达式
streamAPI
HashMap HashTable ConcurrentHashMap区别
HashMap
HashMap扩容机制
创建时可以指定初始容量,默认是16
负载因子,默认是0.75
扩容机制:新容量默认是旧的两倍(减少计算操作,元素不用计算新的hashcode就能得到新位置)
遍历数组中所有的节点,重新插入到新数组中
使用新数组替换旧数组
解决hash冲突
链接法:使用链表或别的数据结构来存储冲突的键值对,存放在同一个哈希桶里
开放寻址法:再哈希表中找到另一个可用的位置来存储:线性探测,二次探测等
再哈希法:发生冲突时,使用另一个哈希函数再次计算键的哈希值
哈希桶扩容:哈希冲突过多时,可以动态扩大哈希桶数量
hashmap不是线程安全,hashtable线程安全
put过程
一般使用string作key
string对象不可变
hashmap和hashtable
HashTable实现
ConcurrentHashMap
实现
特性 | 细节 |
---|---|
结构 | 数组 + 链表 + 红黑树 |
锁机制 | CAS(无锁感知)+ 必要时同步锁 |
扩容策略 | 原子性扩容,利用CAS控制扩容竞争 |
冲突处理 | 链表转树(当碰撞链长到一定阈值时) |
线程安全 | 通过CAS和小粒度锁保证多线程安全 |
性能特点 | 高读多写少场景表现优异,避免全局锁隔离带来的瓶颈 |
主要使用机制
put操作: