java集合框架
集合类图
List集合:
特点:元素有序,且可重复
遍历:下标,foreach,迭代器
扩容:
初始容量10,负载因子0.5,扩容增量0.5倍
新容量 = 原容量 + 原容量 * 0.5 , 如 ArrayList的容量为10,一次扩容后是容量为15
实现:
ArrayList
简单数据结构,超出容量自动扩容,动态数组
内部实现是基于基础的对象数组的
随机访问快
不适合随机增加或删除
线程不安全
LinkedList
LinkedList提供额外的get,remove,insert方法在LinkedList的首部或尾部
线程不安全
LinkedList可被用作堆栈(stack)【包括了push,pop方法】,队列(queue) 或双向队列(deque)
以双向链表实现,链表无容量限制,允许元素为null,线程不安全
适合做随机的增加或删除
Vector
线程安全
但行性能慢,不建议使用
CopyOnWriteArrayList
写时复制
线程安全
适合于读多,写少的场景
写时复制出一个新的数组,完成插入、修改或者移除操作后将新数 组赋值给array
比Vector性能高
最终一致性
实现了List接口,使用方式与ArrayList类似
ArrayList remove 的注意点
列举:
数据准备:为方便演示,需要有紧挨在一起的两个或多个相同的元素
List<Integer> list=new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add(3);
list.add(3);
list.add(4);
for(int i=0;i<list.size();i++){
if(list.get(i)==3) list.remove(i);//当他删除之后 我们的另一个三就会挤上去 所以输出的是 [1,2,3,4]
}
Set
特点:
无序,不重复
遍历:foreach
foreach,迭代器
扩容:
初始容量16,负载因子0.75,扩容增量1倍
实现: HashSet
它存储唯一元素并允许空值
依据对象的hashcode来确定该元素是否存在
由HashMap支持
不保持插入顺序
非线程安全
性能参数:初始容量,负载因子
默认值: 初始容量16,负载因子0.75
示例:new HashSet<>(20, 0.5f);
TreeSet
是一个包含有序的且没有重复元素的集合
作用是提供有序的Set集合,自然排序或者根据提供的Comparator进行排序
TreeSet是基于TreeMap实现的
Map
特点:
无序,键值对,键不能重复,值可以重复,
键重复则覆盖,没有继承Collection接口
扩容:初始容量16,负载因子0.75,扩容增量1倍
遍历:
先获取所有键的Set集合,再遍历(通过键获取值)
取出保存所有Entry的Set,再遍历此Set即可
实现:HashMap
线程不安全,最常用,速度快
内部采用数组来存放数据
基本原理
Table数组中的的Node