集合框架之List集合

目錄

?編輯

一、什么是UML

二、集合框架

三、List集合

1.特點

2.遍歷方式

3.刪除

4.優化

四、迭代器原理

五、泛型

六、裝拆箱

七、ArrayList、LinkedList和Vector的區別

?ArrayList和Vector的區別

LinkedList和Vector的區別?


一、什么是UML

UML(Unified Modeling Language)是一種用于軟件系統設計和建模的標準化語言。它提供了一種統一的方法來描述系統的結構和行為,以便于開發人員、設計師和其他利益相關者之間的溝通和理解。

UML包括多種圖形符號,如用例圖、類圖、時序圖、活動圖等,每種圖形符號都用于表示系統的不同方面和視圖。通過使用這些圖形符號,開發人員可以更好地理解系統的需求、結構和行為,從而更好地進行系統設計和開發。

  1. UML官方網站:Welcome To UML Web Site!
  2. UML教程:UML Tutorial

二、集合框架

三、List集合

1.特點

  • 有序:List集合數據存進去的順序和取出來的順序一致

    List lst=new ArrayList();
    lst.add(2);
    lst.add(1);
    lst.add(5);
    lst.add(8);
    System.out.println(lst);
  • 不唯一:List集合數據允許添加重復數據

    List lst=new ArrayList();
    lst.add(2);
    lst.add(1);
    lst.add(5);
    lst.add(8);
    lst.add(8);
    System.out.println(lst);

2.遍歷方式

  • for

    List lst=new ArrayList();
    lst.add("zs");
    lst.add("ls");
    lst.add("ww");
    for (int i = 0; i < lst.size(); i++) {System.out.println(lst.get(i));
    }
  • foreach

    List lst=new ArrayList();
    lst.add("zs");
    lst.add("ls");
    lst.add("ww");
    for (String str : lst) {System.out.println(str);
    }
  • 迭代器

    List lst=new ArrayList();
    lst.add("zs");
    lst.add("ls");
    lst.add("ww");
    Iterator iterator = lst.iterator();
    while(iterator.hasNext())System.out.println(iterator.next());

3.刪除

  • for正向刪除

    List lst=new ArrayList<>();
    lst.add(12);
    lst.add(13);
    lst.add(14);
    lst.forEach(System.out::println);
    System.out.println("刪除之前集合大小:"+lst.size());
    int size = lst.size();
    for (int i = 0; i <size; i++) {lst.remove(0);
    }
    System.out.println("刪除之后集合大小:"+lst.size());
  • for逆向刪除

    List lst=new ArrayList<>();
    lst.add(12);
    lst.add(13);
    lst.add(14);
    lst.forEach(System.out::println);
    System.out.println("刪除之前集合大小:"+lst.size());
    int size = lst.size()-1;
    for (int i = size; i >=0; i--) {lst.remove(i);
    }
    System.out.println("刪除之后集合大小:"+lst.size());
  • 迭代器刪除

    List lst=new ArrayList<>();
    lst.add(12);
    lst.add(13);
    lst.add(14);
    lst.forEach(System.out::println);
    System.out.println("刪除之前集合大小:"+lst.size());
    Iterator<String> iterator = lst.iterator();
    //判斷下一個元素是否存在
    while(iterator.hasNext()) {//若存在,移動到下一個元素位置//易出錯iterator.next();//刪除元素iterator.remove();
    }
    System.out.println("刪除之后集合大小:"+lst.size());

4.優化

List集合優化目的在于利用合理的存儲空間存下所有元素數據,不多不少,不造成空間浪費。

概念:初始化大小10、負載因子1.5、向下取整

公式:容器大小*1.5倍

例如:10*1.5=15、15*1.5=22、22*1.5=33 ...

public static void main(String[] args) {List lst=new ArrayList<>();for (int i = 0; i < 50; i++) {lst.add(i);System.out.println(i);getLen(lst);}
}public static void getLen(List lst){try {Class<? extends List> lstClass = lst.getClass();Field field = lstClass.getDeclaredField("elementData");field.setAccessible(true);Object[] obj = (Object[]) field.get(lst);System.out.println("集合的大小是:"+obj.length);} catch (Exception e) {e.printStackTrace();}
}

