【Java SE】Arrays類

參考筆記:

Java中Arrays類(操作數組的工具)_java arrays-CSDN博客

Java——Arrays 類詳解_java arrays類-CSDN博客


目錄

1.Arrays類簡介

2.Arrays.toString

2.1 使用示例

2.2 源碼

3. Arrays.copyOf?

3.1 使用示例

3.2 源碼

4.Arrays.sort

4.1 默認排序使用示例

4.2?定制排序使用實例

4.3 Arrays.sort使用的算法

5.Arrays.binarySearch

5.1 使用示例

5.2 源碼

6.Arrays.fill

6.1 使用示例

6.2 源碼

7. Arrays.equals

7.1 使用案例

7.2 源碼

8. Arrays.deepEquals

9.Arrays.asList

9.1 使用細節和案例


1.Arrays類簡介

①?Arrays 類是 Java 語言中用于操作數組的一個工具類,提供了多種靜態方法來處理數組,包括排序、搜索、填充、比較等操作

?Arrays 類位于 java.util.Arrays 中,該類所有的構造方法被設置為 private ,因此無法創建 Arrays 對象

Arrays 所有方法都是靜態的,可以直接通過 "Arrays.方法" 調用

2.Arrays.toString

Arrays.toString(...):返回任何類型數組的字符串形式

2.1 使用示例

import java.util.Arrays;
public class demo {public static void main(String[] args) {int[] arr = {1,2,3};System.out.println(Arrays.toString(arr));}
}

運行結果:

2.2 源碼

底層是重載了多個 toString 方法,這里以 String toString(int[ ] a) 為例

