主頁 >  其他 > Java 集合類詳解(一)

Java 集合類詳解(一)

2023-05-31 08:17:43 其他

為什么要使用集合

存盤多個資料可以使用陣列,但由于陣列在記憶體中是連續存盤的,所以會有一些限制,比如陣列在創建時就要指定長度,即可以容納的元素個數,且指定后無法更改;陣列在創建時需要指定元素的型別,并且所有元素都必須是該型別或其子類;添加或洗掉陣列中的元素需要創建一個新陣列再進行元素復制,比較麻煩,下面是 Person 陣列擴容的示意代碼,

// 給 people1 陣列末尾添加一個元素
public class PersonArray {
    public static void main(String[] args) {
        Person[] people1 = new Person[1];
        people1[0] = new Person();

        // 創建新陣列
        Person[] people2 = new Person[people1.length + 1];
        // 復制 people1 陣列的元素到 people2
        for (int i = 0; i < people1.length; i++) {
            people2[i] = people1[i];
        }
        // 添加新元素
        people2[people2.length - 1] = new Person();
    }
}

陣列可以通過索引快速訪問和操作元素,在許多場景下仍然是非常有用的,但如果需要動態調整大小或保存不同型別的元素,則可以考慮使用集合類來代替陣列,集合類還提供了一系列增加、洗掉、修改和查找元素的方法,集合框架中還提供了多種優化和封裝好的實作類,通過使用合適的集合類可以更高效地組織和操作資料,

集合框架體系

Java 的集合類很多,主要有CollectionMap兩個介面,層次關系如下圖,


Collection介面有ListSet這兩個重要的子介面,它們的實作子類都是單列集合,其中List介面表示有序的、可以包含重復元素的集合,常見的實作類有ArrayListLinkedListVectorSet介面表示無序的且不包含重復元素的集合,常見的實作類有HashSetTreeSetLinkedHashSet

Map介面實作子類是雙列集合,表示一組鍵值對的映射,其中每個鍵都是唯一的,常見的實作類有HashMapHashtableProperties

public class AddElements() {
  public static void main(String[] args) {
    ArrayList<Object> list = new ArrayList<>();
    list.add("黃蓉");
    list.add("郭靖");

    HashMap hashMap = new HashMap();
    hashMap.put("001", "黃蓉");
    hashMap.put("002", "郭靖");
  }
}

Collection 介面和常用方法

Collection 介面實作類的特點

Collection實作類(通常通過其中一個子介面間接實作Collection)可以存放多個 Object 型別的元素,有些Collection介面的實作類可以存放重復的元素,有些則不可以,有些Collection介面的實作類是有序的(List),有些是無序的(Set),Collection介面沒有直接實作類,提供了更具體的子介面(如SetList )的實作,

所有通用的Collection實作類都會提供兩個"標準"構造方法:一個無參構造方法,來創建一個空的集合,以及一個帶有單個Collection型別引數的構造方法,創建一個與引數集合具有相同元素的新集合,實際上,后一種構造方法可以復制任何集合,生成一個與引數集合元素相同的所需型別的集合,

public class CollectionMethod() {
  public static void main(String[] args) {
    ArrayList list = new ArrayList();
    list.add(1);
    list.add(2);
    list.add(3);
    System.out.println(list);// [1, 2, 3]

    Vector<Object> vector = new Vector<>(list);
    System.out.println(vector);// [1, 2, 3]
  }
}

Collection 介面常用方法

下面的代碼以其間接實作類ArrayList演示Collection介面的常用方法,