四、迭代器原理

List集合迭代器是用來遍歷List集合中的元素的工具。它可以按順序訪問List中的每個元素,而不需要知道List的內部結構。迭代器通常包含hasNext()和next()兩個方法,前者用來判斷是否還有下一個元素,后者用來獲取下一個元素。

關于List集合迭代器的原理,它通常是基于List的數據結構實現的。在遍歷過程中,迭代器會維護一個指向當前元素的指針,每次調用next()方法時,指針會移動到下一個元素。迭代器還會記錄遍歷的狀態,以便正確地返回hasNext()方法的結果。

五、泛型

?JDK1.5版本以上才有

  • 以類型為參數的類叫做泛型
  • 泛型的默認類型為Object
  • 作用:提高程序的健壯性、簡化代碼

使用 List 集合時,可以通過指定泛型來限制集合中存儲的元素類型。這樣可以在編譯時就能發現類型不匹配的錯誤,提高代碼的穩定性和可讀性。

例如,我們可以創建一個存儲整數類型的 List 集合:

List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);for (Integer num : list) {System.out.println(num);
}

這樣就可以確保集合中只能存儲整數類型的元素,如果嘗試存儲其他類型的元素會在編譯時報錯。

六、裝拆箱

當我們將基本數據類型(如int、float等)存儲在List集合中時,會發生裝箱操作,即將基本數據類型轉換為對應的包裝類(如Integer、Float等)。而當我們從List集合中取出包裝類并轉換為基本數據類型時,會發生拆箱操作。