public static String toString(int[] a) {if (a == null){//判斷數組a是否為空,為空則返回字符串"null"return "null";}int iMax = a.length - 1;//數組a的最后一個元素索引if (iMax == -1){//如果iMax == -1,說明數組a的長度為0return "[]";}StringBuilder b = new StringBuilder();b.append('[');for (int i = 0; ; i++) {b.append(a[i]);//依次將數組的元素追加到字符串中if (i == iMax){//判斷是否為最終一個元素,如果是最后一個元素,則返回最終的字符串return b.append(']').toString();}b.append(", ");}
}

3. Arrays.copyOf?

Arrays.copyOf(type[ ] original,int newLength):拷貝任意類型數組,返回值是要拷貝的那個數組類型

original:??原數組

newLength:?指定新數組的長度

補充:也可以理解為從原數組 original 中復制 newLength 個元素到新數組中,如果 newLength 大于原數組的大小,則新數組中大于原數組大小的部分的元素都是類型默認值

3.1 使用示例

import java.util.Arrays;
public class demo {public static void main(String[] args) {int[] arr1 = {1,2,3,4};int arr1_len = arr1.length;int[] tmp1 = Arrays.copyOf(arr1,arr1_len); //指定tmp1數組的長度為arr1_len,并拷貝array數組并賦值到tmp1數組上System.out.println(tmp1.length);System.out.println(Arrays.toString(tmp1)); //打印tmp1數組,[1,2,3,4]System.out.println("-----------------------------");int[] arr2 = {4,5,6,7};int arr2_len = arr2.length;int[] tmp2 = Arrays.copyOf(arr2,2 * arr2_len); //指定tmp2數組的長度為2 * arr2_len,并拷貝array數組并賦值到tmp2數組上,System.out.println(tmp2.length);System.out.println(Arrays.toString(tmp2)); //打印tmp2數組,[4,5,6,7,0,0,0,0]System.out.println("-----------------------------");int[] arr3 = {9,10,11,12};int[] tmp3 = Arrays.copyOf(arr3,2);//指定tmp3數組的長度為2,則只會拷貝array數組的前2個元素到tmp3數組上System.out.println(tmp3.length);System.out.println(Arrays.toString(tmp3));//打印tmp3數組,[9,10]}
}

3.2 源碼

4.Arrays.sort

注:Arrays.sort 之前,最好先學一下關于 ComparableComparator 接口,可以看到我寫的另外一篇博客:【Java SE】Java比較器:Comparable、Comparator-CSDN博客

默認排序規則:

????????String:按照字符串中字符的 ASCII 值進行比較
????????Character:按照字符的 ASCII 值來進行比較
????????數值類型對應的包裝類以及 BigInteger、BigDecimal :按照它們對應的數值大小進行比較
????????Boolean:true 對應的包裝類實例大于 false 對應的包裝類實例
????????Date、Time等:后面的日期時間比前面的日期時間大

Arrays.sort(type[ ] a):對整個 a 數組進行默認排序

② Arrays.sort(type[ ] a,int fromIndex,int toIndex):a 數組索引在 [fromIndex,toIndex) 的元素進行默認排序

③ Arrays.sort( T[ ]? a,Comparator <? super T> c):指定比較器 Comparator,對整個 a 數組進行定制排序

④ Arrays.sort( T[ ]? a,int fromIndex,int toIndex,Comparator <? super T> c):指定比較器 Comparator,對 a 數組索引在 [fromIndex,toIndex) 的元素進行定制排序

4.1 默認排序使用示例

import java.util.Arrays;
public class demo {public static void main(String[] args) {//1:Arrays.sort(type[ ] a):int[] arr1 = {-1,10,300,4};Arrays.sort(arr1);//從小到大排序System.out.println(Arrays.toString(arr1));//[-1,4,10,300]//2:Arrays.sort(type[ ] a,int fromIndex,int toIndex):int[] arr2 = {100,10,5,1};Arrays.sort(arr2,0,2);System.out.println(Arrays.toString(arr2));//[10,100,5,1]}
}

4.2?定制排序使用實例

import java.util.Arrays;
import java.util.Comparator;public class demo {public static void main(String[] args) {//方式1.使用匿名內部類傳入比較器 Comparator 接口Integer[] arr = {-1,100,4444,23};System.out.println("arr降序排序前:"+Arrays.toString(arr));//對arr實現降序排序Arrays.sort(arr, new Comparator<Integer>() {@Overridepublic int compare(Integer o1, Integer o2) {if(o1 > o2){return -1;//返回任何小于0的整數都可以}return 1;//返回任何大于0的整數都可以}});System.out.println("arr降序排序后:"+Arrays.toString(arr));//[4444,100,23,-1]System.out.println("--------------------------------");//方式2.定制比較器類實現 Comparator 接口StudentAgeComparator sc = new StudentAgeComparator();Student s1 = new Student("小馬", 55);Student s2 = new Student("蔡徐坤", 24);Student s3 = new Student("ftt", 17);Student s4 = new Student("jack", 30);Student[] personList  = {s1,s2,s3,s4};System.out.println("personList按年齡降序排序前:");Arrays.stream(personList).forEach(student -> System.out.println(student));//對personList數組按對象的年齡降序排序Arrays.sort(personList,sc);System.out.println("personList按年齡降序排序后:");Arrays.stream(personList).forEach(student -> System.out.println(student));}
}//定制比較器類,按學生的年齡降序排序
class StudentAgeComparator implements Comparator<Student>{@Overridepublic int compare(Student s1, Student s2) {if (s1.age > s2.age){return -1;}else if (s1.age < s2.age){return 1;}else {return 0;}}
}class Student{public String name;public int age;public Student(){}public Student(String name, int age) {this.name = name;this.age = age;}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", age=" + age +'}';}
}

運行結果

Debug追溯

這里以上面的代碼?Debug 一下看看 Arrays.sort 底層是如何用到我們指定的比較器 Comparator 來進行排序的,如下 GIF 所示:

可以看到,Arrays.sort 底層最終會調用?TimSort 類的 binarySort 方法,該方法中,

if (c.compare(pivot, a[mid]) < 0)right = mid;

c 即為我們傳入的比較器 StudentAgeComparator

4.3 Arrays.sort使用的算法

①?基本類型數組(如 int[ ], char[ ] 等):

對于基本數據類型數組,Arrays.sort( ) 方法使用了一種名為 Dual-Pivot Quicksort 的排序算法這是一種改進的快速排序算法,由 Vladimir Yaroslavskiy 提出。它在平均情況下具有 O(n log n) 的時間復雜度,在實踐中通常表現良好

② 引用類型數組(如 Integer[ ], String[ ] 等):

對于引用類型數組,Arrays.sort( ) 方法則使用 Timsort 算法。這是一種混合排序算法,結合了歸并排序和插入排序的優點。Timsort 是為了優化對部分有序數據的排序而設計的,具有 O(n log n) 的時間復雜度,在實際應用中表現出色

5.Arrays.binarySearch

Arrays.binarySearch為二分查找算法。在已排序的數組中查找指定的某個元素,返回在數組中的索引

① Arrays.binarySearch(type[ ] a,type key):在整個數組 a 中查找元素 key,返回其索引。未找到時返回的是一個特定的負數,為?- (low + 1)?

② Arrays.binarySearch(type[ ] a,int fromIndex,int toIndex,type key):在數組 a 索引為[fromIndex,toIndex) 的元素中查找元素 key,返回其索引

5.1 使用示例

import java.util.Arrays;
public class demo {public static void main(String[] args) {int[] arr1 = {11, 22, 33, 44};int index1 = Arrays.binarySearch(arr1, 44);System.out.println("index of 44: " + index1);//3int[] arr2 = {11, 22, 33, 44};int index2 = Arrays.binarySearch(arr2,0,1,44);System.out.println("index of 44: " + index2);//返回的是一個負數,在[0,1)區間沒找到44}
}

5.2 源碼

流程圖

?binarySearch0源碼

binarySearch0 就是傳統的二分查找算法,比較簡單

private static int binarySearch0(int[] a, int fromIndex, int toIndex,int key) {int low = fromIndex;//左邊界int high = toIndex - 1;//右邊界面while (low <= high) {int mid = (low + high) >>> 1;//相當于mid = (low + high) / 2int midVal = a[mid];//中間元素值if (midVal < key)low = mid + 1;else if (midVal > key)high = mid - 1;elsereturn mid;}return -(low + 1); // 沒有找到不是直接返回負一,返回一個特定的負數
}

6.Arrays.fill

① Arrays.fill (type[ ] a,type val):a 數組中的所有元素賦值為 val?

②?Arrays.fill (type[ ] a,int fromIndex,int toIndex,type val):a 數組中索引為?[fromIndex,toIndex) 的元素賦值為 val?

6.1 使用示例

import java.util.Arrays;
public class demo {public static void main(String[] args) {//1:Arrays.fill (type[ ] a,type val):將a數組中的所有元素賦值為valint[] arr = new int[10];Arrays.fill(arr, 5);Arrays.stream(arr).forEach(i -> System.out.print(i + " "));System.out.println();System.out.println("-------------------");//2:Arrays.fill (type[ ] a,int fromIndex,int toIndex,type val):將a數組中索引為[fromIndex,toIndex)的元素賦值為valArrays.fill(arr,0,5,4);Arrays.stream(arr).forEach(i -> System.out.print(i + " "));}
}

6.2 源碼

public static void fill(int[] a, int val) {for (int i = 0, len = a.length; i < len; i++)a[i] = val;
}public static void fill(int[] a, int fromIndex, int toIndex, int val) {rangeCheck(a.length, fromIndex, toIndex);for (int i = fromIndex; i < toIndex; i++)a[i] = val;
}

7. Arrays.equals

Arrays.equals (type[ ] a,type[ ]?a2):返回值為 boolean ;判斷一維數組 a 與 一維數組 a2 的內容是否完全相同,兩個數組的 type 需要一致

7.1 使用案例

import java.util.Arrays;
public class demo {public static void main(String[] args) {int[] arr1 = {1,2,3,4};int[] arr2 = {1,2,3,4};int[] arr3 = {100,99};System.out.println(Arrays.equals(arr1, arr2));//trueSystem.out.println(Arrays.equals(arr1, arr3));//false}
}

7.2 源碼

public static boolean equals(int[] a, int[] a2) {if (a==a2)//地址相同,內容一定相同return true;if (a==null || a2==null)//如果有一個為空,則返回falsereturn false;int length = a.length;if (a2.length != length)//長度不同,則返回falsereturn false;for (int i=0; i<length; i++)//逐個比較if (a[i] != a2[i])return false;return true;
}

8. Arrays.deepEquals

Arrays.deepEquals(Object[ ] a1,Object[ ] a2) :用于比較兩個多維數組 a1a2 的內容是否完全相同

使用案例

import java.util.Arrays;public class demo {public static void main(String[] args) {int[][] array1 = {{1, 2, 3}, {4, 5, 6}};int[][] array2 = {{1, 2, 3}, {4, 5, 6}};int[][] array3 = {{1, 2, 3}, {4, 5, 7}};// 比較相同的二維數組boolean isEqual1 = Arrays.deepEquals(array1, array2);System.out.println("array1 和 array2 相等? " + isEqual1); // 輸出: true// 比較不同的二維數組boolean isEqual2 = Arrays.deepEquals(array1, array3);System.out.println("array1 和 array3 相等? " + isEqual2); // 輸出: false}
}

9.Arrays.asList

Arrays.asList( ) 方法是 Arrays 類的一個靜態方法。它可以將傳入的數據轉換為一個固定大小的列表 List

    public static <T> List<T> asList(T... a) {return new ArrayList<>(a);}

    9.1 使用細節和案例

    形參是 (T.. a) 表示可以接收 0 個或者多個類型為 T(String、八大包裝類型、自定義類型) 的參數,編譯器會將傳入的實參轉換為T[ ] a?數組,當然也可以直接傳入一個 T[ ] 數組

    返回的 List 的運行類型是 java.util.Arrays.ArrayList,是 Arrays 類的一個內部類,并不是平時經常使用的 java.util.ArrayList。這里要注意區分,很容易弄混

    驗證

    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.List;
    public class demo {public static void main(String[] args) {//1:傳入多個數據List<String> list1 = Arrays.asList("小馬","唱跳rap籃球");//2:直接傳入數組Integer[] arr1 = {1,2,3};List<Integer> list2 = Arrays.asList(arr1);System.out.println("list1的運行類型:" + list1.getClass());System.out.println("list2的運行類型:" + list2.getClass());//這里new的是java.util.ArrayListList<Object> list3 = new ArrayList<>();System.out.println("list3的運行類型:" + list3.getClass());}
    }

    運行結果:

    返回的 List 不是一個全新的獨立集合,而是對原始數組的包裝視圖:Wrapper View ,具體來說:

    • 共享存儲空間:

      • 返回的 List 直接引用原數組的內存地址

      • 修改 List 中的元素 = 直接修改數組對應位置的元素,反之亦然

    • 固定大小特性

      • 由于數組長度不可變,因此返回的 List 會禁止結構性修改,比如不能使用 addremove 來增加或刪除元素,這與 java.util.ArrayList 是完全不一樣的

    驗證:共享存儲空間

    import java.util.Arrays;
    import java.util.List;public class demo {public static void main(String[] args) {Integer[] arr = {1, 2, 3, 4, 5};//轉換為列表List<Integer> list = Arrays.asList(arr);//修改列表中的元素list.set(0, 10);//打印修改后的列表和數組System.out.println("執行:list.set(0,10)");System.out.println("執行后的列表list: " + list); // 輸出: 修改后的列表: [10, 2, 3, 4, 5]System.out.println("執行后的數組arr: " + Arrays.toString(arr)); // 輸出: 修改后的數組: [10, 2, 3, 4, 5]System.out.println("------------------------------------------------");//修改數組中的元素arr[1] = 999;//打印修改后的列表和數組System.out.println("執行:arr[1] = 999");System.out.println("執行的列表list: " + list); // 輸出: 修改后的列表: [10, 999, 3, 4, 5]System.out.println("執行后的數組arr: " + Arrays.toString(arr)); // 輸出: 修改后的數組: [10, 999, 3, 4, 5]}
    }

    運行結果:?

    驗證:固定大小特性,即不能使用 add 和 remove,編譯可以通過,但會報異常

    從控制臺的異常信息可以看到,調用的是父類 AbstractList .add 方法,這里溯源一下,如下圖:

    父類 AbstractListadd 方法只是簡單的 throw 一個異常,因此在使用 add 方法時會發生異常。 remove 方法也是類似,這里就不再贅述了

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

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

    相關文章

    git命令簡陋版本

    git push git pull 臨時倉庫暫存區 ##############創建提交################ git init #創建git地址 git config --global user.name "***YQ1007" git config --global user.email "***gmail.com" git remote…

    6. 王道_網絡協議

    1 網絡協議和網絡模型 2 TCP/IP協議族概覽 2.1 四層模型的各層實體 2.2 協議數據單元的轉換 2.3 常見協議以及分層 2.4 ifconfig 2.5 本地環回設備 3 以太網 3.1 以太網和交換機 3.2 以太網幀 MAC地址大小 48位 6字節 IP地址 32位 4字節 port 16位 2字節 3.3 ARP協議 4 IP協…

    minecraft.service 文件配置

    minecraft.service 文件配置 # /etc/systemd/system/minecraft.service [Unit] DescriptionMinecraft Fabric Server Afternetwork.target Wantsnetwork-online.target[Service] Usermcfabricuser Groupmcfabricuser WorkingDirectory/minecraft/1.21.1-fabric-server ExecStar…

    python leetcode簡單練習(2)

    20 有效括號 方法思路 要判斷一個僅由括號組成的字符串是否有效&#xff0c;可以使用棧這一數據結構。核心思路是遍歷字符串中的每個字符&#xff0c;遇到左括號時壓入棧中&#xff0c;遇到右括號時檢查棧頂的左括號是否匹配。若匹配則彈出棧頂元素&#xff0c;否則返回false。…

    AI 數字人短視頻數字人口播源碼:短視頻內容生產的新引擎?

    在當下信息爆炸的時代&#xff0c;短視頻已成為主流的信息傳播與娛樂方式之一。在如此龐大的市場需求下&#xff0c;如何高效、創新地生產短視頻內容成為了行業關注的焦點。AI 數字人短視頻數字人口播源碼應運而生&#xff0c;為短視頻內容生產帶來了全新的變革。? 一、行業背…

    AI對傳統IT行業的變革

    傳統 IT 行業長期以來面臨著諸多挑戰。系統類型繁雜、復雜度高&#xff0c;不少環節依賴人工操作&#xff0c;智能化水平偏低&#xff0c;極大地制約了業務運營效率。此外&#xff0c;傳統 IT 企業背負沉重的歷史包袱&#xff0c;重構系統不僅成本高昂&#xff0c;由于現有系統…

    mapbox基礎,使用geojson加載cluster聚合圖層

    ????? 主頁: gis分享者 ????? 感謝各位大佬 點贊?? 收藏? 留言?? 加關注?! ????? 收錄于專欄:mapbox 從入門到精通 文章目錄 一、??前言1.1 ??mapboxgl.Map 地圖對象1.2 ??mapboxgl.Map style屬性1.3 ??circle點圖層樣式二、??使用geojson加…

    Git回退文件到指定提交

    你可以使用 git checkout 命令將某個文件回退到指定提交的版本。以下是具體步驟&#xff1a; 1. 找到目標提交的哈希值 git log --oneline通過 git log 查看提交歷史&#xff0c;找到你要回退到的目標提交的哈希值&#xff08;例如 abc123d&#xff09;。 2. 回退文件到指定提…

    如何屏蔽mac電腦更新提醒,禁止系統更新

    最煩mac的系統更新提醒了&#xff0c;過幾天就是更新彈窗提醒&#xff0c;現在可以直接禁掉了&#xff0c;眼不見心不亂&#xff0c;不然一升級&#xff0c;開發環境全都不能用了&#xff0c;那才是最可怕的&#xff0c;屏蔽的方法也很簡單&#xff0c;就是屏蔽mac系統更新的請…

    mac m1/m2/m3 pyaudio的安裝

    google了很多方法&#xff0c;也嘗試了 issue68的方法&#xff0c; 但是均失敗了&#xff0c;但是問deepseek竟然成功了&#xff0c;下面是deepseek r1給出的方法。在M3 pro芯片上可以成功運行. 安裝homebrew /bin/bash -c "$(curl -fsSL https://raw.githubusercontent…

    hackmyvm-JO2024

    arp-scan -l nmap -sS -v 192.168.222.202 gobuster dir -u http://192.168.222.202 -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -x php -b 301,401,403,404 訪問/preferences.php 看一下cookie 解密 TzoxNToiVXNlclByZWZlcmVuY2VzIjoyOntzOjg6Imxhbmd1…

    從零開始學習SQL

    1.1 MySQL概述 1. 數據管理技術的發展過程 數據庫技術是應數據管理任務的需要而產生的 a. 什么是數據管理 ** 對數據進行收集、分類、組織、編碼、存儲、檢索和維護一系列活動的總和 **b. 數據管理技術的發展過程 人工管理階段&#xff08;20世紀50年代中之前&#xff09;…

    輸電線路在線監測通信規約,即I1協議

    文章目錄 概要整體架構流程數據幀格式技術細節 概要 輸電線路在線監測系統 transmission lines online monitoring system 監測輸電線路設備本體、氣象環境、通道狀況等信息&#xff0c;定性或定量分析輸電線路運行狀況的應用系 統。一般包括主站系統、監測裝置以及主站系統與…

    【AI】Orin NX+ubuntu22.04上移植YoloV11,并使用DeepStream測試成功

    【AI】郭老二博文之:AI學習目錄匯總 1、燒寫系統 新到的開發板,已經燒寫好Ubuntu系統,版本為22.04。 如果沒有升級到Ubuntu22.04,可以在電腦Ubuntu系統中使用SDKManager來燒寫Ubuntu系統,網絡情況好的話,也可以直接將CUDA、cuDNN、TensorRT、Deepstream等也安裝上。 2…

    C++之輸入與輸出

    文章目錄 C 輸入輸出 (I/O) 詳解基本 I/O 組件&#xff08;input / output&#xff09;基本輸出 (cout)基本輸入 (cin)格式化輸出文件 I/O字符串流常見 I/O 方法比較錯誤處理其他保留小數 C 輸入輸出 (I/O) 詳解 C 使用標準庫中的 iostream 庫來處理輸入輸出操作。主要包括以下…

    流動的夢境:GPT-4o 的自回歸圖像生成深度解析

    每周跟蹤AI熱點新聞動向和震撼發展 想要探索生成式人工智能的前沿進展嗎&#xff1f;訂閱我們的簡報&#xff0c;深入解析最新的技術突破、實際應用案例和未來的趨勢。與全球數同行一同&#xff0c;從行業內部的深度分析和實用指南中受益。不要錯過這個機會&#xff0c;成為AI領…

    eBay多賬號安全運營技術體系:從環境隔離到智能風控的工程化實踐

    一、多賬號運營風險模型解析 &#xff08;技術化重構關聯檢測機制&#xff09; 環境指紋維度&#xff1a; 瀏覽器指紋參數&#xff1a;Canvas/WebGL渲染特征&#xff08;差異度要求≥98%&#xff09; 設備指紋參數&#xff1a;GPU型號/聲卡特征&#xff08;識別準確率92%&…

    Vue 3 模板引用(Template Refs)詳解與實戰示例

    Vue 3 模板引用&#xff08;Template Refs&#xff09;詳解與實戰示例 引言 在 Vue 開發中&#xff0c;通常推薦使用 響應式數據 (ref 和 reactive) 進行數據綁定&#xff0c;而不是直接操作 DOM。但是&#xff0c;在某些情況下&#xff0c;我們確實需要訪問某個組件或 DOM 元…

    《Operating System Concepts》閱讀筆記:p495-p511

    《Operating System Concepts》學習第 44 天&#xff0c;p495-p511 總結&#xff0c;總計 17 頁。 一、技術總結 1.cache (1)定義 A cache is a region of fast memory that holds copies of data. (2)cache 和 buffer 的區別 The difference between a buffer and a cac…

    通過Spring Boot集成WebSocket進行消息通信

    文章目錄 通過Spring Boot集成WebSocket進行消息通信1. 創建 Spring Boot 項目2. 添加 WebSocket 依賴3. 配置 WebSocket4. 創建 WebSocket 處理器5. 創建控制器&#xff08;可選&#xff09;6. 前端頁面測試7. 運行項目注意事項 通過Spring Boot集成WebSocket進行消息通信 1.…