Java的Arrays源码
来源:互联网 发布:mac系统idea下载git 编辑:程序博客网 时间:2024/06/06 00:03
public class Arrays {//(JDK:1.7 java.util) private Arrays() {} //私有构造器 public static void sort(int[] a) { //整型排序,数字升序排序 DualPivotQuicksort.sort(a); } public static void sort(int[] a, int fromIndex, int toIndex) { //排序某一部分,包括fromIndex,但不包括toIndex rangeCheck(a.length, fromIndex, toIndex); DualPivotQuicksort.sort(a, fromIndex, toIndex - 1); } static final class LegacyMergeSort { private static final boolean userRequested = //虚拟机创建的一个参数,默认为false java.security.AccessController.doPrivileged( new sun.security.action.GetBooleanAction( "java.util.Arrays.useLegacyMergeSort")).booleanValue(); } public static void sort(Object[] a) { //所有元素必须实现Comparable接口 if (LegacyMergeSort.userRequested) //根据前面的虚拟机参数来选择排序算法, legacyMergeSort(a); else ComparableTimSort.sort(a); } private static void legacyMergeSort(Object[] a) { Object[] aux = a.clone(); //克隆a mergeSort(aux, a, 0, a.length, 0); } public static void sort(Object[] a, int fromIndex, int toIndex) { if (LegacyMergeSort.userRequested) legacyMergeSort(a, fromIndex, toIndex); else ComparableTimSort.sort(a, fromIndex, toIndex); } private static void legacyMergeSort(Object[] a, int fromIndex, int toIndex) { rangeCheck(a.length, fromIndex, toIndex); //参数越界检查 Object[] aux = copyOfRange(a, fromIndex, toIndex); //复制 mergeSort(aux, a, fromIndex, toIndex, -fromIndex); //排序 } private static final int INSERTIONSORT_THRESHOLD = 7; private static void mergeSort(Object[] src, Object[] dest, int low, int high, int off) { int length = high - low; if (length < INSERTIONSORT_THRESHOLD) { //小于7就直接排序 for (int i=low; i<high; i++) for (int j=i; j>low && ((Comparable) dest[j-1]).compareTo(dest[j])>0; j--)//调用Comparable这个接口排序,原数组的类型需实现该接口的方法 swap(dest, j, j-1);//交换数据 return; } int destLow = low; //否则使用合并算法排序 int destHigh = high; low += off; high += off; int mid = (low + high) >>> 1; mergeSort(dest, src, low, mid, -off); mergeSort(dest, src, mid, high, -off); if (((Comparable)src[mid-1]).compareTo(src[mid]) <= 0) { System.arraycopy(src, low, dest, destLow, length); return; } for(int i = destLow, p = low, q = mid; i < destHigh; i++) { if (q >= high || p < mid && ((Comparable)src[p]).compareTo(src[q])<=0) dest[i] = src[p++]; else dest[i] = src[q++]; } } private static void swap(Object[] x, int a, int b) { //交换元素 Object t = x[a]; x[a] = x[b]; x[b] = t; } public static <T> void sort(T[] a, Comparator<? super T> c) { //根据传入的方法(c)进行排序 if (LegacyMergeSort.userRequested) legacyMergeSort(a, c); else TimSort.sort(a, c); } private static <T> void legacyMergeSort(T[] a, Comparator<? super T> c) { T[] aux = a.clone(); if (c==null) mergeSort(aux, a, 0, a.length, 0);//传入了比较方法,就用该方法排序,否则就用默认排序 else mergeSort(aux, a, 0, a.length, 0, c); } public static <T> void sort(T[] a, int fromIndex, int toIndex, Comparator<? super T> c) { if (LegacyMergeSort.userRequested) legacyMergeSort(a, fromIndex, toIndex, c); //范围内排序 else TimSort.sort(a, fromIndex, toIndex, c); } private static <T> void legacyMergeSort(T[] a, int fromIndex, int toIndex, Comparator<? super T> c) { //使用Comparator接口进行比较 rangeCheck(a.length, fromIndex, toIndex); //参数范围检查 T[] aux = copyOfRange(a, fromIndex, toIndex); if (c==null) mergeSort(aux, a, fromIndex, toIndex, -fromIndex); else mergeSort(aux, a, fromIndex, toIndex, -fromIndex, c); } private static void mergeSort(Object[] src, Object[] dest, int low, int high, int off, Comparator c) { int length = high - low; if (length < INSERTIONSORT_THRESHOLD) { //长度小于7直接排序 for (int i=low; i<high; i++) for (int j=i; j>low && c.compare(dest[j-1], dest[j])>0; j--) swap(dest, j, j-1); return; } int destLow = low; int destHigh = high; low += off; high += off; int mid = (low + high) >>> 1; mergeSort(dest, src, low, mid, -off, c); mergeSort(dest, src, mid, high, -off, c); if (c.compare(src[mid-1], src[mid]) <= 0) { System.arraycopy(src, low, dest, destLow, length); return; } for(int i = destLow, p = low, q = mid; i < destHigh; i++) { if (q >= high || p < mid && c.compare(src[p], src[q]) <= 0) dest[i] = src[p++]; else dest[i] = src[q++]; } } private static void rangeCheck(int length, int fromIndex, int toIndex) { if (fromIndex > toIndex) { throw new IllegalArgumentException(//范围检查 "fromIndex(" + fromIndex + ") > toIndex(" + toIndex + ")"); } if (fromIndex < 0) { throw new ArrayIndexOutOfBoundsException(fromIndex); } if (toIndex > length) { throw new ArrayIndexOutOfBoundsException(toIndex); } } public static int binarySearch(long[] a, long key) { return binarySearch0(a, 0, a.length, key); //二分查找,要求a是有序的,否则结果不确定 } public static int binarySearch(long[] a, int fromIndex, int toIndex, long key) { rangeCheck(a.length, fromIndex, toIndex); return binarySearch0(a, fromIndex, toIndex, key); } private static int binarySearch0(long[] a, int fromIndex, int toIndex, long key) { int low = fromIndex; int high = toIndex - 1; while (low <= high) { int mid = (low + high) >>> 1; long midVal = a[mid]; if (midVal < key) low = mid + 1; else if (midVal > key) high = mid - 1; else return mid; // key found } return -(low + 1); // key not found. } public static int binarySearch(Object[] a, Object key) {//在进行此调用之前,必须根据元素的自然顺序对范围进行升序排序,否则结果不确定 return binarySearch0(a, 0, a.length, key); } public static int binarySearch(Object[] a, int fromIndex, int toIndex,//在进行此调用之前,必须实现Comparable接口进行升序排序,否则结果不确定 Object key) { rangeCheck(a.length, fromIndex, toIndex); return binarySearch0(a, fromIndex, toIndex, key); } // Like public version, but without range checks. private static int binarySearch0(Object[] a, int fromIndex, int toIndex, Object key) { int low = fromIndex; int high = toIndex - 1; while (low <= high) { int mid = (low + high) >>> 1; Comparable midVal = (Comparable)a[mid];//排序时调用Comparable接口中排序compareTo方法 int cmp = midVal.compareTo(key); if (cmp < 0) low = mid + 1; else if (cmp > 0) high = mid - 1; else return mid; // key found } return -(low + 1); // key not found. } //二分搜索法搜索数组获得指定对象。调用之前,必须根据通过Comparator对数组进行升序排序。如果没有对数组进行排序,则结果是不确定的 public static <T> int binarySearch(T[] a, T key, Comparator<? super T> c) { return binarySearch0(a, 0, a.length, key, c); } //二分搜索法搜索数组获得指定对象。调用之前,必须根据通过Comparator对数组进行升序排序。如果没有对数组进行排序,则结果是不确定的 public static <T> int binarySearch(T[] a, int fromIndex, int toIndex, T key, Comparator<? super T> c) { rangeCheck(a.length, fromIndex, toIndex); return binarySearch0(a, fromIndex, toIndex, key, c); } //内部实现 private static <T> int binarySearch0(T[] a, int fromIndex, int toIndex, T key, Comparator<? super T> c) { if (c == null) { return binarySearch0(a, fromIndex, toIndex, key); } int low = fromIndex; int high = toIndex - 1; while (low <= high) { int mid = (low + high) >>> 1; T midVal = a[mid]; int cmp = c.compare(midVal, key); if (cmp < 0) low = mid + 1; else if (cmp > 0) high = mid - 1; else return mid; // key found } return -(low + 1); // key not found. } public static boolean equals(long[] a, long[] a2) {//比较数组是否相等 if (a==a2) return true; if (a==null || a2==null) return false; int length = a.length; if (a2.length != length) return false; for (int i=0; i<length; i++) if (a[i] != a2[i]) return false; return true; } public static boolean equals(Object[] a, Object[] a2) { if (a==a2) return true; if (a==null || a2==null) return false; int length = a.length; if (a2.length != length) return false; for (int i=0; i<length; i++) { Object o1 = a[i]; Object o2 = a2[i]; if (!(o1==null ? o2==null : o1.equals(o2))) return false; } return true; } public static void fill(long[] a, long val) { //填充数组 for (int i = 0, len = a.length; i < len; i++) a[i] = val; } public static void fill(long[] a, int fromIndex, int toIndex, long val) { rangeCheck(a.length, fromIndex, toIndex); for (int i = fromIndex; i < toIndex; i++) a[i] = val; } public static void fill(Object[] a, Object val) { for (int i = 0, len = a.length; i < len; i++) a[i] = val; } public static void fill(Object[] a, int fromIndex, int toIndex, Object val) { rangeCheck(a.length, fromIndex, toIndex); for (int i = fromIndex; i < toIndex; i++) a[i] = val; } //深度复制 public static <T> T[] copyOf(T[] original, int newLength) { return (T[]) copyOf(original, newLength, original.getClass()); } public static <T,U> T[] copyOf(U[] original, int newLength, Class<? extends T[]> newType) { //保证copy类型与源类型一致,当然泛型中都是会擦除成object类型,但是可以让它以后向下转型 T[] copy = ((Object)newType == (Object)Object[].class) ? (T[]) new Object[newLength] : (T[]) Array.newInstance(newType.getComponentType(), newLength); //复制数组,比for循环快很多,基本类型和引用类型都可以复制,但是引用类型只是浅复制,即复制引用而不是对象本身的拷贝 System.arraycopy(original, 0, copy, 0, Math.min(original.length, newLength)); return copy; } //范围内的复制,同上 public static <T> T[] copyOfRange(T[] original, int from, int to) { return copyOfRange(original, from, to, (Class<T[]>) original.getClass()); } //范围内的复制,同上 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); //参数有效性检查 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)); //复制数组,速度比for快很多 return copy; } public static <T> List<T> asList(T... a) { return new ArrayList<>(a); //数组变成list存储,仅复制引用,浅复制,于是可以调用下面这个内部类里的方法 } //ArrayList的内部实现,集成的是AbstractList类,里面的add和remove方法没有真正实现,会抛出异常,故不支持调用该方法 private static class ArrayList<E> extends AbstractList<E> implements RandomAccess, java.io.Serializable { private static final long serialVersionUID = -2764017481108945198L; private final E[] a; ArrayList(E[] array) { if (array==null) throw new NullPointerException(); a = array; //复制引用 } public int size() {//大小 return a.length; } public Object[] toArray() {//转为数组 return a.clone(); } public <T> T[] toArray(T[] a) {//同上,保留了具体类型 int size = size(); if (a.length < size) return Arrays.copyOf(this.a, size, (Class<? extends T[]>) a.getClass()); System.arraycopy(this.a, 0, a, 0, size); if (a.length > size) a[size] = null; return a; } public E get(int index) { return a[index]; } public E set(int index, E element) { E oldValue = a[index]; a[index] = element; return oldValue; } public int indexOf(Object o) { //返回元素的索引 if (o==null) { for (int i=0; i<a.length; i++) if (a[i]==null) return i; } else { for (int i=0; i<a.length; i++) if (o.equals(a[i])) return i; } return -1; } public boolean contains(Object o) { //是否包含某个元素 return indexOf(o) != -1; } } public static int hashCode(double a[]) {//返回与内容相关的哈希值,与上面的equals方法一同覆盖Object中的一对方法 if (a == null) return 0; int result = 1; for (double element : a) { long bits = Double.doubleToLongBits(element); result = 31 * result + (int)(bits ^ (bits >>> 32)); } return result; } public static int hashCode(Object a[]) { if (a == null) return 0; int result = 1; for (Object element : a) result = 31 * result + (element == null ? 0 : element.hashCode()); return result; } public static int deepHashCode(Object a[]) {//多维数组的使用 if (a == null) return 0; int result = 1; for (Object element : a) { int elementHash = 0; if (element instanceof Object[]) elementHash = deepHashCode((Object[]) element); else if (element instanceof byte[]) elementHash = hashCode((byte[]) element); else if (element instanceof short[]) elementHash = hashCode((short[]) element); else if (element instanceof int[]) elementHash = hashCode((int[]) element); else if (element instanceof long[]) elementHash = hashCode((long[]) element); else if (element instanceof char[]) elementHash = hashCode((char[]) element); else if (element instanceof float[]) elementHash = hashCode((float[]) element); else if (element instanceof double[]) elementHash = hashCode((double[]) element); else if (element instanceof boolean[]) elementHash = hashCode((boolean[]) element); else if (element != null) elementHash = element.hashCode(); result = 31 * result + elementHash; } return result; } public static boolean deepEquals(Object[] a1, Object[] a2) {//可以比较多维数组 if (a1 == a2) return true; if (a1 == null || a2==null) return false; int length = a1.length; if (a2.length != length) return false; for (int i = 0; i < length; i++) { Object e1 = a1[i]; Object e2 = a2[i]; if (e1 == e2) //即使e1为null,仍可以使用==运算符,但不能使用equals continue; if (e1 == null) return false; // Figure out whether the two elements are equal boolean eq = deepEquals0(e1, e2); if (!eq) return false; } return true; } static boolean deepEquals0(Object e1, Object e2) { assert e1 != null; boolean eq; //判断是否是多维数组 if (e1 instanceof Object[] && e2 instanceof Object[]) eq = deepEquals ((Object[]) e1, (Object[]) e2); else if (e1 instanceof byte[] && e2 instanceof byte[]) eq = equals((byte[]) e1, (byte[]) e2); else if (e1 instanceof short[] && e2 instanceof short[]) eq = equals((short[]) e1, (short[]) e2); else if (e1 instanceof int[] && e2 instanceof int[]) eq = equals((int[]) e1, (int[]) e2); else if (e1 instanceof long[] && e2 instanceof long[]) eq = equals((long[]) e1, (long[]) e2); else if (e1 instanceof char[] && e2 instanceof char[]) eq = equals((char[]) e1, (char[]) e2); else if (e1 instanceof float[] && e2 instanceof float[]) eq = equals((float[]) e1, (float[]) e2); else if (e1 instanceof double[] && e2 instanceof double[]) eq = equals((double[]) e1, (double[]) e2); else if (e1 instanceof boolean[] && e2 instanceof boolean[]) eq = equals((boolean[]) e1, (boolean[]) e2); else eq = e1.equals(e2); return eq; } public static String toString(long[] a) { //toString方法 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(", "); } } public static String toString(Object[] a) { //引用的toString方法 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(String.valueOf(a[i])); if (i == iMax) return b.append(']').toString(); b.append(", "); } } public static String deepToString(Object[] a) {//多维数组可以使用该方法输出字符串 if (a == null) return "null"; int bufLen = 20 * a.length; if (a.length != 0 && bufLen <= 0) //如果bufLen过大 bufLen = Integer.MAX_VALUE; //0x7fffffff StringBuilder buf = new StringBuilder(bufLen); deepToString(a, buf, new HashSet<Object[]>()); return buf.toString(); } private static void deepToString(Object[] a, StringBuilder buf, Set<Object[]> dejaVu) { if (a == null) { buf.append("null"); return; } int iMax = a.length - 1; if (iMax == -1) { buf.append("[]"); return; } dejaVu.add(a); buf.append('['); for (int i = 0; ; i++) { Object element = a[i]; if (element == null) { buf.append("null"); } else { Class eClass = element.getClass(); if (eClass.isArray()) { if (eClass == byte[].class) buf.append(toString((byte[]) element));//如果是一维数组了,直接输出即可 else if (eClass == short[].class) buf.append(toString((short[]) element)); else if (eClass == int[].class) buf.append(toString((int[]) element)); else if (eClass == long[].class) buf.append(toString((long[]) element)); else if (eClass == char[].class) buf.append(toString((char[]) element)); else if (eClass == float[].class) buf.append(toString((float[]) element)); else if (eClass == double[].class) buf.append(toString((double[]) element)); else if (eClass == boolean[].class) buf.append(toString((boolean[]) element)); else { // element is an array of object references if (dejaVu.contains(element)) buf.append("[...]"); else deepToString((Object[])element, buf, dejaVu);//如果仍然是多维数组,再次调用 } } else { // element is non-null and not an array buf.append(element.toString()); } } if (i == iMax) break; buf.append(", "); } buf.append(']'); dejaVu.remove(a); }}
0 0
- Java的Arrays源码
- java中Arrays.sort()的源码分析
- Java Arrays 源码 笔记
- Java源码---java.util.Arrays
- java源码分析:Arrays.sort
- java Arrays.sort 源码分析
- java Arrays.asList()源码剖析
- Java源码分析之Arrays
- java的Arrays.sort(Object[] a)方法源码分析
- 【Java源码分析】Arrays.asList源码分析
- JAVA Arrays的算法
- Java的Arrays-笔记
- java的Arrays类
- Java :Arrays 的copyOf()
- Java的Arrays类
- java --Arrays的equals
- java 源码之 Arrays 工具类
- JAVA JDK API 源码学习 - Arrays.toString
- Amazzzzzzzzzzzzzzzzzzzzing code
- 杂花生树(十七)
- error C2065: 'PMIB_IPSTATS' : undeclared identifier的解决办法
- 一个数加上100是个完全平方数,再加上168又是一个完全平方数, (含优化)
- 泽泽在巴西_ssl1579_最短路
- Java的Arrays源码
- 第九周—切面条
- Decode String
- HTML5 关于 <audio>的操作
- daimajia的图片轮播开源项目配置
- Problem 31 Coin sums(完全背包dp)
- 三天上手PHP之8:逻辑判断(if Else Switch)
- Hdu 1520 Anniversary party(树形DP)
- ubuntu无法上网以及无法远程登录、cuteftp无法登陆linux的解决办法