從零開始學java--集合類(2)

集合類

目錄

集合類

Queue

隊列的使用:

雙端隊列(Deque)

Map和Set

概念:

模型:

Map

常見方法說明:

注意:

TreeMap和HashMap的區別:

Set

常見方法說明:

注意:

TreeSet和HashSet的區別:

Stream流

Collections工具類

常用方法:


Queue

隊列的使用:

在Java中,Queue是個接口,底層是通過鏈表實現的。 ?

方法功能

boolean add(E e)

入隊列(插入失敗會拋出異常)
boolean offer(E e)入隊列
E remove( )出隊列(隊列已經為空會拋出異常)
E poll( )出隊列
element( )獲取對頭元素(隊列已經為空會拋出異常)
peek( )獲取隊頭元素
int size( )獲取隊列中有效元素個數
boolean isEmpty()boolean isEmpty()

注意:Queue是個接口,在實例化時必須實例化LinkedList的對象,因為LinkedList實現了Queue接口。


雙端隊列(Deque)

雙端隊列(deque)是指允許兩端都可以進行入隊和出隊操作的隊列,deque 是 “double ended queue” 的簡稱。 那就說明元素可以從隊頭出隊和入隊,也可以從隊尾出隊和入隊。

雙端隊列既可以當做普通隊列使用,也可以當做棧來使用。

Deque是一個接口,使用時必須創建LinkedList的對象。


Map和Set

概念:

Map和set是一種專門用來進行搜索的容器或者數據結構,其搜索的效率與其具體的實例化子類有關。以前常見的搜索方式有:

  1. 直接遍歷,時間復雜度為O(N),元素如果比較多效率會非常慢
  2. 二分查找,時間復雜度為 ,但搜索前必須要求序列是有序的

上述排序比較適合靜態類型的查找,即一般不會對區間進行插入和刪除操作了,而現實中的查找比如:

  1. 根據姓名查詢考試成績
  2. 通訊錄,即根據姓名查詢聯系方式
  3. 不重復集合,即需要先搜索關鍵字是否已經在集合中

可能在查找時進行一些插入和刪除的操作,即動態查找,那上述兩種方式就不太適合了,本節介紹的Map和Set是一種適合動態查找的集合容器。

模型:

一般把搜索的數據稱為關鍵字(Key),和關鍵字對應的稱為值(Value),將其稱之為Key-value的鍵值對,所以模型會有兩種:

純 key 模型,比如:

  • 有一個英文詞典,快速查找一個單詞是否在詞典中
  • 快速查找某個名字在不在通訊錄中

Key-Value 模型,比如:

  • 統計文件中每個單詞出現的次數,統計結果是每個單詞都有與其對應的次數:<單詞,單詞出現的次數>
  • 梁山好漢的江湖綽號:每個好漢都有自己的江湖綽號

而Map中存儲的就是key-value的鍵值對,Set中只存儲了Key。


Map

Map是一個接口類,該類沒有繼承自Collection,該類中存儲的是結構的鍵值對,并且K一定是唯一的,不能重復。 ?

常見方法說明:

方法解釋
V get(Object key)返回 key 對應的 value
V getOrDefault(Object key, V defaultValue)返回 key 對應的 value,key 不存在,返回默認值
V put(K key, V value)設置 key 對應的 value
V remove(Object key)刪除 key 對應的映射關系
void putAll(Map<? extands K, ? extands V)將另一個Map中的所有鍵值對添加到當前Map中
void clear( )

清空整個Map

Set keySet()返回所有 key 的不重復集合
Collection values()返回所有 value 的可重復集合
Set<Map.Entry<K,V>> entrySet()返回所有的 key-value 映射關系
boolean containsKey(Object key)判斷是否包含 key
boolean containsValue(Object value)判斷是否包含 value

注意:

  1. Map是一個接口,不能直接實例化對象,如果要實例化對象只能實例化其實現類TreeMap或者HashMap
  2. Map中存放鍵值對的Key是唯一的,value是可以重復的
  3. 在TreeMap中插入鍵值對時,key不能為空,否則就會拋NullPointerException異常,value可以為空。但是HashMap的key和value都可以為空。
  4. Map中的Key可以全部分離出來,存儲到Set中來進行訪問(因為Key不能重復)。
  5. Map中的value可以全部分離出來,存儲在Collection的任何一個子集合中(value可能有重復)。
  6. Map中鍵值對的Key不能直接修改,value可以修改,如果要修改key,只能先將該key刪除掉,然后再來進行重新插入。

TreeMap和HashMap的區別:

Map底層結構TreeMapHashMap
底層結構紅黑樹哈希桶
插入/刪除/查找時間復雜度O(log2N)O(1)
是否有序關于Key有序無序
線程安全不安全不安全
插入/刪除/查找區別需要進行元素比較通過哈希函數計算哈希地址
比較與覆寫key必須能夠比較,否則會拋出ClassCastException異常自定義類型需要覆寫equals和hashCode方法
應用場景需要Key有序場景下Key是否有序不關心,需要更高的時間性能

