Java 集合
2024-03-18 11:51:33 0 举报
AI智能生成
Java集合是一组用于处理对象集合的类和接口,它们提供了一套完善的操作对象集合的机制。
作者其他创作
大纲/内容
定义
Java 集合, 也叫作容器,主要是由两大接口派生而来。
Collection接口
用于存放单一元素。
子接口
List、Set 和 Queue。
Map 接口
用于存放键值对。
List
List(对付顺序的好帮手):存储的元素是有序的、可重复的。
ArrayList:Object[] 数组,性能好,线程不安全。
LinkedList:双向链表,不常用,线程不安全。
CopyOnWriteArrayList:写时复制COW,Object[] 数组,线程安全。
Vector:Object[] 数组,JDK1.5之前使用,线程安全。
Stack:继承自 Vector,是一个后进先出的栈,JDK1.5之前使用,线程安全。
Set
Set(注重独一无二的性质):存储的元素不可重复的。
HashSet(无序,唯一):基于 HashMap,线程不安全 。
LinkedHashSet:HashSet 的子类,基于 LinkedHashMap,线程不安全 。
TreeSet(有序,唯一):红黑树(自平衡的排序二叉树),线程不安全。
Queue
Queue(实现排队功能的叫号机):按特定的排队规则来确定先后顺序,存储的元素是有序的、可重复的。
PriorityQueue:JDK1.5,二叉堆 + Object[] 数组来实现小顶堆,线程不安全。
ArrayDeque:JDK1.6,可扩容动态双向数组,基于可变长的数组和双指针来实现。
阻塞队列
BlockingQueue:阻塞队列,继承自 Queue。
ArrayBlockingQueue:JDK1.5,基于定长的数组,有界队列。创建时需指定容量,支持公平和非公平锁访问机制。
LinkedBlockingQueue:JDK1.5,基于单向链表,无界队列,近似无界。创建时指定容量或默认 Integer.MAX_VALUE,仅支持非公平锁访问机制。
PriorityBlockingQueue:支持优先级排序的无界阻塞队列。
SynchronousQueue:JDK1.6,同步队列,一个不存储元素的阻塞队列。
DelayQueue:JDK1.8,基于PriorityQueue,一个支持延迟获取元素的阻塞队列。
TransferQueue:JDK1.7,一个支持更多操作的阻塞队列。
阻塞队列就是典型的生产者-消费者模型,调用 put、take、offfer、poll 等 API 即可实现多线程之间的生产和消费。
Map
Map(用 key 来搜索的专家):使用键值对(key-value)存储,key 是无序的、不可重复的,value 是无序的、可重复的,每个键最多映射到一个值。
HashMap:数组 + 链表(红黑树)组成的,线程不安全。
LinkedHashMap
继承自 HashMap,增加了一条双向链表,线程不安全。
accessOrder:访问顺序,属于构造参数。
LRU 缓存
(Least Recently Used,最近最少使用) 缓存,确保当存放的元素超过容器容量时,将最近最少访问的元素移除。
accessOrder 设置为 true 并重写 removeEldestEntry 方法(移除规则)。
Hashtable:数组(Hashtable 的主体)+ 链表组成的,线程安全。
TreeMap:红黑树(自平衡的排序二叉树),线程不安全。
ConcurrentHashMap:分段的数组 + 链表(红黑树),线程安全。
复杂度
O(1) 常数< O(logn) 对数 < O(n) 线性 < O(n2) < O(n3) < O(2n) 指数
ArrayList
头插 O(n);尾插:容量未达极限 O(1),达到极限 O(n);指定插:O(n);
头删 O(n);尾删 O(1);指定删:O(n);
LinkedList
头插/删 O(1);尾插/删:O(1);指定插/删:O(n);
RandomAccess 接口
一个标记接口,用来表明实现该接口的类支持随机访问(即可以通过索引快速访问元素)。
由于 LinkedList 底层数据结构是链表,内存地址不连续,只能通过指针来定位,不支持随机快速访问,所以不能实现 RandomAccess 接口。
Comparable 和 Comparator
Java 中用于排序的接口,在实现类对象之间比较大小、排序等方面发挥了重要作用。
Comparable
java.lang 包,compareTo(Object obj) 方法用来排序。
方式
实现 Comparable 接口并重写 compareTo(Object obj) 方法。
Comparator
java.util 包,compare(Object obj1, Object obj2) 方法用来排序。
方式
new 一个 Comparator 比较器实例并重写其 compare(Object obj1, Object obj2) 方法。
Queue 与 Deque
Queue
单端队列,只能从一端插入元素,另一端删除元素,实现上一般遵循 先进先出(FIFO) 规则。
扩展了 Collection 的接口,因为容量问题而导致操作失败后处理方式的不同:一种在操作失败后会抛出异常,另一种则会返回特殊值。
Deque
双端队列,在队列的两端均可以插入或删除元素。
Deque 扩展了 Queue 的接口, 增加了在队首和队尾进行插入和删除的方法,失败处理方式与 Queue 相似。
Deque 还提供有 push() 和 pop() 等其他方法,可用于模拟栈。
注意事项
集合判空
使用 isEmpty() 方法,而不是 size()==0 的方式。
集合转 Map
toMap(),value为null,抛NPE。
集合遍历
不要在 foreach 循环里进行元素的 remove/add 操作。
remove 元素请使用 Iterator 方式,如果并发操作,需要对 Iterator 对象加锁。
集合去重
利用 Set 元素唯一的特性,避免使用 List 的 contains()。
集合转数组
toArray(T[] array)
数组转集合
Arrays.asList()
不能修改
手动实现工具类
new ArrayList<>(Arrays.asList("a", "b", "c"))
Java8 Stream
Arrays.stream(myArray).collect(Collectors.toList())
Guava
不可变
ImmutableList.of("string", "elements")、ImmutableList.copyOf(aStringArray)
可变
Lists.newArrayList("or", "string", "elements")
Apache Commons Collections
CollectionUtils.addAll(list, str)
Java9 List.of()
List<Integer> list = List.of(array)
Synchronized 性能问题
Synchronized 锁升级后,性能不再是问题。
0 条评论
下一页