Arrays工具類的使用
阿新 • • 發佈:2019-01-27
這個類在日常的開發中,還是非常常用的。今天就總結一下Arrays工具類的常用方法。最常用的就是asList,sort,toStream,equals,copyOf了。另外可以深入學習下Arrays的排序演算法,這個還是非常有用的。
所有的方法都是在下面的類中進行測試的:
public class ArraysTest {
String[] array = new String[]{"a","c","2","1","b"};
Integer[] ints = new Integer[]{5,1,4,3,2};
...
}
asList
這個方法可以把陣列轉換成List,List提供了很多的操作方法,更便於使用。
@Test
public void test1(){
List<String> lists = Arrays.asList(array);
}
sort排序和parallelSort並行排序
sort比較常用了,根據元素按照自然排序規則排序,也可以設定排序元素的起始位置。
@Test public void sort(){ /* Arrays.sort(array); for(String str : array){ System.out.println(str); }*/ Arrays.sort(array,2,5); System.out.println(Arrays.deepToString(array));//[a, c, 1, 2, b] }
parallelSort則採用並行的排序演算法排序.但是我自己測試,可能資料量太小,速度上並沒有明顯的變化。
binarySearch
查詢目標元素所在的位置,注意需要先進行排序。
@Test public void binarySearch(){ //binarySearch需要保證是排好序的 System.out.println(Arrays.binarySearch(array,"c"));//-6 Arrays.sort(array); System.out.println(Arrays.binarySearch(array,"c"));//4 }
copyOf
拷貝陣列,第一種用法,如果目標長度不夠,會使用0進行補位。第二種用法,支援拷貝目標起始位置到結束為止的陣列。
@Test
public void copyOf(){
//如果位數不夠,需要補位
Integer[] result = Arrays.copyOf(ints,10);
for(int i : result){
System.out.println(i);
}
System.out.println("----------------------------------------->");
//如果位數夠,就取最小的陣列
result = Arrays.copyOf(ints,3);
for(int i : result){
System.out.println(i);
}
System.out.println("----------------------------------------->");
//
result = Arrays.copyOfRange(ints,2,4);
for(int i : result){
System.out.println(i);
}
}
deepEquals深度比較、deepHashCode生成hashcode、deepToString深度列印
這幾個方法基本都是採用遞迴的寫法使用。
@Test
public void deepTest(){
String[] array2 = new String[]{"a","c","2","1","b"};
System.out.println(Arrays.deepEquals(array,array2));//深度比較兩個陣列是否相同
System.out.println(Arrays.deepHashCode(array));
System.out.println(Arrays.deepHashCode(array2));//如果兩個陣列deepEquals,那麼他們的hashcode一定相同
//格式化輸出陣列
System.out.println(Arrays.deepToString(array));
}
equals比較
對比兩個陣列是否相等
@Test
public void equals(){
String[] array2 = new String[]{"a","c","2","1","b"};
//1 對比引用是否相同
//2 對比是否存在null
//3 對比長度是否相同
//4 挨個元素對比
System.out.println(Arrays.equals(array,array2));
}
fill
基於目標元素填充陣列
@Test
public void fill(){
Arrays.fill(array,"test");
System.out.println(Arrays.deepToString(array));//[test, test, test, test, test]
}
toString
列印陣列元素
@Test
public void string(){
System.out.println(Arrays.toString(array));//[a, c, 2, 1, b]
}
toStream
把陣列轉換成stream,然後可以使用java8的stream特性了。
@Test
public void toStream(){
Arrays.stream(array).forEach(s-> System.out.println(s));
}
parallelPrefix
這個有點像spark的reduceByKey,即根據傳入的方法一次計算:
@Test
public void parallelPrefix(){
Arrays.parallelPrefix(ints,(x,y)->(x+y));
System.out.println(Arrays.deepToString(ints));//[5, 6, 10, 13, 15]
}
parallelSetAll
這個方法相當於stream.map會挨個元素遍歷執行方法
@Test
public void parallelSetAll(){
Arrays.parallelSetAll(ints,x->x*x);
System.out.println(Arrays.toString(ints));//[0, 1, 4, 9, 16]
}
setAll
這個方法與上面類似,只不過不是並行的
@Test
public void setAll(){
Arrays.setAll(ints,x->x*2);
System.out.println(Arrays.toString(ints));
}