引言
Java集合框架为数据存储和操作提供了强大的工具。
本文主要介绍java常用集合的原理、优缺点、注意事项及使用示例。
正文
1.List
1.1. ArrayList
- 原理: 基于动态数组实现,支持快速随机访问。
- 优点: 随机访问速度快。
- 缺点: 插入和删除较慢,尤其在中间位置。
- 注意事项: 非线程安全。
示例:
import java.util.ArrayList;
import java.util.List;
public class ArrayListDemo {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("Apple");
list.add("Banana");
list.add("Orange");
for (String fruit : list) {
System.out.println(fruit);
}
}
}
1.2. LinkedList
- 原理: 基于双向链表实现。
- 优点: 插入和删除效率高。
- 缺点: 随机访问速度慢。
- 注意事项: 非线程安全。
示例:
import java.util.LinkedList;
import java.util.List;
public class LinkedListDemo {
public static void main(String[] args) {
List<String> list = new LinkedList<>();
list.add("Apple");
list.add("Banana");
list.add("Orange");
for (String fruit : list) {
System.out.println(fruit);
}
}
}
2. Set
2.1. HashSet
- 原理: 基于哈希表实现。
- 优点: 操作速度快。
- 缺点: 无序。
- 注意事项: 非线程安全。
示例:
import java.util.HashSet;
import java.util.Set;
public class HashSetDemo {
public static void main(String[] args) {
Set<String> set = new HashSet<>();
set.add("Apple");
set.add("Banana");
set.add("Orange");
for (String fruit : set) {
System.out.println(fruit);
}
}
}
2.2. TreeSet
- 原理: 基于红黑树实现。
- 优点: 元素有序。
- 缺点: 操作速度比
HashSet
慢。 - 注意事项: 非线程安全。
示例:
import java.util.Set;
import java.util.TreeSet;
public class TreeSetDemo {
public static void main(String[] args) {
Set<String> set = new TreeSet<>();
set.add("Apple");
set.add("Banana");
set.add("Orange");
for (String fruit : set) {
System.out.println(fruit);
}
}
}
3. Map
3.1. HashMap
- 原理: 基于哈希表实现。
- 优点: 操作速度快。
- 缺点: 无序。
- 注意事项: 非线程安全。
示例:
import java.util.HashMap;
import java.util.Map;
public class HashMapDemo {
public static void main(String[] args) {
Map<String, Integer> map = new HashMap<>();
map.put("Apple", 1);
map.put("Banana", 2);
map.put("Orange", 3);
for (Map.Entry<String, Integer> entry : map.entrySet()) {
System.out.println(entry.getKey() + ": " + entry.getValue());
}
}
}
3.2. TreeMap
- 原理: 基于红黑树实现。
- 优点: 键有序。
- 缺点: 操作速度比
HashMap
慢。 - 注意事项: 非线程安全。
示例:
import java.util.Map;
import java.util.TreeMap;
public class TreeMapDemo {
public static void main(String[] args) {
Map<String, Integer> map = new TreeMap<>();
map.put("Apple", 1);
map.put("Banana", 2);
map.put("Orange", 3);
for (Map.Entry<String, Integer> entry : map.entrySet()) {
System.out.println(entry.getKey() + ": " + entry.getValue());
}
}
}
注意事项总结
- 线程安全: 默认集合类不是线程安全的。在多线程环境中,考虑使用同步包装或并发集合类。
- 性能: 根据操作类型选择合适的集合类型。
- 顺序: 选择合适的集合类型以满足顺序需求(如插入顺序、有序等)。
二、线程安全
1. Vector
- 原理: 类似于
ArrayList
,但所有方法都被同步。 - 优点: 线程安全。
- 缺点: 相比
ArrayList
,性能较低,因为每个操作都需要获取锁。
示例:
import java.util.Vector;
public class VectorDemo {
public static void main(String[] args) {
Vector<String> vector = new Vector<>();
vector.add("Apple");
vector.add("Banana");
vector.add("Orange");
for (String fruit : vector) {
System.out.println(fruit);
}
}
}
2. Hashtable
- 原理: 类似于
HashMap
,但所有方法都被同步。 - 优点: 线程安全。
- 缺点: 相比
HashMap
,性能较低。
示例:
import java.util.Hashtable;
public class HashtableDemo {
public static void main(String[] args) {
Hashtable<String, Integer> table = new Hashtable<>();
table.put("Apple", 1);
table.put("Banana", 2);
table.put("Orange", 3);
for (String key : table.keySet()) {
System.out.println(key + ": " + table.get(key));
}
}
}
3. Collections.synchronizedList
/ synchronizedSet
/ synchronizedMap
- 原理: 使用
Collections
提供的静态方法包装集合,使其线程安全。 - 优点: 线程安全。
- 缺点: 每次访问集合时都需要同步,性能较低。
示例:
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class SynchronizedListDemo {
public static void main(String[] args) {
List<String> list = Collections.synchronizedList(new ArrayList<>());
list.add("Apple");
list.add("Banana");
list.add("Orange");
synchronized (list) {
for (String fruit : list) {
System.out.println(fruit);
}
}
}
}
4. ConcurrentHashMap
- 原理: 使用分段锁机制提高并发性能。
- 优点: 高效的线程安全。
- 缺点: 比
HashMap
复杂。
示例:
import java.util.concurrent.ConcurrentHashMap;
public class ConcurrentHashMapDemo {
public static void main(String[] args) {
ConcurrentHashMap<String, Integer> map = new ConcurrentHashMap<>();
map.put("Apple", 1);
map.put("Banana", 2);
map.put("Orange", 3);
for (String key : map.keySet()) {
System.out.println(key + ": " + map.get(key));
}
}
}
5. CopyOnWriteArrayList
/ CopyOnWriteArraySet
- 原理: 每次修改时复制整个底层数组。
- 优点: 适合读多写少的场景。
- 缺点: 写操作开销大。
示例:
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
public class CopyOnWriteArrayListDemo {
public static void main(String[] args) {
List<String> list = new CopyOnWriteArrayList<>();
list.add("Apple");
list.add("Banana");
list.add("Orange");
for (String fruit : list) {
System.out.println(fruit);
}
}
}
注意事项
- 性能: 在选择线程安全集合时,考虑读写操作的频率。
- 锁粒度: 使用更细粒度的锁(如
ConcurrentHashMap
)可以提高并发性能。 - 适用场景: 根据使用场景选择合适的线程安全集合。