FileDocCategorySizeDatePackage
Arrays.javaAPI DocAndroid 1.5 API104150Wed May 06 22:41:04 BST 2009java.util

Arrays

public class Arrays extends Object
{@code Arrays} contains static methods which operate on arrays.
since
Android 1.0

Fields Summary
Constructors Summary
private Arrays()

        /* empty */
    
Methods Summary
public static java.util.ListasList(T array)
Returns a {@code List} of the objects in the specified array. The size of the {@code List} cannot be modified, i.e. adding and removing are unsupported, but the elements can be set. Setting an element modifies the underlying array.

param
array the array.
return
a {@code List} of the elements of the specified array.
since
Android 1.0

        return new ArrayList<T>(array);
    
public static intbinarySearch(T[] array, T object, java.util.Comparator comparator)
Performs a binary search for the specified element in the specified ascending sorted array using the {@code Comparator} to compare elements. Searching in an unsorted array has an undefined result. It's also undefined which element is found if there are multiple occurrences of the same element.

param
array the sorted array to search
param
object the element to find
param
comparator the {@code Comparator} sued to compare the elements.
return
the non-negative index of the element, or a negative index which is {@code -index - 1} where the element would be inserted.
exception
ClassCastException if an element in the array cannot be compared to the search element using the {@code Comparator}.
since
Android 1.0

        if (comparator == null) {
            return binarySearch(array, object);
        }

        int low = 0, mid = 0, high = array.length - 1, result = 0;
        while (low <= high) {
            mid = (low + high) >> 1;
            if ((result = comparator.compare(array[mid], object)) < 0) {
                low = mid + 1;
            } else if (result == 0) {
                return mid;
            } else {
                high = mid - 1;
            }
        }
        return -mid - (result >= 0 ? 1 : 2);
    
public static intbinarySearch(short[] array, short value)
Performs a binary search for the specified element in the specified ascending sorted array. Searching in an unsorted array has an undefined result. It's also undefined which element is found if there are multiple occurrences of the same element.

param
array the sorted {@code short} array to search.
param
value the {@code short} element to find.
return
the non-negative index of the element, or a negative index which is {@code -index - 1} where the element would be inserted.
since
Android 1.0

        int low = 0, mid = -1, high = array.length - 1;
        while (low <= high) {
            mid = (low + high) >> 1;
            if (value > array[mid]) {
                low = mid + 1;
            } else if (value == array[mid]) {
                return mid;
            } else {
                high = mid - 1;
            }
        }
        if (mid < 0) {
            return -1;
        }
        return -mid - (value < array[mid] ? 1 : 2);
    
public static intbinarySearch(byte[] array, byte value)
Performs a binary search for the specified element in the specified ascending sorted array. Searching in an unsorted array has an undefined result. It's also undefined which element is found if there are multiple occurrences of the same element.

param
array the sorted {@code byte} array to search.
param
value the {@code byte} element to find.
return
the non-negative index of the element, or a negative index which is {@code -index - 1} where the element would be inserted.
since
Android 1.0

        int low = 0, mid = -1, high = array.length - 1;
        while (low <= high) {
            mid = (low + high) >> 1;
            if (value > array[mid]) {
                low = mid + 1;
            } else if (value == array[mid]) {
                return mid;
            } else {
                high = mid - 1;
            }
        }
        if (mid < 0) {
            return -1;
        }

        return -mid - (value < array[mid] ? 1 : 2);
    
public static intbinarySearch(char[] array, char value)
Performs a binary search for the specified element in the specified ascending sorted array. Searching in an unsorted array has an undefined result. It's also undefined which element is found if there are multiple occurrences of the same element.

param
array the sorted {@code char} array to search.
param
value the {@code char} element to find.
return
the non-negative index of the element, or a negative index which is {@code -index - 1} where the element would be inserted.
since
Android 1.0

        int low = 0, mid = -1, high = array.length - 1;
        while (low <= high) {
            mid = (low + high) >> 1;
            if (value > array[mid]) {
                low = mid + 1;
            } else if (value == array[mid]) {
                return mid;
            } else {
                high = mid - 1;
            }
        }
        if (mid < 0) {
            return -1;
        }
        return -mid - (value < array[mid] ? 1 : 2);
    
public static intbinarySearch(double[] array, double value)
Performs a binary search for the specified element in the specified ascending sorted array. Searching in an unsorted array has an undefined result. It's also undefined which element is found if there are multiple occurrences of the same element.

param
array the sorted {@code double} array to search.
param
value the {@code double} element to find.
return
the non-negative index of the element, or a negative index which is {@code -index - 1} where the element would be inserted.
since
Android 1.0

        long longBits = Double.doubleToLongBits(value);
        int low = 0, mid = -1, high = array.length - 1;
        while (low <= high) {
            mid = (low + high) >> 1;
            if (lessThan(array[mid], value)) {
                low = mid + 1;
            } else if (longBits == Double.doubleToLongBits(array[mid])) {
                return mid;
            } else {
                high = mid - 1;
            }
        }
        if (mid < 0) {
            return -1;
        }
        return -mid - (lessThan(value, array[mid]) ? 1 : 2);
    
public static intbinarySearch(float[] array, float value)
Performs a binary search for the specified element in the specified ascending sorted array. Searching in an unsorted array has an undefined result. It's also undefined which element is found if there are multiple occurrences of the same element.

param
array the sorted {@code float} array to search.
param
value the {@code float} element to find.
return
the non-negative index of the element, or a negative index which is {@code -index - 1} where the element would be inserted.
since
Android 1.0

        int intBits = Float.floatToIntBits(value);
        int low = 0, mid = -1, high = array.length - 1;
        while (low <= high) {
            mid = (low + high) >> 1;
            if (lessThan(array[mid], value)) {
                low = mid + 1;
            } else if (intBits == Float.floatToIntBits(array[mid])) {
                return mid;
            } else {
                high = mid - 1;
            }
        }
        if (mid < 0) {
            return -1;
        }
        return -mid - (lessThan(value, array[mid]) ? 1 : 2);
    
public static intbinarySearch(int[] array, int value)
Performs a binary search for the specified element in the specified ascending sorted array. Searching in an unsorted array has an undefined result. It's also undefined which element is found if there are multiple occurrences of the same element.

param
array the sorted {@code int} array to search.
param
value the {@code int} element to find.
return
the non-negative index of the element, or a negative index which is {@code -index - 1} where the element would be inserted.
since
Android 1.0

        int low = 0, mid = -1, high = array.length - 1;
        while (low <= high) {
            mid = (low + high) >> 1;
            if (value > array[mid]) {
                low = mid + 1;
            } else if (value == array[mid]) {
                return mid;
            } else {
                high = mid - 1;
            }
        }
        if (mid < 0) {
            return -1;
        }
        return -mid - (value < array[mid] ? 1 : 2);
    
public static intbinarySearch(long[] array, long value)
Performs a binary search for the specified element in the specified ascending sorted array. Searching in an unsorted array has an undefined result. It's also undefined which element is found if there are multiple occurrences of the same element.

param
array the sorted {@code long} array to search.
param
value the {@code long} element to find.
return
the non-negative index of the element, or a negative index which is {@code -index - 1} where the element would be inserted.
since
Android 1.0

        int low = 0, mid = -1, high = array.length - 1;
        while (low <= high) {
            mid = (low + high) >> 1;
            if (value > array[mid]) {
                low = mid + 1;
            } else if (value == array[mid]) {
                return mid;
            } else {
                high = mid - 1;
            }
        }
        if (mid < 0) {
            return -1;
        }
        return -mid - (value < array[mid] ? 1 : 2);
    
public static intbinarySearch(java.lang.Object[] array, java.lang.Object object)
Performs a binary search for the specified element in the specified ascending sorted array. Searching in an unsorted array has an undefined result. It's also undefined which element is found if there are multiple occurrences of the same element.

param
array the sorted {@code Object} array to search.
param
object the {@code Object} element to find.
return
the non-negative index of the element, or a negative index which is {@code -index - 1} where the element would be inserted.
exception
ClassCastException if an element in the array or the search element does not implement {@code Comparable}, or cannot be compared to each other.
since
Android 1.0

        if (array.length == 0) {
            return -1;
        }
        Comparable<Object> key = (Comparable<Object>) object;
        int low = 0, mid = 0, high = array.length - 1, result = 0;
        while (low <= high) {
            mid = (low + high) >> 1;
            if ((result = key.compareTo(array[mid])) > 0) {
                low = mid + 1;
            } else if (result == 0) {
                return mid;
            } else {
                high = mid - 1;
            }
        }
        return -mid - (result <= 0 ? 1 : 2);
    
private static voidcheckBounds(int arrLength, int start, int end)

        if (start > end) {
            throw new IllegalArgumentException("fromIndex(" + start //$NON-NLS-1$
                    + ") > toIndex(" + end + ")"); //$NON-NLS-1$ //$NON-NLS-2$
        }
        if (start < 0 || end > arrLength) {
            throw new ArrayIndexOutOfBoundsException();
        }
    