LinkedHashMap按照插入順序遍歷

    public static void main(String[] args){Map<Integer,String> map=new HashMap<>();map.put(1,"小紅");map.put(2,"小明");map.forEach((k,v)->System.out.println(k+"="+v));Map<Integer,String>map1=new TreeMap<>((a,b)->b-a); //按倒序輸出map1.put(2,"m");map1.put(1,"j");map1.put(3,"a");map1.forEach((k1,v1)->System.out.println(k1+"="+v1));}
/*
1=小紅
2=小明
3=a
2=m
1=j
*/

Set

常見方法說明:

方法解釋
boolean add(E e)添加元素,但重復元素不會被添加成功
void clear()清空集合
boolean contains(Object o)判斷o是否在集合中
Iterator<E> iterator()返回迭代器
boolean remove(Object o)刪除集合中的o
int size()返回set中元素的個數
boolean isEmpty()檢測set是否為空,空返回true,否則返回false
Object[] toArray()將set中的元素轉換為數組返回
boolean containsAll(Collection<?> c)集合c中的元素是否在set中全部存在,是返回true,否則返回false
boolean addAll(Collection<?extends E>c)將集合c中的元素添加到set中,可以達到去重的效果

注意:

  1. Set是繼承自Collection的一個接口類
  2. Set中只存儲了key,并且要求key一定要唯一
  3. 不支持隨機訪問(不允許通過下標訪問)
  4. TreeSet的底層是使用Map來實現的,其使用key與Object的一個默認對象作為鍵值對插入到Map中的
  5. Set最大的功能就是對集合中的元素進行去重
  6. 實現Set接口的常用類有TreeSet和HashSet,還有一個LinkedHashSet,LinkedHashSet是在HashSet的基礎 上維護了一個雙向鏈表來記錄元素的插入次序。?
  7. Set中的Key不能修改,如果要修改,先將原來的刪除掉,然后再重新插入
  8. TreeSet中不能插入null的key,HashSet可以。

TreeSet和HashSet的區別:

Set底層結構TreeSetHashSet
底層結構紅黑樹哈希桶
插入/刪除/查找時間復雜度OO(1)
是否有序關于key有序不一定有序
線程安全不安全不安全
插入/刪除/查找區別按照紅黑樹的特性來進行插入和刪除

1、先計算key哈希地址

2、然后進行插入和刪除

比較與覆寫key必須能夠比較,否則會拋出ClassCastException異常自定義類型需要覆寫equals和hashCode方法
應用場景需要Key有序場景下Key是否有序不關心,需要更高的時間性能

Stream流

Java 8 API添加了一個新的抽象稱為流Stream,可以讓你以一種聲明的方式處理數據。Stream使用一種類似用SQL語句從數據庫查詢數據的直觀方式來提供一種對Java集合運算和表達的高階抽象。這種風格將要處理的元素集合看作一種流,流在管道中傳輸,并且可以在管道的節點上進行處理,比如篩選、排序、聚合等。

    public static void main(String[] args){List<String> list =new ArrayList<>(Arrays.asList("aaaa","Saaaa","Saaaa","xx","Xss","Lxxx"));//刪除長度不大于3的字符串//刪除首字母不為大寫的字母//去掉重復的字符串list=list.stream().filter(str ->str.length()>3) //保留的條件.filter(str ->str.charAt(0)>='A'&&str.charAt(0)<='Z').distinct()  //去重,用equals判斷.collect(Collectors.toList());System.out.println(list);List<Integer>collect=list.stream().map(String::length).collect(Collectors.toList());System.out.println(collect);}
//輸出[Saaaa, Lxxx]
//[5, 4]

不能認為每一步是直接依次執行的。Stream會先記錄每一步操作,而不是直接開始執行內容,當整個鏈式調用完成后,才會依次執行,也就是說需要的時候,工廠的機器才會按照預定的流程啟動。

生成隨機數:

    public static void main(String[] args){Random random=new Random();random.ints(-100,100).limit(10).filter(i -> i<0) //只保留小于0的數字.sorted()  //默認從小到大排序.forEach(System.out::println);}

Collections工具類

Arrays是一個用于操作數組的工具類

Collections類是專用于集合的工具類

常用方法:

    public static void main(String[] args){List list1=new ArrayList<>(Arrays.asList(1,4,5,2,9,0));//求最大值最小值Collections.max(list1);Collections.min(list1);//對集合進行二分搜索(注意:集合的具體類型必須是實現Comparable接口的類)Collections.sort(list1);System.out.println(Collections.binarySearch(list1,4));
//輸出3//對集合的元素進行快速填充,注意這個填充是對集合中的已有元素進行覆蓋//如果集合中本身沒有元素,那么fill操作不會生效Collections.fill(list1,0);System.out.println(list1);
//輸出[0, 0, 0, 0, 0, 0]//emptyXXX快速生成一個只讀的空集合List<Integer>list2=Collections.emptyList();//Collections.singletonList()會生成一個只有一個元素的Listlist2.add(10); //不支持,會直接拋出異常//將一個可修改的集合變成只讀的集合:List<Integer>list3=new ArrayList<>(Arrays.asList(1,3,3,24));List<Integer>newList=Collections.unmodifiableList(list3);newList.add(10); //不支持,會拋出異常//尋找子集合的位置System.out.println(Collections.indexOfSubList(list3,Arrays.asList(3,3)));
//輸出1}

由于泛型機制上的一些漏洞,實際上對應類型的集合類有可能會存放其他類型的值,泛型的檢查值存在于編譯階段,我們只要繞過這個階段,在實際運行時,并不會真的進行類型檢查,要解決這些問題就是在運行時進行類型檢查:

    public static void main(String[] args){List list1=new ArrayList<>(Arrays.asList(1,4,5,2,9,0));list1=Collections.checkedList(list1,Integer.class);list1.add("aaa");System.out.println(list1);}
//在輸出時會報錯

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/79621.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/79621.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/79621.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【HarmonyOS 5】鴻蒙發展歷程

【HarmonyOS 5】鴻蒙發展歷程 一、鴻蒙 HarmonyOS 版本年代記 鴻蒙 1.0&#xff1a; 2019 年 8 月 9 日&#xff0c;華為在開發者大會上正式發布鴻蒙 1.0 系統&#xff0c;這一版本首次應用于華為榮耀智慧屏產品中&#xff0c;標志著華為正式進軍操作系統領域。該版本初步展現…

SpringBoot教學管理平臺源碼設計開發

概述 基于SpringBoot框架開發的??教學管理平臺??完整項目&#xff0c;幫助開發者快速搭建在線教育平臺。該系統包含學生端、教師端和管理后臺&#xff0c;實現了課程管理、隨堂測試、作業提交等核心功能&#xff0c;是學習SpringBoot開發的優質案例。 主要內容 1. 系統架…

人工智能端側熱度再起

在科技浪潮洶涌澎湃的當下,人工智能端側正悄然掀起新一輪的熱度風暴。曾經,人工智能更多停留在概念層面,仿佛是遙不可及的未來幻想;而后,它逐漸落地,在特定領域嶄露頭角,卻也顯得有些曲高和寡。但如今,人工智能端側正以前所未有的態勢融入我們的生活,從智能手機的語音…

相同的數(簡單)

深度優先搜索 如果兩個二叉樹都為空&#xff0c;則兩個二叉樹相同。如果兩個二叉樹中有且只有一個為空&#xff0c;則兩個二叉樹一定不相同。 如果兩個二叉樹都不為空&#xff0c;那么首先判斷它們的根節點的值是否相同&#xff0c;若不相同則兩個二叉樹一定不同&#xff0c;…

網絡安全等級保護有關工作事項[2025]

公安部發布公網安〔2025〕1846號文件&#xff0c;關于對網絡安全等級保護有關共工作事項的進一步說明 一、備案相關問題 1、如何執行系統備案動態更新工作? 全面梳理與重新填報&#xff1a; 答復&#xff1a;運營者需**全面梳理已備案系統**的情況&#xff0c;對于已完成定…

c++類【發展】

類的靜態成員&#xff08;用static聲明的成員&#xff09;,在聲明之外用例單獨的語句進行初始化&#xff0c;初始化時&#xff0c;不再需要用static進行限定。在方法文件中初始化。以防重復。 特殊成員函數 復制構造函數&#xff1a; 當使用一個對象來初始化另一個對象…

寧德時代區塊鏈+數字孿生專利解析:去中心化身份認證重構產業安全底座

引言&#xff1a;當動力電池巨頭瞄準數字孿生安全 2025年5月6日&#xff0c;金融界披露寧德時代未來能源&#xff08;上海&#xff09;研究院與母公司寧德時代新能源科技股份有限公司聯合申請的一項關鍵專利——“身份驗證方法、系統、電子設備及存儲介質”。這項技術將區塊鏈…

cesium之自定義地圖與地圖疊加

在appvue中,cesium支持更換不同的地圖資源,代碼如下 <template><div id"cesiumContainer" ref"cesiumContainer"></div> </template><script setup> import * as Cesium from cesium; import "./Widgets/widgets.css&…

STL?string!!!

一、引言 在之前的文章中&#xff0c;我們一同學習了有關類和對象、模板、動態內存管理的相關知識&#xff0c;那么接下來一段時間我們將要趁熱打鐵&#xff0c;一起來手撕C庫中最重要的一個庫----STL中的一些容器&#xff0c;在手撕它們之前&#xff0c;我將先介紹一下對應的容…

低版本GUI配置SAProuter

1、注意配置SAProuter時&#xff0c;必須添加后面的/H/ 如&#xff1a;/H/sap.sapzx.cn/H/ 2、或者有時需要配置service文件&#xff08;C:\WINDOWS \system32\drivers\etc\service&#xff09; sapmsEP1 3600/tcp

springBoot中自定義一個validation注解,實現指定枚舉值校驗

緣由 在后臺寫接口的時候&#xff0c;經常會出現dto某個屬性是映射到一個枚舉的情況。有時候還會出現只能映射到枚舉類中部分枚舉值的情況。以前都是在service里面自行判斷&#xff0c;很多地方代碼冗余&#xff0c;所以就想著弄一個自定義的validation注解來實現。 例如下面某…

MySQL數據庫中篇

#作者&#xff1a;允砸兒 #日期&#xff1a;乙巳青蛇年 四月初九 筆者繼續帶朋友們了解mysql數據庫中篇的內容。多了不說&#xff0c;少了不嘮&#xff0c;咱們直接就開寫。 書接上回筆者在上篇中介紹了什么是數據庫和數據庫的一些基礎的概念&#xff0c;以及mysql數據庫的…

AI如何重塑DDoS防護行業?六大變革與未來展望

隨著AI技術的深度滲透&#xff0c;DDoS防護行業正經歷一場從“規則驅動”到“智能驅動”的范式革命。傳統依賴靜態閾值和人工規則的防御模式已難以應對新型攻擊&#xff0c;而AI的引入不僅提升了檢測精度&#xff0c;更重構了防護體系的底層邏輯。以下是AI帶來的六大核心變革及…

五一作業-day04

文章目錄 1. **ps -ef是顯示當前系統進程的命令,統計下當前系統一共有多少進程**2. **last命令用于顯示所用用戶最近1次登錄情況,awk可以取出某一列,現在要取出last命令第1列并去重統計次數**3. **secure日志是用戶的登錄日志,過濾出secure日志中的Failed password的次數(用課堂…

抽獎系統(基于Tkinter)

一、抽獎規則及使用方法 抽獎規則&#xff1a; 從1-138個號碼中隨機抽獎&#xff0c;共進行n輪抽獎&#xff0c;每個號碼僅有一次中獎機會&#xff0c;即已中獎的號碼不會再次中獎。 使用方法&#xff1a; 要求開始抽獎后屏幕上隨機滾動顯示中獎號碼&#xff0c;點擊“STOP”之…

window 系統 使用ollama + docker + deepseek R1+ Dify 搭建本地個人助手

1. 下載ollama &#xff0c;官網 下載地址&#xff1a;Download Ollama on macOS&#xff0c;選擇 Window 下載完成后&#xff0c;可在終端 使用 ollama --version 2. 下載 本地大模型&#xff0c;這里下載deepseek r1 7b 3.下載Embed模型 Embed模型 是文本工具向量化的核心工…

【學習筆記】 強化學習:實用方法論

作者選擇了由 Ian Goodfellow、Yoshua Bengio 和 Aaron Courville 三位大佬撰寫的《Deep Learning》(人工智能領域的經典教程&#xff0c;深度學習領域研究生必讀教材),開始深度學習領域學習&#xff0c;深入全面的理解深度學習的理論知識。 之前的文章參考下面的鏈接&#xf…

益鑫通汽車連接器可替代Molex,JST

# 探秘優質車規連接器 在汽車向新能源和智能化發展的進程中&#xff0c;車規連接器對汽車電子系統的穩定運行至關重要。有企業憑借技術與創新&#xff0c;在該領域表現出色。其車規連接器類型多樣&#xff0c;能滿足汽車不同系統連接需求。 一款2.54Pitch線對板連接器&#xff…

【WPF】將Bitmap圖像轉換為BitmapImage,并給Image控件顯示圖像

1.C#將Bitmap圖像轉換為BitmapImage&#xff0c;并給Image控件顯示圖像后臺實現 public void InitImage(Bitmap bitmap){try{// 將Bitmap轉換為WPF的BitmapImageBitmapImage bitmapImage;using (MemoryStream memory new MemoryStream()){bitmap.Save(memory, System.Drawing.…

Python從入門到高手8.2節-元組的常用操作符

目錄 ?8.2.1 元組的常用操作符 8.2.2 []操作符: 索引訪問元組 8.2.3 [:]操作符&#xff1a;元組的切片 8.2.4 操作符&#xff1a;元組的加法 8.2.5 *操作符&#xff1a;元組的乘法 8.2.6 元組的關系運算 8.2.7 in操作符&#xff1a;查找元素 8.2.8 五一她玩了個狗吃…