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