public static booleandeepEquals(java.lang.Object[] array1, java.lang.Object[] array2)
Returns {@code true} if the two given arrays are deeply equal to one another. Unlike the method {@code equals(Object[] array1, Object[] array2)}, this method is appropriate for use for nested arrays of arbitrary depth.

Two array references are considered deeply equal if they are both {@code null}, or if they refer to arrays that have the same length and the elements at each index in the two arrays are equal.

Two {@code null} elements {@code element1} and {@code element2} are possibly deeply equal if any of the following conditions satisfied:

{@code element1} and {@code element2} are both arrays of object reference types, and {@code Arrays.deepEquals(element1, element2)} would return {@code true}.

{@code element1} and {@code element2} are arrays of the same primitive type, and the appropriate overloading of {@code Arrays.equals(element1, element2)} would return {@code true}.

{@code element1 == element2}

{@code element1.equals(element2)} would return {@code true}.

Note that this definition permits {@code null} elements at any depth.

If either of the given arrays contain themselves as elements, the behavior of this method is uncertain.

param
array1 the first {@code Object} array.
param
array2 the second {@code Object} array.
return
{@code true} if both arrays are {@code null} or if the arrays have the same length and the elements at each index in the two arrays are equal according to {@code equals()}, {@code false} otherwise.
since
Android 1.0

        if (array1 == array2) {
            return true;
        }
        if (array1 == null || array2 == null || array1.length != array2.length) {
            return false;
        }
        for (int i = 0; i < array1.length; i++) {
            Object e1 = array1[i], e2 = array2[i];

            if (!deepEqualsElements(e1, e2)) {
                return false;
            }
        }
        return true;
    
private static booleandeepEqualsElements(java.lang.Object e1, java.lang.Object e2)

        Class<?> cl1, cl2;

        if (e1 == e2) {
            return true;
        }

        if (e1 == null || e2 == null) {
            return false;
        }

        cl1 = e1.getClass().getComponentType();
        cl2 = e2.getClass().getComponentType();

        if (cl1 != cl2) {
            return false;
        }

        if (cl1 == null) {
            return e1.equals(e2);
        }

        /*
         * compare as arrays
         */
        if (!cl1.isPrimitive()) {
            return deepEquals((Object[]) e1, (Object[]) e2);
        }

        if (cl1.equals(int.class)) {
            return equals((int[]) e1, (int[]) e2);
        }
        if (cl1.equals(char.class)) {
            return equals((char[]) e1, (char[]) e2);
        }
        if (cl1.equals(boolean.class)) {
            return equals((boolean[]) e1, (boolean[]) e2);
        }
        if (cl1.equals(byte.class)) {
            return equals((byte[]) e1, (byte[]) e2);
        }
        if (cl1.equals(long.class)) {
            return equals((long[]) e1, (long[]) e2);
        }
        if (cl1.equals(float.class)) {
            return equals((float[]) e1, (float[]) e2);
        }
        if (cl1.equals(double.class)) {
            return equals((double[]) e1, (double[]) e2);
        }
        return equals((short[]) e1, (short[]) e2);
    
public static intdeepHashCode(java.lang.Object[] array)
Returns a hash code based on the "deep contents" of the given array. If the array contains other arrays as its elements, the hash code is based on their contents not their identities. So it is not acceptable to invoke this method on an array that contains itself as an element, either directly or indirectly.

For any two arrays {@code a} and {@code b}, if {@code Arrays.deepEquals(a, b)} returns {@code true}, it means that the return value of {@code Arrays.deepHashCode(a)} equals {@code Arrays.deepHashCode(b)}.