示例:送快遞,寄快遞時需要對物品進行包裹,收快遞后就需要對包裹進行拆包。

  • 裝箱(值類型到引用類型

    int a=10;
    Integer b=new Integer(a);
  • 拆箱(引用類型到值類型

    Integer c=new Integer(10);
    int d=c.intValue();

七、ArrayList、LinkedList和Vector的區別

?ArrayList和Vector的區別

ArrayList和Vector都是實現了List接口的動態數組,它們之間的主要區別在于線程安全性和性能。

  1. 線程安全性:
  • ArrayList是非線程安全的,即在多線程環境下使用ArrayList可能會導致并發訪問異常(ConcurrentModificationException)。
  • Vector是線程安全的,它的方法都是同步的,可以在多線程環境下安全地使用。
  1. 性能:
  • ArrayList相對于Vector在性能上更好,因為Vector的方法都是同步的,會帶來額外的開銷。
  • 在單線程環境下,ArrayList的性能更優。

?代碼示例:

// ArrayList的使用
List<String> arrayList = new ArrayList<>();
arrayList.add("A");
arrayList.add("B");
arrayList.add("C");// Vector的使用
List<String> vector = new Vector<>();
vector.add("X");
vector.add("Y");
vector.add("Z");

LinkedList和Vector的區別?

LinkedList和Vector都是Java中的集合類,但它們有一些區別:

  1. 數據結構:LinkedList是基于鏈表實現的,而Vector是基于數組實現的。

  2. 線程安全性:Vector是線程安全的,而LinkedList不是線程安全的。

  3. 擴容機制:Vector在擴容時會增加原數組大小的一半,而LinkedList在插入元素時只需要調整相鄰節點的指針。

  4. 遍歷性能:LinkedList在遍歷時需要遍歷整個鏈表,而Vector在遍歷時可以通過索引直接訪問元素。

  5. 插入和刪除操作:LinkedList在任意位置插入和刪除元素的性能更好,而Vector在中間插入和刪除元素時需要移動其他元素。

?代碼示例:?

// 創建一個LinkedList
LinkedList<String> linkedList = new LinkedList<>();
linkedList.add("A");
linkedList.add("B");
linkedList.add("C");// 創建一個Vector
Vector<String> vector = new Vector<>();
vector.add("X");
vector.add("Y");
vector.add("Z");// 遍歷LinkedList
for(String str : linkedList) {System.out.println(str);
}// 遍歷Vector
for(String str : vector) {System.out.println(str);
}

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

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

相關文章

基于ORB-SLAM2與YOLOv8剔除動態特征點(三種方法)

基于ORB-SLAM2與YOLOv8剔除動態特征點(三種方法) 寫上篇文章時測試過程比較亂&#xff0c;寫的時候有些地方有點失誤&#xff0c;所以重新寫了這篇 本文內容均在RGB-D環境下進行程序測試 本文涉及到的動態特征點剔除速度均是以https://cvg.cit.tum.de/data/datasets/rgbd-dat…

系統學習Python——裝飾器:類裝飾器-[單例類:編寫替代方案]

分類目錄&#xff1a;《系統學習Python》總目錄 有趣的是&#xff0c;這里如果能使用nonlocal語句&#xff08;僅在Python3.X中可用&#xff09;來改變外層作用域名稱&#xff0c;我們在這里可以編寫一個自包含程度更高的解決方案一一一下面的替代方案為每個類使用了一個外層作…

編寫程序,實現shell功能——項目訓練——day08

c c今天做了一個實戰項目訓練&#xff0c;編寫一個程序&#xff0c;實現shell功能&#xff0c;我們稱之為minishell。 主要是利用Linux中IO接口實現&#xff0c;實現的功能有&#xff1a; 1.ls ls -a ls -l cd cp mv pwd c…

軟件License授權原理

軟件License授權原理 你知道License是如何防止別人破解的嗎&#xff1f;本文將介紹License的生成原理&#xff0c;理解了License的授權原理你不但可以防止別人破解你的License&#xff0c;你甚至可以研究別人的License找到它們的漏洞。喜歡本文的朋友建議收藏關注&#xff0c;…

【Linux】進程狀態

進程狀態 進程狀態的簡要介紹運行狀態進程排隊 阻塞狀態掛起狀態Linux中的進程狀態 進程狀態的簡要介紹 進程狀態指的是一個操作系統中正在運行的進程當前所處的狀態。根據不同的操作系統&#xff0c;進程狀態可能會有一些細微的差別&#xff0c;但最主要的是以下三種狀態 運行…

Java——方法的使用

目錄 一.方法的概念及使用 1 什么是方法(method) 2.方法定義 3 方法調用的執行過程 4 實參和形參的關系(重要) 5.沒有返回值的方法 二.方法重載 1.為什么需要方法重載 2.方法重載概念 3.方法簽名 三.遞歸 1.遞歸的概念 2.遞歸執行過程分析 3. 遞歸練習 一.方法的…

貓頭虎分享已解決Bug || 容器編排問題:OrchestrationFailure, ContainerManagementError

博主貓頭虎的技術世界 &#x1f31f; 歡迎來到貓頭虎的博客 — 探索技術的無限可能&#xff01; 專欄鏈接&#xff1a; &#x1f517; 精選專欄&#xff1a; 《面試題大全》 — 面試準備的寶典&#xff01;《IDEA開發秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鴻蒙》 …

代碼隨想錄算法訓練營第四十二天|122. 買賣股票的最佳時機 II

674. 最長連續遞增序列 public static int findLengthOfLCIS(int[] nums) {int[] dp new int[nums.length];dp[0] 1;for (int i 1; i < nums.length; i) {dfs(nums, dp, i);}Arrays.sort(dp);return dp[dp.length - 1];}public static void dfs(int[] nums, int[] dp, i…

【Python】【VS Code】VS Code中python.json和setting.json文件配置說明

目錄 1. python.json配置 2. setting.json配置 3. 解決中文亂碼 4. 實現效果 1. python.json配置 python.json 獲取步驟&#xff1a;文件 -> 首選項 -> 配置用戶代碼片段 -> python 此為VS Code的頭文件設置&#xff0c;復制以下內容到 python.json {"HEADER…

個人做抖店如何能夠快速起店?掌握好技巧是關鍵!建議收藏!

大家好&#xff0c;我是電商小布。 相信我們每個朋友在店鋪開通后&#xff0c;最關心的事情就是小店成功起店了。 那么個人做抖店想要快速起店&#xff0c;該怎么來進行操作呢&#xff1f; 接下來&#xff0c;小布重點給大家說三點&#xff1a; 首先來說一下小店的主體類型…

git常用命令記錄

1、第一次初始化 git init git add . git commit -m ‘first commit’ git remote add origin gitgithub.com:帳號名/倉庫名.git git pull origin master git push origin master # -f 強推 git clone gitgithub.com:git帳號名/倉庫名.git 2、工作基本操作 git checkout master…

dell r740服務器黃燈閃爍維修現場解決

1&#xff1a;首先看一下這款DELL非常主力的PowerEdge R740服務器長啥樣&#xff0c;不得不說就外觀來說自從IBM拋棄System X系列服務器后&#xff0c;也就戴爾這個外觀看的比較順眼。 圖一&#xff1a;是DELL R740前視圖&#xff08;這款是8盤機型&#xff09; 圖二&#xff…

QT 數據庫的增加操作和畫圖 Win

第一步、先配置CMakeLists.txt 在CMakeLists.txt中添加 find_package(Qt6 REQUIRED COMPONENTS Sql) find_package(Qt6 REQUIRED COMPONENTS Charts)target_link_libraries(${PROJECT_NAME} PRIVATE Qt6::Sql) target_link_libraries(${PROJECT_NAME} PRIVATE Qt6::Charts)避…

springboot集成JWT實現token權限認證

vuespringboot登錄與注冊功能的實現 注&#xff1a;對于JWT的學習&#xff0c;首先要完成注冊和登錄的功能&#xff0c;本篇博客是基于上述博客的進階學習&#xff0c;代碼頁也是在原有的基礎上進行擴展 ①在pom.xml添加依賴 <!-- JWT --> <dependency><grou…

Linux篇:Shell命令以及運行原理 和 權限

一. Shell命令及原理 Linux操作系統狹義上是Linux內核&#xff0c;廣義上是指Linux內核Linux外殼(Shell)和對應的配套程序 Linux外殼&#xff1a;Linux 外殼是用戶與內核之間的接口&#xff0c;用戶通過外殼與操作系統進行交互和操作。在 Linux 系統中&#xff0c;用戶可以選…

C語言——static的三大用法

被稱為面試愛考愛問題的它到底有何奧義 它難度不大并且非常常用&#xff0c;話不多說&#xff0c;直接開始 一、局部靜態變量 定義 在函數內部使用static修飾的變量被稱為局部靜態變量&#xff0c;與普通的局部變量不同&#xff0c;局部靜態變量在使用后不會被銷毀&#xff…

pycharm 遠程運行報錯 Failed to prepare environment

什么也沒動的情況下&#xff0c;遠程連接后運行是沒問題的&#xff0c;突然在運行時就運行不了了&#xff0c;解決方案 清理緩存&#xff1a; 有時候 PyCharm 的內部緩存可能出現問題&#xff0c;可以嘗試清除緩存&#xff08;File > Invalidate Caches / Restart&#xff0…

mysql優化指南之原理篇

之前碰到一個線上問題&#xff0c;在接手一個同事的項目后&#xff0c;因為工期比較趕&#xff0c;我還沒來得及了解業務背景和大致實現&#xff0c;只是了解了上線發布的順序和驗證方式就進行了上線&#xff0c;在上線進行金絲雀的時候系統還沒發生什么異常&#xff0c;于是我…

【面試題】談談MySQL的事務

事務是啥 MySQL的事務就是把多個sql語句操作打包在一起執行&#xff0c;要么全部執行&#xff0c;要么一個都別執行。這種操作稱為“原子性”&#xff0c;是事務最核心的特征。當某個sql操作出錯時&#xff0c;就會進行“回滾/rollback”操作&#xff0c;即把執行過的操作逆向…

MySQL數據庫進階第二篇(索引,SQL性能分析,使用規則)

文章目錄 一、索引概述二、索引結構三、結構 - B-Tree四、結構 - BTree五、結構 - Hash六、索引分類七、索引語法1.案例代碼 八、SQL性能分析1.查看SQl執行頻率2.慢查詢日志3.PROFILES詳情4.EXPLAIN執行計劃 九、 索引使用規則十、SQL 提示十一、覆蓋索引十二、前綴索引十三、單…