java集合
常用集合类
UML
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);
}
错误,为啥?
for(int i=0;i<list.size();i++){
if(list.get(i)==3) list.remove(i--);
}
正确,为啥?
for(int i=list.size()-1;i>=0;i--){
if(list.get(i)==3){
list.remove(i);
}
}
正确,为啥?
for(Integer i:list){
if(i==3) list.remove(i);
}
错误,??
Iterator<Integer> it=list.iterator();
while(it.hasNext()){
if(it.next()==3){
it.remove();
}
}
??
Iterator<Integer> it=list.iterator();
while(it.hasNext()){
Integer value=it.next();
if(value==3){
list.remove(value);
}
}
??
list.remove(2);
输出结果是什么?
Set
特点:无序,不重复
思考:如果对List容器中的元素去重?
遍历: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
线程不安全,最常用,速度快
内部采用数组来存放数据
基本原理
put执行过程
Table数组中的的Node
链表结构示意图
红黑树结构示意图
流程图中绿色标出的部分为JDK8新增的处理逻辑,目的是在Table[i]中的Node节点数量大于8时,通过红黑树提升查找速度。
HashTable
线程安全,不太常用
ConcurrentHashMap
线程安全,比HashTable性能高
TreeMap
key值按一定的顺序排序
添加或获取元素时性能较HashMap慢
因为需求维护内部的红黑树,用于保证key值的顺序
LinkedHashMap
继承HashMap
LinkedHashMap是有序的,且默认为插入顺序
当我们希望有顺序地去存储key-value时,就需要使用LinkedHashMap了
Map<String, String> linkedHashMap = new LinkedHashMap<>();
linkedHashMap.put("name1", "josan1");
linkedHashMap.put("name2", "josan2");
linkedHashMap.put("name3", "josan3");
Set<Entry<String, String>> set = linkedHashMap.entrySet();
Iterator<Entry<String, String>> iterator = set.iterator();
while(iterator.hasNext()) {
Entry entry = iterator.next();
String key = (String) entry.getKey();
String value = (String) entry.getValue();
System.out.println("key:" + key + ",value:" + value);
}
排序
java.lang.Comparable
java.util.Comparator
工具类
Collections
提供一组静态方法操作集合
Arrays
提供一组静态方法操作数组
jdk8:stream
介绍
jdk8添加的一个新的功能,称之为流,可以以声明的方式来处理数据,提供一种对 Java 集合运算的方便处理方式
让程序员写出高效率、干净、简洁的代码
特点
可以方便的对集合进行并行操作,便于使用多核资源
惰性求值
不是数据结构,不保存数据
不会修改原来的数据源,将操作后的数据保存到另一个对象中
操作
中间操作(Intermediate)
map (mapToInt, flatMap 等)、 filter、 distinct、 sorted、 peek、 skip、 parallel、 sequential、 unordered
最终操作(Terminal)
forEach、 forEachOrdered、 toArray、 reduce、 collect、 min、 max、 count、iterator
特点:
在一次聚合操作中,可以有多个Intermediate,但是有且只有一个Terminal
使用示例
filter
sorted
distinct
min,max,count
group
java集合(List集合、Set集合、Map集合)
于 2022-06-30 14:41:34 首次发布
