【java 13天進階Day05】數據結構,List,Set ,TreeSet集合,Collections工具類

常見的數據結構種類

  1. 集合是基于數據結構做出來的,不同的集合底層會采用不同的數據結構。
  2. 不同的數據結構,功能和作用是不一樣的。
  3. 數據結構:
    • 數據結構指的是數據以什么方式組織在一起。
    • 不同的數據結構,增刪查的性能是不一樣的。
    • 不同的集合底層會采用不同的數據結構,我們要知道集合的底層是基于哪種數據結構存儲和操作數據的。這樣才能知道具體場景用哪種集合。
  4. Java常見的數據結構即數據存儲的常用結構:棧、隊列、數組、鏈表和紅黑樹。
  5. a.隊列(queue)
    • –先進先出,后進后出。
    • –場景:各種排隊。叫號系統。
    • –有很多集合可以實現隊列。
  6. b.棧(stack)
    • –后進先出,先進后出
    • – 壓棧==入棧
    • – 彈棧 == 出棧
    • –場景:手槍的彈夾。
  7. c.數組
    • –數組是內存中的連續存儲區域。
    • –分成若干等分的小區域(每個區域大小是一樣的)
    • –元素存在索引
    • –特點:查詢元素快(根據索引快速計算出元素的地址,然后立即去定位)
    • 增刪元素慢(創建新數組,遷移元素)
  8. d.鏈表
    • –元素不是內存中的連續區域存儲。
    • –元素是游離存儲的。每個元素會記錄下個元素的地址。
    • –特點:查詢元素慢。
    • 增刪元素快(針對于首尾元素,速度極快,一般是雙鏈表)。
  9. e.紅黑樹(待看)
    1.
    2. 二叉樹:binary tree永遠只有一個根節點**,是每個結點不超過2個節點的樹(tree) 。
    3. 查找二叉樹,排序二叉樹:小的左邊,大的右邊,但是可能樹很高,性能變差。
    4. 為了做排序和搜索會進行左旋和右旋實現平衡查找二叉樹,讓樹的高度差不大于
    1**。
    5. 紅黑樹(就是基于紅黑規則實現了自平衡的排序二叉樹):樹盡量的保證到了很矮小,但是又排好序了,性能最高的樹。
    6. 紅黑樹的增刪查改性能都好。

ArrayList集合

  • List集合繼承了Collection集合的全部功能,因為List集合多了索引,所以多了很多按照索引操作元素的功能。
  • ArrayList實現List集合底層基于數組存儲數據的,查詢快,增刪慢!
  • public void add(int index, E element):將指定的元素,添加到該集合中的指定位置上。
  • public E get(int index):返回集合中指定位置的元素。
  • public E remove(int index):移除列表中指定位置的元素,返回的是被移除的元素。
  • public E set(int index, E element):用指定元素替換集合中指定位置的元素,返回更新前的元素值。
  • 四種遍歷:多了for遍歷,因為有索引。
  • 使用多態List<String> lists = new ArrayList<>();

LinkedList集合
  • LinkedList也是List的實現類:底層是基于鏈表的,增刪比較快,查詢慢!!
  • LinkedList是支持雙鏈表,定位前后的元素是非常快的,增刪首尾的元素也是最快的。
  • public void addFirst(E e):將指定元素插入此列表的開頭。
  • public void addLast(E e):將指定元素添加到此列表的結尾。
  • public E getFirst():返回此列表的第一個元素。
  • public E getLast():返回此列表的最后一個元素。
  • public E removeFirst():移除并返回此列表的第一個元素。
  • public E removeLast():移除并返回此列表的最后一個元素。
  • public E pop():從此列表所表示的堆棧處彈出一個元素。
  • public void push(E e):將元素推入此列表所表示的堆棧。
  • 放棄多態,使用多態無法調用子類新功能LinkedList<String> linkList = new LinkedList<>();

