Java中Arrays數(shù)組工具類的基本使用詳解
方法一覽表
| 方法名 | 簡要描述 |
|---|---|
| asList() | 返回由指定數(shù)組支持的固定大小的列表。 |
| sort() | 將數(shù)組排序(升序) |
| parallelSort() | 將指定的數(shù)組按升序排序 |
| binarySearch() | 使用二分搜索法快速查找指定的值(前提是數(shù)組必須是有序的) |
| compare() | 按字典順序比較兩個數(shù)組 |
| compareUnsigned() | 按字典順序比較兩個數(shù)組,將數(shù)字元素處理為無符號 |
| copyOf() | 填充復(fù)制數(shù)組 |
| copyOfRange() | 將數(shù)組的指定范圍復(fù)制到新數(shù)組 |
| equals() | 比較兩個數(shù)組 |
| deepEquals() | 比較兩個數(shù)組深度 |
| toString() | 將數(shù)組轉(zhuǎn)換為字符串 |
| deepToString() | 將一個多維數(shù)組轉(zhuǎn)換為字符串 |
| fill() | 將指定元素填充給數(shù)組每一個元素 |
| mismatch() | 查找并返回兩個數(shù)組之間第一個不匹配的索引,如果未找到則返回-1 |
| parallelPrefix() | 使用提供的函數(shù)對數(shù)組元素進(jìn)行操作 |
| parallelSetAll() | 使用提供的生成器函數(shù)并行設(shè)置指定數(shù)組的所有元素以計算每個元素 |
| setAll() | 使用提供的生成器函數(shù)設(shè)置指定數(shù)組的所有元素以計算每個元素 |
快速定位詳細(xì)操作
接下來我用代碼一一舉例演示。
asList()
功能:返回由指定數(shù)組支持的固定大小的列表
參數(shù):asList?(T… a)
返回值:一個列表
代碼示例:
@Test
public void asListTest() {
List<String> ss = Arrays.asList("hello", "world");
// List<String> ss1 = Arrays.asList("hello", "world",1); 報錯,類型必須一直(泛型)
System.out.println(ss); //[hello, world]
// ss.add("java"); //UnsupportedOperationException 會報錯
// ss.remove(1); //UnsupportedOperationException 會報錯
System.out.println(ss.get(0)); //hello
ss.set(0, "java");
System.out.println(ss); //[java, world]
}
注意
將這一數(shù)組轉(zhuǎn)換為列表后,對應(yīng)的列表是不支持添加和刪除操作的,否則會報錯
但可以修改和獲取元素
toString() 和 deepToString()
功能:將數(shù)組轉(zhuǎn)換為字符串
參數(shù):待轉(zhuǎn)化數(shù)組
返回值:轉(zhuǎn)化后的字符串
代碼示例:
@Test
public void asListTest() {
List<String> ss = Arrays.asList("hello", "world");
// List<String> ss1 = Arrays.asList("hello", "world",1); 報錯,類型必須一直(泛型)
System.out.println(ss); //[hello, world]
// ss.add("java"); //UnsupportedOperationException 會報錯
// ss.remove(1); //UnsupportedOperationException 會報錯
System.out.println(ss.get(0)); //hello
ss.set(0, "java");
System.out.println(ss); //[java, world]
}
sort() 和 parallelSort()
功能:都是將數(shù)組排序(默認(rèn)升序,支持lambda,泛型)
參數(shù):
- sort?(Object[] a[, int fromIndex, int toIndex])
- 或者sort?(T[] a[, int fromIndex, int toIndex,] Comparator<? super T> c)
- parallelSort(Object[] a[, int fromIndex, int toIndex])
- 或者parallelSort?(T[] a[, int fromIndex, int toIndex,] Comparator<?
super T> c)
返回值:無
代碼示例:
@Test
public void sortTest() {
String[] str = {"abc", "add", "java", "hello", "javascript"};
int[] ii = {1, 8, 99, 222, 35};
System.out.println(Arrays.toString(str));
System.out.println(Arrays.toString(ii));
//單參數(shù)情況
//Arrays.sort(str); 默認(rèn)全排,字母會按照字母表順序
//Arrays.sort(ii);
//System.out.println(Arrays.toString(str)); //[abc, add, hello, java, javascript]
//System.out.println(Arrays.toString(ii)); //[1, 8, 35, 99, 222]
//多參數(shù)情況
//Arrays.sort(str,2,4); 只排列指定范圍內(nèi)的
//Arrays.sort(ii,2,4);
//System.out.println(Arrays.toString(str)); //[abc, add, hello, java, javascript]
//System.out.println(Arrays.toString(ii)); //[1, 8, 99, 222, 35]
//可傳入lambda表達(dá)式(多參數(shù)情況可指定開始結(jié)束位置)
// Arrays.sort(str, (a, b) -> b.compareTo(a)); //降序
// System.out.println(Arrays.toString(str)); //[javascript, java, hello, add, abc]
//parallelSort()方法目前我實驗感覺與sort()相差無幾,基本相似
Arrays.parallelSort(str);
System.out.println(Arrays.toString(str)); //[abc, add, hello, java, javascript]
Arrays.parallelSort(str,(a,b)->b.compareTo(a));
System.out.println(Arrays.toString(str)); //[javascript, java, hello, add, abc]
}
binarySearch()
功能:使用二分搜索法快速查找指定的值(前提是數(shù)組必須是有序的,支持lambda表達(dá)式,泛型)
參數(shù):binarySearch?(Object[] a[, int fromIndex, int toIndex], Object key)
返回值:有則返回對應(yīng)下標(biāo),無則返回負(fù)值
代碼示例:
@Test
public void binarySearchTest() {
int[] a = {1, 5, 7, 4, 6, 7, 8, 4, 9, 0};
Arrays.sort(a); //必須先排序
System.out.println(Arrays.toString(a));
//[0, 1, 4, 4, 5, 6, 7, 7, 8, 9]
System.out.println(Arrays.binarySearch(a, 4)); //2
System.out.println(Arrays.binarySearch(a, 11)); //-11
//也可指定范圍查找,其查找機(jī)制是折半查找,每次縮小一半范圍
}
compare() 和 compareUnsigned()
功能:按字典順序比較兩個數(shù)組
參數(shù):
compare?(T[] a, 【int aFromIndex, int aToIndex】, T[] b,【 int bFromIndex, int bToIndex】,【 Comparator<? super T> cmp】)
返回值:
- 如果第一個和第二個數(shù)組相等并且包含相同順序的相同元素,則值為0 ;
- 如果第一個數(shù)組按字典順序小于第二個數(shù)組,則值小于0 ;
- 如果第一個數(shù)組按字典順序大于第二個數(shù)組,則值大于0
代碼示例:
@Test
public void compareTest() {
int[] a = {1, 2, 3, 4};
int[] b = {1, 2, 3, 4, 5};
int[] c = {1, 2, 3, 4, 5};
String[] s1 = {"java","hello","c++"};
String[] s2 = {"java","hello"};
// System.out.println(Arrays.compare(a,b)); //-1
// System.out.println(Arrays.compare(b,a)); //1
// System.out.println(Arrays.compare(b,c)); //0
System.out.println(Arrays.compare(s1,s2)); //1
//也可劃定范圍去比較,或者傳入lambda
// System.out.println(Arrays.compareUnsigned(s1,s2));//報錯
System.out.println(Arrays.compareUnsigned(a,b)); //-1
}
注意
compareUnsigned()只能比較byte(),short(),int(),long()數(shù)字型數(shù)組,可以劃定比較范圍,但不支持lambda
copyOf() 和 copyOfRange()
功能:復(fù)制填充數(shù)組
參數(shù):
- copyOf?(int[] original, int newLength)…
- copyOf?(T[] original, int newLength)
- copyOfRange?(int[] original, int from, int to)…
- copyOfRange?(T[] original, int from, int to)
- copyOfRange?(U[] original, int from, int to, 類<? extends T[]> newType)
返回值:復(fù)制填充后的數(shù)組
代碼示例:
@Test
public void copyOfTest() {
//copyOf
int[] arr = {1, 2, 3, 4, 5, 6, 7, 8, 9, 0};
int[] arr1 = Arrays.copyOf(arr, 5); //拷貝長度為5,第二個參數(shù)為新數(shù)組的長度
int[] arr2 = Arrays.copyOf(arr, 15);
System.out.println(Arrays.toString(arr1)); //[1, 2, 3, 4, 5]
System.out.println(Arrays.toString(arr2)); //[1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 0, 0, 0, 0, 0]
arr[0] = 20; //改變原數(shù)組
System.out.println(Arrays.toString(arr)); //原數(shù)組改變
System.out.println(Arrays.toString(arr1)); //復(fù)制后的數(shù)組不變
String[] str = {"java","hello","world"};
String[] str1 = Arrays.copyOf(str,2);
String[] str2 = Arrays.copyOf(str,5);
System.out.println(Arrays.toString(str1)); //[java, hello]
System.out.println(Arrays.toString(str2)); //[java, hello, world, null, null]
//copyOfRange()
int[] arrs = {1, 2, 3, 4, 5, 6, 7, 8, 9, 0};
int[] arr3 = Arrays.copyOfRange(arrs,2,8); //[3, 4, 5, 6, 7, 8]
int[] arr4 = Arrays.copyOfRange(arrs,5,15); //[6, 7, 8, 9, 0, 0, 0, 0, 0, 0]
System.out.println(Arrays.toString(arr3));
System.out.println(Arrays.toString(arr4));
arrs[6] = 99; //改變原數(shù)組
System.out.println(Arrays.toString(arrs)); //[1, 2, 3, 4, 5, 6, 99, 8, 9, 0] 原數(shù)組改變
System.out.println(Arrays.toString(arr3)); //[3, 4, 5, 6, 7, 8] 復(fù)制后的不會隨著改變
}
注意
copyOf()是從原數(shù)組0位置開始拷貝指定長度到新數(shù)組
copyOfRange()是從原數(shù)組中指定范圍拷貝到新數(shù)組
如果指定長度或者范圍超出原數(shù)組范圍,則超出部分會補上此數(shù)據(jù)類型的默認(rèn)值,如String類型會補null,int型會補0
equals()
功能:比較兩個數(shù)組
參數(shù):
- equals?(int[] a,【 int aFromIndex, int aToIndex】, int[] b,【 int bFromIndex, int bToIndex】)…
- equals?(T[] a, 【int aFromIndex, int aToIndex】, T[] b,【 int bFromIndex, int bToIndex】, Comparator<? super T> cmp)
返回值:boolean
代碼示例:
@Test
public void equalsTest() {
int[] a = {1, 2, 3, 4, 5, 6};
int[] b = {6, 5, 3, 4, 2, 1};
System.out.println(Arrays.equals(a, b)); //false
System.out.println(Arrays.equals(a, 2, 3, b, 2, 3)); //指定比較范圍 true
}
deepEquals()
功能:比較兩個數(shù)組的深度
參數(shù):deepEquals?(Object[] a1, Object[] a2)
返回值:boolean
代碼示例:
@Test
public void deepEqualsTest() {
String[] s1 = {"java", "hello", "c++"};
String[] s2 = {"java", "hello"};
String[] s3 = {"java", "hello", "c++"};
System.out.println(Arrays.deepEquals(s1, s2)); //false
System.out.println(Arrays.deepEquals(s1, s3)); //true
String[][] s4 = {{"hello"}, {"java"}, {"c++"}, {"python"}};
String[][] s5 = {{"hello"}, {"java"}, {"c++"}, {"python"}};
System.out.println(Arrays.deepEquals(s4, s5)); //true
System.out.println(Arrays.equals(s4, s5)); //false
int[] a = {1,2};
int[] b = {1,2};
// System.out.println(Arrays.deepEquals(a,b)); //報錯
}
比較equals()和deepEquals()方法
相同點
兩者都是比較數(shù)組是否相等的方法
不同點
- equals默認(rèn)從頭比較到尾,也可以指定范圍,但是deepEquals不能指定范圍
- 可以比較多維數(shù)組,equals不能
- deepEquals不支持比較基本類型數(shù)組,equals支持
?fill()
功能:將指定元素填充給數(shù)組每一個元素
參數(shù):fill?(int[] a, 【int fromIndex, int toIndex】, int val)
返回值:無
代碼示例:
@Test
public void fillTest() {
String[] a = {"a", "b", "c", "d", "e", "f"};
System.out.println(Arrays.toString(a)); //[a, b, c, d, e, f]
Arrays.fill(a, "java");
System.out.println(Arrays.toString(a)); //[java, java, java, java, java, java]
String[] b = {"a", "b", "c", "d", "e", "f"};
System.out.println(Arrays.toString(b)); //[a, b, c, d, e, f]
Arrays.fill(b, 2, 5, "java");
System.out.println(Arrays.toString(b)); //[a, b, java, java, java, f]
//默認(rèn)全填充,也可以指定范圍,會改變原數(shù)組
}
mismatch()
功能:查找并返回兩個數(shù)組之間第一個不匹配的索引,如果未找到則返回-1
參數(shù):
- mismatch?(int[] a, 【int aFromIndex, int aToIndex】, int[] b,【 int bFromIndex, int bToIndex】)
- mismatch?(T[] a, 【int aFromIndex, int aToIndex】, T[] b,【 int bFromIndex, int bToIndex】, Comparator<? super T> cmp)
返回值:兩個數(shù)組之間第一個不匹配的索引,未找到不匹配則返回-1。
代碼示例:
@Test
public void mismatchTest() {
String[] s1 = {"java", "c++", "html", "css", "Javascript", "world"};
String[] s2 = {"world", "c++", "html", "css", "Javascript"};
System.out.println(Arrays.mismatch(s1, s2)); //0
System.out.println(Arrays.mismatch(s1, 1, 4, s2, 1, 4)); //-1
System.out.println(Arrays.mismatch(s1, 1, 5, s2, 1, 4)); //3
}
parallelPrefix()
功能:使用提供的函數(shù)并行地累積給定數(shù)組的每個元素。
參數(shù):
- parallelPrefix?(int[] array, 【int fromIndex, int toIndex】, IntBinaryOperator op)
- parallelPrefix?(T[] array, 【int fromIndex, int toIndex】, BinaryOperator op)
返回值:無
代碼示例:
@Test
public void parallelPrefixTest() {
String[] s1 = {"java", "c++", "html", "css", "Javascript", "world"};
System.out.println(Arrays.toString(s1)); //[java, c++, html, css, Javascript, world]
Arrays.parallelPrefix(s1, String::concat);
System.out.println(Arrays.toString(s1)); //[java, javac++, javac++html, javac++htmlcss, javac++htmlcssJavascript, javac++htmlcssJavascriptworld]
int[] a = {1, 2, 3, 4, 5};
System.out.println(Arrays.toString(a)); //[1, 2, 3, 4, 5]
Arrays.parallelPrefix(a, (x, y) -> x * y);
System.out.println(Arrays.toString(a)); //[1, 2, 6, 24, 120]
Arrays.parallelPrefix(a, 2, 4, (x, y) -> x / y);
System.out.println(Arrays.toString(a)); //[1, 2, 6, 0, 120] 也可指定范圍
}
setAll() 和 parallelSetAll()
功能:使用提供的生成器函數(shù)設(shè)置指定數(shù)組的所有元素以計算每個元素。
參數(shù):
- parallelSetAll?(T[] array, IntFunction<? extends T> generator)
- setAll?(T[] array, IntFunction<? extends T> generator)
返回值:無
代碼示例:
@Test
public void parallelPrefixTest() {
String[] s1 = {"java", "c++", "html", "css", "Javascript", "world"};
System.out.println(Arrays.toString(s1)); //[java, c++, html, css, Javascript, world]
Arrays.parallelPrefix(s1, String::concat);
System.out.println(Arrays.toString(s1)); //[java, javac++, javac++html, javac++htmlcss, javac++htmlcssJavascript, javac++htmlcssJavascriptworld]
int[] a = {1, 2, 3, 4, 5};
System.out.println(Arrays.toString(a)); //[1, 2, 3, 4, 5]
Arrays.parallelPrefix(a, (x, y) -> x * y);
System.out.println(Arrays.toString(a)); //[1, 2, 6, 24, 120]
Arrays.parallelPrefix(a, 2, 4, (x, y) -> x / y);
System.out.println(Arrays.toString(a)); //[1, 2, 6, 0, 120] 也可指定范圍
}
本文大致包含了所有的方法,除了Java 11之后新增的,或者我看漏的,文中如有錯誤,還請指出,大家一起進(jìn)步!
總結(jié)
到此這篇關(guān)于Java中Arrays數(shù)組工具類的基本使用的文章就介紹到這了,更多相關(guān)Java?Arrays數(shù)組工具類使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java并發(fā)編程StampedLock高性能讀寫鎖詳解
這篇文章主要為大家介紹了java并發(fā)編程StampedLock高性能讀寫鎖的示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05
Java實現(xiàn)多叉樹和二叉樹之間的互轉(zhuǎn)
本文主要介紹了Java實現(xiàn)多叉樹和二叉樹之間的互轉(zhuǎn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-05-05


