简介

  • 因为Arrays是JDK官方提供的操作数组的工具类,所以很多部分都是重载方法,本篇只举例说明,因为使用的方法是一致的。

    代码实现

    1. public class Arrays {
    2. // 最小数组长度,低于该最小数组长度,并行排序算法将不会进一步划分排序任务
    3. private static final int MIN_ARRAY_SORT_GRAN = 1 << 13;
    4. // 私有构造
    5. private Arrays() {}
    6. // 它实现了一个基团相互比较的元素的的自然顺序的比较器。
    7. static final class NaturalOrder implements Comparator<Object> {
    8. @SuppressWarnings("unchecked")
    9. public int compare(Object first, Object second) {
    10. return ((Comparable<Object>)first).compareTo(second);
    11. }
    12. static final NaturalOrder INSTANCE = new NaturalOrder();
    13. }
    14. // 将检查fromIndex和toIndex都在范围内,如果他们不抛出异常
    15. private static void rangeCheck(int arrayLength, int fromIndex, int toIndex) {
    16. if (fromIndex > toIndex) {
    17. throw new IllegalArgumentException(
    18. "fromIndex(" + fromIndex + ") > toIndex(" + toIndex + ")");
    19. }
    20. if (fromIndex < 0) {
    21. throw new ArrayIndexOutOfBoundsException(fromIndex);
    22. }
    23. if (toIndex > arrayLength) {
    24. throw new ArrayIndexOutOfBoundsException(toIndex);
    25. }
    26. }
    27. // 排序 使用JDK提供的快排正序排序
    28. public static void sort(int[] a) {
    29. DualPivotQuicksort.sort(a, 0, a.length - 1, null, 0, 0);
    30. }
    31. // 省略其他重载方法 ...
    32. // 平行划分排序 分治合并思想
    33. public static void parallelSort(byte[] a) {
    34. int n = a.length, p, g;
    35. if (n <= MIN_ARRAY_SORT_GRAN ||
    36. (p = ForkJoinPool.getCommonPoolParallelism()) == 1)
    37. DualPivotQuicksort.sort(a, 0, n - 1);
    38. else
    39. new ArraysParallelSortHelpers.FJByte.Sorter
    40. (null, a, new byte[n], 0, n, 0,
    41. ((g = n / (p << 2)) <= MIN_ARRAY_SORT_GRAN) ?
    42. MIN_ARRAY_SORT_GRAN : g).invoke();
    43. }
    44. // 省略其他重载方法 ...
    45. // 老归并排序实现可以使用系统属性中选择(与破碎比较兼容性)。
    46. // 不能在封闭类的静态布尔由于循环依赖。 为了在未来的版本中删除
    47. static final class LegacyMergeSort {
    48. private static final boolean userRequested =
    49. java.security.AccessController.doPrivileged(
    50. new sun.security.action.GetBooleanAction(
    51. "java.util.Arrays.useLegacyMergeSort")).booleanValue();
    52. }
    53. // 调用归并排序
    54. private static void legacyMergeSort(Object[] a) {
    55. Object[] aux = a.clone();
    56. mergeSort(aux, a, 0, a.length, 0);
    57. }
    58. // 协调参数:在等于或低于其插入排序列表大小将优先于归并使用
    59. private static final int INSERTIONSORT_THRESHOLD = 7;
    60. // 归并排序算法
    61. private static void mergeSort(Object[] src,
    62. Object[] dest,
    63. int low,
    64. int high,
    65. int off) {
    66. int length = high - low;
    67. // Insertion sort on smallest arrays
    68. if (length < INSERTIONSORT_THRESHOLD) {
    69. for (int i=low; i<high; i++)
    70. for (int j=i; j>low &&
    71. ((Comparable) dest[j-1]).compareTo(dest[j])>0; j--)
    72. swap(dest, j, j-1);
    73. return;
    74. }
    75. // Recursively sort halves of dest into src
    76. int destLow = low;
    77. int destHigh = high;
    78. low += off;
    79. high += off;
    80. int mid = (low + high) >>> 1;
    81. mergeSort(dest, src, low, mid, -off);
    82. mergeSort(dest, src, mid, high, -off);
    83. if (((Comparable)src[mid-1]).compareTo(src[mid]) <= 0) {
    84. System.arraycopy(src, low, dest, destLow, length);
    85. return;
    86. }
    87. // Merge sorted halves (now in src) into dest
    88. for(int i = destLow, p = low, q = mid; i < destHigh; i++) {
    89. if (q >= high || p < mid && ((Comparable)src[p]).compareTo(src[q])<=0)
    90. dest[i] = src[p++];
    91. else
    92. dest[i] = src[q++];
    93. }
    94. }
    95. // 交换数据
    96. private static void swap(Object[] x, int a, int b) {
    97. Object t = x[a];
    98. x[a] = x[b];
    99. x[b] = t;
    100. }
    101. public static <T> void parallelPrefix(T[] array, BinaryOperator<T> op) {
    102. Objects.requireNonNull(op);
    103. if (array.length > 0)
    104. new ArrayPrefixHelpers.CumulateTask<>
    105. (null, op, array, 0, array.length).invoke();
    106. }
    107. // 重载方法省略 ....
    108. // 二分查找算法
    109. public static int binarySearch(long[] a, long key) {
    110. return binarySearch0(a, 0, a.length, key);
    111. }
    112. // 核心二分算法
    113. private static int binarySearch0(long[] a, int fromIndex, int toIndex,
    114. long key) {
    115. int low = fromIndex;
    116. int high = toIndex - 1;
    117. while (low <= high) {
    118. int mid = (low + high) >>> 1;
    119. long midVal = a[mid];
    120. if (midVal < key)
    121. low = mid + 1;
    122. else if (midVal > key)
    123. high = mid - 1;
    124. else
    125. return mid; // key found
    126. }
    127. return -(low + 1); // key not found.
    128. }
    129. // 重载方法省略 ....
    130. // equals 方法
    131. public static boolean equals(long[] a, long[] a2) {
    132. if (a==a2)
    133. return true;
    134. if (a==null || a2==null)
    135. return false;
    136. int length = a.length;
    137. if (a2.length != length)
    138. return false;
    139. for (int i=0; i<length; i++)
    140. if (a[i] != a2[i])
    141. return false;
    142. return true;
    143. }
    144. // 重载方法省略 ....
    145. // 填充数组 a 填充为 val
    146. public static void fill(long[] a, long val) {
    147. for (int i = 0, len = a.length; i < len; i++)
    148. a[i] = val;
    149. }
    150. // 重载方法省略 ....
    151. // 数组拷贝 复制指定的数组,截取或用null填充(如果必要)
    152. public static <T> T[] copyOf(T[] original, int newLength) {
    153. return (T[]) copyOf(original, newLength, original.getClass());
    154. }
    155. // 调用 System.arraycopy()
    156. public static <T,U> T[] copyOf(U[] original, int newLength, Class<? extends T[]> newType) {
    157. @SuppressWarnings("unchecked")
    158. T[] copy = ((Object)newType == (Object)Object[].class)
    159. ? (T[]) new Object[newLength]
    160. : (T[]) Array.newInstance(newType.getComponentType(), newLength);
    161. System.arraycopy(original, 0, copy, 0,
    162. Math.min(original.length, newLength));
    163. return copy;
    164. }
    165. // 重载方法省略 ....
    166. // 复制指定的范围指定数组到一个新的数组
    167. public static <T> T[] copyOfRange(T[] original, int from, int to) {
    168. return copyOfRange(original, from, to, (Class<? extends T[]>) original.getClass());
    169. }
    170. public static <T,U> T[] copyOfRange(U[] original, int from, int to, Class<? extends T[]> newType) {
    171. int newLength = to - from;
    172. if (newLength < 0)
    173. throw new IllegalArgumentException(from + " > " + to);
    174. @SuppressWarnings("unchecked")
    175. T[] copy = ((Object)newType == (Object)Object[].class)
    176. ? (T[]) new Object[newLength]
    177. : (T[]) Array.newInstance(newType.getComponentType(), newLength);
    178. System.arraycopy(original, from, copy, 0,
    179. Math.min(original.length - from, newLength));
    180. return copy;
    181. }
    182. // 重载方法省略 ....
    183. // 返回List数组 调用 下面的 ArrayList<>
    184. public static <T> List<T> asList(T... a) {
    185. return new ArrayList<>(a);
    186. }
    187. private static class ArrayList<E> extends AbstractList<E>
    188. implements RandomAccess, java.io.Serializable
    189. {
    190. private static final long serialVersionUID = -2764017481108945198L;
    191. private final E[] a;
    192. ArrayList(E[] array) {
    193. a = Objects.requireNonNull(array);
    194. }
    195. @Override
    196. public int size() {
    197. return a.length;
    198. }
    199. @Override
    200. public Object[] toArray() {
    201. return a.clone();
    202. }
    203. @Override
    204. @SuppressWarnings("unchecked")
    205. public <T> T[] toArray(T[] a) {
    206. int size = size();
    207. if (a.length < size)
    208. return Arrays.copyOf(this.a, size,
    209. (Class<? extends T[]>) a.getClass());
    210. System.arraycopy(this.a, 0, a, 0, size);
    211. if (a.length > size)
    212. a[size] = null;
    213. return a;
    214. }
    215. @Override
    216. public E get(int index) {
    217. return a[index];
    218. }
    219. @Override
    220. public E set(int index, E element) {
    221. E oldValue = a[index];
    222. a[index] = element;
    223. return oldValue;
    224. }
    225. @Override
    226. public int indexOf(Object o) {
    227. E[] a = this.a;
    228. if (o == null) {
    229. for (int i = 0; i < a.length; i++)
    230. if (a[i] == null)
    231. return i;
    232. } else {
    233. for (int i = 0; i < a.length; i++)
    234. if (o.equals(a[i]))
    235. return i;
    236. }
    237. return -1;
    238. }
    239. @Override
    240. public boolean contains(Object o) {
    241. return indexOf(o) != -1;
    242. }
    243. @Override
    244. public Spliterator<E> spliterator() {
    245. return Spliterators.spliterator(a, Spliterator.ORDERED);
    246. }
    247. @Override
    248. public void forEach(Consumer<? super E> action) {
    249. Objects.requireNonNull(action);
    250. for (E e : a) {
    251. action.accept(e);
    252. }
    253. }
    254. @Override
    255. public void replaceAll(UnaryOperator<E> operator) {
    256. Objects.requireNonNull(operator);
    257. E[] a = this.a;
    258. for (int i = 0; i < a.length; i++) {
    259. a[i] = operator.apply(a[i]);
    260. }
    261. }
    262. @Override
    263. public void sort(Comparator<? super E> c) {
    264. Arrays.sort(a, c);
    265. }
    266. }
    267. // hashCode
    268. public static int hashCode(long a[]) {
    269. if (a == null)
    270. return 0;
    271. int result = 1;
    272. for (long element : a) {
    273. int elementHash = (int)(element ^ (element >>> 32));
    274. result = 31 * result + elementHash;
    275. }
    276. return result;
    277. }
    278. // 省略重载方法 ...
    279. // 深度 HashCode
    280. // 返回基于指定数组的“深层内容”哈希码
    281. public static int deepHashCode(Object a[]) {
    282. if (a == null)
    283. return 0;
    284. int result = 1;
    285. for (Object element : a) {
    286. int elementHash = 0;
    287. if (element instanceof Object[])
    288. elementHash = deepHashCode((Object[]) element);
    289. else if (element instanceof byte[])
    290. elementHash = hashCode((byte[]) element);
    291. else if (element instanceof short[])
    292. elementHash = hashCode((short[]) element);
    293. else if (element instanceof int[])
    294. elementHash = hashCode((int[]) element);
    295. else if (element instanceof long[])
    296. elementHash = hashCode((long[]) element);
    297. else if (element instanceof char[])
    298. elementHash = hashCode((char[]) element);
    299. else if (element instanceof float[])
    300. elementHash = hashCode((float[]) element);
    301. else if (element instanceof double[])
    302. elementHash = hashCode((double[]) element);
    303. else if (element instanceof boolean[])
    304. elementHash = hashCode((boolean[]) element);
    305. else if (element != null)
    306. elementHash = element.hashCode();
    307. result = 31 * result + elementHash;
    308. }
    309. return result;
    310. }
    311. // 深度比较
    312. public static boolean deepEquals(Object[] a1, Object[] a2) {
    313. if (a1 == a2)
    314. return true;
    315. if (a1 == null || a2==null)
    316. return false;
    317. int length = a1.length;
    318. if (a2.length != length)
    319. return false;
    320. for (int i = 0; i < length; i++) {
    321. Object e1 = a1[i];
    322. Object e2 = a2[i];
    323. if (e1 == e2)
    324. continue;
    325. if (e1 == null)
    326. return false;
    327. // Figure out whether the two elements are equal
    328. boolean eq = deepEquals0(e1, e2);
    329. if (!eq)
    330. return false;
    331. }
    332. return true;
    333. }
    334. // 辅助方法
    335. static boolean deepEquals0(Object e1, Object e2) {
    336. assert e1 != null;
    337. boolean eq;
    338. if (e1 instanceof Object[] && e2 instanceof Object[])
    339. eq = deepEquals ((Object[]) e1, (Object[]) e2);
    340. else if (e1 instanceof byte[] && e2 instanceof byte[])
    341. eq = equals((byte[]) e1, (byte[]) e2);
    342. else if (e1 instanceof short[] && e2 instanceof short[])
    343. eq = equals((short[]) e1, (short[]) e2);
    344. else if (e1 instanceof int[] && e2 instanceof int[])
    345. eq = equals((int[]) e1, (int[]) e2);
    346. else if (e1 instanceof long[] && e2 instanceof long[])
    347. eq = equals((long[]) e1, (long[]) e2);
    348. else if (e1 instanceof char[] && e2 instanceof char[])
    349. eq = equals((char[]) e1, (char[]) e2);
    350. else if (e1 instanceof float[] && e2 instanceof float[])
    351. eq = equals((float[]) e1, (float[]) e2);
    352. else if (e1 instanceof double[] && e2 instanceof double[])
    353. eq = equals((double[]) e1, (double[]) e2);
    354. else if (e1 instanceof boolean[] && e2 instanceof boolean[])
    355. eq = equals((boolean[]) e1, (boolean[]) e2);
    356. else
    357. eq = e1.equals(e2);
    358. return eq;
    359. }
    360. // toString 方法
    361. public static String toString(long[] a) {
    362. if (a == null)
    363. return "null";
    364. int iMax = a.length - 1;
    365. if (iMax == -1)
    366. return "[]";
    367. StringBuilder b = new StringBuilder();
    368. b.append('[');
    369. for (int i = 0; ; i++) {
    370. b.append(a[i]);
    371. if (i == iMax)
    372. return b.append(']').toString();
    373. b.append(", ");
    374. }
    375. }
    376. // 省略重载方法 ...
    377. // 深度 toString
    378. public static String deepToString(Object[] a) {
    379. if (a == null)
    380. return "null";
    381. int bufLen = 20 * a.length;
    382. if (a.length != 0 && bufLen <= 0)
    383. bufLen = Integer.MAX_VALUE;
    384. StringBuilder buf = new StringBuilder(bufLen);
    385. deepToString(a, buf, new HashSet<Object[]>());
    386. return buf.toString();
    387. }
    388. // 省略重载方法 ...
    389. // 置指定的数组中的所有元素,使用所提供的生成器函数来计算每个元素。
    390. public static <T> void setAll(T[] array, IntFunction<? extends T> generator) {
    391. Objects.requireNonNull(generator);
    392. for (int i = 0; i < array.length; i++)
    393. array[i] = generator.apply(i);
    394. }
    395. // 设置指定的数组的所有元素,并行地使用所提供的生成器函数来计算每个元素。
    396. public static <T> void parallelSetAll(T[] array, IntFunction<? extends T> generator) {
    397. Objects.requireNonNull(generator);
    398. IntStream.range(0, array.length).parallel().forEach(i -> { array[i] = generator.apply(i); });
    399. }
    400. // 返回一个Spliterator覆盖所有指定数组
    401. public static <T> Spliterator<T> spliterator(T[] array) {
    402. return Spliterators.spliterator(array,
    403. Spliterator.ORDERED | Spliterator.IMMUTABLE);
    404. }
    405. // 返回一个Spliterator.OfInt覆盖所有指定数组
    406. public static Spliterator.OfInt spliterator(int[] array) {
    407. return Spliterators.spliterator(array,
    408. Spliterator.ORDERED | Spliterator.IMMUTABLE);
    409. }
    410. // JDK8 新特性 Stream 流
    411. public static <T> Stream<T> stream(T[] array, int startInclusive, int endExclusive) {
    412. return StreamSupport.stream(spliterator(array, startInclusive, endExclusive), false);
    413. }
    414. }

    注意点

    ```java public class ArraysTest { public static void main(String[] args) {

      List<String> list = Arrays.asList("1", "@", "#");
      System.out.println(list.get(1));
      list.add("2");
    

    } }

// Exception in thread “main” java.lang.UnsupportedOperationException ```

  • Arrays.asList 内部实现是自行实现的,其不支持添加,所以其是只读的。

    总结

  • Arrays工具类的方法共计5000多行,但是大部分都是重载方法

  • 通过抽取公共部分来看,我们可以发现只要掌握了这些基本方法,也就掌握了Arrays类