在 java 中,若需要按照添加顺序存储和操作元素,有以下几种数据结构可供选择。这些结构在保留元素插入顺序的同时提供了不同的功能特性。
1. 使用 arraylist
特点
- 有序性:
arraylist会按添加顺序存储元素。 - 允许重复:可以存储重复的元素。
- 随机访问:支持快速的按索引访问操作,时间复杂度为 o(1)。
- 线程不安全:默认情况下非线程安全,需手动同步。
示例
import java.util.arraylist;
public class arraylistexample {
public static void main(string[] args) {
arraylist<string> list = new arraylist<>();
list.add("apple");
list.add("banana");
list.add("cherry");
system.out.println("arraylist: " + list); // 输出: [apple, banana, cherry]
}
}
2. 使用 linkedlist
特点
- 有序性:
linkedlist按照插入顺序存储元素。 - 允许重复:支持重复的元素。
- 高效插入和删除:在头部或尾部插入、删除操作时间复杂度为 o(1),但随机访问性能较差(时间复杂度 o(n))。
- 双向链表实现:支持队列、栈等功能操作。
示例
import java.util.linkedlist;
public class linkedlistexample {
public static void main(string[] args) {
linkedlist<string> list = new linkedlist<>();
list.add("apple");
list.add("banana");
list.add("cherry");
system.out.println("linkedlist: " + list); // 输出: [apple, banana, cherry]
}
}
3. 使用 linkedhashset
特点
- 有序性:
linkedhashset会按照元素的插入顺序存储。 - 去重:不允许存储重复元素。
- 底层实现:基于
hashmap和双向链表。 - 适用场景:需要保留插入顺序,同时需要去重的场景。
示例
import java.util.linkedhashset;
public class linkedhashsetexample {
public static void main(string[] args) {
linkedhashset<string> set = new linkedhashset<>();
set.add("apple");
set.add("banana");
set.add("cherry");
set.add("apple"); // 重复元素将被忽略
system.out.println("linkedhashset: " + set); // 输出: [apple, banana, cherry]
}
}
4. 使用 linkedhashmap
特点
- 有序性:
linkedhashmap按照插入顺序存储键值对。 - 允许重复值:键不能重复,但值可以重复。
- 快速访问:支持通过键快速访问值(时间复杂度为 o(1))。
- 底层实现:基于
hashmap和双向链表。 - 适用场景:需要保留键值对的插入顺序。
示例
import java.util.linkedhashmap;
public class linkedhashmapexample {
public static void main(string[] args) {
linkedhashmap<integer, string> map = new linkedhashmap<>();
map.put(1, "apple");
map.put(2, "banana");
map.put(3, "cherry");
system.out.println("linkedhashmap: " + map); // 输出: {1=apple, 2=banana, 3=cherry}
}
}
5. 使用 stream 收集为有序集合
如果数据来源是无序的,例如 hashset 或原始数组,java 的 stream api 提供了一种方式,将数据按插入顺序转换为有序集合。
示例:收集为 list
import java.util.arrays;
import java.util.list;
import java.util.stream.collectors;
public class streamorderedexample {
public static void main(string[] args) {
list<string> list = arrays.aslist("cherry", "apple", "banana");
list<string> orderedlist = list.stream()
.collect(collectors.tolist()); // 保持原始顺序
system.out.println("ordered list: " + orderedlist); // 输出: [cherry, apple, banana]
}
}
示例:收集为 linkedhashset
import java.util.arrays;
import java.util.linkedhashset;
import java.util.set;
import java.util.stream.collectors;
public class streamtoorderedset {
public static void main(string[] args) {
list<string> list = arrays.aslist("apple", "banana", "cherry", "apple");
set<string> orderedset = list.stream()
.collect(collectors.tocollection(linkedhashset::new));
system.out.println("ordered set: " + orderedset); // 输出: [apple, banana, cherry]
}
}
6. 各种数据结构的性能对比
| 数据结构 | 插入顺序 | 允许重复 | 时间复杂度:插入 | 时间复杂度:查找 | 时间复杂度:删除 | 备注 |
|---|---|---|---|---|---|---|
arraylist | 保持插入顺序 | 允许 | o(1)(尾部) | o(1)(按索引) | o(n)(中间元素) | 适合频繁访问,但插入删除较慢 |
linkedlist | 保持插入顺序 | 允许 | o(1)(头/尾) | o(n)(随机访问) | o(1)(头/尾) | 插入和删除效率高,适合队列场景 |
linkedhashset | 保持插入顺序 | 不允许 | o(1) | o(1) | o(1) | 适合需要顺序且去重的场景 |
linkedhashmap | 保持插入顺序 | 键不能重复 | o(1) | o(1) | o(1) | 适合需要顺序且键值对存储的场景 |
stream | 按数据源的顺序处理 | 可控 | 与数据源有关 | 与数据源有关 | 与数据源有关 | 灵活,但主要用于一次性操作 |
总结
在 java 中,以下集合可以按添加顺序存储数据:
arraylist和linkedlist:适合需要频繁增删、按顺序访问的场景。linkedhashset和linkedhashmap:适合需要顺序存储并去重或键值对操作的场景。stream:用于一次性操作,将无序数据转为有序集合。
根据实际需求,选择适合的数据结构以满足性能和功能需求。例如,若需要保留插入顺序且去重,选择 linkedhashset;若需要高效随机访问,则选择 arraylist。
到此这篇关于java按照添加顺序的集合几种方法的文章就介绍到这了,更多相关java按照添加顺序的集合内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论