Set系列集合
  • Set系列集合是基于哈希表存儲數據的,它的增刪改查的性能都很好。
  • 只有HashSet同父類Set一致都是無序,不重復,無索引的。
  • 使用多態Set<String> sets = new HashSet<>();
  • 兩個問題:
    • Set集合添加的元素是不重復的,是如何去重復的?
      • 對于有值特性的,Set集合可以直接判斷進行去重復。
      • 對于引用數據類型的類對象,Set集合是按照如下流程進行是否重復的判斷。
        1. Set集合會讓兩兩對象,先調用自己的hashCode()方法得到彼此的哈希值(所謂的內存地址)a1.hashCode());
        2. 然后比較兩個對象的哈希值是否相同,如果不相同則直接認為兩個對象不重復。
        3. 如果哈希值相同,會繼續讓兩個對象進行equals比較內容是否相同,如果相同認為真的重復了
          如果不相同認為不重復。
        4. 如果希望Set集合認為兩個對象只要內容一樣就重復了,必須重寫對象的hashCode和equals方法。這會使得相同內容的對象哈希值一致且equals比較內容相同。(直接生產即可)
    • Set集合元素無序的原因是什么?
      • 根本原因是因為底層采用了哈希表存儲元素。63%6=3
      • JDK 1.8之前:哈希表 = 數組 + 鏈表 + (哈希算法)
      • JDK 1.8之后:哈希表 = 數組 + 鏈表 + 紅黑樹 + (哈希算法)
      • 當鏈表長度超過閾值(8)時,將鏈表轉換為紅黑樹,這樣大大減少了查找時間。

LinkedHashSet
  • 是HashSet的子類,元素是**“有序”** 不重復,無索引。
  • LinkedHashSet底層依然是使用哈希表存儲元素的,但是每個元素都額外帶一個鏈來維護添加順序!!不光增刪查快,還有序。
  • 缺點是多了一個存儲順序的鏈會占內存空間!!而且不允許重復,無索引。
  • 總結:
    • 如果希望元素可以重復,又有索引,查詢要快用ArrayList集合。(用的最多)
    • 如果希望元素可以重復,又有索引,增刪要快要用LinkedList集合。(適合查詢元素比較少的情況,經常要首尾操作元素的情況)
    • 如果希望增刪改查都很快,但是元素不重復以及無序無索引,那么用HashSet集合。
    • 如果希望增刪改查都很快且有序,但是元素不重復以及無索引,那么用LinkedHashSet集合。

