【進階篇-Day9:JAVA中單列集合Collection、List、ArrayList、LinkedList的介紹】

目錄

  • 1、集合的介紹
    • 1.1 概念
    • 1.2 集合的分類
  • 2、單列集合:Collection
    • 2.1 Collection的使用
    • 2.2 集合的通用遍歷方式
      • `2.2.1 迭代器遍歷:`
        • (1)例子:
        • (2)迭代器遍歷的原理:
        • (3)迭代器源碼分析:
        • (4)總結:
      • `2.2.2 增強for循環遍歷:`
      • `2.2.3 foreach遍歷:`
    • 2.3 List集合
      • (1)和索引相關的方法:
      • (2)list集合的遍歷方法:
    • 2.4 數據結構
      • 2.4.1 棧和隊列
      • 2.4.2 數組
      • 2.4.3 鏈表
      • 2.4.4 總結
    • 2.5 ArrayList類和LinkedList類
      • 2.5.1 ArrayList類:
        • (1)ArrayList長度可變原理:
      • 2.5.2 LinkedList類:

1、集合的介紹

1.1 概念

在這里插入圖片描述

1.2 集合的分類

在這里插入圖片描述

注:集合分為單列集合雙列集合

  • 單列集合:一次添加一個元素,實現了Collection接口。
  • 雙列集合:一次添加兩個元素,實現了Map接口。

2、單列集合:Collection

在這里插入圖片描述
注:Collection集合,可以分為List集合Set集合

  • List集合:存取有序、有索引、可以存儲重復的元素。
  • Set集合:存取無序、沒有索引、不可以存儲重復的元素。

2.1 Collection的使用

在這里插入圖片描述

