Java按照添加順序的集合幾種方法詳解
在 Java 中,若需要按照添加順序存儲(chǔ)和操作元素,有以下幾種數(shù)據(jù)結(jié)構(gòu)可供選擇。這些結(jié)構(gòu)在保留元素插入順序的同時(shí)提供了不同的功能特性。
1. 使用 ArrayList
特點(diǎn)
- 有序性:
ArrayList會(huì)按添加順序存儲(chǔ)元素。 - 允許重復(fù):可以存儲(chǔ)重復(fù)的元素。
- 隨機(jī)訪問:支持快速的按索引訪問操作,時(shí)間復(fù)雜度為 O(1)。
- 線程不安全:默認(rèn)情況下非線程安全,需手動(dòng)同步。
示例
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
特點(diǎn)
- 有序性:
LinkedList按照插入順序存儲(chǔ)元素。 - 允許重復(fù):支持重復(fù)的元素。
- 高效插入和刪除:在頭部或尾部插入、刪除操作時(shí)間復(fù)雜度為 O(1),但隨機(jī)訪問性能較差(時(shí)間復(fù)雜度 O(n))。
- 雙向鏈表實(shí)現(xiàn):支持隊(duì)列、棧等功能操作。
示例
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
特點(diǎn)
- 有序性:
LinkedHashSet會(huì)按照元素的插入順序存儲(chǔ)。 - 去重:不允許存儲(chǔ)重復(fù)元素。
- 底層實(shí)現(xiàn):基于
HashMap和雙向鏈表。 - 適用場(chǎng)景:需要保留插入順序,同時(shí)需要去重的場(chǎng)景。
示例
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"); // 重復(fù)元素將被忽略
System.out.println("LinkedHashSet: " + set); // 輸出: [Apple, Banana, Cherry]
}
}
4. 使用 LinkedHashMap
特點(diǎn)
- 有序性:
LinkedHashMap按照插入順序存儲(chǔ)鍵值對(duì)。 - 允許重復(fù)值:鍵不能重復(fù),但值可以重復(fù)。
- 快速訪問:支持通過鍵快速訪問值(時(shí)間復(fù)雜度為 O(1))。
- 底層實(shí)現(xiàn):基于
HashMap和雙向鏈表。 - 適用場(chǎng)景:需要保留鍵值對(duì)的插入順序。
示例
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 收集為有序集合
如果數(shù)據(jù)來源是無序的,例如 HashSet 或原始數(shù)組,Java 的 Stream API 提供了一種方式,將數(shù)據(jù)按插入順序轉(zhuǎn)換為有序集合。
示例:收集為 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. 各種數(shù)據(jù)結(jié)構(gòu)的性能對(duì)比
| 數(shù)據(jù)結(jié)構(gòu) | 插入順序 | 允許重復(fù) | 時(shí)間復(fù)雜度:插入 | 時(shí)間復(fù)雜度:查找 | 時(shí)間復(fù)雜度:刪除 | 備注 |
|---|---|---|---|---|---|---|
ArrayList | 保持插入順序 | 允許 | O(1)(尾部) | O(1)(按索引) | O(n)(中間元素) | 適合頻繁訪問,但插入刪除較慢 |
LinkedList | 保持插入順序 | 允許 | O(1)(頭/尾) | O(n)(隨機(jī)訪問) | O(1)(頭/尾) | 插入和刪除效率高,適合隊(duì)列場(chǎng)景 |
LinkedHashSet | 保持插入順序 | 不允許 | O(1) | O(1) | O(1) | 適合需要順序且去重的場(chǎng)景 |
LinkedHashMap | 保持插入順序 | 鍵不能重復(fù) | O(1) | O(1) | O(1) | 適合需要順序且鍵值對(duì)存儲(chǔ)的場(chǎng)景 |
Stream | 按數(shù)據(jù)源的順序處理 | 可控 | 與數(shù)據(jù)源有關(guān) | 與數(shù)據(jù)源有關(guān) | 與數(shù)據(jù)源有關(guān) | 靈活,但主要用于一次性操作 |
總結(jié)
在 Java 中,以下集合可以按添加順序存儲(chǔ)數(shù)據(jù):
ArrayList和LinkedList:適合需要頻繁增刪、按順序訪問的場(chǎng)景。LinkedHashSet和LinkedHashMap:適合需要順序存儲(chǔ)并去重或鍵值對(duì)操作的場(chǎng)景。Stream:用于一次性操作,將無序數(shù)據(jù)轉(zhuǎn)為有序集合。
根據(jù)實(shí)際需求,選擇適合的數(shù)據(jù)結(jié)構(gòu)以滿足性能和功能需求。例如,若需要保留插入順序且去重,選擇 LinkedHashSet;若需要高效隨機(jī)訪問,則選擇 ArrayList。
到此這篇關(guān)于Java按照添加順序的集合幾種方法的文章就介紹到這了,更多相關(guān)Java按照添加順序的集合內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
在CentOS7(有圖形化界面)上安裝maven和idea的詳細(xì)教程
這篇文章主要介紹了在CentOS7(有圖形化界面)上安裝maven和idea的詳細(xì)教程,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-03-03
SpringBoot2.x配置多數(shù)據(jù)源方式
這篇文章主要介紹了SpringBoot2.x配置多數(shù)據(jù)源方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-03-03
java實(shí)現(xiàn)客戶端向服務(wù)器發(fā)送文件
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)客戶端向服務(wù)器發(fā)送文件,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-01-01
SpringBoot整合Mail輕松實(shí)現(xiàn)郵件自動(dòng)推送功能
在項(xiàng)目中經(jīng)常會(huì)遇到SpringBoot推送消息的業(yè)務(wù),除了站內(nèi)推送通知,郵件推送也是一種常見的方式,本文小編就給大家介紹了SpringBoot整合Mail輕松實(shí)現(xiàn)郵件自動(dòng)推送功能,需要的朋友可以參考下2024-12-12
Java IO流體系繼承結(jié)構(gòu)圖_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要介紹了Java IO流體系繼承結(jié)構(gòu)圖,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2017-05-05
詳解ConcurrentHashMap如何保證線程安全及底層實(shí)現(xiàn)原理
這篇文章主要為大家介紹了ConcurrentHashMap如何保證線程安全及底層實(shí)現(xiàn)原理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-05-05