public class CollectionMethod() {
  public static void main(String[] args) {
    Collection collection = new ArrayList<>();
    
    // boolean add(E e)
    // 給集合中添加指定的元素,添加成功則回傳 true,
    // 如果此集合不允許重復元素并且已經包含了指定的元素,則回傳 false,
    // 支持此操作的實作類可能會對添加到該集合中的元素進行限制,
    // 如果一個集合拒絕添加某個特定元素的原因不是因為集合已經包含該元素,
    // 會拋出一個例外(而不是回傳 false),
    collection.add("hello");
    collection.add(10);
    collection.add(true);
    // 下面一條陳述句執行后輸出:collection = [hello, 10, true]
    System.out.println("collection = " + collection);
    
    // boolean remove(Object o)
    // 從集合中移除指定元素的一個實體,如果集合包含多個滿足
    // (o==null ? e==null : o.equals(e))條件的元素 e,
    // 則移除第一個元素 e,移除完成后回傳 true,
    collection.remove("hello");
    // 下面一條陳述句執行后輸出:collection = [10, true]
		System.out.println("collection = " + collection);
    
    // boolean contains(Object o)
    // 如果此集合包含指定元素,則回傳 true,更準確地說,當且僅當此集合包含至少
    // 一個滿足(o==null ? e==null : o.equals(e))條件的元素 e 時,回傳 true,
    System.out.println(collection.contains(10));// true
    
    // int size()
    // 回傳此集合中的元素數量,
    System.out.println(collection.size());// 2
    
    // boolean isEmpty()
    // 判斷集合是否為空,
    System.out.println(collection.isEmpty());// false
    
    // void clear()
    // 清空集合中的元素,
    collection.clear();
    // 下面一條陳述句執行后輸出:collection = []
    System.out.println("collection = " + collection);
    
    // boolean addAll(Collection<? extends E> c)
    // 將指定集合中的所有元素添加到此集合中,
    Collection collection1 = new ArrayList();
    collection1.add("Mary");
    collection1.add("Luck");
    collection.addAll(collection1);
    // 下面一條陳述句執行后輸出:collection = [Mary, Luck]
    System.out.println("collection = " + collection);
   
    // boolean containsAll(Collection<?> c)
    // 判斷此集合是否包含指定集合中的所有元素
    System.out.println(collection.containsAll(collection1));// true

    // boolean removeAll(Collection<?> c)
    // 從此集合中移除與指定集合中相同的所有元素,
    // 在此呼叫回傳后,此集合將不包含與指定集合共有的任何元素,
    collection.add("King");
    collection.removeAll(collection1);
    // 下面一條陳述句執行后輸出:collection = [King]
    System.out.println("collection = " + collection);
  }
}

Collection 介面如何遍歷元素

使用 Iterator(迭代器)

Iterator介面是集合的迭代器,主要用于遍歷Collection集合中的元素,所有實作了Collection介面的實作類,都有一個iterator()方法,用以回傳一個實作了Iterator介面的物件,即可以回傳一個迭代器,

Iterator介面的方法:

// 判斷是否還有下一個元素
boolean hasNext()
  
// 回傳集合中的下一個元素
E next()

// 從底層集合中移除此迭代器回傳的最后一個元素,每次呼叫 next() 只能呼叫此方法一次,
// 如果在呼叫此方法之前尚未呼叫過 next() 方法,或者在最后一次呼叫 next() 方法之后
// 已經呼叫了過一次 remove() 方法,則拋出 IllegalStateException 例外,
default void remove() 

// 對剩余的每個元素執行給定的操作,直到所有元素被處理完或操作拋出例外為止,
default void forEachRemaining(Consumer<? super E> action)

迭代器的使用示例代碼:

public class CollectionIterateor() {
  public static void main(String[] args) {
    Collection col = new ArrayList();
    col.add("紅樓夢");
    col.add("西游記");
    col.add("三國演義");
    col.add("水滸傳");

    // 遍歷 col 集合
    // 先獲得 col 對應的迭代器
    Iterator iterator = col.iterator();
    // 使用 while 回圈遍歷
    while (iterator.hasNext()) {// 判斷是否還有元素
      Object obj = iterator.next(); // 回傳下一個元素,型別是 Object
      System.out.println("obj = " + obj);
    }
    
    // 當退出 while 回圈后,iterator 迭代器指向最后一個元素
    // 此時再呼叫 next() 會拋出 NoSuchElementException 例外
    // iterator.next();
    
    // 如果需要再次遍歷,需要重制迭代器
    System.out.println("===第二次遍歷===");
    iterator = col.iterator();
    while (iterator.hasNext()) {
      Object obj = iterator.next();
      System.out.println("obj = " + obj);
    }
  }
}

由于當迭代器中不存在下一個元素時,直接呼叫 iterator.next() 方法會拋出 NoSuchElementException 例外,所以呼叫 iterator.next() 方法之前需要呼叫 iterator.hasNext() 方法,

增強 for 回圈

增強 for 回圈是簡化版的 iterator,本質一樣,只能用來遍歷集合或陣列,基本語法如下:

for(元素型別 元素名 : 集合名或陣列名){
	訪問元素;
}
public class EnhancedFor() {
  public static void main(String[] args) {
    Collection collection = new ArrayList();

    collection.add("mary");
    collection.add(true);
    collection.add(10);

    for (Object o : collection) {
      System.out.println("o = " + o);
    }
  }
}

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/553842.html

標籤:其他

上一篇:詳解RocketMQ 順序消費機制

下一篇:返回列表

