ArrayList常用于需要动态增减数据的场景,比如读取数据库查询结果时,结果集数量不确定。其自动扩容特性避免了数组手动扩容的麻烦。
作为内存缓存容器时,ArrayList的随机访问效率(O(1))比LinkedList更适合高频读取操作。例如电商系统中的商品分类列表缓存。
处理CSV文件或Excel导入时,ArrayList可临时存储解析后的数据记录。其toArray()方法便于后续批量插入数据库。
在Web应用的单个请求生命周期内,如Controller层接收前端传递的JSON数组数据,转换为ArrayList进行业务处理。
LinkedList基于双向链表实现,插入和删除操作的时间复杂度为O(1),但随机访问需要O(n)时间。与ArrayList相比,更适合频繁修改的场景,但空间开销更大。
需要频繁在列表中间进行添加或删除元素时,LinkedList性能优势明显。例如实现撤销操作的历史记录功能,每次操作都需在特定位置插入新记录。
LinkedList history = new LinkedList();
history.addFirst("Action 1"); // 添加到头部
history.addLast("Action 2"); // 添加到尾部
history.removeFirst(); // 移除头部元素
LinkedList实现了Deque接口,可以作为普通队列或双端队列使用。这在任务调度、消息处理等场景非常实用。
Deque queue = new LinkedList();
queue.offer(1); // 入队
queue.poll(); // 出队
// 作为双端队列使用
queue.offerFirst(0); // 头部插入
queue.offerLast(2); // 尾部插入
当内存碎片化严重或需要节省连续内存空间时,LinkedList的非连续存储特性更具优势。每个元素独立存储,只需通过指针连接。
结合HashMap和LinkedList可以实现高效的LRU缓存。LinkedList维护访问顺序,HashMap提供快速查找。
LinkedHashMap cache = new LinkedHashMap(16, 0.75f, true) {
protected boolean removeEldestEntry(Map.Entry eldest) {
return size() > MAX_SIZE;
}
};
处理超长列表时,LinkedList的迭代器可以配合分页机制逐块处理数据,避免一次性加载全部数据导致内存溢出。
Iterator iterator = bigList.iterator();
int batchSize = 1000;
while(iterator.hasNext()) {
List batch = new ArrayList(batchSize);
for(int i=0; i
HashSet常用于缓存系统中快速判断元素是否已存在。例如在用户行为分析中,避免重复记录相同操作。其O(1)时间复杂度的contains()方法比遍历列表更高效。
Set userActions = new HashSet();
if (!userActions.contains(actionId)) {
userActions.add(actionId);
// 记录新行为
}
处理批量数据时用于快速剔除重复项。比如从数据库查询结果中提取唯一值,或合并多个列表时自动去重。相比手动比较,HashSet能显著减少代码量。
List rawData = Arrays.asList(1,2,2,3);
Set uniqueData = new HashSet(rawData); // 自动去重
用于快速判断集合关系,如检测两个数据集的交集、并集或差集。通过retainAll()/addAll()等方法,可以高效实现集合运算。
Set setA = new HashSet(Arrays.asList("a","b"));
Set setB = new HashSet(Arrays.asList("b","c"));
setA.retainAll(setB); // 取交集后setA=["b"]
在事务处理中临时存储唯一标识符,如订单号、会话ID等。利用HashSet的快速查找特性,能够立即验证标识是否已被使用。
在图算法中记录已访问节点,避免重复处理。相比列表查询,HashSet的contains()方法能在常数时间内完成节点存在性检查。
Set visited = new HashSet();
dfs(Node current) {
if (visited.contains(current)) return;
visited.add(current);
// 处理节点逻辑
}
LinkedHashSet 是 HashSet 的子类,底层基于 LinkedHashMap 实现。它保留了元素插入的顺序,同时具备 HashSet 的去重特性。LinkedHashSet 的迭代顺序与插入顺序一致,而普通 HashSet 的迭代顺序是不确定的。
(1)需要保持插入顺序的去重集合 当业务逻辑要求数据既要去重,又要保留原始插入顺序时,LinkedHashSet 是最佳选择。例如用户操作日志的记录,需要按时间顺序展示但避免重复记录。
(2)缓存最近访问的数据 实现 LRU(Least Recently Used)缓存时,LinkedHashSet 可以自然地维护访问顺序。结合重写 removeEldestEntry 方法,能够高效地淘汰最久未使用的数据。
LinkedHashSet cache = new LinkedHashSet(MAX_ENTRIES) {
@Override
protected boolean removeEldestEntry(Map.Entry eldest) {
return size() > MAX_ENTRIES;
}
};
(3)需要可预测迭代顺序的集合 某些场景下如生成测试用例或序列化数据时,需要保证每次运行时的元素顺序一致。LinkedHashSet 的有序特性比 HashSet 更适合这种需求。
(4)去重且保持原始顺序的数据处理 在处理文件行、数据库查询结果等数据流时,既要过滤重复项又要维持原始顺序。例如从多个数据源合并数据时:
LinkedHashSet mergedData = new LinkedHashSet();
mergedData.addAll(source1Data);
mergedData.addAll(source2Data); // 自动去重且保持添加顺序
TreeSet 是 Java 中基于 TreeMap 实现的有序集合,底层使用红黑树数据结构存储元素。其核心特性包括:
自动排序:元素默认按自然顺序(Comparable)或自定义比较器(Comparator)排序。
去重:不允许重复元素。
高效操作:插入、删除、查找的时间复杂度为 O(log n)。
适用于需要维护元素顺序并避免重复的场景,例如存储用户积分排行榜:
TreeSet scores = new TreeSet();
scores.add(95);
scores.add(80);
scores.add(100); // 自动排序为 [80, 95, 100]
利用 subSet()、headSet()、tailSet() 方法快速获取子集:
TreeSet numbers = new TreeSet(Arrays.asList(1, 3, 5, 7, 9));
// 获取 [3, 7) 范围内的元素
SortedSet subset = numbers.subSet(3, 7); // 结果为 [3, 5]
通过 first() 和 last() 方法直接访问首尾元素:
TreeSet names = new TreeSet(Arrays.asList("Alice", "Bob", "Zoe"));
String first = names.first(); // "Alice"
String last = names.last(); // "Zoe"
通过 Comparator 实现灵活排序,例如按字符串长度排序:
TreeSet words = new TreeSet(
(a, b) -> a.length() - b.length()
);
words.add("apple");
words.add("banana");
words.add("cat"); // 顺序为 ["cat", "apple", "banana"]
适用于需要按时间顺序处理任务的场景,例如定时任务队列:
class Task implements Comparable {
LocalDateTime time;
String name;
// 按时间排序
@Override
public int compareTo(Task o) {
return this.time.compareTo(o.time);
}
}
TreeSet schedule = new TreeSet();
schedule.add(new Task(LocalDateTime.now(), "Task1"));
```
参与评论
手机查看
返回顶部