Java第十四幕集合啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦

集合

1 Collection接口

1.1 集合概述

集合是一個裝對象的容器。集合中只能存放引用數據類型的對象。集合中有一些大小是固定的,有一些是不固定的。有一些是有序的,有些是無序的。

有些可以有重復元素,有一些不可以有重復元素

1.2 集合常用方法

public static void main(String[] args) {// 創建集合對象Collection<String> coll = new ArrayList<>();// 添加元素coll.add("吳京");coll.add("王源");coll.add("丁真");coll.add("迪麗熱巴");coll.add("劉浩存");coll.add("田曉威");// 清空集合
// ? ? ?  coll.clear();boolean contains = coll.contains("劉浩存");System.out.println(contains);// 判斷集合是否為空boolean empty = coll.isEmpty();System.out.println(empty);// 移除指定的元素boolean remove = coll.remove("田曉威");System.out.println(remove);// 獲取集合的實際元素個數int size = coll.size();System.out.println(size);// 把集合轉換成數組String[] array = coll.toArray(new String[0]);for (String o : array) {System.out.println(o);}System.out.println(coll);}

1.3 List接口

1.3.1 List接口的特點

  • 有序的集合

  • 方法具有索引

  • 允許重復的元素

1.3.2 List接口帶有索引的方法

public static void main(String[] args) {List<String> list = new ArrayList<>();list.add("郭靖");list.add("洪七公");list.add("黃蓉");list.add("歐陽鋒");list.add("歐陽克");list.add("黃蓉");// 插入元素list.add(3,"黃藥師");list.add(6,"周伯通");// IndexOutOfBoundsException: 索引越界// ? ?  ArrayIndexOutOfBoundsException: 數組越界
// ? ? ? ? ? ?  StringIndexOutOfBoundsException: 字符串越界
// ? ? ?  list.add(9,"王重陽");list.add("黃蓉");// 獲取指定索引處的元素String s = list.get(4);System.out.println(s);// 獲取指定元素首次出現的索引  找不到返回-1int index = list.indexOf("楊過");System.out.println(index);// 獲取指定元素最后一次出現的索引  找不到返回-1int indexOf = list.lastIndexOf("黃蓉");System.out.println(indexOf);// 刪除指定索引處的元素String remove = list.remove(5);System.out.println(remove);// 替換指定索引處的元素String set = list.set(6, "楊康");System.out.println(set);// 截取子列表 ? 包頭不包尾List<String> strings = list.subList(2, 6);System.out.println(strings);System.out.println(list);}

1.3.3 ArrayList的特點

  • 內部數據結構是數組

  • 內存是連續的,具有索引

  • 查詢速度相對快

  • 增刪速度相對慢

  • 異步線程不安全的集合

  • 可以存放null

  • 默認無參構造的初始容量是0

  • 默認的初始容量是10

  • 擴容是原來容量 + 原來容量 / 2

public static void main(String[] args) {ArrayList<String> arrayList = new ArrayList<>(14);arrayList.add("阿珍");// 把ArrayList長度變成實際元素個數的長度arrayList.trimToSize();}

1.3.4 實現ArrayList練習

package cn.javasm.demo;
?
import java.util.Arrays;
import java.util.Objects;
?
/*** 模擬實現ArrayList*/
public class ArrayListDemo {// 存儲數據的數組private String[] data;// 實際元素個數private int size;
?// 定義無參構造public ArrayListDemo(){// 默認長度是10data = new String[10];}
?// 定義有參構造,用戶可以根據參數選擇初始默認容量public ArrayListDemo(int len){if (len < 0) throw new IllegalArgumentException();data = new String[len];}
?// 添加元素public void add(String str){// 判斷是否需要擴容if (size >= data.length){grow();}data[size++] = str;}
?/*** 擴容數組*/private void grow() {if (data.length >= 1)data = Arrays.copyOf(data,data.length + (data.length >> 1));elsedata = Arrays.copyOf(data,data.length + 1);}
?// 插入元素方法public void add(int index,String str){// 判斷索引是否越界if (index < 0 || index > size) throw new IndexOutOfBoundsException("數組越界了");
?// 判斷是否需要擴容if (size >= data.length){grow();}
?// 插入元素其實就是將數據向后挪動一位,然后騰出來的那一位賦值為要插入的數據// 方式一:
// ? ? ?  for (int i = size - 1;i >= index;i--){
// ? ? ? ? ?  data[i + 1] = data[i];
// ? ? ?  }// 方式二:System.arraycopy(data,index,data,index + 1,size - index);
?data[index] = str;// 實際元素+1size++;}
?/*** 刪除指定索引處的元素* @param index*/public void remove(int index){// 判斷索引是否越界out(index);
?// 刪除元素就是將后面的元素依次向前移動一位// 方式一:
// ? ? ?  for (int i = index;i < size - 1;i++){
// ? ? ? ? ?  data[i] = data[i + 1];
// ? ? ?  }// 方式二:System.arraycopy(data,index + 1, data,index,size - index - 1);
?// 實際元素個數-1size--;}
?private void out(int index) {if (index >= size || index < 0) throw new IndexOutOfBoundsException();}
?/*** 查找指定元素首次出現的索引,找不到返回-1*/public int indexOf(String str){for (int i = 0; i < size; i++) {
// ? ? ? ? ?  if (str == data[i] || str != null && str.equals(data[i])){
// ? ? ? ? ? ? ?  return i;
// ? ? ? ? ?  }if (Objects.equals(str,data[i])){return i;}}return -1;}
?
?/*** 刪除指定元素*/public void remove(String str){// 查找str首次出現的位置int index = indexOf(str);if (index != -1) remove(index);}
?/*** 清空集合*/public void clear(){data = new String[10];size = 0;}
?/*** 判斷是否包含某個元素*/public boolean contains(String str){return indexOf(str) != -1;}
?/*** 獲取指定索引處的元素*/public String get(int index){// 判斷是否越界out(index);return data[index];}
?/*** 判斷集合是否為空*/public boolean isEmpty(){return size == 0;}
?/*** 替換元素*/public void set(int index,String str){out(index);data[index] = str;}/*** 獲取元素個數*/public int size(){return size;}
?/*** 截取子列表* @return*/public ArrayListDemo sublist(int fromIndex,int toIndex){// 判斷索引是否越界out(fromIndex);out(toIndex);
?// 判斷參數是否合法if (fromIndex > toIndex) throw new IllegalArgumentException();
?// 創建新的列表ArrayListDemo sublist = new ArrayListDemo(toIndex - fromIndex);// 拷貝數據System.arraycopy(data,fromIndex,sublist.data,0,toIndex - fromIndex);// 設置實際元素個數sublist.size = toIndex - fromIndex;return sublist;}
?// [元素1, 元素2, 元素3]@Overridepublic String toString() {StringBuilder stringBuilder = new StringBuilder();stringBuilder.append("[");for (int i = 0; i < size; i++) {if (i != size - 1){stringBuilder.append(data[i]).append(", ");}else {stringBuilder.append(data[i]);}}stringBuilder.append("]");return stringBuilder.toString();
?}
}

1.3.5 LinkedList的特點

  • 底層數據結構是雙向鏈表

  • 內存是不連續的

  • 增刪速度快

  • 查詢速度慢

  • 異步線程不安全的集合

1.3.6 實現LinkedList

package cn.javasm.demo;
?
import java.util.Objects;
?
public class LinkedListDemo {/*** 實際元素個數*/private int size;
?/*** 頭結點*/private Node first;
?/*** 尾結點*/private Node last;
?// 結點private class Node{// 數據String item;
?// 上一個結點Node prev;
?// 下一個結點Node next;
?public Node(String item, Node prev, Node next) {this.item = item;this.prev = prev;this.next = next;}}
?/*** 添加元素* @param str 數據*/public void add(String str){// 創建新結點Node node = new Node(str,null,null);// 添加元素分為兩種情況// 1.添加的是第一個結點  要求頭尾相同if (size == 0){this.first = node;}else {// 2.不是第一個結點this.last.next = node;node.prev = this.last;}this.last = node;size++;}
?/*** 插入元素* @param index  插入的索引* @param str ?  數據*/public void add(int index,String str){// 判斷索引是否越界if (index > size || index < 0) throw new IndexOutOfBoundsException();// 插入元素分為三種情況// 1.插入到尾部  2.插入到中間  3.插入到頭部// 插入到尾部就是添加元素if (index == size){add(str);return;}
?// 創建新結點Node node = new Node(str,null,null);if (index == 0){// 插入到頭部node.next = this.first;this.first.prev = node;this.first = node;}else {// 插入到中間
?// 先查詢要插入索引的元素Node no = getNode(index);no.prev.next = node;node.prev = no.prev;node.next = no;no.prev = node;}size++;}
?/*** 根據索引查找結點* @param index* @return*/private Node getNode(int index) {Node no = first;for (int i = 0; i < index; i++) {no = no.next;}return no;}
?/*** 刪除指定索引處的元素* @param index*/public void remove(int index){
?// 判斷索引是否越界out(index);
?// 刪除元素分為: 1.刪除頭結點  2.刪除尾結點  3.刪除中間結點if (index == 0){// 刪除頭結點this.first = this.first.next;this.first.prev = null;}else if (index == size - 1){//刪除尾結點this.last = this.last.prev;this.last.next = null;}else {// 刪除中間結點Node node = getNode(index);node.prev.next = node.next;node.next.prev = node.prev;}size--;}
?private void out(int index) {if (index >= size || index < 0) throw new IndexOutOfBoundsException();}
?/*** 查詢指定元素首次出現的索引* @param str  指定的元素* @return ? ? 索引*/public int indexOf(String str){// 獲取頭結點Node node = this.first;for (int i = 0; i < size; i++) {if (Objects.equals(str,node.item)){return i;}node = node.next;}return -1;}
?/*** 刪除指定元素的結點*/public void remove(String str){// 查找出現的索引int index = indexOf(str);if (index != -1) this.remove(index);}
?/*** 清空鏈表*/public void clear(){this.first = this.last = null;size = 0;}
?/*** 判斷是否包含指定的元素* @return*/public boolean contains(String str){return indexOf(str) != -1;}
?/*** 獲取元素* @return*/public String get(int index){//判斷是否越界out(index);return getNode(index).item;}
?/*** 判斷鏈表是否為空* @return*/public boolean isEmpty(){return size == 0;}
?/*** 替換元素* @return*/public void set(int index,String str){// 判斷是否越界out(index);getNode(index).item = str;}
?/*** 獲取元素個數* @return*/public int size(){return size;}
?/*** 截取子鏈表*/public LinkedListDemo sublist(int fromIndex,int toIndex){// 判斷是否越界out(fromIndex);out(toIndex);// 判斷參數是否合法if (fromIndex > toIndex) throw new IllegalArgumentException();
?// 創建新鏈表LinkedListDemo sublist = new LinkedListDemo();// 獲取開始的結點Node node = getNode(fromIndex);for (int i = fromIndex;i < toIndex;i++){sublist.add(node.item);node = node.next;}return sublist;}
?@Overridepublic String toString() {StringBuilder stringBuilder = new StringBuilder();stringBuilder.append("[");Node node = this.first;for (int i = 0; i < size; i++) {if (i != size - 1){stringBuilder.append(node.item).append(", ");}else {stringBuilder.append(node.item);}node = node.next;}stringBuilder.append("]");return stringBuilder.toString();}
?public Node getFirst() {return first;}
?public Node getLast() {return last;}
}
?

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

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

相關文章

硬件基礎:串口通信

數據傳輸方式&#xff08;按位傳輸方式&#xff09;并行通信通過多條數據線同時傳輸多個數據位&#xff0c;速度較快但成本高&#xff0c;抗干擾能力弱&#xff0c;適用于短距離通信&#xff0c;如早期的打印機接口。串行通信通過單條或少數數據線逐位傳輸數據&#xff0c;線路…

從Java全棧到云原生:一場技術深度對話

從Java全棧到云原生&#xff1a;一場技術深度對話 面試官與應聘者互動記錄 面試官&#xff1a;你好&#xff0c;歡迎來到我們的面試。先簡單介紹一下你自己吧。 應聘者&#xff1a;您好&#xff0c;我叫李明&#xff0c;28歲&#xff0c;碩士學歷&#xff0c;有5年Java全棧開發…

158-EEMD-HHT算法

158-EEMD-HHT#EMD #希爾伯特變換-&#xff08;Hilbert- Huang Transform&#xff0c;HHT&#xff09;#集合經驗模態分解 EEMD #時頻分析 #邊際譜代碼描述1、利用 集合經驗模態分解&#xff08;EEMD&#xff09;方法對信號進行分解&#xff0c;得到模態分量 IMF&#xff1b;2、計…

C#開發中的 token

C# 開發中的 Token 詳解 C# 開發中的 Token 詳解與示例 1. CancellationToken - 異步取消令牌 示例 1:基礎取消機制 示例 2:Web API 中的請求取消 2. JWT Token - 身份驗證令牌 示例 1:JWT Token 生成與驗證 示例 2:ASP.NET Core JWT 認證配置 3. Access Token - API 訪問令…

旅游安全急救實訓室助力應急處置技能實戰化

隨著旅游行業的快速發展&#xff0c;游客安全需求日益突出&#xff0c;應急處置能力已成為旅游服務人才的核心素養之一。在中職教育旅游服務與管理專業中&#xff0c;旅游安全急救實訓室作為關鍵教學場所&#xff0c;正發揮著不可替代的作用。一、旅游安全急救實訓室的建設背景…

分布式微服務--ZooKeeper的客戶端常用命令 Java API 操作

一、ZooKeeper 客戶端常用命令 1. 啟動與退出 bin/zkCli.sh -server 127.0.0.1:2181 # 連接客戶端 quit # 退出客戶端2. 節點操作 # 查看子節點 ls / ls -s / ls /app# 查看節點詳細信息 ls2 /app stat /app# 創建節點 create /node1 "…

PID控制技術深度剖析:從基礎原理到高級應用(六)

PID 控制技術深度剖析&#xff1a;從基礎原理到高級應用 最近在項目中有要開始進行PID的控制了&#xff0c;隔了很久沒有做PID控制的東西了&#xff0c;所以想正好借這個機會&#xff0c;溫習一下和PID有關的內容。 系列文章目錄 PID控制技術深度剖析&#xff1a;從基礎原理到…

PCL關鍵點提取

1. 核心概念:什么是關鍵點?為什么需要關鍵點? 關鍵詞:信息冗余、計算效率、突出特征 “想象一下,我們有一片密集的點云,包含幾十萬個點。如果我們直接在每個點上都計算像FPFH這樣的局部特征,計算量會非常大,極其耗時,而且很多點所處的區域(比如平坦的墻面)特征非常…

vcruntime140_1.dll缺失怎么辦?暗黑破壞神游戲vcruntime140_1.dll缺失的4個解決方法

你是否遇到過這樣的情況&#xff1a; 玩《暗黑破壞神》《英雄聯盟》《GTA5》的時候&#xff0c;游戲忽然閃退&#xff0c;彈窗提示&#xff1a; “無法啟動&#xff0c;因為計算機中丟失 vcruntime140_1.dll” 這不是某一個游戲的問題&#xff0c;而是 Windows 系統運行庫缺失…

遷移學習-ResNet

好的&#xff0c;我將為你撰寫一篇關于ResNet遷移學習的技術博客。以下是博客的主要內容&#xff1a;ResNet遷移學習&#xff1a;原理、實踐與效果深度解析1. 深度學習中遷移學習的重要性與ResNet的獨特價值遷移學習&#xff08;Transfer Learning&#xff09;是機器學習中一種…

極大似然估計與概率圖模型:統計建模的黃金組合

在數據驅動的時代&#xff0c;如何從海量信息中提取有價值的規律&#xff1f;統計建模提供了兩大核心工具&#xff1a;極大似然估計&#xff08;MLE&#xff09;幫助我們根據數據推斷模型參數&#xff0c;而概率圖模型&#xff08;PGM&#xff09;則通過圖形化語言描述變量間的…

解析豆科系統發育沖突原因

生命之樹是進化生物學的核心&#xff0c;但由于 不完全譜系排序&#xff08;ILS&#xff09;、雜交 和 多倍化 等復雜過程&#xff0c;解析深層且難解的系統發育關系仍然是一個挑戰。**豆科&#xff08;Leguminosae&#xff09;**這一物種豐富且生態多樣化家族的理解&#xff0…

從Java全棧到前端框架:一次真實的面試對話與技術解析

從Java全棧到前端框架&#xff1a;一次真實的面試對話與技術解析 在一次真實的面試中&#xff0c;一位擁有多年經驗的Java全棧開發工程師&#xff0c;被問及了多個涉及前后端技術棧的問題。他的回答既專業又自然&#xff0c;展現了扎實的技術功底和豐富的實戰經驗。 面試官&…

阿瓦隆 A1566HA 2U 480T礦機參數解析:性能與能效深入分析

在礦機行業&#xff0c;AvaLON是一個備受關注的品牌&#xff0c;尤其在比特幣&#xff08;BTC&#xff09;和比特幣現金&#xff08;BCH&#xff09;挖礦領域&#xff0c;憑借其強勁的算力和高效能效&#xff0c;在市場中占據了一席之地。本文將針對阿瓦隆 A1566HA 2U 480T礦機…

小迪安全v2023學習筆記(七十八講)—— 數據庫安全RedisCouchDBH2database未授權CVE

文章目錄前記服務攻防——第七十八天數據庫安全&Redis&CouchDB&H2database&未授權訪問&CVE漏洞前置知識復現環境服務判斷對象類別利用方法數據庫應用 - Redis-未授權訪問&CVE漏洞前置知識案例演示沙箱繞過RCE - CVE-2022-0543未授權訪問 - CNVD-2019-2…

HTML + CSS 創建圖片倒影的 5 種方法

HTML CSS 創建圖片倒影的 5 種方法 目標&#xff1a;掌握多種生成“圖片倒影 / Reflection”效果的實現思路&#xff0c;理解兼容性、性能差異與最佳實踐&#xff0c;方便在真實業務&#xff08;商品展示、相冊、登陸頁面視覺強化&#xff09;中安全使用。 總覽對比 方法核心…

一個文件被打開io流和不打卡 inode

1. 磁盤 最小基本單位 扇區 機器磁盤的io效率 &#xff08;讀和取&#xff09;2. 文件系統 對磁盤分區 &#xff0c;最小的文件單位塊組&#xff0c;快組內部已經劃分好區域&#xff0c;巴拉巴拉&#xff0c;總之&#xff0c;每次使用數據&#xff0c;以操作系統的處理都是塊級…

ThermoSeek:熱穩定蛋白數據庫

這篇論文提出了ThermoSeek&#xff0c;一個綜合性的網絡資源&#xff0c;用于分析來自嗜熱和嗜冷物種的蛋白質序列和結構。具體來說&#xff0c;數據收集&#xff1a;從美國國家生物技術信息中心&#xff08;NCBI&#xff09;的基因組數據庫中收集了物種的分類ID&#xff0c;并…

leetcode算法刷題的第二十七天

1.leetcode 56.合并區間 題目鏈接 class Solution { public:static bool cmp(const vector<int>& a,const vector<int>& b){return a[0]<b[0];}vector<vector<int>> merge(vector<vector<int>>& intervals) {vector<v…

解決 Apache/WAF SSL 證書鏈不完整導致的 PKIX path building failed 問題

文章目錄解決 Apache/WAF SSL 證書鏈不完整導致的 PKIX path building failed 問題為什么會出現證書鏈錯誤&#xff1f;常見場景直連服務器正常&#xff0c;但經過 WAF 出錯Windows/Linux 下證書文件說明引入 WAF 或其他中間層&#xff1a;解決方法方法一&#xff1a;單獨配置 …