標籤雲
其他(160006) Python(38189) JavaScript(25464) Java(18161) C(15234) 區塊鏈(8268) C#(7972) AI(7469) 爪哇(7425) MySQL(7217) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5873) 数组(5741) R(5409) Linux(5344) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4579) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2434) ASP.NET(2403) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) .NET技术(1977) 功能(1967) Web開發(1951) HtmlCss(1950) C++(1927) python-3.x(1918) 弹簧靴(1913) xml(1889) PostgreSQL(1878) .NETCore(1862) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • Java 集合類詳解(一)

    ## 為什么要使用集合 存盤多個資料可以使用陣列,但由于陣列在記憶體中是連續存盤的,所以會有一些限制。比如陣列在創建時就要指定長度,即可以容納的元素個數,且指定后無法更改;陣列在創建時需要指定元素的型別,并且所有元素都必須是該型別或其子類;添加或洗掉陣列中的元素需要創建一個新陣列再進行元素復制,比較麻 ......

    uj5u.com 2023-05-31 08:17:43 more
  • 詳解RocketMQ 順序消費機制

    摘要:順序訊息是指對于一個指定的 Topic ,訊息嚴格按照先進先出(FIFO)的原則進行訊息發布和消費,即先發布的訊息先消費,后發布的訊息后消費。 本文分享自華為云社區《RocketMQ 順序消費機制》,作者: 勇哥java實戰分享 。 順序訊息是指對于一個指定的 Topic ,訊息嚴格按照先進先 ......

    uj5u.com 2023-05-31 08:17:16 more
  • 直播原始碼平臺搭建技術分享之直播短信功能

    在利用直播原始碼去開發平臺中,直播原始碼功能技術是開發直播平臺的重要技術之一,今天我就為大家分享直播原始碼平臺搭建技術分享直播短信功能實作。 ......

    uj5u.com 2023-05-31 08:16:52 more
  • 5年測驗工程師經歷,下一步轉開發還是繼續測驗?

    測驗五年,沒有積累編程腳本能力和自動化經驗,找作業時都要求語言能力,自動化框架。
    感覺開發同事積累的經歷容易找作業。
    下一步,想辦法轉開發崗還是繼續測驗???
    正常情況下,有了四年的測驗工程師經歷,應該可以達到中級測驗工程師的水平了。作為一個初中級測驗工程師下一步是轉開發還是繼續做測驗,個人建議是做... ......

    uj5u.com 2023-05-31 08:16:12 more
  • 安全測驗實踐-萬家APP越權邏輯漏洞挖掘

    邏輯漏洞會導致業務面臨著巨大的經濟損失隱患與敏感資料泄露的風險,本文從安全測驗的角度,以越權邏輯漏洞為例,介紹邏輯漏洞的挖掘方法和實踐程序。 ......

    uj5u.com 2023-05-31 08:16:00 more
  • OWASP移動應用安全測驗指南中文版

    OWASP移動應用安全測驗指南(MASTG)是OWASP移動應用安全(MAS)旗艦專案的一部分,是一本涵蓋移動應用安全分析程序、技術和工具的綜合手冊,也是一套詳盡的測驗案例,用于驗證OWASP移動應用安全驗證標準(MASVS)中列出的要求,為完整和一致的安全測驗提供一個基線。 OWASP MASVS ......

    uj5u.com 2023-05-31 08:15:44 more
  • Kali滲透Windows服務器

    這個實驗主要讓我們學習漏洞掃描技識訓本原理,了解其在網路攻防中的作用,掌握使用Kali中的Metasploit對目標主機滲透,并根據報告做出相應的防護措施。 ......

    uj5u.com 2023-05-31 08:15:20 more
  • 輔助測驗和研發人員的一款小插件【資料安全】

    ## 一、為什么要做一款這樣的小插件 資料,一直在思考如何讓資料更安全的流轉和服務于客戶,圍繞這樣的想法,我們做過許多方面的擴展。我們落地了服務端的資料切片支持場景化的設計,實作了基于JDBC協議對SQL的攔截與切片,實作了在應用層的全鏈路資料庫審計方案和實作,實作了WEB端明暗水印和檔案水印等等, ......

    uj5u.com 2023-05-31 08:15:03 more
  • 【智能軟體安全】上海道寧為您帶來智能軟體安全平臺——?Veracod

    Veracode可以全面地 保護您構建和管理地應用程式 在現代軟體 開發生命周期的 每個階段不斷發現并修復缺陷 Veracode通過 建立一種在安全和開發團隊之間 架起橋梁并授權 開發人員成為 安全倡導者的積極文化 從一開始就防止常見的安全漏洞 開發商介紹 Veracode成立于2006年,起初是一 ......

    uj5u.com 2023-05-31 08:14:50 more
  • 隱私合規相關法律法規合集

    01中華人民共和國網路安全法(全文)201611.pdf 02資訊安全技術 個人資訊安全規范GB:T 35273—2017.pdf 03開展App違法違規收集使用個人資訊專項治理-中共中央網路安全和資訊化委員會辦公室201901.pdf 04App違法違規收集使用個人資訊自評估指南201903.pd ......

    uj5u.com 2023-05-31 08:14:38 more