package com.itheima.collection;import java.util.ArrayList;
import java.util.Collection;public class CollectionTest1 {/*** Collection的常用方法:*     public boolean add(E e):把給定的對象添加到當前集合中*     public void clear():清空集合中所有的元素*     public boolean isEmpty():判斷當前集合是否為空*     public boolean remove(E e):把給定的對象在當前集合中刪除*     public boolean contains(Object obj):判斷當前集合中是否包含給定的對象*     public int size():返回集合中元素的個數(集合的長度)**/public static void main(String[] args) {//以多態的形式創建集合對象,調用單列集合中的共有方法Collection<String> c = new ArrayList<>();//1、add(E e):把給定的對象添加到當前集合中boolean b1 = c.add("張三");boolean b2 = c.add("李四");boolean b3 = c.add("王五");System.out.println(b1);//true 返回是否添加成功的狀態System.out.println(b2);//trueSystem.out.println(b3);//trueSystem.out.println(c);//[張三, 張三, 張三]//2、clear():清空集合中所有的元素c.clear();System.out.println(c);//[]//3、isEmpty():判斷當前集合是否為空System.out.println(c.isEmpty());//true//4、remove(E e):把給定的對象在當前集合中刪除c.add("馬四");c.add("趙武");boolean remove = c.remove("馬四");//返回值為是否刪除成功的標記:刪除存在的對象則返回true,刪除不存在的對象則返回falseSystem.out.println(c);//[趙武] 可以發現馬四已經被刪除了//5、contains(Object obj):判斷當前集合中是否包含給定的對象boolean contains1 = c.contains("平平");System.out.println(contains1);//false 不包含則返回falseboolean contains2 = c.contains("趙武");System.out.println(contains2);//true 包含則返回true//6、size():返回集合中元素的個數(集合的長度)System.out.println(c.size());//1}
}

2.2 集合的通用遍歷方式

在這里插入圖片描述

2.2.1 迭代器遍歷:

(1)例子:
package com.itheima.collection;import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;public class CollectionTest3 {/*** public Iterator<E> iterator():獲取遍歷集合的迭代器*     1、public E next():從集合中獲取一個元素*          注:如果next()調用超過了集合的大小,就會出現 NoSuchElementException 異常*     2、public boolean hasNext():如果任有元素可以迭代,則返回true*/public static void main(String[] args) {Collection<Student> c = new ArrayList<>();Student s1 = new Student("張三", 11);//Student是自定義創建的類Student s2 = new Student("李四", 21);Student s3 = new Student("王五", 31);//添加三個對象c.add(s1);c.add(s2);c.add(s3);//1、獲取迭代器Iterator<Student> iterator = c.iterator();//2、循環判斷集合中是否還有元素while (iterator.hasNext()){////3、調用next方法,從集合中獲取一個元素Student next = iterator.next();System.out.println(next);}}
}
(2)迭代器遍歷的原理:

在這里插入圖片描述

總結:next()方法取出一個元素后,指針會向后移動一位。

(3)迭代器源碼分析:

在這里插入圖片描述

(4)總結:

在這里插入圖片描述

2.2.2 增強for循環遍歷:

在這里插入圖片描述

package com.itheima.collection;import java.util.ArrayList;
import java.util.Collection;public class CollectionTest4 {/*** 使用增強for循環遍歷**/public static void main(String[] args) {Collection<Student> c = new ArrayList<>();Student s1 = new Student("張三", 11);//Student是自定義創建的類Student s2 = new Student("李四", 21);Student s3 = new Student("王五", 31);//添加三個對象c.add(s1);c.add(s2);c.add(s3);//使用增強for循環遍歷for (Student s : c){System.out.println(s);}}
}

注:增強for循環的遍歷方式,其實就是迭代器遍歷,當編譯成字節碼文件后,發現增強for循環代碼就會轉換為迭代器遍歷方式。

2.2.3 foreach遍歷:

package com.itheima.collection;import java.util.ArrayList;
import java.util.Collection;
import java.util.function.Consumer;public class CollectionTest4 {public static void main(String[] args) {Collection<Student> c = new ArrayList<>();Student s1 = new Student("張三", 11);//Student是自定義創建的類Student s2 = new Student("李四", 21);Student s3 = new Student("王五", 31);//添加三個對象c.add(s1);c.add(s2);c.add(s3);//使用foreach方法遍歷c.forEach(e-> System.out.println(e));}
}

注:foreach底層也是迭代器遍歷。

2.3 List集合

在這里插入圖片描述

(1)和索引相關的方法:

在這里插入圖片描述

package com.itheima.collection.list;import java.util.ArrayList;
import java.util.List;public class ListDemo1 {/*** List接口的特點:存取有序、有索引、可以存儲重復* 和索引有關的API:*     public void add(int index, E element):在指定的索引位置,添加元素*     public E set(int index, E element):根據索引修改集合中的元素*     public E remove(int index):根據索引刪除集合中的元素*     public E get(int index):返回指定索引處的元素*/public static void main(String[] args) {List<String> list = new ArrayList<>();//1、add(int index, E element):在指定的索引位置,添加元素list.add("lisi");list.add("wangwu");list.add("maliu");list.add(1, "lisi");//在1號位置添加元素,原來1號位置及后面的元素都向后移動一位System.out.println(list);//[lisi, lisi, wangwu, maliu]//2、set(int index, E element):根據索引修改集合中的元素list.set(1, "馬四");//修改索引為1的元素為馬四System.out.println(list);//[lisi, 馬四, wangwu, maliu]//3、remove(int index):根據索引刪除集合中的元素list.remove(1);//刪除索引為1的元素System.out.println(list);//[lisi, wangwu, maliu]//4、get(int index):返回指定索引處的元素System.out.println(list.get(1));//wangwu 獲取索引為1的元素}
}

注意:remove()方法,如果list集合中存儲的本身就是int類型,那么刪除時會被當做索引,因此需要手動裝箱,如下例子:

package com.itheima.collection.list;
import java.util.ArrayList;
import java.util.List;
public class ListDemo {List<Integer> ll = new ArrayList<>();ll.add(111);ll.add(222);ll.add(333);
//        ll.remove(222);//222會被當作索引,這里就會報空指針,手動裝箱,如下ll.remove(Integer.valueOf(222));System.out.println(ll);//[111, 333]}
}

(2)list集合的遍歷方法:

在這里插入圖片描述

package com.itheima.collection.list;import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;public class ListDemo2 {/*** List集合的遍歷方式:*     1、普通for循環*     2、迭代器遍歷*     3、增強for循環*     4、foreach方法*     5、ListIterator(List集合特有的迭代器)**/public static void main(String[] args) {List<String> list = new ArrayList<>();list.add("111");list.add("222");list.add("333");list.add("444");//1、普通for循環for (int i = 0; i < list.size(); i++) {System.out.println(list.get(i));}System.out.println("--------------------");//2、迭代器遍歷Iterator<String> iterator = list.iterator();while (iterator.hasNext()){System.out.println(iterator.next());}System.out.println("--------------------");//3、增強for循環for (String s : list){System.out.println(s);}System.out.println("--------------------");//4、foreach方法list.forEach(item -> System.out.println(item));System.out.println("--------------------");//5、ListIterator(List集合特有的迭代器)ListIterator<String> listIterator = list.listIterator();while (listIterator.hasNext()){System.out.println(listIterator.next());}//上述ListIterator遍歷和正常的一樣,不一樣的是可以倒敘遍歷,同時增加了add()方法while (listIterator.hasPrevious()){System.out.println(listIterator.previous());}}
}

注意:在遍歷過程中做刪除、增加操作,可能會發生并發修改異常。
在這里插入圖片描述
在這里插入圖片描述

package com.itheima.collection.list;import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;/*** Title: ListDemo3* Describe: 類的功能* Name: masizhou* Date: 2024/7/13* Copyright: @2022 by masizhou*/public class ListDemo3 {/*** 在遍歷過程中,如果有添加、刪除元素操作時,會出現并發修改異常:ConcurrentModificationException* 【場景】:使用[迭代器]遍歷集合的過程中,調用了[集合對象]的添加,刪除方法,機會出現此異常* 【解決方案】:迭代器的遍歷過程中,不允許使用集合對象的添加或刪除,那就是用迭代器,自己的添加或刪除方法*              刪除方法:普通的迭代器有*              添加方法:普通的迭代器沒有,需要使用list集合特有的迭代器**/public static void main(String[] args) {List<String> list = new ArrayList<>();list.add("aaa");list.add("bbb");list.add("ccc");list.add("ddd");/*下面代碼使用的是增強for循環,其實底層也是使用迭代器的方法,但這個時候增加和刪除只能拿到集合的方法,沒法使用迭代器的方法【解決方法】:手寫迭代器進行遍歷---這就是為啥手寫迭代器遍歷雖然麻煩,但是有特定使用的場景*/
//        for (String s : list){
//            list.remove("bbb");
//        }ListIterator<String> listIterator = list.listIterator();while (listIterator.hasNext()){String s = listIterator.next();if ("aaa".equals(s)){listIterator.remove();listIterator.add("我是增加的元素");}}System.out.println(list);//[我是增加的元素, bbb, ccc, ddd]}
}

注意:
(1)我們在寫代碼,在遍歷過程中需要對一個集合做增加或者刪除操作時,一般會放在一個新的集合中,避免索引亂了的問題而導致空指針。
(2)但是為了節省內存,就是要操作原集合,那就使用迭代器的遍歷方法,然后用迭代器的add和remove方法做增加和刪除操作就可以解決這個問題。

2.4 數據結構

在這里插入圖片描述

2.4.1 棧和隊列

在這里插入圖片描述

2.4.2 數組

在這里插入圖片描述

2.4.3 鏈表

在這里插入圖片描述

在這里插入圖片描述

在這里插入圖片描述

2.4.4 總結

在這里插入圖片描述

2.5 ArrayList類和LinkedList類

2.5.1 ArrayList類:

在這里插入圖片描述

package com.itheima.collection.list;
import java.util.ArrayList;
import java.util.List;public class ListDemo3 {public static void main(String[] args) {List<String> list = new ArrayList<>();//多態list.add("aaa");list.add("bbb");System.out.println(list);}
}
(1)ArrayList長度可變原理:

在這里插入圖片描述

注意:
在這里插入圖片描述
在這里插入圖片描述

在這里插入圖片描述

2.5.2 LinkedList類:

在這里插入圖片描述

package com.itheima.collection.list;
import java.util.LinkedList;
import java.util.List;public class ListDemo4 {/*** LinkedList特有方法:*     public void addFirst(E e):頭部添加*     public void addLast(E e):尾部添加*     public E getFirst():獲取第一個*     public E getLast():獲取最后一個*     public E removeFirst():刪除第一個*     public E removeLast():刪除最后一個**/public static void main(String[] args) {LinkedList<String> linkedList = new LinkedList<>();linkedList.add("張三");linkedList.add("李四");linkedList.add("王五");//1、addFirst(E e):頭部添加linkedList.addFirst("瑪爾");System.out.println(linkedList);//[瑪爾, 張三, 李四, 王五]//2、addLast(E e):尾部添加linkedList.addLast("馬六");System.out.println(linkedList);//[瑪爾, 張三, 李四, 王五, 馬六]//3、getFirst():獲取第一個System.out.println(linkedList.getFirst());//瑪爾//4、getLast():獲取最后一個System.out.println(linkedList.getLast());//馬六//5、removeFirst():刪除第一個LinkedList<String> l1 = new LinkedList<>();l1.add("aaa");l1.add("bbb");l1.add("ccc");l1.add("ddd");//l1 = [aaa, bbb, ccc, ddd]l1.removeFirst();System.out.println(l1);//[bbb, ccc, ddd]//6、removeLast():刪除最后一個LinkedList<String> l2 = new LinkedList<>();l2.add("aaa");l2.add("bbb");l2.add("ccc");l2.add("ddd");//l2 = [aaa, bbb, ccc, ddd]l2.removeLast();System.out.println(l2);//[aaa, bbb, ccc]}
}

在這里插入圖片描述

在這里插入圖片描述
答:實際上就是從頭或者從尾部開始遍歷查找:

  • 如果索引比集合長度的一半小,則從頭找;
  • 如果索引比集合長度的一半大,則從尾找;

注意!!!
注意!!!
注意!!!
雙列集合在Day10里。。。

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

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

相關文章

排序——交換排序

在上篇文章我們詳細介紹了排序的概念與插入排序&#xff0c;大家可以通過下面這個鏈接去看&#xff1a; 排序的概念及插入排序 這篇文章就介紹一下一種排序方式&#xff1a;交換排序。 一&#xff0c;交換排序 基本思想&#xff1a;兩兩比較&#xff0c;如果發生逆序則交換…

jenkins系列-09.jpom構建java docker harbor

本地先啟動jpom server agent: /Users/jelex/Documents/work/jpom-2.10.40/server-2.10.40-release/bin jelexjelexxudeMacBook-Pro bin % sh Server.sh start/Users/jelex/Documents/work/jpom-2.10.40/agent-2.10.40-release/bin jelexjelexxudeMacBook-Pro bin % ./Agent.…

達夢數據庫的系統視圖v$sessions

達夢數據庫的系統視圖v$sessions 達夢數據庫&#xff08;DM Database&#xff09;是中國的一款國產數據庫管理系統&#xff0c;它提供了類似于Oracle的系統視圖來監控和管理數據庫。V$SESSIONS 是達夢數據庫中的一個系統視圖&#xff0c;用于顯示當前數據庫會話的信息。 以下…

全自主巡航無人機項目思路:STM32/PX4 + ROS + AI 實現從傳感融合到智能規劃的端到端解決方案

1. 項目概述 本項目旨在設計并實現一款高度自主的自動巡航無人機系統。該系統能夠按照預設路徑自主飛行&#xff0c;完成各種巡航任務&#xff0c;如電力巡線、森林防火、邊境巡邏和災害監測等。 1.1 系統特點 基于STM32F4和PX4的高性能嵌入式飛控系統多傳感器融合技術實現精…

MYSQL--第八次作業

MYSQL–第八次作業 一、備份與恢復 環境搭建&#xff1a; CREATE DATABASE booksDB; use booksDB;CREATE TABLE books ( bk_id INT NOT NULL PRIMARY KEY, bk_title VARCHAR(50) NOT NULL, copyright YEAR NOT NULL );CREATE TABLE authors ( auth_id INT NOT NULL PRI…

geoServer在windows中下載安裝部署詳細操作教程

這里寫目錄標題 1.安裝環境檢查2.下載安裝包&#xff08;1&#xff09;進入下載地址&#xff1a;&#xff08;2&#xff09;以下載最新版為例&#xff0c;點擊“Stable GeoServer”下載&#xff08;3&#xff09;安裝有兩種方式&#xff08;4&#xff09;我這里選擇下載war包 3…

python作業三

1.使用requests模塊獲取這個json文件http://java-api.super-yx.com/html/hello.json 2.將獲取到的json轉為dict 3.將dict保存為hello.json文件 4.用io流寫一個copy(src,dst)函數,復制hello.json到C:\hello.json import json import shutilimport requests #使用requests模塊獲…

Qt MV架構-視圖類

一、基本概念 在MV架構中&#xff0c;視圖包含了模型中的數據項&#xff0c;并將它們呈現給用戶。數據項的表示方法&#xff0c;可能和數據項在存儲時用的數據結構完全不同。 這種內容與表現分離之所以能夠實現&#xff0c;是因為使用了 QAbstractItemModel提供的一個標準模…

`nmap`模塊是一個用于與Nmap安全掃描器交互的庫

在Python中&#xff0c;nmap模塊是一個用于與Nmap安全掃描器交互的庫。Nmap&#xff08;Network Mapper&#xff09;是一個開源工具&#xff0c;用于發現網絡上的設備和服務。雖然Python的nmap模塊可能不是官方的Nmap庫&#xff08;因為Nmap本身是用C/C編寫的&#xff09;&…

基于JavaSpringBoot+Vue+uniapp微信小程序校園宿舍管理系統設計與實現

基于JavaSpringBootVueuniapp微信小程序實現校園宿舍管理系統設計與實現 目錄 第一章 緒論 1.1 研究背景 1.2 研究現狀 1.3 研究內容 第二章 相關技術介紹 2.1 Java語言 2.2 HTML網頁技術 2.3 MySQL數據庫 2.4 Springboot 框架介紹 2.5 VueJS介紹 2.6 ElementUI介紹…

視頻轉換、提取音頻、視頻加水印、視頻去水印、音頻轉換、分割合并壓縮等,批量還幾乎免費

「想轉就轉視頻音頻助手」免費版來襲&#xff01; 在數字化時代&#xff0c;視頻和音頻處理已成為我們日常生活的一部分。無論是制作個人視頻博客、編輯家庭影片&#xff0c;還是處理音頻文件&#xff0c;我們都在尋找一個強大而易于使用的解決方案。今天&#xff0c;我要向您…

基于大語言模型(LLM)的合成數據生成、策展和評估的綜述

節前&#xff0c;我們星球組織了一場算法崗技術&面試討論會&#xff0c;邀請了一些互聯網大廠朋友、參加社招和校招面試的同學。 針對算法崗技術趨勢、大模型落地項目經驗分享、新手如何入門算法崗、該如何準備、面試常考點分享等熱門話題進行了深入的討論。 合集&#x…

【JVM實戰篇】內存調優:內存泄露危害+內存監控工具介紹+內存泄露原因介紹

文章目錄 內存調優內存溢出和內存泄漏內存泄露帶來什么問題內存泄露案例演示內存泄漏的常見場景場景一場景二 解決內存溢出的方法常用內存監控工具Top命令優缺點 VisualVM軟件、插件優缺點監控本地Java進程監控服務器的Java進程&#xff08;生產環境不推薦使用&#xff09; Art…

【圖解大數據技術】流式計算:Spark Streaming、Flink

【圖解大數據技術】流式計算&#xff1a;Spark Streaming、Flink 批處理 VS 流式計算Spark StreamingFlinkFlink簡介Flink入門案例Streaming Dataflow Flink架構Flink任務調度與執行task slot 和 task EventTime、Windows、WatermarksEventTimeWindowsWatermarks 批處理 VS 流式…

如何查找電腦的MAC地址

一. 什么是mac地址&#xff1f; mac地址本質上幫助我們連接到我們遇到的大多數本地網絡。每個網絡適配器通常由網絡接口??控制器(NIC) 制造商分配一個唯一的 mac 地址。 二. 如何查找mac地址 1.點擊網絡和Internet設置 2.點擊WLAN點擊硬件屬性 3.即可查看mac地址

智慧城市3d數據可視化系統提升信息匯報的時效和精準度

在信息大爆炸的時代&#xff0c;數據的力量無可估量。而如何將這些數據以直觀、高效的方式呈現出來&#xff0c;成為了一個亟待解決的問題。為此&#xff0c;我們推出了全新的3D可視化數據大屏系統&#xff0c;讓數據“躍然屏上”&#xff0c;助力您洞察先機&#xff0c;決勝千…

從零開始實現大語言模型(五):縮放點積注意力機制

1. 前言 縮放點積注意力機制(scaled dot-product attention)是OpenAI的GPT系列大語言模型所使用的多頭注意力機制(multi-head attention)的核心,其目標與前文所述簡單自注意力機制完全相同,即輸入向量序列 x 1 , x 2 , ? ? , x n x_1, x_2, \cdots, x_n x

pytorch訓練的時候 shm共享內存不足,導致訓練停止

1.查看shm情況 df -h /dev/shm內存已經滿了&#xff0c;因為之前訓練多次訓練意外停止到shm中的緩存不能及時被清理 2、手動清理shm 依然沒被釋放 3、查看關聯的進程&#xff0c;一個一個kill lsof |grep deletedkill -9 46619 44618 44617 。。。。。4、搞定

Spring @Scheduled學習

一. Jdk中的定時任務 我們平時在 Spring 項目中會使用 Scheduled 開啟定時任務&#xff1b; jdk 中其實也提供了定時任務線程池 ScheduledThreadPool&#xff0c;我們可以直接通過 Executors 工具類獲取&#xff1b; // 創建了核心線程數為 2 的 ScheduledThreadPool 對象 S…

ROS2 + 科大訊飛 初步實現機器人語音控制

環境配置&#xff1a; 電腦端&#xff1a; ubuntu22.04實體機作為上位機 ROS版本&#xff1a;ros2-humble 實體機器人&#xff1a; STM32 思嵐A1激光雷達 科大訊飛語音SDK 訊飛開放平臺-以語音交互為核心的人工智能開放平臺 實現步驟&#xff1a; 1. 下載和處理科大訊飛語音模…