TreeSet集合
  • 不重復,無索引,按照大小默認升序排序!!
  • TreeSet集合稱為排序不重復集合,可以對元素進行默認的升序排序。
  • 使用多態,在Set基礎上基本無新增功能 Set<Double> scores = new TreeSet<>();
  • TreeSet集合自自排序的方式:
    • 1.有值特性的元素直接可以升序排序。(浮點型,整型)
    • 2.字符串類型的元素會按照首字符的編號排序。
    • 3.對于自定義的引用數據類型,TreeSet默認無法排序,執行的時候直接報錯,因為人家不知道排序規則。
  • 自定義的引用數據類型的排序實現:定制排序的大小規則
    • a.直接為對象的類實現比較器規則接口Comparable,重寫比較方法(拓展方式)。

      • 如果程序員認為比較者大于被比較者 返回正數。
      • 如果程序員認為比較者小于被比較者 返回負數。
      • 如果程序員認為比較者等于被比較者 返回0。
      • @Data
        public class Employee implements Comparable<Employee> {private String name;private double salary;private int age;// 重寫了比較方法。// e1.compareTo(o)// 比較者:this// 被比較者:o// 需求:按照年齡比較@Overridepublic int compareTo(Employee o) {// 規則:Java規則// 如果程序員認為比較者大于被比較者 返回正數!// 如果程序員認為比較者小于被比較者 返回負數!// 如果程序員認為比較者等于被比較者 返回0!
        //        if(this.age > o.age){
        //            return 1;
        //        }else if(this.age < o.age){
        //            return -1;
        //        }
        //        return 0;return this.age - o.age;}} 
        
    • b.直接為集合設置比較器Comparator對象,重寫比較方法。

      • 如果程序員認為比較者大于被比較者 返回正數。
      • 如果程序員認為比較者小于被比較者 返回負數。
      • 如果程序員認為比較者等于被比較者 返回0。
      • 使用匿名內部類 public TreeSet(Comparator<? super E> comparator)
      • Set<Employee> employees1 = new TreeSet<>(new Comparator<Employee>() {@Overridepublic int compare(Employee o1, Employee o2) {// o1比較者   o2被比較者// 如果程序員認為比較者大于被比較者 返回正數!// 如果程序員認為比較者小于被比較者 返回負數!// 如果程序員認為比較者等于被比較者 返回0!return o1.getAge() - o2.getAge();}});
        
  • 注意:如果類和集合都帶有比較規則,優先使用集合自帶的比較規則。

Collections工具類的使用

  • java.utils.Collections:是集合工具類
  • Collections并不屬于集合,是用來操作集合的工具類。
  • Collections有幾個常用的API:
    • -public static boolean addAll(Collection<? super T> c, T… elements):給集合對象批量添加元素!
      • List<String> names = new ArrayList<>();
      • Collections.addAll(names, "曹操", "小亮", "小王");
    • - public static void shuffle(List<?> list) :打亂集合順序,只能打亂有序的List集合。
    • - public static void sort(List list):將集合中元素按照默認規則排序,默認升序。
    • - public static void sort(List list,Comparator<? super T> ):將集合中元素按照指定規則排序。
  • Set是哈希算法存儲的,無法為其排序和升序。
  • 引用數據類型的排序
    • 字符串按照首字符的編號升序排序!
    • 自定義類型的比較方法API
      • - public static void sort(List list):
        • 將集合中元素按照默認規則排序。對于自定義的引用類型的排序人家根本不知道怎么排,直接報錯!
        • 如果希望自定義的引用類型排序不報錯,可以給類提供比較規則:Comparable。
      • - public static void sort(List list,Comparator<? super T>
        • 將集合中元素按照指定規則排序,自帶比較器
        • //方式1 自定義比較器
          Collections.sort(oranges1, new Comparator<Orange>() {@Overridepublic int compare(Orange o1, Orange o2) {if (o1.getWeight() > o2.getWeight()) return -1;if (o1.getWeight() < o2.getWeight()) return 1;return 0;}});
          
        • //方式2 類實現Comparable接口
          @Data
          public class Orange implements Comparable {private String name;private double weight;private String price;@Overridepublic int compareTo(Object o) {Orange o2 = (Orange) o;if (this.weight > o2.weight) return 1;if (this.weight < o2.weight) return -1;return 0;}
          }
          
        • 注意:如果類有比較規則,而sort有比較器,優先使用比較器。

可變參數

  • 可變參數用在形參中可以接收多個數據。
  • 可變參數的格式:數據類型… 參數名稱 public static void sum(int... nums)
  • 可變參數的作用:
    • 傳輸參數非常靈活,方便。
    • 可以不傳輸參數。
    • 可以傳輸一個參數。
    • 可以傳輸多個參數。
    • 可以傳輸一個數組。
    • 可變參數在方法內部本質上就是一個數組。
  • 可變參數的注意事項:
    • 1.一個形參列表中可變參數只能有一個。
    • 2.可變參數必須放在形參列表的最后面。

ps:b站課程《黑馬程序員Java13天進階》根據官方筆記結合自身情況整理的筆記
視頻鏈接

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

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

相關文章

systemctl管理指令

今天我們來繼續學習服務管理指令,接下來才是重頭戲-systemctl,那么話不多說,直接開始吧. systemctl管理指令 1.基本語法: systemctl [start | stop | restart | status]服務 注&#xff1a;systemctl指令管理的服務在/usr/lib/ systemd/system查看 2.systemctl設置服務的自…

STM32單片機教程:從零開始打造智能天氣時鐘

STM32單片機教程&#xff1a;從零開始打造智能天氣時鐘 大家好&#xff01;今天我想為大家詳細介紹一下我們的STM32課程&#xff0c;以及如何從零基礎逐步掌握單片機開發技能&#xff0c;最終實現一個完整的智能天氣時鐘項目。 課程面向人群 本課程主要面向那些已經通過野火…

Neovim插件深度解析:mcphub.nvim如何用MCP協議重構開發體驗

在AI與工具鏈深度融合的今天,Neovim 作為現代開發者的生產力工具,正通過插件生態不斷突破邊界。mcphub.nvim 作為一款基于 MCP(Model Context Protocol) 協議的插件,重新定義了Neovim與智能工具的交互方式。它不僅簡化了MCP服務器的集成與管理,更通過直觀的UI和生態整合,…

第33講|遙感大模型在地學分類中的初探與實戰

目錄 ?? 一、什么是“遙感大模型”? ?? 二、遙感大模型在地學分類中的優勢 ??三、案例:使用 Segment Anything Model (SAM) 進行遙感地物分割 ?? 1. 安裝與依賴配置(PyTorch) ?? 2. 讀取遙感圖像(可用 Sentinel-2 偽彩色圖) ?? 3. SAM 模型載入 ?? …

MATLAB - 小車倒立擺的非線性模型預測控制(NMPC)

系列文章目錄 目錄 系列文章目錄 前言 一、擺錘/小車組件 二、系統方程 三、控制目標 四、控制結構 五、創建非線性 MPC 控制器 六、指定非線性設備模型 七、定義成本和約束 八、驗證非線性 MPC 控制器 九、狀態估計 十、MATLAB 中的閉環仿真 十一、使用 MATLAB 中…

JAVA文件I/O

目錄 一、三種路徑的分類&#xff1a; 1、絕對路徑&#xff1a; 2、相對路徑&#xff1a; 3、基準目錄&#xff1a; 二、文件的種類&#xff1a; 三、利用JAVA操作文件&#xff1a; 1、File類的構造方法&#xff1a; 2、File 類方法的使用&#xff1a; 使用例子&#…

焊接機器人的設計

一、引言 隨著制造業的發展&#xff0c;焊接工藝在各個領域得到廣泛應用。焊接機器人具有焊接質量高、效率高、勞動強度低等優點&#xff0c;能夠滿足現代制造業對焊接生產的要求。設計一款性能優良的焊接機器人&#xff0c;對于提高焊接生產的自動化水平和產品質量具有重要意…

Thymeleaf簡介

在Java中&#xff0c;模板引擎可以幫助生成文本輸出。常見的模板引擎包括FreeMarker、Velocity和Thymeleaf等 Thymeleaf是一個適用于Web和獨立環境的現代服務器端Java模板引擎。 Thymeleaf 和 JSP比較&#xff1a; Thymeleaf目前所作的工作和JSP有相似之處&#xff0c;Thyme…

(論文閱讀)RNNoise 基于遞歸神經網絡的噪聲抑制庫

RNNoise 是一個基于遞歸神經網絡的噪聲抑制庫。 有關該算法的描述見以下論文&#xff1a; J.-M. Valin, A Hybrid DSP/Deep Learning Approach to Real-Time Full-Band Speech Enhancement, Proceedings of IEEE Multimedia Signal Processing (MMSP) Workshop, arXiv:1709.08…

DevOps-文章目錄

01什么是DevOps 02DevOps基礎環境準備 03-DevOps-安裝并初始化Gitlab 04-DevOps-安裝并初始化Jenkins 05-DevOps-Jenkins自動拉取構建代碼1 05-DevOps-Jenkins自動拉取構建代碼2 06-DevOps-自動構建Docker鏡像 07-DevOps-安裝部署Harbor鏡像倉庫 08-DevOps-向Harbor上傳自定義鏡…

UML 狀態圖:以網絡媒體教學系統為例解析

目錄 一、系統概述 二、狀態圖分析 &#xff08;一&#xff09;登錄認證模塊 &#xff08;二&#xff09;課程選擇模塊 &#xff08;三&#xff09;視頻播放模塊 &#xff08;四&#xff09;退出登錄狀態 三、UML狀態圖繪畫 四、總結 UML狀態圖是一種行為圖&#xff0c…

交易模式革新:Eagle Trader APP上線,助力自營交易考試效率提升

近年來&#xff0c;金融行業隨著投資者需求的日益多樣化&#xff0c;衍生出了眾多不同的交易方式。例如&#xff0c;為了幫助新手小白建立交易基礎&#xff0c;誕生了各類跟單社區&#xff1b;而與此同時&#xff0c;一種備受矚目的交易方式 —— 自營交易模式&#xff0c;正吸…

Elasticsearch BBQ 與 OpenSearch FAISS:向量搜索性能對比

作者&#xff1a;來自 Elastic Ugo Sangiorgi Elasticsearch BBQ 與 OpenSearch FAISS 的性能對比。 帶有二值量化的向量搜索&#xff1a;使用 BBQ 的 Elasticsearch 比使用 FAISS 的 OpenSearch 快 5 倍。Elastic 收到了來自社區的請求&#xff0c;希望澄清 Elasticsearch 與 …

Vue 3.4 新特性詳解:Composition API 與 Effect 作用域 API 實戰

一、Vue 3.4 核心特性概覽 Vue 3.4 代號「?? Slam Dunk」,帶來多項關鍵升級: 模板解析器性能翻倍:單文件組件(SFC)構建效率提升 44%,解析速度提升 2 倍。響應式系統優化:計算屬性和 watchEffect 觸發更精準,減少無效渲染。Effect 作用域 API 穩定:通過 effectScope…

【day8】調用AI接口,生成自動化測試用例

1、項目結構建議 project/ ├── api_docs/ # 存放接口文檔 │ └── XX系統.swagger.json ├── ai_generator/ # AI測試用例生成模塊 │ └── test_case_generator.py ├── tests/ # 生成的測試用例 │ └── test_user_api.py ├── conftest.py # pytest配置 ├─…

React應用開發學習指南

AI生成研究報告&#xff1a;關鍵詞 React應用開發 React 已經成為前端 Web 開發領域的主導力量&#xff0c;它是一個免費且開源的 JavaScript 庫&#xff0c;主要用于構建用戶界面 (UI) 1。其多功能性延伸到為 Web 和原生應用程序創建 UI&#xff0c;使其成為行業內備受追捧的…

MSTP+VRRP+DHCP(ENSP)

下載鏈接 通過網盤分享的文件&#xff1a;MSTPVRRPDHCP拓撲圖 鏈接: https://pan.baidu.com/s/1ehRwRQ-WzKC8PsUHsTe70Q?pwd345d 提取碼: 345d PC1 PC2 PC5 AR1 為AR1各端口配置IP地址 <Huawei>sys [Huawei]un in en [Huawei]int g0/0/0 [Huawei-GigabitEthernet0/0/…

第一個Qt開發的OpenCV程序

OpenCV計算機視覺開發實踐&#xff1a;基于Qt C - 商品搜索 - 京東 下載安裝Qt&#xff1a;https://download.qt.io/archive/qt/5.14/5.14.2/qt-opensource-windows-x86-5.14.2.exe 下載安裝OpenCV&#xff1a;https://opencv.org/releases/ 下載安裝CMake&#xff1a;Downl…

深入解析 Python 中的裝飾器 —— 從基礎到實戰

1. 裝飾器基礎 1.1 什么是裝飾器&#xff1f; 裝飾器本質上是一個 Python 函數&#xff0c;它可以讓其他函數在不需要做任何代碼變動的前提下增加額外功能。裝飾器的返回值也是一個函數對象。 1.2 語法糖&#xff1a; 符號 Python 提供了 符號作為裝飾器的語法糖&#xff0c…

研究生面試常見問題

研究生面試是考研復試的重要環節&#xff0c;面試表現直接關系到錄取結果。以下從面試流程、常見問題分類及回答技巧等方面為您整理了相關內容&#xff0c;幫助您更好地準備面試。 一、研究生面試的基本流程 自我介紹&#xff1a;通常需要準備1分鐘左右的中文或英文自我介紹&a…