The computation of the value returned by this method is similar to that of the value returned by {@link List#hashCode()}} invoked on a {@link List}} containing a sequence of instances representing the elements of array in the same order. The difference is: If an element e of array is itself an array, its hash code is computed by calling the appropriate overloading of {@code Arrays.hashCode(e)} if e is an array of a primitive type, or by calling {@code Arrays.deepHashCode(e)} recursively if e is an array of a reference type. The value returned by this method is the same value as the method {@code Arrays.asList(array).hashCode()}. If the array is {@code null}, the return value is 0.

param
array the array whose hash code to compute.
return
the hash code for {@code array}.
since
Android 1.0

        if (array == null) {
            return 0;
        }
        int hashCode = 1;
        for (Object element : array) {
            int elementHashCode = deepHashCodeElement(element);
            hashCode = 31 * hashCode + elementHashCode;
        }
        return hashCode;
    
private static intdeepHashCodeElement(java.lang.Object element)

        Class<?> cl;
        if (element == null) {
            return 0;
        }

        cl = element.getClass().getComponentType();

        if (cl == null) {
            return element.hashCode();
        }

        /*
         * element is an array
         */
        if (!cl.isPrimitive()) {
            return deepHashCode((Object[]) element);
        }
        if (cl.equals(int.class)) {
            return hashCode((int[]) element);
        }
        if (cl.equals(char.class)) {
            return hashCode((char[]) element);
        }
        if (cl.equals(boolean.class)) {
            return hashCode((boolean[]) element);
        }
        if (cl.equals(byte.class)) {
            return hashCode((byte[]) element);
        }
        if (cl.equals(long.class)) {
            return hashCode((long[]) element);
        }
        if (cl.equals(float.class)) {
            return hashCode((float[]) element);
        }
        if (cl.equals(double.class)) {
            return hashCode((double[]) element);
        }
        return hashCode((short[]) element);
    
public static java.lang.StringdeepToString(java.lang.Object[] array)

Creates a "deep" {@code String} representation of the {@code Object[]} passed, such that if the array contains other arrays, the {@code String} representation of those arrays is generated as well.

If any of the elements are primitive arrays, the generation is delegated to the other {@code toString} methods in this class. If any element contains a reference to the original array, then it will be represented as {@code "[...]"}. If an element is an {@code Object[]}, then its representation is generated by a recursive call to this method. All other elements are converted via the {@link String#valueOf(Object)} method.

param
array the {@code Object} array to convert.
return
the {@code String} representation of {@code array}.
since
Android 1.0

        // delegate this to the recursive method
        return deepToStringImpl(array, new Object[] { array }, null);
    
private static java.lang.StringdeepToStringImpl(java.lang.Object[] array, java.lang.Object[] origArrays, java.lang.StringBuilder sb)

Implementation method used by {@link #deepToString(Object[])}.

param
array the {@code Object[]} to dive into.
param
origArrays the original {@code Object[]}; used to test for self references.
param
sb the {@code StringBuilder} instance to append to or {@code null} one hasn't been created yet.
return
the result.
see
#deepToString(Object[])

        if (array == null) {
            return "null"; //$NON-NLS-1$
        }
        if (array.length == 0) {
            return "[]"; //$NON-NLS-1$
        }

        if (sb == null) {
            sb = new StringBuilder(2 + array.length * 5);
        }
        sb.append('[");

        for (int i = 0; i < array.length; i++) {
            if (i != 0) {
                sb.append(", "); //$NON-NLS-1$
            }
            // establish current element
            Object elem = array[i];
            if (elem == null) {
                // element is null
                sb.append("null"); //$NON-NLS-1$
            } else {
                // get the Class of the current element
                Class<?> elemClass = elem.getClass();
                if (elemClass.isArray()) {
                    // element is an array type

                    // get the declared Class of the array (element)
                    Class<?> elemElemClass = elemClass.getComponentType();
                    if (elemElemClass.isPrimitive()) {
                        // element is a primitive array
                        if (boolean.class.equals(elemElemClass)) {
                            sb.append(toString((boolean[]) elem));
                        } else if (byte.class.equals(elemElemClass)) {
                            sb.append(toString((byte[]) elem));
                        } else if (char.class.equals(elemElemClass)) {
                            sb.append(toString((char[]) elem));
                        } else if (double.class.equals(elemElemClass)) {
                            sb.append(toString((double[]) elem));
                        } else if (float.class.equals(elemElemClass)) {
                            sb.append(toString((float[]) elem));
                        } else if (int.class.equals(elemElemClass)) {
                            sb.append(toString((int[]) elem));
                        } else if (long.class.equals(elemElemClass)) {
                            sb.append(toString((long[]) elem));
                        } else if (short.class.equals(elemElemClass)) {
                            sb.append(toString((short[]) elem));
                        } else {
                            // no other possible primitives, so we assert that
                            throw new AssertionError();
                        }
                    } else {
                        // element is an Object[], so we assert that
                        assert elem instanceof Object[];
                        if (deepToStringImplContains(origArrays, elem)) {
                            sb.append("[...]"); //$NON-NLS-1$
                        } else {
                            Object[] newArray = (Object[]) elem;
                            Object[] newOrigArrays = new Object[origArrays.length + 1];
                            System.arraycopy(origArrays, 0, newOrigArrays, 0,
                                    origArrays.length);
                            newOrigArrays[origArrays.length] = newArray;
                            // make the recursive call to this method
                            deepToStringImpl(newArray, newOrigArrays, sb);
                        }
                    }
                } else { // element is NOT an array, just an Object
                    sb.append(array[i]);
                }
            }
        }
        sb.append(']");
        return sb.toString();
    
private static booleandeepToStringImplContains(java.lang.Object[] origArrays, java.lang.Object array)

Utility method used to assist the implementation of {@link #deepToString(Object[])}.

param
origArrays An array of Object[] references.
param
array An Object[] reference to look for in {@code origArrays}.
return
A value of {@code true} if {@code array} is an element in {@code origArrays}.

        if (origArrays == null || origArrays.length == 0) {
            return false;
        }
        for (Object element : origArrays) {
            if (element == array) {
                return true;
            }
        }
        return false;
    
public static booleanequals(byte[] array1, byte[] array2)
Compares the two arrays.

param
array1 the first {@code byte} array.
param
array2 the second {@code byte} array.
return
{@code true} if both arrays are {@code null} or if the arrays have the same length and the elements at each index in the two arrays are equal, {@code false} otherwise.
since
Android 1.0

        if (array1 == array2) {
            return true;
        }
        if (array1 == null || array2 == null || array1.length != array2.length) {
            return false;
        }
        for (int i = 0; i < array1.length; i++) {
            if (array1[i] != array2[i]) {
                return false;
            }
        }
        return true;
    
public static booleanequals(short[] array1, short[] array2)
Compares the two arrays.

param
array1 the first {@code short} array.
param
array2 the second {@code short} array.
return
{@code true} if both arrays are {@code null} or if the arrays have the same length and the elements at each index in the two arrays are equal, {@code false} otherwise.
since
Android 1.0

        if (array1 == array2) {
            return true;
        }
        if (array1 == null || array2 == null || array1.length != array2.length) {
            return false;
        }
        for (int i = 0; i < array1.length; i++) {
            if (array1[i] != array2[i]) {
                return false;
            }
        }
        return true;
    
public static booleanequals(char[] array1, char[] array2)
Compares the two arrays.

param
array1 the first {@code char} array.
param
array2 the second {@code char} array.
return
{@code true} if both arrays are {@code null} or if the arrays have the same length and the elements at each index in the two arrays are equal, {@code false} otherwise.
since
Android 1.0

        if (array1 == array2) {
            return true;
        }
        if (array1 == null || array2 == null || array1.length != array2.length) {
            return false;
        }
        for (int i = 0; i < array1.length; i++) {
            if (array1[i] != array2[i]) {
                return false;
            }
        }
        return true;
    
public static booleanequals(int[] array1, int[] array2)
Compares the two arrays.

param
array1 the first {@code int} array.
param
array2 the second {@code int} array.
return
{@code true} if both arrays are {@code null} or if the arrays have the same length and the elements at each index in the two arrays are equal, {@code false} otherwise.
since
Android 1.0

        if (array1 == array2) {
            return true;
        }
        if (array1 == null || array2 == null || array1.length != array2.length) {
            return false;
        }
        for (int i = 0; i < array1.length; i++) {
            if (array1[i] != array2[i]) {
                return false;
            }
        }
        return true;
    
public static booleanequals(long[] array1, long[] array2)
Compares the two arrays.

param
array1 the first {@code long} array.
param
array2 the second {@code long} array.
return
{@code true} if both arrays are {@code null} or if the arrays have the same length and the elements at each index in the two arrays are equal, {@code false} otherwise.
since
Android 1.0

        if (array1 == array2) {
            return true;
        }
        if (array1 == null || array2 == null || array1.length != array2.length) {
            return false;
        }
        for (int i = 0; i < array1.length; i++) {
            if (array1[i] != array2[i]) {
                return false;
            }
        }
        return true;
    
public static booleanequals(float[] array1, float[] array2)
Compares the two arrays. The values are compared in the same manner as {@code Float.equals()}.

param
array1 the first {@code float} array.
param
array2 the second {@code float} array.
return
{@code true} if both arrays are {@code null} or if the arrays have the same length and the elements at each index in the two arrays are equal, {@code false} otherwise.
see
Float#equals(Object)
since
Android 1.0

        if (array1 == array2) {
            return true;
        }
        if (array1 == null || array2 == null || array1.length != array2.length) {
            return false;
        }
        for (int i = 0; i < array1.length; i++) {
            if (Float.floatToIntBits(array1[i]) != Float
                    .floatToIntBits(array2[i])) {
                return false;
            }
        }
        return true;
    
public static booleanequals(double[] array1, double[] array2)
Compares the two arrays. The values are compared in the same manner as {@code Double.equals()}.

param
array1 the first {@code double} array.
param
array2 the second {@code double} array.
return
{@code true} if both arrays are {@code null} or if the arrays have the same length and the elements at each index in the two arrays are equal, {@code false} otherwise.
see
Double#equals(Object)
since
Android 1.0

        if (array1 == array2) {
            return true;
        }
        if (array1 == null || array2 == null || array1.length != array2.length) {
            return false;
        }
        for (int i = 0; i < array1.length; i++) {
            if (Double.doubleToLongBits(array1[i]) != Double
                    .doubleToLongBits(array2[i])) {
                return false;
            }
        }
        return true;
    
public static booleanequals(boolean[] array1, boolean[] array2)
Compares the two arrays.

param
array1 the first {@code boolean} array.
param
array2 the second {@code boolean} array.
return
{@code true} if both arrays are {@code null} or if the arrays have the same length and the elements at each index in the two arrays are equal, {@code false} otherwise.
since
Android 1.0

        if (array1 == array2) {
            return true;
        }
        if (array1 == null || array2 == null || array1.length != array2.length) {
            return false;
        }
        for (int i = 0; i < array1.length; i++) {
            if (array1[i] != array2[i]) {
                return false;
            }
        }
        return true;
    
public static booleanequals(java.lang.Object[] array1, java.lang.Object[] array2)
Compares the two arrays.

param
array1 the first {@code Object} array.
param
array2 the second {@code Object} array.
return
{@code true} if both arrays are {@code null} or if the arrays have the same length and the elements at each index in the two arrays are equal according to {@code equals()}, {@code false} otherwise.
since
Android 1.0

        if (array1 == array2) {
            return true;
        }
        if (array1 == null || array2 == null || array1.length != array2.length) {
            return false;
        }
        for (int i = 0; i < array1.length; i++) {
            Object e1 = array1[i], e2 = array2[i];
            if (!(e1 == null ? e2 == null : e1.equals(e2))) {
                return false;
            }
        }
        return true;
    
public static voidfill(byte[] array, byte value)
Fills the specified array with the specified element.

param
array the {@code byte} array to fill.
param
value the {@code byte} element.
since
Android 1.0

        for (int i = 0; i < array.length; i++) {
            array[i] = value;
        }
    
public static voidfill(byte[] array, int start, int end, byte value)
Fills the specified range in the array with the specified element.

param
array the {@code byte} array to fill.
param
start the first index to fill.
param
end the last + 1 index to fill.
param
value the {@code byte} element.
exception
IllegalArgumentException if {@code start > end}.
exception
ArrayIndexOutOfBoundsException if {@code start < 0} or {@code end > array.length}.
since
Android 1.0

        // Check for null first
        int length = array.length;
        if (start > end) {
            throw new IllegalArgumentException();
        }
        if (start < 0 || end > length) {
            throw new ArrayIndexOutOfBoundsException();
        }
        for (int i = start; i < end; i++) {
            array[i] = value;
        }
    
public static voidfill(short[] array, short value)
Fills the specified array with the specified element.

param
array the {@code short} array to fill.
param
value the {@code short} element.
since
Android 1.0

        for (int i = 0; i < array.length; i++) {
            array[i] = value;
        }
    
public static voidfill(short[] array, int start, int end, short value)
Fills the specified range in the array with the specified element.

param
array the {@code short} array to fill.
param
start the first index to fill.
param
end the last + 1 index to fill.
param
value the {@code short} element.
exception
IllegalArgumentException if {@code start > end}.
exception
ArrayIndexOutOfBoundsException if {@code start < 0} or {@code end > array.length}.
since
Android 1.0

        // Check for null first
        int length = array.length;
        if (start > end) {
            throw new IllegalArgumentException();
        }
        if (start < 0 || end > length) {
            throw new ArrayIndexOutOfBoundsException();
        }
        for (int i = start; i < end; i++) {
            array[i] = value;
        }
    
public static voidfill(char[] array, char value)
Fills the specified array with the specified element.

param
array the {@code char} array to fill.
param
value the {@code char} element.
since
Android 1.0

        for (int i = 0; i < array.length; i++) {
            array[i] = value;
        }
    
public static voidfill(char[] array, int start, int end, char value)
Fills the specified range in the array with the specified element.

param
array the {@code char} array to fill.
param
start the first index to fill.
param
end the last + 1 index to fill.
param
value the {@code char} element.
exception
IllegalArgumentException if {@code start > end}.
exception
ArrayIndexOutOfBoundsException if {@code start < 0} or {@code end > array.length}.
since
Android 1.0

        // Check for null first
        int length = array.length;
        if (start > end) {
            throw new IllegalArgumentException();
        }
        if (start < 0 || end > length) {
            throw new ArrayIndexOutOfBoundsException();
        }
        for (int i = start; i < end; i++) {
            array[i] = value;
        }
    
public static voidfill(int[] array, int value)
Fills the specified array with the specified element.

param
array the {@code int} array to fill.
param
value the {@code int} element.
since
Android 1.0

        for (int i = 0; i < array.length; i++) {
            array[i] = value;
        }
    
public static voidfill(int[] array, int start, int end, int value)
Fills the specified range in the array with the specified element.

param
array the {@code int} array to fill.
param
start the first index to fill.
param
end the last + 1 index to fill.
param
value the {@code int} element.
exception
IllegalArgumentException if {@code start > end}.
exception
ArrayIndexOutOfBoundsException if {@code start < 0} or {@code end > array.length}.
since
Android 1.0

        // Check for null first
        int length = array.length;
        if (start > end) {
            throw new IllegalArgumentException();
        }
        if (start < 0 || end > length) {
            throw new ArrayIndexOutOfBoundsException();
        }
        for (int i = start; i < end; i++) {
            array[i] = value;
        }
    
public static voidfill(long[] array, long value)
Fills the specified array with the specified element.

param
array the {@code long} array to fill.
param
value the {@code long} element.
since
Android 1.0

        for (int i = 0; i < array.length; i++) {
            array[i] = value;
        }
    
public static voidfill(long[] array, int start, int end, long value)
Fills the specified range in the array with the specified element.

param
array the {@code long} array to fill.
param
start the first index to fill.
param
end the last + 1 index to fill.
param
value the {@code long} element.
exception
IllegalArgumentException if {@code start > end}.
exception
ArrayIndexOutOfBoundsException if {@code start < 0} or {@code end > array.length}.
since
Android 1.0

        // Check for null first
        int length = array.length;
        if (start > end) {
            throw new IllegalArgumentException();
        }
        if (start < 0 || end > length) {
            throw new ArrayIndexOutOfBoundsException();
        }
        for (int i = start; i < end; i++) {
            array[i] = value;
        }
    
public static voidfill(float[] array, float value)
Fills the specified array with the specified element.

param
array the {@code float} array to fill.
param
value the {@code float} element.
since
Android 1.0

        for (int i = 0; i < array.length; i++) {
            array[i] = value;
        }
    
public static voidfill(float[] array, int start, int end, float value)
Fills the specified range in the array with the specified element.

param
array the {@code float} array to fill.
param
start the first index to fill.
param
end the last + 1 index to fill.
param
value the {@code float} element.
exception
IllegalArgumentException if {@code start > end}.
exception
ArrayIndexOutOfBoundsException if {@code start < 0} or {@code end > array.length}.
since
Android 1.0

        // Check for null first
        int length = array.length;
        if (start > end) {
            throw new IllegalArgumentException();
        }
        if (start < 0 || end > length) {
            throw new ArrayIndexOutOfBoundsException();
        }
        for (int i = start; i < end; i++) {
            array[i] = value;
        }
    
public static voidfill(double[] array, double value)
Fills the specified array with the specified element.

param
array the {@code double} array to fill.
param
value the {@code double} element.
since
Android 1.0

        for (int i = 0; i < array.length; i++) {
            array[i] = value;
        }
    
public static voidfill(double[] array, int start, int end, double value)
Fills the specified range in the array with the specified element.

param
array the {@code double} array to fill.
param
start the first index to fill.
param
end the last + 1 index to fill.
param
value the {@code double} element.
exception
IllegalArgumentException if {@code start > end}.
exception
ArrayIndexOutOfBoundsException if {@code start < 0} or {@code end > array.length}.
since
Android 1.0

        // Check for null first
        int length = array.length;
        if (start > end) {
            throw new IllegalArgumentException();
        }
        if (start < 0 || end > length) {
            throw new ArrayIndexOutOfBoundsException();
        }
        for (int i = start; i < end; i++) {
            array[i] = value;
        }
    
public static voidfill(boolean[] array, boolean value)
Fills the specified array with the specified element.

param
array the {@code boolean} array to fill.
param
value the {@code boolean} element.
since
Android 1.0

        for (int i = 0; i < array.length; i++) {
            array[i] = value;
        }
    
public static voidfill(boolean[] array, int start, int end, boolean value)
Fills the specified range in the array with the specified element.

param
array the {@code boolean} array to fill.
param
start the first index to fill.
param
end the last + 1 index to fill.
param
value the {@code boolean} element.
exception
IllegalArgumentException if {@code start > end}.
exception
ArrayIndexOutOfBoundsException if {@code start < 0} or {@code end > array.length}.
since
Android 1.0

        // Check for null first
        int length = array.length;
        if (start > end) {
            throw new IllegalArgumentException();
        }
        if (start < 0 || end > length) {
            throw new ArrayIndexOutOfBoundsException();
        }
        for (int i = start; i < end; i++) {
            array[i] = value;
        }
    
public static voidfill(java.lang.Object[] array, java.lang.Object value)
Fills the specified array with the specified element.

param
array the {@code Object} array to fill.
param
value the {@code Object} element.
since
Android 1.0

        for (int i = 0; i < array.length; i++) {
            array[i] = value;
        }
    
public static voidfill(java.lang.Object[] array, int start, int end, java.lang.Object value)
Fills the specified range in the array with the specified element.

param
array the {@code Object} array to fill.
param
start the first index to fill.
param
end the last + 1 index to fill.
param
value the {@code Object} element.
exception
IllegalArgumentException if {@code start > end}.
exception
ArrayIndexOutOfBoundsException if {@code start < 0} or {@code end > array.length}.
since
Android 1.0

        // Check for null first
        int length = array.length;
        if (start > end) {
            throw new IllegalArgumentException();
        }
        if (start < 0 || end > length) {
            throw new ArrayIndexOutOfBoundsException();
        }
        for (int i = start; i < end; i++) {
            array[i] = value;
        }
    
public static inthashCode(boolean[] array)
Returns a hash code based on the contents of the given array. For any two {@code boolean} arrays {@code a} and {@code b}, if {@code Arrays.equals(a, b)} returns {@code true}, it means that the return value of {@code Arrays.hashCode(a)} equals {@code Arrays.hashCode(b)}.

The value returned by this method is the same value as the {@link List#hashCode()}} method which is invoked on a {@link List}} containing a sequence of {@link Boolean}} instances representing the elements of array in the same order. If the array is {@code null}, the return value is 0.

param
array the array whose hash code to compute.
return
the hash code for {@code array}.
since
Android 1.0

        if (array == null) {
            return 0;
        }
        int hashCode = 1;
        for (boolean element : array) {
            // 1231, 1237 are hash code values for boolean value
            hashCode = 31 * hashCode + (element ? 1231 : 1237);
        }
        return hashCode;
    
public static inthashCode(int[] array)
Returns a hash code based on the contents of the given array. For any two not-null {@code int} arrays {@code a} and {@code b}, if {@code Arrays.equals(a, b)} returns {@code true}, it means that the return value of {@code Arrays.hashCode(a)} equals {@code Arrays.hashCode(b)}.

The value returned by this method is the same value as the {@link List#hashCode()}} method which is invoked on a {@link List}} containing a sequence of {@link Integer}} instances representing the elements of array in the same order. If the array is {@code null}, the return value is 0.

param
array the array whose hash code to compute.
return
the hash code for {@code array}.
since
Android 1.0

        if (array == null) {
            return 0;
        }
        int hashCode = 1;
        for (int element : array) {
            // the hash code value for integer value is integer value itself
            hashCode = 31 * hashCode + element;
        }
        return hashCode;
    
public static inthashCode(short[] array)
Returns a hash code based on the contents of the given array. For any two {@code short} arrays {@code a} and {@code b}, if {@code Arrays.equals(a, b)} returns {@code true}, it means that the return value of {@code Arrays.hashCode(a)} equals {@code Arrays.hashCode(b)}.

The value returned by this method is the same value as the {@link List#hashCode()}} method which is invoked on a {@link List}} containing a sequence of {@link Short}} instances representing the elements of array in the same order. If the array is {@code null}, the return value is 0.

param
array the array whose hash code to compute.
return
the hash code for {@code array}.
since
Android 1.0

        if (array == null) {
            return 0;
        }
        int hashCode = 1;
        for (short element : array) {
            // the hash code value for short value is its integer value
            hashCode = 31 * hashCode + element;
        }
        return hashCode;
    
public static inthashCode(char[] array)
Returns a hash code based on the contents of the given array. For any two {@code char} arrays {@code a} and {@code b}, if {@code Arrays.equals(a, b)} returns {@code true}, it means that the return value of {@code Arrays.hashCode(a)} equals {@code Arrays.hashCode(b)}.

The value returned by this method is the same value as the {@link List#hashCode()}} method which is invoked on a {@link List}} containing a sequence of {@link Character}} instances representing the elements of array in the same order. If the array is {@code null}, the return value is 0.

param
array the array whose hash code to compute.
return
the hash code for {@code array}.
since
Android 1.0

        if (array == null) {
            return 0;
        }
        int hashCode = 1;
        for (char element : array) {
            // the hash code value for char value is its integer value
            hashCode = 31 * hashCode + element;
        }
        return hashCode;
    
public static inthashCode(byte[] array)
Returns a hash code based on the contents of the given array. For any two {@code byte} arrays {@code a} and {@code b}, if {@code Arrays.equals(a, b)} returns {@code true}, it means that the return value of {@code Arrays.hashCode(a)} equals {@code Arrays.hashCode(b)}.

The value returned by this method is the same value as the {@link List#hashCode()}} method which is invoked on a {@link List}} containing a sequence of {@link Byte}} instances representing the elements of array in the same order. If the array is {@code null}, the return value is 0.

param
array the array whose hash code to compute.
return
the hash code for {@code array}.
since
Android 1.0

        if (array == null) {
            return 0;
        }
        int hashCode = 1;
        for (byte element : array) {
            // the hash code value for byte value is its integer value
            hashCode = 31 * hashCode + element;
        }
        return hashCode;
    
public static inthashCode(long[] array)
Returns a hash code based on the contents of the given array. For any two {@code long} arrays {@code a} and {@code b}, if {@code Arrays.equals(a, b)} returns {@code true}, it means that the return value of {@code Arrays.hashCode(a)} equals {@code Arrays.hashCode(b)}.

The value returned by this method is the same value as the {@link List#hashCode()}} method which is invoked on a {@link List}} containing a sequence of {@link Long}} instances representing the elements of array in the same order. If the array is {@code null}, the return value is 0.

param
array the array whose hash code to compute.
return
the hash code for {@code array}.
since
Android 1.0

        if (array == null) {
            return 0;
        }
        int hashCode = 1;
        for (long elementValue : array) {
            /*
             * the hash code value for long value is (int) (value ^ (value >>>
             * 32))
             */
            hashCode = 31 * hashCode
                    + (int) (elementValue ^ (elementValue >>> 32));
        }
        return hashCode;
    
public static inthashCode(float[] array)
Returns a hash code based on the contents of the given array. For any two {@code float} arrays {@code a} and {@code b}, if {@code Arrays.equals(a, b)} returns {@code true}, it means that the return value of {@code Arrays.hashCode(a)} equals {@code Arrays.hashCode(b)}.

The value returned by this method is the same value as the {@link List#hashCode()}} method which is invoked on a {@link List}} containing a sequence of {@link Float}} instances representing the elements of array in the same order. If the array is {@code null}, the return value is 0.

param
array the array whose hash code to compute.
return
the hash code for {@code array}.
since
Android 1.0

        if (array == null) {
            return 0;
        }
        int hashCode = 1;
        for (float element : array) {
            /*
             * the hash code value for float value is
             * Float.floatToIntBits(value)
             */
            hashCode = 31 * hashCode + Float.floatToIntBits(element);
        }
        return hashCode;
    
public static inthashCode(double[] array)
Returns a hash code based on the contents of the given array. For any two {@code double} arrays {@code a} and {@code b}, if {@code Arrays.equals(a, b)} returns {@code true}, it means that the return value of {@code Arrays.hashCode(a)} equals {@code Arrays.hashCode(b)}.

The value returned by this method is the same value as the {@link List#hashCode()}} method which is invoked on a {@link List}} containing a sequence of {@link Double}} instances representing the elements of array in the same order. If the array is {@code null}, the return value is 0.

param
array the array whose hash code to compute.
return
the hash code for {@code array}.
since
Android 1.0

        if (array == null) {
            return 0;
        }
        int hashCode = 1;

        for (double element : array) {
            long v = Double.doubleToLongBits(element);
            /*
             * the hash code value for double value is (int) (v ^ (v >>> 32))
             * where v = Double.doubleToLongBits(value)
             */
            hashCode = 31 * hashCode + (int) (v ^ (v >>> 32));
        }
        return hashCode;
    
public static inthashCode(java.lang.Object[] array)
Returns a hash code based on the contents of the given array. If the array contains other arrays as its elements, the hash code is based on their identities not their contents. So it is acceptable to invoke this method on an array that contains itself as an element, either directly or indirectly.

For any two arrays {@code a} and {@code b}, if {@code Arrays.equals(a, b)} returns {@code true}, it means that the return value of {@code Arrays.hashCode(a)} equals {@code Arrays.hashCode(b)}.

The value returned by this method is the same value as the method Arrays.asList(array).hashCode(). If the array is {@code null}, the return value is 0.

param
array the array whose hash code to compute.
return
the hash code for {@code array}.
since
Android 1.0

        if (array == null) {
            return 0;
        }
        int hashCode = 1;
        for (Object element : array) {
            int elementHashCode;

            if (element == null) {
                elementHashCode = 0;
            } else {
                elementHashCode = (element).hashCode();
            }
            hashCode = 31 * hashCode + elementHashCode;
        }
        return hashCode;
    
private static booleanlessThan(double double1, double double2)

        long d1, d2;
        long NaNbits = Double.doubleToLongBits(Double.NaN);
        if ((d1 = Double.doubleToLongBits(double1)) == NaNbits) {
            return false;
        }
        if ((d2 = Double.doubleToLongBits(double2)) == NaNbits) {
            return true;
        }
        if (double1 == double2) {
            if (d1 == d2) {
                return false;
            }
            // check for -0
            return d1 < d2;
        }
        return double1 < double2;
    
private static booleanlessThan(float float1, float float2)

        int f1, f2;
        int NaNbits = Float.floatToIntBits(Float.NaN);
        if ((f1 = Float.floatToIntBits(float1)) == NaNbits) {
            return false;
        }
        if ((f2 = Float.floatToIntBits(float2)) == NaNbits) {
            return true;
        }
        if (float1 == float2) {
            if (f1 == f2) {
                return false;
            }
            // check for -0
            return f1 < f2;
        }
        return float1 < float2;
    
private static intmed3(byte[] array, int a, int b, int c)

        byte x = array[a], y = array[b], z = array[c];
        return x < y ? (y < z ? b : (x < z ? c : a)) : (y > z ? b : (x > z ? c
                : a));
    
private static intmed3(char[] array, int a, int b, int c)

        char x = array[a], y = array[b], z = array[c];
        return x < y ? (y < z ? b : (x < z ? c : a)) : (y > z ? b : (x > z ? c
                : a));
    
private static intmed3(double[] array, int a, int b, int c)

        double x = array[a], y = array[b], z = array[c];
        return lessThan(x, y) ? (lessThan(y, z) ? b : (lessThan(x, z) ? c : a))
                : (lessThan(z, y) ? b : (lessThan(z, x) ? c : a));
    
private static intmed3(float[] array, int a, int b, int c)

        float x = array[a], y = array[b], z = array[c];
        return lessThan(x, y) ? (lessThan(y, z) ? b : (lessThan(x, z) ? c : a))
                : (lessThan(z, y) ? b : (lessThan(z, x) ? c : a));
    
private static intmed3(int[] array, int a, int b, int c)

        int x = array[a], y = array[b], z = array[c];
        return x < y ? (y < z ? b : (x < z ? c : a)) : (y > z ? b : (x > z ? c
                : a));
    
private static intmed3(long[] array, int a, int b, int c)

        long x = array[a], y = array[b], z = array[c];
        return x < y ? (y < z ? b : (x < z ? c : a)) : (y > z ? b : (x > z ? c
                : a));
    
private static intmed3(short[] array, int a, int b, int c)

        short x = array[a], y = array[b], z = array[c];
        return x < y ? (y < z ? b : (x < z ? c : a)) : (y > z ? b : (x > z ? c
                : a));
    
public static voidsort(byte[] array)
Sorts the specified array in ascending numerical order.

param
array the {@code byte} array to be sorted.
since
Android 1.0

        sort(0, array.length, array);
    
public static voidsort(byte[] array, int start, int end)
Sorts the specified range in the array in ascending numerical order.

param
array the {@code byte} array to be sorted.
param
start the start index to sort.
param
end the last + 1 index to sort.
exception
IllegalArgumentException if {@code start > end}.
exception
ArrayIndexOutOfBoundsException if {@code start < 0} or {@code end > array.length}.
since
Android 1.0

        if (array == null) {
            throw new NullPointerException();
        }
        checkBounds(array.length, start, end);
        sort(start, end, array);
    
private static voidsort(int start, int end, byte[] array)

        byte temp;
        int length = end - start;
        if (length < 7) {
            for (int i = start + 1; i < end; i++) {
                for (int j = i; j > start && array[j - 1] > array[j]; j--) {
                    temp = array[j];
                    array[j] = array[j - 1];
                    array[j - 1] = temp;
                }
            }
            return;
        }
        int middle = (start + end) / 2;
        if (length > 7) {
            int bottom = start;
            int top = end - 1;
            if (length > 40) {
                length /= 8;
                bottom = med3(array, bottom, bottom + length, bottom
                        + (2 * length));
                middle = med3(array, middle - length, middle, middle + length);
                top = med3(array, top - (2 * length), top - length, top);
            }
            middle = med3(array, bottom, middle, top);
        }
        byte partionValue = array[middle];
        int a, b, c, d;
        a = b = start;
        c = d = end - 1;
        while (true) {
            while (b <= c && array[b] <= partionValue) {
                if (array[b] == partionValue) {
                    temp = array[a];
                    array[a++] = array[b];
                    array[b] = temp;
                }
                b++;
            }
            while (c >= b && array[c] >= partionValue) {
                if (array[c] == partionValue) {
                    temp = array[c];
                    array[c] = array[d];
                    array[d--] = temp;
                }
                c--;
            }
            if (b > c) {
                break;
            }
            temp = array[b];
            array[b++] = array[c];
            array[c--] = temp;
        }
        length = a - start < b - a ? a - start : b - a;
        int l = start;
        int h = b - length;
        while (length-- > 0) {
            temp = array[l];
            array[l++] = array[h];
            array[h++] = temp;
        }
        length = d - c < end - 1 - d ? d - c : end - 1 - d;
        l = b;
        h = end - length;
        while (length-- > 0) {
            temp = array[l];
            array[l++] = array[h];
            array[h++] = temp;
        }
        if ((length = b - a) > 0) {
            sort(start, start + length, array);
        }
        if ((length = d - c) > 0) {
            sort(end - length, end, array);
        }
    
public static voidsort(char[] array)
Sorts the specified array in ascending numerical order.

param
array the {@code char} array to be sorted.
since
Android 1.0

        sort(0, array.length, array);
    
public static voidsort(char[] array, int start, int end)
Sorts the specified range in the array in ascending numerical order.

param
array the {@code char} array to be sorted.
param
start the start index to sort.
param
end the last + 1 index to sort.
exception
IllegalArgumentException if {@code start > end}.
exception
ArrayIndexOutOfBoundsException if {@code start < 0} or {@code end > array.length}.
since
Android 1.0

        if (array == null) {
            throw new NullPointerException();
        }
        checkBounds(array.length, start, end);
        sort(start, end, array);
    
private static voidsort(int start, int end, char[] array)

        char temp;
        int length = end - start;
        if (length < 7) {
            for (int i = start + 1; i < end; i++) {
                for (int j = i; j > start && array[j - 1] > array[j]; j--) {
                    temp = array[j];
                    array[j] = array[j - 1];
                    array[j - 1] = temp;
                }
            }
            return;
        }
        int middle = (start + end) / 2;
        if (length > 7) {
            int bottom = start;
            int top = end - 1;
            if (length > 40) {
                length /= 8;
                bottom = med3(array, bottom, bottom + length, bottom
                        + (2 * length));
                middle = med3(array, middle - length, middle, middle + length);
                top = med3(array, top - (2 * length), top - length, top);
            }
            middle = med3(array, bottom, middle, top);
        }
        char partionValue = array[middle];
        int a, b, c, d;
        a = b = start;
        c = d = end - 1;
        while (true) {
            while (b <= c && array[b] <= partionValue) {
                if (array[b] == partionValue) {
                    temp = array[a];
                    array[a++] = array[b];
                    array[b] = temp;
                }
                b++;
            }
            while (c >= b && array[c] >= partionValue) {
                if (array[c] == partionValue) {
                    temp = array[c];
                    array[c] = array[d];
                    array[d--] = temp;
                }
                c--;
            }
            if (b > c) {
                break;
            }
            temp = array[b];
            array[b++] = array[c];
            array[c--] = temp;
        }
        length = a - start < b - a ? a - start : b - a;
        int l = start;
        int h = b - length;
        while (length-- > 0) {
            temp = array[l];
            array[l++] = array[h];
            array[h++] = temp;
        }
        length = d - c < end - 1 - d ? d - c : end - 1 - d;
        l = b;
        h = end - length;
        while (length-- > 0) {
            temp = array[l];
            array[l++] = array[h];
            array[h++] = temp;
        }
        if ((length = b - a) > 0) {
            sort(start, start + length, array);
        }
        if ((length = d - c) > 0) {
            sort(end - length, end, array);
        }
    
public static voidsort(double[] array)
Sorts the specified array in ascending numerical order.

param
array the {@code double} array to be sorted.
see
#sort(double[], int, int)
since
Android 1.0

        sort(0, array.length, array);
    
public static voidsort(double[] array, int start, int end)
Sorts the specified range in the array in ascending numerical order. The values are sorted according to the order imposed by {@code Double.compareTo()}.

param
array the {@code double} array to be sorted.
param
start the start index to sort.
param
end the last + 1 index to sort.
exception
IllegalArgumentException if {@code start > end}.
exception
ArrayIndexOutOfBoundsException if {@code start < 0} or {@code end > array.length}.
see
Double#compareTo(Double)
since
Android 1.0

        if (array == null) {
            throw new NullPointerException();
        }
        checkBounds(array.length, start, end);
        sort(start, end, array);
    
private static voidsort(int start, int end, double[] array)

        double temp;
        int length = end - start;
        if (length < 7) {
            for (int i = start + 1; i < end; i++) {
                for (int j = i; j > start && lessThan(array[j], array[j - 1]); j--) {
                    temp = array[j];
                    array[j] = array[j - 1];
                    array[j - 1] = temp;
                }
            }
            return;
        }
        int middle = (start + end) / 2;
        if (length > 7) {
            int bottom = start;
            int top = end - 1;
            if (length > 40) {
                length /= 8;
                bottom = med3(array, bottom, bottom + length, bottom
                        + (2 * length));
                middle = med3(array, middle - length, middle, middle + length);
                top = med3(array, top - (2 * length), top - length, top);
            }
            middle = med3(array, bottom, middle, top);
        }
        double partionValue = array[middle];
        int a, b, c, d;
        a = b = start;
        c = d = end - 1;
        while (true) {
            while (b <= c && !lessThan(partionValue, array[b])) {
                if (array[b] == partionValue) {
                    temp = array[a];
                    array[a++] = array[b];
                    array[b] = temp;
                }
                b++;
            }
            while (c >= b && !lessThan(array[c], partionValue)) {
                if (array[c] == partionValue) {
                    temp = array[c];
                    array[c] = array[d];
                    array[d--] = temp;
                }
                c--;
            }
            if (b > c) {
                break;
            }
            temp = array[b];
            array[b++] = array[c];
            array[c--] = temp;
        }
        length = a - start < b - a ? a - start : b - a;
        int l = start;
        int h = b - length;
        while (length-- > 0) {
            temp = array[l];
            array[l++] = array[h];
            array[h++] = temp;
        }
        length = d - c < end - 1 - d ? d - c : end - 1 - d;
        l = b;
        h = end - length;
        while (length-- > 0) {
            temp = array[l];
            array[l++] = array[h];
            array[h++] = temp;
        }
        if ((length = b - a) > 0) {
            sort(start, start + length, array);
        }
        if ((length = d - c) > 0) {
            sort(end - length, end, array);
        }
    
public static voidsort(float[] array)
Sorts the specified array in ascending numerical order.

param
array the {@code float} array to be sorted.
see
#sort(float[], int, int)
since
Android 1.0

        sort(0, array.length, array);
    
public static voidsort(float[] array, int start, int end)
Sorts the specified range in the array in ascending numerical order. The values are sorted according to the order imposed by {@code Float.compareTo()}.

param
array the {@code float} array to be sorted.
param
start the start index to sort.
param
end the last + 1 index to sort.
exception
IllegalArgumentException if {@code start > end}.
exception
ArrayIndexOutOfBoundsException if {@code start < 0} or {@code end > array.length}.
see
Float#compareTo(Float)
since
Android 1.0

        if (array == null) {
            throw new NullPointerException();
        }
        checkBounds(array.length, start, end);
        sort(start, end, array);
    
private static voidsort(int start, int end, float[] array)

        float temp;
        int length = end - start;
        if (length < 7) {
            for (int i = start + 1; i < end; i++) {
                for (int j = i; j > start && lessThan(array[j], array[j - 1]); j--) {
                    temp = array[j];
                    array[j] = array[j - 1];
                    array[j - 1] = temp;
                }
            }
            return;
        }
        int middle = (start + end) / 2;
        if (length > 7) {
            int bottom = start;
            int top = end - 1;
            if (length > 40) {
                length /= 8;
                bottom = med3(array, bottom, bottom + length, bottom
                        + (2 * length));
                middle = med3(array, middle - length, middle, middle + length);
                top = med3(array, top - (2 * length), top - length, top);
            }
            middle = med3(array, bottom, middle, top);
        }
        float partionValue = array[middle];
        int a, b, c, d;
        a = b = start;
        c = d = end - 1;
        while (true) {
            while (b <= c && !lessThan(partionValue, array[b])) {
                if (array[b] == partionValue) {
                    temp = array[a];
                    array[a++] = array[b];
                    array[b] = temp;
                }
                b++;
            }
            while (c >= b && !lessThan(array[c], partionValue)) {
                if (array[c] == partionValue) {
                    temp = array[c];
                    array[c] = array[d];
                    array[d--] = temp;
                }
                c--;
            }
            if (b > c) {
                break;
            }
            temp = array[b];
            array[b++] = array[c];
            array[c--] = temp;
        }
        length = a - start < b - a ? a - start : b - a;
        int l = start;
        int h = b - length;
        while (length-- > 0) {
            temp = array[l];
            array[l++] = array[h];
            array[h++] = temp;
        }
        length = d - c < end - 1 - d ? d - c : end - 1 - d;
        l = b;
        h = end - length;
        while (length-- > 0) {
            temp = array[l];
            array[l++] = array[h];
            array[h++] = temp;
        }
        if ((length = b - a) > 0) {
            sort(start, start + length, array);
        }
        if ((length = d - c) > 0) {
            sort(end - length, end, array);
        }
    
public static voidsort(int[] array)
Sorts the specified array in ascending numerical order.

param
array the {@code int} array to be sorted.
since
Android 1.0

        sort(0, array.length, array);
    
public static voidsort(int[] array, int start, int end)
Sorts the specified range in the array in ascending numerical order.

param
array the {@code int} array to be sorted.
param
start the start index to sort.
param
end the last + 1 index to sort.
exception
IllegalArgumentException if {@code start > end}.
exception
ArrayIndexOutOfBoundsException if {@code start < 0} or {@code end > array.length}.
since
Android 1.0

        if (array == null) {
            throw new NullPointerException();
        }
        checkBounds(array.length, start, end);
        sort(start, end, array);
    
private static voidsort(int start, int end, int[] array)

        int temp;
        int length = end - start;
        if (length < 7) {
            for (int i = start + 1; i < end; i++) {
                for (int j = i; j > start && array[j - 1] > array[j]; j--) {
                    temp = array[j];
                    array[j] = array[j - 1];
                    array[j - 1] = temp;
                }
            }
            return;
        }
        int middle = (start + end) / 2;
        if (length > 7) {
            int bottom = start;
            int top = end - 1;
            if (length > 40) {
                length /= 8;
                bottom = med3(array, bottom, bottom + length, bottom
                        + (2 * length));
                middle = med3(array, middle - length, middle, middle + length);
                top = med3(array, top - (2 * length), top - length, top);
            }
            middle = med3(array, bottom, middle, top);
        }
        int partionValue = array[middle];
        int a, b, c, d;
        a = b = start;
        c = d = end - 1;
        while (true) {
            while (b <= c && array[b] <= partionValue) {
                if (array[b] == partionValue) {
                    temp = array[a];
                    array[a++] = array[b];
                    array[b] = temp;
                }
                b++;
            }
            while (c >= b && array[c] >= partionValue) {
                if (array[c] == partionValue) {
                    temp = array[c];
                    array[c] = array[d];
                    array[d--] = temp;
                }
                c--;
            }
            if (b > c) {
                break;
            }
            temp = array[b];
            array[b++] = array[c];
            array[c--] = temp;
        }
        length = a - start < b - a ? a - start : b - a;
        int l = start;
        int h = b - length;
        while (length-- > 0) {
            temp = array[l];
            array[l++] = array[h];
            array[h++] = temp;
        }
        length = d - c < end - 1 - d ? d - c : end - 1 - d;
        l = b;
        h = end - length;
        while (length-- > 0) {
            temp = array[l];
            array[l++] = array[h];
            array[h++] = temp;
        }
        if ((length = b - a) > 0) {
            sort(start, start + length, array);
        }
        if ((length = d - c) > 0) {
            sort(end - length, end, array);
        }
    
public static voidsort(long[] array)
Sorts the specified array in ascending numerical order.

param
array the {@code long} array to be sorted.
since
Android 1.0

        sort(0, array.length, array);
    
public static voidsort(long[] array, int start, int end)
Sorts the specified range in the array in ascending numerical order.

param
array the {@code long} array to be sorted.
param
start the start index to sort.
param
end the last + 1 index to sort.
exception
IllegalArgumentException if {@code start > end}.
exception
ArrayIndexOutOfBoundsException if {@code start < 0} or {@code end > array.length}.
since
Android 1.0

        if (array == null) {
            throw new NullPointerException();
        }
        checkBounds(array.length, start, end);
        sort(start, end, array);
    
private static voidsort(int start, int end, long[] array)

        long temp;
        int length = end - start;
        if (length < 7) {
            for (int i = start + 1; i < end; i++) {
                for (int j = i; j > start && array[j - 1] > array[j]; j--) {
                    temp = array[j];
                    array[j] = array[j - 1];
                    array[j - 1] = temp;
                }
            }
            return;
        }
        int middle = (start + end) / 2;
        if (length > 7) {
            int bottom = start;
            int top = end - 1;
            if (length > 40) {
                length /= 8;
                bottom = med3(array, bottom, bottom + length, bottom
                        + (2 * length));
                middle = med3(array, middle - length, middle, middle + length);
                top = med3(array, top - (2 * length), top - length, top);
            }
            middle = med3(array, bottom, middle, top);
        }
        long partionValue = array[middle];
        int a, b, c, d;
        a = b = start;
        c = d = end - 1;
        while (true) {
            while (b <= c && array[b] <= partionValue) {
                if (array[b] == partionValue) {
                    temp = array[a];
                    array[a++] = array[b];
                    array[b] = temp;
                }
                b++;
            }
            while (c >= b && array[c] >= partionValue) {
                if (array[c] == partionValue) {
                    temp = array[c];
                    array[c] = array[d];
                    array[d--] = temp;
                }
                c--;
            }
            if (b > c) {
                break;
            }
            temp = array[b];
            array[b++] = array[c];
            array[c--] = temp;
        }
        length = a - start < b - a ? a - start : b - a;
        int l = start;
        int h = b - length;
        while (length-- > 0) {
            temp = array[l];
            array[l++] = array[h];
            array[h++] = temp;
        }
        length = d - c < end - 1 - d ? d - c : end - 1 - d;
        l = b;
        h = end - length;
        while (length-- > 0) {
            temp = array[l];
            array[l++] = array[h];
            array[h++] = temp;
        }
        if ((length = b - a) > 0) {
            sort(start, start + length, array);
        }
        if ((length = d - c) > 0) {
            sort(end - length, end, array);
        }
    
public static voidsort(java.lang.Object[] array)
Sorts the specified array in ascending natural order.

param
array the {@code Object} array to be sorted.
exception
ClassCastException if an element in the array does not implement {@code Comparable} or if some elements cannot be compared to each other.
see
#sort(Object[], int, int)
since
Android 1.0

        ComparableTimSort.sort(array);
    
public static voidsort(java.lang.Object[] array, int start, int end)
Sorts the specified range in the array in ascending natural order. All elements must implement the {@code Comparable} interface and must be comparable to each other without a {@code ClassCastException} being thrown.

param
array the {@code Object} array to be sorted.
param
start the start index to sort.
param
end the last + 1 index to sort.
exception
ClassCastException if an element in the array does not implement {@code Comparable} or some elements cannot be compared to each other.
exception
IllegalArgumentException if {@code start > end}.
exception
ArrayIndexOutOfBoundsException if {@code start < 0} or {@code end > array.length}.
since
Android 1.0

        ComparableTimSort.sort(array, start, end);
    
public static voidsort(T[] array, int start, int end, java.util.Comparator comparator)
Sorts the specified range in the array using the specified {@code Comparator}. All elements must be comparable to each other without a {@code ClassCastException} being thrown.

param
array the {@code Object} array to be sorted.
param
start the start index to sort.
param
end the last + 1 index to sort.
param
comparator the {@code Comparator}.
exception
ClassCastException if elements in the array cannot be compared to each other using the {@code Comparator}.
exception
IllegalArgumentException if {@code start > end}.
exception
ArrayIndexOutOfBoundsException if {@code start < 0} or {@code end > array.length}.
since
Android 1.0

        TimSort.sort(array, start, end, comparator);
    
public static voidsort(T[] array, java.util.Comparator comparator)
Sorts the specified array using the specified {@code Comparator}. All elements must be comparable to each other without a {@code ClassCastException} being thrown.

param
array the {@code Object} array to be sorted.
param
comparator the {@code Comparator}.
exception
ClassCastException if elements in the array cannot be compared to each other using the {@code Comparator}.
since
Android 1.0

        TimSort.sort(array, comparator);
    
public static voidsort(short[] array)
Sorts the specified array in ascending numerical order.

param
array the {@code short} array to be sorted.
since
Android 1.0

        sort(0, array.length, array);
    
public static voidsort(short[] array, int start, int end)
Sorts the specified range in the array in ascending numerical order.

param
array the {@code short} array to be sorted.
param
start the start index to sort.
param
end the last + 1 index to sort.
exception
IllegalArgumentException if {@code start > end}.
exception
ArrayIndexOutOfBoundsException if {@code start < 0} or {@code end > array.length}.
since
Android 1.0

        if (array == null) {
            throw new NullPointerException();
        }
        checkBounds(array.length, start, end);
        sort(start, end, array);
    
private static voidsort(int start, int end, short[] array)

        short temp;
        int length = end - start;
        if (length < 7) {
            for (int i = start + 1; i < end; i++) {
                for (int j = i; j > start && array[j - 1] > array[j]; j--) {
                    temp = array[j];
                    array[j] = array[j - 1];
                    array[j - 1] = temp;
                }
            }
            return;
        }
        int middle = (start + end) / 2;
        if (length > 7) {
            int bottom = start;
            int top = end - 1;
            if (length > 40) {
                length /= 8;
                bottom = med3(array, bottom, bottom + length, bottom
                        + (2 * length));
                middle = med3(array, middle - length, middle, middle + length);
                top = med3(array, top - (2 * length), top - length, top);
            }
            middle = med3(array, bottom, middle, top);
        }
        short partionValue = array[middle];
        int a, b, c, d;
        a = b = start;
        c = d = end - 1;
        while (true) {
            while (b <= c && array[b] <= partionValue) {
                if (array[b] == partionValue) {
                    temp = array[a];
                    array[a++] = array[b];
                    array[b] = temp;
                }
                b++;
            }
            while (c >= b && array[c] >= partionValue) {
                if (array[c] == partionValue) {
                    temp = array[c];
                    array[c] = array[d];
                    array[d--] = temp;
                }
                c--;
            }
            if (b > c) {
                break;
            }
            temp = array[b];
            array[b++] = array[c];
            array[c--] = temp;
        }
        length = a - start < b - a ? a - start : b - a;
        int l = start;
        int h = b - length;
        while (length-- > 0) {
            temp = array[l];
            array[l++] = array[h];
            array[h++] = temp;
        }
        length = d - c < end - 1 - d ? d - c : end - 1 - d;
        l = b;
        h = end - length;
        while (length-- > 0) {
            temp = array[l];
            array[l++] = array[h];
            array[h++] = temp;
        }
        if ((length = b - a) > 0) {
            sort(start, start + length, array);
        }
        if ((length = d - c) > 0) {
            sort(end - length, end, array);
        }
    
public static java.lang.StringtoString(boolean[] array)

Creates a {@code String} representation of the {@code boolean[]} passed. The result is surrounded by brackets ({@code "[]"}), each element is converted to a {@code String} via the {@link String#valueOf(boolean)} and separated by {@code ", "}. If the array is {@code null}, then {@code "null"} is returned.

param
array the {@code boolean} array to convert.
return
the {@code String} representation of {@code array}.
since
Android 1.0

        if (array == null) {
            return "null"; //$NON-NLS-1$
        }
        if (array.length == 0) {
            return "[]"; //$NON-NLS-1$
        }
        StringBuilder sb = new StringBuilder(2 + array.length * 5);
        sb.append('[");
        sb.append(array[0]);
        for (int i = 1; i < array.length; i++) {
            sb.append(", "); //$NON-NLS-1$
            sb.append(array[i]);
        }
        sb.append(']");
        return sb.toString();
    
public static java.lang.StringtoString(byte[] array)

Creates a {@code String} representation of the {@code byte[]} passed. The result is surrounded by brackets ({@code "[]"}), each element is converted to a {@code String} via the {@link String#valueOf(int)} and separated by {@code ", "}. If the array is {@code null}, then {@code "null"} is returned.

param
array the {@code byte} array to convert.
return
the {@code String} representation of {@code array}.
since
Android 1.0

        if (array == null) {
            return "null"; //$NON-NLS-1$
        }
        if (array.length == 0) {
            return "[]"; //$NON-NLS-1$
        }
        StringBuilder sb = new StringBuilder(2 + array.length * 3);
        sb.append('[");
        sb.append(array[0]);
        for (int i = 1; i < array.length; i++) {
            sb.append(", "); //$NON-NLS-1$
            sb.append(array[i]);
        }
        sb.append(']");
        return sb.toString();
    
public static java.lang.StringtoString(char[] array)

Creates a {@code String} representation of the {@code char[]} passed. The result is surrounded by brackets ({@code "[]"}), each element is converted to a {@code String} via the {@link String#valueOf(char)} and separated by {@code ", "}. If the array is {@code null}, then {@code "null"} is returned.

param
array the {@code char} array to convert.
return
the {@code String} representation of {@code array}.
since
Android 1.0

        if (array == null) {
            return "null"; //$NON-NLS-1$
        }
        if (array.length == 0) {
            return "[]"; //$NON-NLS-1$
        }
        StringBuilder sb = new StringBuilder(2 + array.length * 2);
        sb.append('[");
        sb.append(array[0]);
        for (int i = 1; i < array.length; i++) {
            sb.append(", "); //$NON-NLS-1$
            sb.append(array[i]);
        }
        sb.append(']");
        return sb.toString();
    
public static java.lang.StringtoString(double[] array)

Creates a {@code String} representation of the {@code double[]} passed. The result is surrounded by brackets ({@code "[]"}), each element is converted to a {@code String} via the {@link String#valueOf(double)} and separated by {@code ", "}. If the array is {@code null}, then {@code "null"} is returned.

param
array the {@code double} array to convert.
return
the {@code String} representation of {@code array}.
since
Android 1.0

        if (array == null) {
            return "null"; //$NON-NLS-1$
        }
        if (array.length == 0) {
            return "[]"; //$NON-NLS-1$
        }
        StringBuilder sb = new StringBuilder(2 + array.length * 5);
        sb.append('[");
        sb.append(array[0]);
        for (int i = 1; i < array.length; i++) {
            sb.append(", "); //$NON-NLS-1$
            sb.append(array[i]);
        }
        sb.append(']");
        return sb.toString();
    
public static java.lang.StringtoString(float[] array)

Creates a {@code String} representation of the {@code float[]} passed. The result is surrounded by brackets ({@code "[]"}), each element is converted to a {@code String} via the {@link String#valueOf(float)} and separated by {@code ", "}. If the array is {@code null}, then {@code "null"} is returned.

param
array the {@code float} array to convert.
return
the {@code String} representation of {@code array}.
since
Android 1.0

        if (array == null) {
            return "null"; //$NON-NLS-1$
        }
        if (array.length == 0) {
            return "[]"; //$NON-NLS-1$
        }
        StringBuilder sb = new StringBuilder(2 + array.length * 5);
        sb.append('[");
        sb.append(array[0]);
        for (int i = 1; i < array.length; i++) {
            sb.append(", "); //$NON-NLS-1$
            sb.append(array[i]);
        }
        sb.append(']");
        return sb.toString();
    
public static java.lang.StringtoString(int[] array)

Creates a {@code String} representation of the {@code int[]} passed. The result is surrounded by brackets ({@code "[]"}), each element is converted to a {@code String} via the {@link String#valueOf(int)} and separated by {@code ", "}. If the array is {@code null}, then {@code "null"} is returned.

param
array the {@code int} array to convert.
return
the {@code String} representation of {@code array}.
since
Android 1.0

        if (array == null) {
            return "null"; //$NON-NLS-1$
        }
        if (array.length == 0) {
            return "[]"; //$NON-NLS-1$
        }
        StringBuilder sb = new StringBuilder(2 + array.length * 4);
        sb.append('[");
        sb.append(array[0]);
        for (int i = 1; i < array.length; i++) {
            sb.append(", "); //$NON-NLS-1$
            sb.append(array[i]);
        }
        sb.append(']");
        return sb.toString();
    
public static java.lang.StringtoString(long[] array)

Creates a {@code String} representation of the {@code long[]} passed. The result is surrounded by brackets ({@code "[]"}), each element is converted to a {@code String} via the {@link String#valueOf(long)} and separated by {@code ", "}. If the array is {@code null}, then {@code "null"} is returned.

param
array the {@code long} array to convert.
return
the {@code String} representation of {@code array}.
since
Android 1.0

        if (array == null) {
            return "null"; //$NON-NLS-1$
        }
        if (array.length == 0) {
            return "[]"; //$NON-NLS-1$
        }
        StringBuilder sb = new StringBuilder(2 + array.length * 4);
        sb.append('[");
        sb.append(array[0]);
        for (int i = 1; i < array.length; i++) {
            sb.append(", "); //$NON-NLS-1$
            sb.append(array[i]);
        }
        sb.append(']");
        return sb.toString();
    
public static java.lang.StringtoString(short[] array)

Creates a {@code String} representation of the {@code short[]} passed. The result is surrounded by brackets ({@code "[]"}), each element is converted to a {@code String} via the {@link String#valueOf(int)} and separated by {@code ", "}. If the array is {@code null}, then {@code "null"} is returned.

param
array the {@code short} array to convert.
return
the {@code String} representation of {@code array}.
since
Android 1.0

        if (array == null) {
            return "null"; //$NON-NLS-1$
        }
        if (array.length == 0) {
            return "[]"; //$NON-NLS-1$
        }
        StringBuilder sb = new StringBuilder(2 + array.length * 4);
        sb.append('[");
        sb.append(array[0]);
        for (int i = 1; i < array.length; i++) {
            sb.append(", "); //$NON-NLS-1$
            sb.append(array[i]);
        }
        sb.append(']");
        return sb.toString();
    
public static java.lang.StringtoString(java.lang.Object[] array)

Creates a {@code String} representation of the {@code Object[]} passed. The result is surrounded by brackets ({@code "[]"}), each element is converted to a {@code String} via the {@link String#valueOf(Object)} and separated by {@code ", "}. If the array is {@code null}, then {@code "null"} is returned.

param
array the {@code Object} array to convert.
return
the {@code String} representation of {@code array}.
since
Android 1.0

        if (array == null) {
            return "null"; //$NON-NLS-1$
        }
        if (array.length == 0) {
            return "[]"; //$NON-NLS-1$
        }
        StringBuilder sb = new StringBuilder(2 + array.length * 5);
        sb.append('[");
        sb.append(array[0]);
        for (int i = 1; i < array.length; i++) {
            sb.append(", "); //$NON-NLS-1$
            sb.append(array[i]);
        }
        sb.append(']");
        return sb.toString();