List-順序表--2

目錄

1、ArrayList

2、ArrayList構造方法

3、ArrayList常見方法

4、ArrayList的遍歷

5、ArrayList的擴容機制

6、ArrayList的具體使用

6.1、楊輝三角

6.2、簡單的洗牌算法


1、ArrayList

在集合框架中,ArrayList 是一個普通的類,實現了 List 接口

說明:

1. ArrayList是以泛型方式實現的,使用時必須要先實例化
2. ArrayList實現了RandomAccess接口,表明ArrayList支持隨機訪問
3. ArrayList實現了Cloneable接口,表明ArrayList是可以clone的
4. ArrayList實現了Serializable接口,表明ArrayList是支持序列化的
5. 和Vector不同,ArrayList不是線程安全的,在單線程下可以使用,在多線程中可以選擇Vector或者CopyOnWriteArrayList
6. ArrayList底層是一段連續的空間,并且可以動態擴容,是一個動態類型的順序表

2、ArrayList構造方法

底層代碼分析:

1. 帶一個參數的構造方法,初始化 ArrayList 時可以指定初始容量

2. 不帶參數的構造方法,初始化時分配的是一個空數組

既然沒有分配內存,那這個 ArrayList 對象是如何存數據的呢?

^

繼續查看 add 方法的原碼,得出結論:

結論1:雖然初始化時沒有分配內存,但是第一次 add 的時候會分配大小為10的內存

結論2:對于ArrayList來說,當容量滿了,采用的擴容方式是1.5倍擴容

^

3. 有通配符的構造方法

參數列表的含義:

Collection:表示傳入的參數是?Collection 類型的,實現了Collection接口的類型也可以

<? extends E>:通配符上界,這里表示可以傳入的參數類型是 E 或者 E 的子類

^

例如:

ArrayList<Integer> list?= new ArrayList<>();

ArrayList<Number> list1?= new ArrayList<>(list);

