Java不同集合之间的区别
一、核心接口体系List接口实现类特性ArrayListLinkedListVector底层结构动态数组双向链表动态数组线程安全查询性能O(1) 快速O(n) 较慢O(1) 快速插入/删除尾部快O(1)中间慢O(n)两端快O(1)中间慢O(n)尾部快O(1)中间慢O(n)内存占用较小连续内存较大额外存储指针较小线程安全否否是synchronized扩容机制默认10扩容1.5倍无扩容概念默认10扩容2倍Set接口实现类特性HashSetLinkedHashSetTreeSet底层结构HashMapLinkedHashMapTreeMap红黑树有序性无序插入顺序自然顺序/自定义顺序null值允许一个null允许一个null不允许null性能O(1)O(1)略慢于HashSetO(log n)适用场景去重且不关心顺序去重且需保持插入顺序去重且需排序示例代码// 输出顺序不确定 SetString hashSet new HashSet(); hashSet.add(B); hashSet.add(A); hashSet.add(C); // 输出顺序: B, A, C SetString linkedHashSet new LinkedHashSet(); linkedHashSet.add(B); linkedHashSet.add(A); linkedHashSet.add(C); // 输出顺序: A, B, C (自然排序) SetString treeSet new TreeSet(); treeSet.add(B); treeSet.add(A); treeSet.add(C);Map接口实现类特性HashMapLinkedHashMapTreeMapHashtable底层结构数组链表红黑树HashMap 双向链表红黑树数组链表有序性无序插入顺序/访问顺序键排序无序null键值允许一个null键可以多个null值value)同HashMap不允许null键允许多个null值键值不允许null线程安全否否否是synchronized性能O(1)O(1)O(log n)O(1)扩容因子默认0.75/ 扩容0.75/2倍0.75/2倍无/不扩容0.75/2倍1扩容因子是哈希表在容量不足时触发扩容的阈值通常表示为当前元素数量 / 当前容量的比例。// HashMap 默认配置int DEFAULT_INITIAL_CAPACITY 16; // 初始容量float DEFAULT_LOAD_FACTOR 0.75f; // 扩容因子int threshold (int)(16 * 0.75) 12; // 扩容阈值// 当元素数量达到12时HashMap自动扩容到32// HashMap - 最常用 MapString, Integer hashMap new HashMap(); hashMap.put(A, 1); hashMap.get(A); // O(1) // LinkedHashMap - 保持顺序 MapString, Integer linkedHashMap new LinkedHashMap(); linkedHashMap.put(B, 2); linkedHashMap.put(A, 1); // 遍历顺序: B, A // TreeMap - 排序 MapString, Integer treeMap new TreeMap(); treeMap.put(B, 2); treeMap.put(A, 1); // 遍历顺序: A, BQueue/Deque实现类特性PriorityQueueArrayDequeLinkedList底层结构数组堆循环数组双向链表是否阻塞否否否排序优先级排序FIFO先进先出FIFO/LIFO容量限制无可指定初始容量无性能O(log n)入队出队O(1)两端操作O(1)两端操作// 优先级队列 - 按优先级排序 QueueInteger pq new PriorityQueue(); pq.offer(5); pq.offer(1); pq.offer(3); System.out.println(pq.poll()); // 输出 1 // ArrayDeque - 双端队列 DequeString deque new ArrayDeque(); deque.addFirst(A); deque.addLast(B); deque.pollFirst(); // 弹出头部并发集合java.util.concurrent集合用途特点ConcurrentHashMap并发Map分段锁/CAS高并发性能好CopyOnWriteArrayList读多写少场景写时复制读操作无锁ConcurrentLinkedQueue高并发队列非阻塞CAS实现BlockingQueue生产者-消费者模式一种通过缓冲区协调数据生产与消费的并发设计模式解决速度不匹配问题。支持阻塞操作二、选择指南需要顺序存储├── 是 → List│ ├── 需要快速随机访问→ ArrayList│ ├── 需要频繁插入删除→ LinkedList│ └── 需要线程安全→ Vector 或 CopyOnWriteArrayList└── 否 → Set/Map需要去重├── 是 → Set│ ├── 不关心顺序 → HashSet│ ├── 需要插入顺序 → LinkedHashSet│ └── 需要排序 → TreeSet└── 否 → Map├── 不关心顺序 → HashMap├── 需要插入/访问顺序 → LinkedHashMap├── 需要排序 → TreeMap└── 需要线程安全 → ConcurrentHashMap三、性能对比操作ArrayListLinkedListHashSetTreeSetHashMapTreeMap添加尾部添加O(1)⁺O(1)----头部添加O(n)O(1)----中间插入O(n)O(n)----普通添加--O(1)O(log n)O(1)O(log n)查找按下标O(1)O(n)----按元素O(n)O(n)O(1)O(log n)O(1)O(log n)删除尾部删除O(1)O(1)----头部删除O(n)O(1)----中间删除O(n)O(n)----按元素删除O(n)O(n)O(1)O(log n)O(1)O(log n)遍历O(n)O(n)O(n)O(n)O(n)O(n)说明⁺ArrayList尾部添加当容量足够时为O(1)需要扩容时为O(n)
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2448596.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!