三、Arrays源码分析
3.1 类的属性
public class Arrays { // 可以进行并行排序的最小数组长度 private static final int MIN_ARRAY_SORT_GRAN = 1 << 13; }
3.2 构造函数
private Arrays() {}
说明:私有构造函数,类外不允许调用。
3.3 方法分析
Arrays的全部方法如下
说明:可以看到,Arrays工具类处理的是数组类型。并且每个方法存在多个重载版本。
3.4 核心方法分析
由于存在多个重载版本,每个重载版本的逻辑大体一致,故只分析有代表性的版
本。
1. sort函数
用于对数组进行排序,两个主要的重载版本,方法签名如下
public static void sort(int[] a) public static void sort(int[] a, int fromIndex, int toIndex)
说明:第一个版本是对整个数组进行排序,第二个版本只对指定部分进行排序。第一个版本代码如下
public static void sort(int[] a) { // 使用快速排序 DualPivotQuicksort.sort(a, 0, a.length - 1, null, 0, 0); }
说明:使用快速排序进行排序。第二个版本与第一个版本类似,不再累赘。
2. equals方法
用于判断两个数组是否相等,若数组元素重写了equals方法,则按照元素的equals方法进行比较。主要的重载版本,方法签名如下
public static boolean equals(int[] a, int[] a2) public static boolean equals(Object[] a, Object[] a2)
说明:第一个版本具体代码如下
public static boolean equals(int[] a, int[] a2) { if (a==a2) return true; if (a==null || a2==null) // 任一数组为空,则返回false return false; int length = a.length; if (a2.length != length) // 数组大小不相等,返回false return false; for (int i=0; i<length; i++) // 遍历比较,元素全部相等则返回true,否则,返回false if (a[i] != a2[i]) return false; return true; }
说明:首先,判断是否为同一个数组引用,满足后,再判断是否有数组为空,满足后,再判断两数组长度是否相等,满足后,最后遍历数组进行比较。
3. copyOf函数
用于复制数组元素至另一个数组。主要重载版本,签名如下
public static <T> T[] copyOf(T[] original, int newLength) public static <T,U> T[] copyOf(U[] original, int newLength, Class<? extends T[]> newType)
第二个版本,具体代码如下
public static <T,U> T[] copyOf(U[] original, int newLength, Class<? extends T[]> newType) { @SuppressWarnings("unchecked") T[] copy = ((Object)newType == (Object)Object[].class) ? (T[]) new Object[newLength] : (T[]) Array.newInstance(newType.getComponentType(), newLength); System.arraycopy(original, 0, copy, 0, Math.min(original.length, newLength)); return copy; }
4. copyOfRange函数
指定数组一段元素进行复制(指定了开始位置和结束位置),签名如下
public static <T> T[] copyOfRange(T[] original, int from, int to) public static <T,U> T[] copyOfRange(U[] original, int from, int to, Class<? extends T[]> newType)
public static <T,U> T[] copyOfRange(U[] original, int from, int to, Class<? extends T[]> newType) { int newLength = to - from; if (newLength < 0) throw new IllegalArgumentException(from + " > " + to); @SuppressWarnings("unchecked") T[] copy = ((Object)newType == (Object)Object[].class) ? (T[]) new Object[newLength] : (T[]) Array.newInstance(newType.getComponentType(), newLength); System.arraycopy(original, from, copy, 0, Math.min(original.length - from, newLength)); return copy; }
5. hashCode函数
求得数组的hashCode,主要版本,签名如下
public static int hashCode(int a[])
代码如下
public static int hashCode(int a[]) { if (a == null) return 0; int result = 1; for (int element : a) result = 31 * result + element; return result; }
6. asList函数
用于将不定参数转化为List,方法签名如下
public static <T> List<T> asList(T... a)
具体代码如下
public static <T> List<T> asList(T... a) { return new ArrayList<>(a); }
7. toString函数
用于更友好的显示数组信息,签名如下
public static String toString(int[] a)
注意,并没有覆盖Object类的toString方法,因为方法签名不相同。具体代码如下
public static String toString(int[] a) { if (a == null) return "null"; int iMax = a.length - 1; if (iMax == -1) return "[]"; StringBuilder b = new StringBuilder(); b.append('['); for (int i = 0; ; i++) { b.append(a[i]); if (i == iMax) return b.append(']').toString(); b.append(", "); } }
Arrays工具类的主要方法就介绍到这里,平时我们可以多用用里面的方法,达到更熟悉的效果。
四、总结
Collections与Arrays提供了很多有用的方法,我们平时可以多用用,至此,集合框架的主要源码就分析完了。下面会接着分析并发框架的源码,谢谢各位园友的观看~