首先,list 是實現了 Collection 接口的,?:Integer ;E:?Number,Integer 是?Number 的子類,list 滿足這兩個條件,所以可以作為參數正確執行。相當于把 list 表中數據打包給到 list

    public static void main(String[] args) {LinkedList<Integer> list1 = new LinkedList<>();list1.add(1);list1.add(2);list1.add(3);ArrayList<Number> list2 = new ArrayList<>(list1);list2.add(99);list2.add(88);System.out.println(list2); // 輸出 [1,2,3,99,88]}

3、ArrayList常見方法

    public static void main(String[] args) {ArrayList<Integer> list = new ArrayList<>();list.add(1);list.add(2);list.add(3);ArrayList<Number> list123 = new ArrayList<>();list123.addAll(list); // 與上述第三個構造方法類似System.out.println(list123);//123list123.remove(2); // 刪除 2 位置元素list123.remove(new Integer(2)); // 刪除遇到的第一個 2System.out.println(list123);//23list123.get(0);list123.set(1,2);list123.contains(1);list.add(4);list.add(5);//并不會產生新的對象!List<Integer> list1 = list.subList(1,3); // [1,3)System.out.println(list1);System.out.println("==============");list1.set(0,99);System.out.println(list1);System.out.println(list);}

上述?subList 方法執行結果:

list1:??[99,3]

list:??? [1, 99, 3,4, 5]

發現通過 list1 修改,list 也會發生改變,所以?subList 的執行過程并不會產生新的對象,在這個案例中,list1 的起始位置指向 list 的 1 下標

4、ArrayList的遍歷

1.?for循環+下標

public static void main(String[] args) {List<Integer> list = new ArrayList<>();list.add(1);list.add(2);list.add(3);list.add(4);list.add(5);// 使用下標+for遍歷for (int i = 0; i < list.size(); i++) {System.out.print(list.get(i) + " ");}System.out.println();
}

2.?foreach

^

for(Integer x : list) {
? ? System.out.print(x+" ");

}
System.out.println();

3. 迭代器

只有實現了 literable 接口的類型,才能使用迭代器;Map 就不能使用,因為他沒有實現 literable 接口

Iterator<Integer> it = list.iterator();? ? --? 通用迭代器

Iterator<Integer> it = list.listIterator();? ? --? List 的專屬迭代器

^

//使用 迭代器 遍歷集合類 list
Iterator<Integer> it = list.iterator();
while (it.hasNext()) {
? ? System.out.println(it.next()+" ");

}

注意:ArrayList最長使用的遍歷方式是:for循環+下標 以及 foreach?

5、ArrayList的擴容機制

在上述構造方法中,通過查看 add 方法的底層代碼得出結論:ArrayList是一個動態類型的順序表,即:在插入元素的過程中會自動擴容

底層代碼總結:

1. 檢測是否真正需要擴容,如果是調用grow準備擴容
2. 預估需要庫容的大小

  • 初步預估按照1.5倍大小擴容
  • 如果用戶所需大小超過預估1.5倍大小,則按照用戶所需大小擴容
  • 真正擴容之前檢測是否能擴容成功,防止太大導致擴容失敗

3. 使用copyOf進行擴容

6、ArrayList的具體使用

6.1、楊輝三角

力扣118

分析 List<List<Integer>>?

class Solution {public List<List<Integer>> generate(int numRows) {List<List<Integer>> ret = new ArrayList<>();// 1. 先處理第一行List<Integer> list = new ArrayList<>();list.add(1);ret.add(list);// 2. 從第2行開始計算 每個list當中的數據for(int i = 1;i < numRows;i++) {// 3. 先準備當前行數據List<Integer> curRow =  new ArrayList<>();// 4. 準備當前行的第一個數據curRow.add(1);// 5. 準備當前的中間數據List<Integer> prevRow = ret.get(i-1); // 拿到上一行的數據for(int j = 1; j < i;j++) {// 上一行的當前列 + 上一行的前一列int val = prevRow.get(j) + prevRow.get(j-1);curRow.add(val);}// 6. 準備當前行最后一個數據curRow.add(1);// 7. 把這個數據放到二維數組當中去ret.add(curRow);}return ret;}
}

6.2、簡單的洗牌算法

實現這個算法要解決的問題:

1.買一副牌【要生成一副撲克牌】放到哪里?

2.洗牌,怎么洗?

3.揭牌,每個人輪流抓5張牌,怎么抓牌?抓的牌放到哪里?

1. 創建一個 card 類,定義 花色 和 數字 兩個屬性;生成 get 和 set 方法;生成toString方法

package card;public class Card {private String suit;//花色private int rank;//數字public Card(String suit, int rank) {this.suit = suit;this.rank = rank;}public String getSuit() {return suit;}public void setSuit(String suit) {this.suit = suit;}public int getRank() {return rank;}public void setRank(int rank) {this.rank = rank;}@Overridepublic String toString() {return suit+":"+rank+" ";}
}

2. 創建 CardDemo 和 Test 類;CardDemo類中定義一個買牌的方法,在Test類中測試

? ? 一共52張牌 1-k,其中1對應A、J對應11、Q對應12、K對應13

?3. 在CardDemo 類中再定義一個花色類,并完善buyCard方法

4. 買完牌后洗牌,這里使用生成隨機數的方式,從最后一張牌開始,與隨機生成的牌交換

5. 揭牌,3個人每人輪流揭5張,每次揭1張

把三個人的關系用一個二維數組表示

每揭一張牌,就把整副牌的0下標位置刪除

CardDemo 類的完整代碼

public class CardDemo {private  final String[] suits = {"?","?","?","?"};/*** 52張 1-K*      J   Q  K*      11 12 13* @return*/public List<Card> buyCard() {List<Card> cardList = new ArrayList<>();for (int i = 0; i < 4; i++) {for (int j = 1; j <= 13; j++) {Card card = new Card(suits[i],j);cardList.add(card);}}return cardList;}public void shuffle(List<Card> cardList) {Random random = new Random();for (int i = cardList.size()-1; i > 0; i--) {int index = random.nextInt(i);//index  i 交換swap(cardList,i,index);}}private void swap(List<Card> cardList,int a,int b) {Card tmp = cardList.get(a);cardList.set(a,cardList.get(b));cardList.set(b,tmp);/*** tmp = a* a = b* b = tmp*/}/*** 揭牌* 3個人 每個人輪流揭牌5張* @param cardList*/public void getCard(List<Card> cardList) {List<Card> hand1 = new ArrayList<>();List<Card> hand2 = new ArrayList<>();List<Card> hand3 = new ArrayList<>();List<List<Card>> hands = new ArrayList<>();hands.add(hand1);hands.add(hand2);hands.add(hand3);//3個人 輪流抓牌5張 每次揭牌1張for (int i = 0; i < 5; i++) {//j代表人for (int j = 0; j < 3; j++) {Card card = cardList.remove(0);hands.get(j).add(card);}}System.out.println("第1個揭牌如下:");System.out.println(hand1);System.out.println("第2個揭牌如下:");System.out.println(hand2);System.out.println("第3個揭牌如下:");System.out.println(hand3);System.out.println("剩下的牌:");System.out.println(cardList);}
}

Test 類中代碼

public class Test {public static void main(String[] args) {CardDemo cardDemo = new CardDemo();List<Card> cardList =  cardDemo.buyCard();System.out.println("買的牌如下:");System.out.println(cardList);System.out.println("洗牌:");cardDemo.shuffle(cardList);System.out.println(cardList);System.out.println("揭牌:");cardDemo.getCard(cardList);}
}

7、順序表的優缺點

缺點:

  1. 插入數據必須移動其他數據,最壞情況下,就是插入到0位置。時間復雜度O(N)
  2. 刪除數據也需要移動數據,最壞情況下,就是刪除0位置。時間復雜度O(N)
  3. 擴容之后有可能會浪費空間

優點:在給定下標進行查找的時候,時間復雜度O(1)

總結:順序表比較適合進行給定下標查找的場景。

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

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

相關文章

lambda用法及其原理

目錄 lambda形式lambda用法1.sort降序2.swap3.捕捉列表 習題解題 lambda形式 [capture-list](parameters)->return type{function boby}[capture-list]&#xff1a;[捕捉列表]用于捕捉函數外的參數&#xff0c;可以為空&#xff0c;但不能省略&#xff1b;(parameters) &am…

基于ASP.NET的動漫網站

一、系統架構與技術實現 系統架構&#xff1a;基于ASP.NET的MVC框架構建&#xff0c;實現網站的層次結構&#xff0c;使得網站更加易于維護和擴展。 技術實現&#xff1a;利用ASP.NET的技術特點&#xff0c;如強大的后端開發能力、豐富的UI控件等&#xff0c;結合前端技術如HT…

用 HTML5 Canvas 和 JavaScript 實現流星雨特效

最近在研究前端動畫效果時,實現了一個超酷的流星雨特效,今天來和大家分享下具體實現過程。 1,整體實現思路 這個流星雨特效主要由 HTML、CSS 和 JavaScript 協同完成。HTML 搭建基礎結構,CSS 負責頁面樣式設計,JavaScript 實現星星和流星的動態效果。 效果展示: 用 HTM…

AI中的神經元與權重矩陣之間的關系;神經元連接角度看行和列的意義

AI中的神經元與權重矩陣之間的關系 目錄 AI中的神經元與權重矩陣之間的關系神經元連接角度看行和列的意義AI中的神經元概念 在人工智能領域,特別是神經網絡中,神經元是基本的計算單元,它是對生物神經元的一種抽象模擬。就像生物神經元接收來自其他神經元的電信號,經過處理后…

Visual studio code編寫簡單記事本exe筆記

安裝擴展cmake tools c/c c/c Extension pack CMakeLists.txt cmake_minimum_required(VERSION 3.20) project(NotepadApp)set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON)# Windows specific settings if(WIN32)set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON)s…

Linux 35.6 + JetPack v5.1.4之編譯 pytorch升級

Linux 35.6 JetPack v5.1.4之編譯 pytorch升級 1. 源由2. 升級步驟1&#xff1a;獲取二進制版本步驟2&#xff1a;安裝二進制版本步驟3&#xff1a;獲取torchvision步驟4&#xff1a;安裝torchvision步驟5&#xff1a;檢查安裝版本 3. 使用4. 補充4.1 torchvision版本問題4.2 …

計算機網絡--根據IP地址和路由表計算下一跳

一、必備知識 1.無分類地址IPV4地址網絡前綴主機號 2.每個IPV4地址由32位二進制數組成 3. /15這個地址表示網絡前綴有15位&#xff0c;那么主機號32-1517位。 4.地址掩碼&#xff08;子網掩碼&#xff09;&#xff1a;所對應的網絡前綴為1&#xff0c;主機號為0。 5.計算下…

歐幾里得算法(簡單理解版,非嚴格證明)

歐幾里得算法用于求解兩個整數的最大公約數&#xff0c;又稱為輾轉相除 依據的基本定理&#xff1a; GCD(a,b)GCD(a%b,b) 證明&#xff1a; 對于搞理論的人可能需要會嚴格證明&#xff0c;但是對于我們一般人而言&#xff0c;只要能理解其原理并記住即可&#xff0c;后者實際上…

插入式微型機頂盒來了

快科技1月6日消息&#xff0c;據國家廣播電視總局今日消息&#xff0c;國家廣播電視總局為首款以插入式微型機頂盒品類通過入網檢測的設備頒發了入網認定證書。 這是插入式微型機頂盒批量部署進程中的又一大進展。同時&#xff0c;廣播電視科學研究院依據行業標準建成了插入式…

lamda表達式

提示&#xff1a;文章 文章目錄 前言一、背景在使用lambda的時候&#xff0c;有幾個參數是可以直接省略的&#xff1a; 二、題目問題探究 總結 前言 前期疑問&#xff1a; 本文目標&#xff1a; lamda表達式 一、背景 看c科二的時候有看到lamda表達式&#xff0c;就再次看了…

XXL-RPC v1.8.1 | RPC服務框架

Release Notes 1、【安全】序列化安全性增強&#xff0c;默認開啟package安全空間機制&#xff1b;2、【擴展】序列化擴展性增強&#xff0c;支持自定義序列化package白名單&#xff1b;3、【優化】序列化類型主動檢測&#xff0c;提升問題定位效率&#xff1b;4、【能力】服務…

前端路由layout布局處理以及菜單交互(三)

上篇介紹了前端項目部署以及基本依賴的應用&#xff0c;這次主要對于路由以及布局進行模塊化處理 一、 創建layout模塊 1、新建src/layout/index.vue <template><el-container class"common-layout"><!-- <el-aside class"aside">&l…

Spring Boot(4)使用 IDEA 搭建 Spring Boot+MyBatis 項目全流程實戰

文章目錄 一、?搞個引言二、?開始搭建 Spring Boot 項目吧&#xff01;2.1 啟動 IDEA 并創建新項目2.2 選擇項目依賴2.3 完成項目創建 三、&#x1f4d8;項目結構剖析四、?配置數據庫連接五、? 創建 MyBatis 相關組件5.1 實體類&#xff08;Entity&#xff09;5.2 Mapper 接…

使用wujie搭建微前端應用及踩坑

線上演示地址&#xff1a;wujie-app 源碼地址&#xff1a;https://github.com/Jiang-K-J/micro-app?tabreadme-ov-file &#xff08;如果覺您得有用&#xff0c;請幫忙點個小星星&#xff09; 主應用&#xff1a;vue2webpack 子應用&#xff1a;vue3vite 子應用&#xff1…

【數據可視化-11】全國大學數據可視化分析

&#x1f9d1; 博主簡介&#xff1a;曾任某智慧城市類企業算法總監&#xff0c;目前在美國市場的物流公司從事高級算法工程師一職&#xff0c;深耕人工智能領域&#xff0c;精通python數據挖掘、可視化、機器學習等&#xff0c;發表過AI相關的專利并多次在AI類比賽中獲獎。CSDN…

141.《mac m1安裝mongodb詳細教程》

文章目錄 下載從官網下載安裝包 下載后雙擊解壓出文件夾安裝文件名修改為 mongodb配置data存放位置和日志log的存放位置啟動方式一方式二方式二:輸入mongo報錯以及解決辦法 本人電腦 m2 pro,屬于 arm 架構 下載 官網地址: mongodb官網 怎么查看自己電腦應該下載哪個版本,輸入…

frameworks 之 Winscope 工具

frameworks 之 Winscope 工具 1. 手機端開啟2. 加載追蹤的文件2.1 Android12 3. 分析文件 Winscope 是一款 Web 工具&#xff0c;可以讓用戶在動畫和轉換期間和之后記錄、重放和分析多個系統服務的狀態。Winscope 將所有相關的系統服務狀態記錄在一個跟蹤文件中。使用帶有跟蹤文…

在日期字段中自動插入斜杠“/”的最佳方法是什么

我正在嘗試向輸入日期字段添加功能&#xff0c;以便當用戶輸入數字時&#xff0c;自動添加斜杠“/”。 所以假設我有以下 html&#xff1a; <input type"text" id"fooDate" />假設我有以下 javascript&#xff1a; var dateField document.getElem…

極限學習機 (Extreme Learning Machine, ELM) 算法詳解與PyTorch實現

極限學習機 (Extreme Learning Machine, ELM) 算法詳解與PyTorch實現 目錄 極限學習機 (Extreme Learning Machine, ELM) 算法詳解與PyTorch實現1. 極限學習機 (ELM) 算法概述1.1 單隱層前饋神經網絡1.2 ELM的優勢2. ELM的核心技術2.1 模型定義2.2 隨機初始化2.3 最小二乘法2.4…