1 2 这个类在日常的开发中,还是非常常用的。今天就总结一下Arrays工具类的常用方法。最常用的就是asList,sort,toStream,equals,copyOf了。另外可以深入学习下Arrays的排序算法,这个还是非常有用的。 3 4 所有的方法都是在下面的类中进行测试的: 5 6 public class ArraysTest { 7 String[] array = new String[]{"a","c","2","1","b"}; 8 Integer[] ints = new Integer[]{5,1,4,3,2}; 9 ... 10 } 11 asList 12 13 这个方法可以把数组转换成List,List提供了很多的操作方法,更便于使用。 14 15 @Test 16 public void test1(){ 17 List<String> lists = Arrays.asList(array); 18 } 19 sort排序和parallelSort并行排序 20 21 sort比较常用了,根据元素按照自然排序规则排序,也可以设置排序元素的起始位置。 22 23 @Test 24 public void sort(){ 25 /* Arrays.sort(array); 26 for(String str : array){ 27 System.out.println(str); 28 }*/ 29 Arrays.sort(array,2,5); 30 System.out.println(Arrays.deepToString(array));//[a, c, 1, 2, b] 31 } 32 parallelSort则采用并行的排序算法排序.但是我自己测试,可能数据量太小,速度上并没有明显的变化。 33 34 binarySearch 35 36 查找目标元素所在的位置,注意需要先进行排序。 37 38 @Test 39 public void binarySearch(){ 40 //binarySearch需要保证是排好序的 41 System.out.println(Arrays.binarySearch(array,"c"));//-6 42 Arrays.sort(array); 43 System.out.println(Arrays.binarySearch(array,"c"));//4 44 } 45 copyOf 46 47 拷贝数组,第一种用法,如果目标长度不够,会使用0进行补位。第二种用法,支持拷贝目标起始位置到结束为止的数组。 48 49 @Test 50 public void copyOf(){ 51 //如果位数不够,需要补位 52 Integer[] result = Arrays.copyOf(ints,10); 53 for(int i : result){ 54 System.out.println(i); 55 } 56 System.out.println("----------------------------------------->"); 57 //如果位数够,就取最小的数组 58 result = Arrays.copyOf(ints,3); 59 for(int i : result){ 60 System.out.println(i); 61 } 62 System.out.println("----------------------------------------->"); 63 // 64 result = Arrays.copyOfRange(ints,2,4); 65 for(int i : result){ 66 System.out.println(i); 67 } 68 } 69 deepEquals深度比较、deepHashCode生成hashcode、deepToString深度打印 70 71 这几个方法基本都是采用递归的写法使用。 72 73 @Test 74 public void deepTest(){ 75 String[] array2 = new String[]{"a","c","2","1","b"}; 76 System.out.println(Arrays.deepEquals(array,array2));//深度比较两个数组是否相同 77 78 System.out.println(Arrays.deepHashCode(array)); 79 System.out.println(Arrays.deepHashCode(array2));//如果两个数组deepEquals,那么他们的hashcode一定相同 80 81 //格式化输出数组 82 System.out.println(Arrays.deepToString(array)); 83 } 84 equals比较 85 86 对比两个数组是否相等 87 88 @Test 89 public void equals(){ 90 String[] array2 = new String[]{"a","c","2","1","b"}; 91 92 //1 对比引用是否相同 93 //2 对比是否存在null 94 //3 对比长度是否相同 95 //4 挨个元素对比 96 System.out.println(Arrays.equals(array,array2)); 97 } 98 fill 99 100 基于目标元素填充数组 101 102 @Test 103 public void fill(){ 104 Arrays.fill(array,"test"); 105 System.out.println(Arrays.deepToString(array));//[test, test, test, test, test] 106 } 107 toString 108 109 打印数组元素 110 111 @Test 112 public void string(){ 113 System.out.println(Arrays.toString(array));//[a, c, 2, 1, b] 114 } 115 toStream 116 117 把数组转换成stream,然后可以使用java8的stream特性了。 118 119 @Test 120 public void toStream(){ 121 Arrays.stream(array).forEach(s-> System.out.println(s)); 122 } 123 parallelPrefix 124 125 这个有点像spark的reduceByKey,即根据传入的方法一次计算: 126 127 @Test 128 public void parallelPrefix(){ 129 Arrays.parallelPrefix(ints,(x,y)->(x+y)); 130 System.out.println(Arrays.deepToString(ints));//[5, 6, 10, 13, 15] 131 } 132 parallelSetAll 133 134 这个方法相当于stream.map会挨个元素遍历执行方法 135 136 @Test 137 public void parallelSetAll(){ 138 Arrays.parallelSetAll(ints,x->x*x); 139 System.out.println(Arrays.toString(ints));//[0, 1, 4, 9, 16] 140 } 141 setAll 142 143 这个方法与上面类似,只不过不是并行的 144 145 @Test 146 public void setAll(){ 147 Arrays.setAll(ints,x->x*2); 148 System.out.println(Arrays.toString(ints)); 149 }