1adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/*
2adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  Licensed to the Apache Software Foundation (ASF) under one or more
3adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  contributor license agreements.  See the NOTICE file distributed with
4adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  this work for additional information regarding copyright ownership.
5adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  The ASF licenses this file to You under the Apache License, Version 2.0
6adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  (the "License"); you may not use this file except in compliance with
7adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  the License.  You may obtain a copy of the License at
8adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
9adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *     http://www.apache.org/licenses/LICENSE-2.0
10adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
11adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  Unless required by applicable law or agreed to in writing, software
12adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  distributed under the License is distributed on an "AS IS" BASIS,
13adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  See the License for the specific language governing permissions and
15adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  limitations under the License.
16adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
17adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
18adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpackage java.util;
19adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
20adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.Serializable;
21adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.lang.reflect.Array;
22adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
23adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/**
24adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code Arrays} contains static methods which operate on arrays.
25f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson *
26f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * @since 1.2
27adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
28adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpublic class Arrays {
294aec69133b8fc525362f4d2b861e5bcc4a7828d2Narayan Kamath    private static class ArrayList<E> extends AbstractList<E> implements
30adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            List<E>, Serializable, RandomAccess {
31adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
32adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        private static final long serialVersionUID = -2764017481108945198L;
33adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
34adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        private final E[] a;
35adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
364aec69133b8fc525362f4d2b861e5bcc4a7828d2Narayan Kamath        ArrayList(E[] storage) {
37adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (storage == null) {
38d43b9ef11a1095967a3396b246639b563e1a4128Kenny Root                throw new NullPointerException("storage == null");
39adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
40adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            a = storage;
41adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
42adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        @Override
44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public boolean contains(Object object) {
45adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (object != null) {
46adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                for (E element : a) {
47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    if (object.equals(element)) {
48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        return true;
49adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    }
50adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                }
51adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            } else {
52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                for (E element : a) {
53adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    if (element == null) {
54adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        return true;
55adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    }
56adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                }
57adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
58adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return false;
59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
60adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
61adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        @Override
62adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public E get(int location) {
63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            try {
64adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                return a[location];
65adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            } catch (ArrayIndexOutOfBoundsException e) {
6687201ff38d682b55f456c50da3e742459a56d258Brian Carlstrom                throw java.util.ArrayList.throwIndexOutOfBoundsException(location, a.length);
67adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
68adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
70adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        @Override
71adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public int indexOf(Object object) {
72adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (object != null) {
73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                for (int i = 0; i < a.length; i++) {
74adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    if (object.equals(a[i])) {
75adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        return i;
76adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    }
77adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                }
78adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            } else {
79adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                for (int i = 0; i < a.length; i++) {
80adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    if (a[i] == null) {
81adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        return i;
82adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    }
83adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                }
84adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
85adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return -1;
86adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
87adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
88adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        @Override
89adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public int lastIndexOf(Object object) {
90adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (object != null) {
91adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                for (int i = a.length - 1; i >= 0; i--) {
92adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    if (object.equals(a[i])) {
93adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        return i;
94adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    }
95adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                }
96adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            } else {
97adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                for (int i = a.length - 1; i >= 0; i--) {
98adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    if (a[i] == null) {
99adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        return i;
100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    }
101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                }
102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return -1;
104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        @Override
107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public E set(int location, E object) {
108415c7497ec02890a73eb293f98f69c1f6983389bElliott Hughes            E result = a[location];
109415c7497ec02890a73eb293f98f69c1f6983389bElliott Hughes            a[location] = object;
110415c7497ec02890a73eb293f98f69c1f6983389bElliott Hughes            return result;
111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        @Override
114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public int size() {
115adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return a.length;
116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        @Override
119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public Object[] toArray() {
120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return a.clone();
121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        @Override
124adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        @SuppressWarnings({"unchecked", "SuspiciousSystemArraycopy"})
125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public <T> T[] toArray(T[] contents) {
126adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            int size = size();
127adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (size > contents.length) {
128adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                Class<?> ct = contents.getClass().getComponentType();
129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                contents = (T[]) Array.newInstance(ct, size);
130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            System.arraycopy(a, 0, contents, 0, size);
132adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (size < contents.length) {
133adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                contents[size] = null;
134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
135adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return contents;
136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
138adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private Arrays() {
140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /* empty */
141adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
142adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
143adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns a {@code List} of the objects in the specified array. The size of the
145adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code List} cannot be modified, i.e. adding and removing are unsupported, but
146adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * the elements can be set. Setting an element modifies the underlying
147adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * array.
148f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
149adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param array
150adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the array.
151adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return a {@code List} of the elements of the specified array.
152adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
153bce3d7cfe03fcb70bd374ad2e8b16ba64a45e993Elliott Hughes    @SafeVarargs
154adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static <T> List<T> asList(T... array) {
1554aec69133b8fc525362f4d2b861e5bcc4a7828d2Narayan Kamath        return new ArrayList<T>(array);
156adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
157adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
158adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
159055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * Performs a binary search for {@code value} in the ascending sorted array {@code array}.
160055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * Searching in an unsorted array has an undefined result. It's also undefined which element
161055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * is found if there are multiple occurrences of the same element.
162f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
163055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @param array the sorted array to search.
164055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @param value the element to find.
165adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the non-negative index of the element, or a negative index which
166adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         is {@code -index - 1} where the element would be inserted.
167adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
168adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static int binarySearch(byte[] array, byte value) {
169055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        return binarySearch(array, 0, array.length, value);
170adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
171adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
172adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
173055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * Performs a binary search for {@code value} in the ascending sorted array {@code array},
174055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * in the range specified by fromIndex (inclusive) and toIndex (exclusive).
175055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * Searching in an unsorted array has an undefined result. It's also undefined which element
176055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * is found if there are multiple occurrences of the same element.
177f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
178055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @param array the sorted array to search.
179055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @param startIndex the inclusive start index.
180055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @param endIndex the exclusive start index.
181055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @param value the element to find.
182055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @return the non-negative index of the element, or a negative index which
183055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     *         is {@code -index - 1} where the element would be inserted.
184055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @throws IllegalArgumentException if {@code startIndex > endIndex}
185055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @throws ArrayIndexOutOfBoundsException if {@code startIndex < 0 || endIndex > array.length}
186055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @since 1.6
187055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     */
188055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes    public static int binarySearch(byte[] array, int startIndex, int endIndex, byte value) {
189055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        checkBinarySearchBounds(startIndex, endIndex, array.length);
190055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        int lo = startIndex;
191055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        int hi = endIndex - 1;
192055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes
193055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        while (lo <= hi) {
194055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes            int mid = (lo + hi) >>> 1;
195055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes            byte midVal = array[mid];
196055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes
197055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes            if (midVal < value) {
198055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes                lo = mid + 1;
199055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes            } else if (midVal > value) {
200055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes                hi = mid - 1;
201055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes            } else {
202055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes                return mid;  // value found
203055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes            }
204055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        }
205055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        return ~lo;  // value not present
206055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes    }
207055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes
208055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes    /**
209055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * Performs a binary search for {@code value} in the ascending sorted array {@code array}.
210055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * Searching in an unsorted array has an undefined result. It's also undefined which element
211055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * is found if there are multiple occurrences of the same element.
212055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     *
213055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @param array the sorted array to search.
214055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @param value the element to find.
215adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the non-negative index of the element, or a negative index which
216adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         is {@code -index - 1} where the element would be inserted.
217adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
218adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static int binarySearch(char[] array, char value) {
219055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        return binarySearch(array, 0, array.length, value);
220adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
221adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
222adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
223055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * Performs a binary search for {@code value} in the ascending sorted array {@code array},
224055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * in the range specified by fromIndex (inclusive) and toIndex (exclusive).
225055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * Searching in an unsorted array has an undefined result. It's also undefined which element
226055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * is found if there are multiple occurrences of the same element.
227f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
228055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @param array the sorted array to search.
229055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @param startIndex the inclusive start index.
230055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @param endIndex the exclusive start index.
231055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @param value the element to find.
232055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @return the non-negative index of the element, or a negative index which
233055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     *         is {@code -index - 1} where the element would be inserted.
234055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @throws IllegalArgumentException if {@code startIndex > endIndex}
235055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @throws ArrayIndexOutOfBoundsException if {@code startIndex < 0 || endIndex > array.length}
236055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @since 1.6
237055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     */
238055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes    public static int binarySearch(char[] array, int startIndex, int endIndex, char value) {
239055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        checkBinarySearchBounds(startIndex, endIndex, array.length);
240055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        int lo = startIndex;
241055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        int hi = endIndex - 1;
242055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes
243055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        while (lo <= hi) {
244055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes            int mid = (lo + hi) >>> 1;
245055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes            char midVal = array[mid];
246055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes
247055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes            if (midVal < value) {
248055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes                lo = mid + 1;
249055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes            } else if (midVal > value) {
250055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes                hi = mid - 1;
251055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes            } else {
252055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes                return mid;  // value found
253055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes            }
254055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        }
255055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        return ~lo;  // value not present
256055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes    }
257055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes
258055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes    /**
259055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * Performs a binary search for {@code value} in the ascending sorted array {@code array}.
260055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * Searching in an unsorted array has an undefined result. It's also undefined which element
261055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * is found if there are multiple occurrences of the same element.
262055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     *
263055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @param array the sorted array to search.
264055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @param value the element to find.
265adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the non-negative index of the element, or a negative index which
266adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         is {@code -index - 1} where the element would be inserted.
267adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
268adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static int binarySearch(double[] array, double value) {
269055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        return binarySearch(array, 0, array.length, value);
270055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes    }
271055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes
272055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes    /**
273055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * Performs a binary search for {@code value} in the ascending sorted array {@code array},
274055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * in the range specified by fromIndex (inclusive) and toIndex (exclusive).
275055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * Searching in an unsorted array has an undefined result. It's also undefined which element
276055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * is found if there are multiple occurrences of the same element.
277055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     *
278055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @param array the sorted array to search.
279055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @param startIndex the inclusive start index.
280055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @param endIndex the exclusive start index.
281055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @param value the element to find.
282055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @return the non-negative index of the element, or a negative index which
283055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     *         is {@code -index - 1} where the element would be inserted.
284055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @throws IllegalArgumentException if {@code startIndex > endIndex}
285055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @throws ArrayIndexOutOfBoundsException if {@code startIndex < 0 || endIndex > array.length}
286055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @since 1.6
287055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     */
288055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes    public static int binarySearch(double[] array, int startIndex, int endIndex, double value) {
289055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        checkBinarySearchBounds(startIndex, endIndex, array.length);
290055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        int lo = startIndex;
291055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        int hi = endIndex - 1;
2927d6b0007041b192e33858c38d099561237264cb0Joshua Bloch
2937d6b0007041b192e33858c38d099561237264cb0Joshua Bloch        while (lo <= hi) {
2947d6b0007041b192e33858c38d099561237264cb0Joshua Bloch            int mid = (lo + hi) >>> 1;
2957d6b0007041b192e33858c38d099561237264cb0Joshua Bloch            double midVal = array[mid];
2967d6b0007041b192e33858c38d099561237264cb0Joshua Bloch
2977d6b0007041b192e33858c38d099561237264cb0Joshua Bloch            if (midVal < value) {
2987d6b0007041b192e33858c38d099561237264cb0Joshua Bloch                lo = mid + 1;
2997d6b0007041b192e33858c38d099561237264cb0Joshua Bloch            } else if (midVal > value) {
3007d6b0007041b192e33858c38d099561237264cb0Joshua Bloch                hi = mid - 1;
3017d6b0007041b192e33858c38d099561237264cb0Joshua Bloch            } else if (midVal != 0 && midVal == value) {
3027d6b0007041b192e33858c38d099561237264cb0Joshua Bloch                return mid;  // value found
3037d6b0007041b192e33858c38d099561237264cb0Joshua Bloch            } else { // Either midVal and value are == 0 or at least one is NaN
3047d6b0007041b192e33858c38d099561237264cb0Joshua Bloch                long midValBits = Double.doubleToLongBits(midVal);
3057d6b0007041b192e33858c38d099561237264cb0Joshua Bloch                long valueBits  = Double.doubleToLongBits(value);
3067d6b0007041b192e33858c38d099561237264cb0Joshua Bloch
307055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes                if (midValBits < valueBits) {
3087d6b0007041b192e33858c38d099561237264cb0Joshua Bloch                    lo = mid + 1; // (-0.0, 0.0) or (not NaN, NaN); midVal < val
309055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes                } else if (midValBits > valueBits) {
3107d6b0007041b192e33858c38d099561237264cb0Joshua Bloch                    hi = mid - 1; // (0.0, -0.0) or (NaN, not NaN); midVal > val
311055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes                } else {
3127d6b0007041b192e33858c38d099561237264cb0Joshua Bloch                    return mid; // bit patterns are equal; value found
313055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes                }
314adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
315adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
3167d6b0007041b192e33858c38d099561237264cb0Joshua Bloch        return ~lo;  // value not present
317adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
318adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
319adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
320055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * Performs a binary search for {@code value} in the ascending sorted array {@code array}.
321055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * Searching in an unsorted array has an undefined result. It's also undefined which element
322055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * is found if there are multiple occurrences of the same element.
323f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
324055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @param array the sorted array to search.
325055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @param value the element to find.
326adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the non-negative index of the element, or a negative index which
327adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         is {@code -index - 1} where the element would be inserted.
328adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
329adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static int binarySearch(float[] array, float value) {
330055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        return binarySearch(array, 0, array.length, value);
331055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes    }
332055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes
333055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes    /**
334055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * Performs a binary search for {@code value} in the ascending sorted array {@code array},
335055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * in the range specified by fromIndex (inclusive) and toIndex (exclusive).
336055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * Searching in an unsorted array has an undefined result. It's also undefined which element
337055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * is found if there are multiple occurrences of the same element.
338055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     *
339055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @param array the sorted array to search.
340055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @param startIndex the inclusive start index.
341055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @param endIndex the exclusive start index.
342055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @param value the element to find.
343055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @return the non-negative index of the element, or a negative index which
344055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     *         is {@code -index - 1} where the element would be inserted.
345055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @throws IllegalArgumentException if {@code startIndex > endIndex}
346055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @throws ArrayIndexOutOfBoundsException if {@code startIndex < 0 || endIndex > array.length}
347055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @since 1.6
348055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     */
349055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes    public static int binarySearch(float[] array, int startIndex, int endIndex, float value) {
350055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        checkBinarySearchBounds(startIndex, endIndex, array.length);
351055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        int lo = startIndex;
352055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        int hi = endIndex - 1;
3537d6b0007041b192e33858c38d099561237264cb0Joshua Bloch
3547d6b0007041b192e33858c38d099561237264cb0Joshua Bloch        while (lo <= hi) {
3557d6b0007041b192e33858c38d099561237264cb0Joshua Bloch            int mid = (lo + hi) >>> 1;
3567d6b0007041b192e33858c38d099561237264cb0Joshua Bloch            float midVal = array[mid];
3577d6b0007041b192e33858c38d099561237264cb0Joshua Bloch
3587d6b0007041b192e33858c38d099561237264cb0Joshua Bloch            if (midVal < value) {
3597d6b0007041b192e33858c38d099561237264cb0Joshua Bloch                lo = mid + 1;
3607d6b0007041b192e33858c38d099561237264cb0Joshua Bloch            } else if (midVal > value) {
3617d6b0007041b192e33858c38d099561237264cb0Joshua Bloch                hi = mid - 1;
3627d6b0007041b192e33858c38d099561237264cb0Joshua Bloch            } else if (midVal != 0 && midVal == value) {
3637d6b0007041b192e33858c38d099561237264cb0Joshua Bloch                return mid;  // value found
3647d6b0007041b192e33858c38d099561237264cb0Joshua Bloch            } else { // Either midVal and value are == 0 or at least one is NaN
3657d6b0007041b192e33858c38d099561237264cb0Joshua Bloch                int midValBits = Float.floatToIntBits(midVal);
3667d6b0007041b192e33858c38d099561237264cb0Joshua Bloch                int valueBits  = Float.floatToIntBits(value);
3677d6b0007041b192e33858c38d099561237264cb0Joshua Bloch
368055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes                if (midValBits < valueBits) {
3697d6b0007041b192e33858c38d099561237264cb0Joshua Bloch                    lo = mid + 1; // (-0.0, 0.0) or (not NaN, NaN); midVal < val
370055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes                } else if (midValBits > valueBits) {
3717d6b0007041b192e33858c38d099561237264cb0Joshua Bloch                    hi = mid - 1; // (0.0, -0.0) or (NaN, not NaN); midVal > val
372055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes                } else {
3737d6b0007041b192e33858c38d099561237264cb0Joshua Bloch                    return mid; // bit patterns are equal; value found
374055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes                }
375adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
376adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
3777d6b0007041b192e33858c38d099561237264cb0Joshua Bloch        return ~lo;  // value not present
378adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
379adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
380adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
381055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * Performs a binary search for {@code value} in the ascending sorted array {@code array}.
382055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * Searching in an unsorted array has an undefined result. It's also undefined which element
383055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * is found if there are multiple occurrences of the same element.
384f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
385055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @param array the sorted array to search.
386055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @param value the element to find.
387adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the non-negative index of the element, or a negative index which
388adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         is {@code -index - 1} where the element would be inserted.
389adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
390055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes    public static int binarySearch(int[] array, int value) {
391055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        return binarySearch(array, 0, array.length, value);
392055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes    }
3937d6b0007041b192e33858c38d099561237264cb0Joshua Bloch
394055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes    /**
395055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * Performs a binary search for {@code value} in the ascending sorted array {@code array},
396055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * in the range specified by fromIndex (inclusive) and toIndex (exclusive).
397055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * Searching in an unsorted array has an undefined result. It's also undefined which element
398055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * is found if there are multiple occurrences of the same element.
399055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     *
400055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @param array the sorted array to search.
401055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @param startIndex the inclusive start index.
402055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @param endIndex the exclusive start index.
403055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @param value the element to find.
404055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @return the non-negative index of the element, or a negative index which
405055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     *         is {@code -index - 1} where the element would be inserted.
406055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @throws IllegalArgumentException if {@code startIndex > endIndex}
407055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @throws ArrayIndexOutOfBoundsException if {@code startIndex < 0 || endIndex > array.length}
408055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @since 1.6
409055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     */
410055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes    public static int binarySearch(int[] array, int startIndex, int endIndex, int value) {
411055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        checkBinarySearchBounds(startIndex, endIndex, array.length);
412055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        int lo = startIndex;
413055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        int hi = endIndex - 1;
4147d6b0007041b192e33858c38d099561237264cb0Joshua Bloch
415055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        while (lo <= hi) {
416055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes            int mid = (lo + hi) >>> 1;
417055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes            int midVal = array[mid];
418055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes
419055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes            if (midVal < value) {
420055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes                lo = mid + 1;
421055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes            } else if (midVal > value) {
422055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes                hi = mid - 1;
423055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes            } else {
424055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes                return mid;  // value found
425055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes            }
426055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        }
427055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        return ~lo;  // value not present
428055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes    }
429adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
430adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
431055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * Performs a binary search for {@code value} in the ascending sorted array {@code array}.
432055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * Searching in an unsorted array has an undefined result. It's also undefined which element
433055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * is found if there are multiple occurrences of the same element.
434f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
435055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @param array the sorted array to search.
436055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @param value the element to find.
437adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the non-negative index of the element, or a negative index which
438adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         is {@code -index - 1} where the element would be inserted.
439adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
440adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static int binarySearch(long[] array, long value) {
441055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        return binarySearch(array, 0, array.length, value);
442055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes    }
443055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes
444055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes    /**
445055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * Performs a binary search for {@code value} in the ascending sorted array {@code array},
446055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * in the range specified by fromIndex (inclusive) and toIndex (exclusive).
447055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * Searching in an unsorted array has an undefined result. It's also undefined which element
448055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * is found if there are multiple occurrences of the same element.
449055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     *
450055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @param array the sorted array to search.
451055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @param startIndex the inclusive start index.
452055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @param endIndex the exclusive start index.
453055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @param value the element to find.
454055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @return the non-negative index of the element, or a negative index which
455055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     *         is {@code -index - 1} where the element would be inserted.
456055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @throws IllegalArgumentException if {@code startIndex > endIndex}
457055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @throws ArrayIndexOutOfBoundsException if {@code startIndex < 0 || endIndex > array.length}
458055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @since 1.6
459055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     */
460055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes    public static int binarySearch(long[] array, int startIndex, int endIndex, long value) {
461055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        checkBinarySearchBounds(startIndex, endIndex, array.length);
462055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        int lo = startIndex;
463055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        int hi = endIndex - 1;
464055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes
465055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        while (lo <= hi) {
466055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes            int mid = (lo + hi) >>> 1;
467055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes            long midVal = array[mid];
468055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes
469055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes            if (midVal < value) {
470055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes                lo = mid + 1;
471055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes            } else if (midVal > value) {
472055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes                hi = mid - 1;
473055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes            } else {
474055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes                return mid;  // value found
475055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes            }
4767d6b0007041b192e33858c38d099561237264cb0Joshua Bloch         }
4777d6b0007041b192e33858c38d099561237264cb0Joshua Bloch         return ~lo;  // value not present
478adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
479adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
480adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
481055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * Performs a binary search for {@code value} in the ascending sorted array {@code array}.
482055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * Searching in an unsorted array has an undefined result. It's also undefined which element
483055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * is found if there are multiple occurrences of the same element.
484f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
485055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @param array the sorted array to search.
486055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @param value the element to find.
487adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the non-negative index of the element, or a negative index which
488adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         is {@code -index - 1} where the element would be inserted.
489f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * @throws ClassCastException
490055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     *         if an element in the array or the search element does not
491055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     *         implement {@code Comparable}, or cannot be compared to each other.
492adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
4937d6b0007041b192e33858c38d099561237264cb0Joshua Bloch    public static int binarySearch(Object[] array, Object value) {
494055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        return binarySearch(array, 0, array.length, value);
495adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
496adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
497adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
498055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * Performs a binary search for {@code value} in the ascending sorted array {@code array},
499055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * in the range specified by fromIndex (inclusive) and toIndex (exclusive).
500055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * Searching in an unsorted array has an undefined result. It's also undefined which element
501055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * is found if there are multiple occurrences of the same element.
502f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
503055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @param array the sorted array to search.
504055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @param startIndex the inclusive start index.
505055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @param endIndex the exclusive start index.
506055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @param value the element to find.
507adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the non-negative index of the element, or a negative index which
508adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         is {@code -index - 1} where the element would be inserted.
509f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * @throws ClassCastException
510055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     *         if an element in the array or the search element does not
511055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     *         implement {@code Comparable}, or cannot be compared to each other.
512055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @throws IllegalArgumentException if {@code startIndex > endIndex}
513055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @throws ArrayIndexOutOfBoundsException if {@code startIndex < 0 || endIndex > array.length}
514055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @since 1.6
515adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
516055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes    public static int binarySearch(Object[] array, int startIndex, int endIndex, Object value) {
517055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        checkBinarySearchBounds(startIndex, endIndex, array.length);
518055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        int lo = startIndex;
519055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        int hi = endIndex - 1;
520055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes
521055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        while (lo <= hi) {
522055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes            int mid = (lo + hi) >>> 1;
523055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes            @SuppressWarnings("unchecked")
524055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes            int midValCmp = ((Comparable) array[mid]).compareTo(value);
525055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes
526055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes            if (midValCmp < 0) {
527055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes                lo = mid + 1;
528055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes            } else if (midValCmp > 0) {
529055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes                hi = mid - 1;
530055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes            } else {
531055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes                return mid;  // value found
532055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes            }
533055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        }
534055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        return ~lo;  // value not present
535055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes    }
536055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes
537055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes    /**
538055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * Performs a binary search for {@code value} in the ascending sorted array {@code array},
539162a12c1442641a95fe95859fa4e561b22db049fElliott Hughes     * using {@code comparator} to compare elements.
540055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * Searching in an unsorted array has an undefined result. It's also undefined which element
541055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * is found if there are multiple occurrences of the same element.
542055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     *
543055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @param array the sorted array to search.
544055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @param value the element to find.
545055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @param comparator the {@code Comparator} used to compare the elements.
546055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @return the non-negative index of the element, or a negative index which
547055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     *         is {@code -index - 1} where the element would be inserted.
548055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @throws ClassCastException
549055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     *         if an element in the array or the search element does not
550055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     *         implement {@code Comparable}, or cannot be compared to each other.
551adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
552055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes    public static <T> int binarySearch(T[] array, T value, Comparator<? super T> comparator) {
553055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        return binarySearch(array, 0, array.length, value, comparator);
554055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes    }
555055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes
556055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes    /**
557055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * Performs a binary search for {@code value} in the ascending sorted array {@code array},
558055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * in the range specified by fromIndex (inclusive) and toIndex (exclusive),
559162a12c1442641a95fe95859fa4e561b22db049fElliott Hughes     * using {@code comparator} to compare elements.
560055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * Searching in an unsorted array has an undefined result. It's also undefined which element
561055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * is found if there are multiple occurrences of the same element.
562055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     *
563055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @param array the sorted array to search.
564055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @param startIndex the inclusive start index.
565055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @param endIndex the exclusive start index.
566055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @param value the element to find.
567055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @param comparator the {@code Comparator} used to compare the elements.
568055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @return the non-negative index of the element, or a negative index which
569055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     *         is {@code -index - 1} where the element would be inserted.
570055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @throws ClassCastException
571055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     *         if an element in the array or the search element does not
572055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     *         implement {@code Comparable}, or cannot be compared to each other.
573055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @throws IllegalArgumentException if {@code startIndex > endIndex}
574055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @throws ArrayIndexOutOfBoundsException if {@code startIndex < 0 || endIndex > array.length}
575055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @since 1.6
576055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     */
577055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes    public static <T> int binarySearch(T[] array, int startIndex, int endIndex, T value,
578adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            Comparator<? super T> comparator) {
579055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        if (comparator == null) {
580055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes            return binarySearch(array, startIndex, endIndex, value);
581055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        }
582adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
583055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        checkBinarySearchBounds(startIndex, endIndex, array.length);
584055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        int lo = startIndex;
585055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        int hi = endIndex - 1;
5867d6b0007041b192e33858c38d099561237264cb0Joshua Bloch
5877d6b0007041b192e33858c38d099561237264cb0Joshua Bloch        while (lo <= hi) {
5887d6b0007041b192e33858c38d099561237264cb0Joshua Bloch            int mid = (lo + hi) >>> 1;
5897d6b0007041b192e33858c38d099561237264cb0Joshua Bloch            int midValCmp = comparator.compare(array[mid], value);
5907d6b0007041b192e33858c38d099561237264cb0Joshua Bloch
591055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes            if (midValCmp < 0) {
5927d6b0007041b192e33858c38d099561237264cb0Joshua Bloch                lo = mid + 1;
593055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes            } else if (midValCmp > 0) {
5947d6b0007041b192e33858c38d099561237264cb0Joshua Bloch                hi = mid - 1;
595055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes            } else {
5967d6b0007041b192e33858c38d099561237264cb0Joshua Bloch                return mid;  // value found
597055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes            }
598adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
5997d6b0007041b192e33858c38d099561237264cb0Joshua Bloch        return ~lo;  // value not present
600adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
601adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
602adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
603055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * Performs a binary search for {@code value} in the ascending sorted array {@code array}.
604055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * Searching in an unsorted array has an undefined result. It's also undefined which element
605055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * is found if there are multiple occurrences of the same element.
606f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
607055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @param array the sorted array to search.
608055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @param value the element to find.
609adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the non-negative index of the element, or a negative index which
610adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         is {@code -index - 1} where the element would be inserted.
611adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
612adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static int binarySearch(short[] array, short value) {
613055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        return binarySearch(array, 0, array.length, value);
614055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes    }
615055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes
616055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes    /**
617055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * Performs a binary search for {@code value} in the ascending sorted array {@code array},
618055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * in the range specified by fromIndex (inclusive) and toIndex (exclusive).
619055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * Searching in an unsorted array has an undefined result. It's also undefined which element
620055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * is found if there are multiple occurrences of the same element.
621055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     *
622055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @param array the sorted array to search.
623055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @param startIndex the inclusive start index.
624055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @param endIndex the exclusive start index.
625055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @param value the element to find.
626055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @return the non-negative index of the element, or a negative index which
627055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     *         is {@code -index - 1} where the element would be inserted.
628055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @throws IllegalArgumentException if {@code startIndex > endIndex}
629055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @throws ArrayIndexOutOfBoundsException if {@code startIndex < 0 || endIndex > array.length}
630055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @since 1.6
631055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     */
632055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes    public static int binarySearch(short[] array, int startIndex, int endIndex, short value) {
633055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        checkBinarySearchBounds(startIndex, endIndex, array.length);
634055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        int lo = startIndex;
635055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        int hi = endIndex - 1;
636055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes
637055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        while (lo <= hi) {
638055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes            int mid = (lo + hi) >>> 1;
639055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes            short midVal = array[mid];
640055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes
641055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes            if (midVal < value) {
642055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes                lo = mid + 1;
643055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes            } else if (midVal > value) {
644055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes                hi = mid - 1;
645055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes            } else {
646055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes                return mid;  // value found
647055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes            }
648055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        }
649055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        return ~lo;  // value not present
650055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes    }
651055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes
652055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes    private static void checkBinarySearchBounds(int startIndex, int endIndex, int length) {
653055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        if (startIndex > endIndex) {
654055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes            throw new IllegalArgumentException();
655055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        }
656055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        if (startIndex < 0 || endIndex > length) {
657055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes            throw new ArrayIndexOutOfBoundsException();
658055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        }
659adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
660adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
661adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
662adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Fills the specified array with the specified element.
663f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
664adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param array
665adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the {@code byte} array to fill.
666adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param value
667adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the {@code byte} element.
668adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
669adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static void fill(byte[] array, byte value) {
670adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        for (int i = 0; i < array.length; i++) {
671adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            array[i] = value;
672adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
673adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
674adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
675adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
676adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Fills the specified range in the array with the specified element.
677f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
678adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param array
679adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the {@code byte} array to fill.
680adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param start
681adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the first index to fill.
682adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param end
683adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the last + 1 index to fill.
684adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param value
685adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the {@code byte} element.
686f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * @throws IllegalArgumentException
687adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *                if {@code start > end}.
688f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * @throws ArrayIndexOutOfBoundsException
689adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *                if {@code start < 0} or {@code end > array.length}.
690adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
691adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static void fill(byte[] array, int start, int end, byte value) {
692b9cc455ed89df1a0cf4186c92b352c9649995d96Elliott Hughes        Arrays.checkStartAndEnd(array.length, start, end);
693adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        for (int i = start; i < end; i++) {
694adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            array[i] = value;
695adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
696adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
697adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
698adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
699adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Fills the specified array with the specified element.
700f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
701adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param array
702adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the {@code short} array to fill.
703adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param value
704adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the {@code short} element.
705adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
706adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static void fill(short[] array, short value) {
707adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        for (int i = 0; i < array.length; i++) {
708adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            array[i] = value;
709adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
710adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
711adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
712adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
713adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Fills the specified range in the array with the specified element.
714f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
715adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param array
716adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the {@code short} array to fill.
717adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param start
718adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the first index to fill.
719adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param end
720adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the last + 1 index to fill.
721adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param value
722adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the {@code short} element.
723f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * @throws IllegalArgumentException
724adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *                if {@code start > end}.
725f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * @throws ArrayIndexOutOfBoundsException
726adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *                if {@code start < 0} or {@code end > array.length}.
727adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
728adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static void fill(short[] array, int start, int end, short value) {
729b9cc455ed89df1a0cf4186c92b352c9649995d96Elliott Hughes        Arrays.checkStartAndEnd(array.length, start, end);
730adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        for (int i = start; i < end; i++) {
731adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            array[i] = value;
732adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
733adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
734adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
735adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
736adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Fills the specified array with the specified element.
737f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
738adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param array
739adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the {@code char} array to fill.
740adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param value
741adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the {@code char} element.
742adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
743adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static void fill(char[] array, char value) {
744adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        for (int i = 0; i < array.length; i++) {
745adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            array[i] = value;
746adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
747adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
748adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
749adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
750adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Fills the specified range in the array with the specified element.
751f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
752adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param array
753adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the {@code char} array to fill.
754adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param start
755adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the first index to fill.
756adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param end
757adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the last + 1 index to fill.
758adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param value
759adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the {@code char} element.
760f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * @throws IllegalArgumentException
761adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *                if {@code start > end}.
762f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * @throws ArrayIndexOutOfBoundsException
763adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *                if {@code start < 0} or {@code end > array.length}.
764adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
765adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static void fill(char[] array, int start, int end, char value) {
766b9cc455ed89df1a0cf4186c92b352c9649995d96Elliott Hughes        Arrays.checkStartAndEnd(array.length, start, end);
767adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        for (int i = start; i < end; i++) {
768adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            array[i] = value;
769adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
770adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
771adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
772adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
773adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Fills the specified array with the specified element.
774f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
775adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param array
776adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the {@code int} array to fill.
777adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param value
778adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the {@code int} element.
779adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
780adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static void fill(int[] array, int value) {
781adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        for (int i = 0; i < array.length; i++) {
782adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            array[i] = value;
783adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
784adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
785adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
786adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
787adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Fills the specified range in the array with the specified element.
788f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
789adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param array
790adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the {@code int} array to fill.
791adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param start
792adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the first index to fill.
793adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param end
794adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the last + 1 index to fill.
795adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param value
796adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the {@code int} element.
797f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * @throws IllegalArgumentException
798adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *                if {@code start > end}.
799f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * @throws ArrayIndexOutOfBoundsException
800adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *                if {@code start < 0} or {@code end > array.length}.
801adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
802adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static void fill(int[] array, int start, int end, int value) {
803b9cc455ed89df1a0cf4186c92b352c9649995d96Elliott Hughes        Arrays.checkStartAndEnd(array.length, start, end);
804adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        for (int i = start; i < end; i++) {
805adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            array[i] = value;
806adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
807adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
808adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
809adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
810adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Fills the specified array with the specified element.
811f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
812adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param array
813adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the {@code long} array to fill.
814adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param value
815adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the {@code long} element.
816adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
817adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static void fill(long[] array, long value) {
818adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        for (int i = 0; i < array.length; i++) {
819adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            array[i] = value;
820adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
821adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
822adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
823adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
824adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Fills the specified range in the array with the specified element.
825f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
826adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param array
827adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the {@code long} array to fill.
828adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param start
829adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the first index to fill.
830adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param end
831adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the last + 1 index to fill.
832adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param value
833adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the {@code long} element.
834f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * @throws IllegalArgumentException
835adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *                if {@code start > end}.
836f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * @throws ArrayIndexOutOfBoundsException
837adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *                if {@code start < 0} or {@code end > array.length}.
838adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
839adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static void fill(long[] array, int start, int end, long value) {
840b9cc455ed89df1a0cf4186c92b352c9649995d96Elliott Hughes        Arrays.checkStartAndEnd(array.length, start, end);
841adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        for (int i = start; i < end; i++) {
842adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            array[i] = value;
843adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
844adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
845adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
846adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
847adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Fills the specified array with the specified element.
848f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
849adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param array
850adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the {@code float} array to fill.
851adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param value
852adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the {@code float} element.
853adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
854adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static void fill(float[] array, float value) {
855adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        for (int i = 0; i < array.length; i++) {
856adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            array[i] = value;
857adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
858adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
859adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
860adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
861adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Fills the specified range in the array with the specified element.
862f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
863adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param array
864adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the {@code float} array to fill.
865adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param start
866adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the first index to fill.
867adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param end
868adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the last + 1 index to fill.
869adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param value
870adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the {@code float} element.
871f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * @throws IllegalArgumentException
872adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *                if {@code start > end}.
873f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * @throws ArrayIndexOutOfBoundsException
874adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *                if {@code start < 0} or {@code end > array.length}.
875adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
876adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static void fill(float[] array, int start, int end, float value) {
877b9cc455ed89df1a0cf4186c92b352c9649995d96Elliott Hughes        Arrays.checkStartAndEnd(array.length, start, end);
878adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        for (int i = start; i < end; i++) {
879adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            array[i] = value;
880adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
881adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
882adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
883adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
884adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Fills the specified array with the specified element.
885f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
886adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param array
887adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the {@code double} array to fill.
888adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param value
889adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the {@code double} element.
890adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
891adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static void fill(double[] array, double value) {
892adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        for (int i = 0; i < array.length; i++) {
893adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            array[i] = value;
894adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
895adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
896adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
897adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
898adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Fills the specified range in the array with the specified element.
899f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
900adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param array
901adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the {@code double} array to fill.
902adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param start
903adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the first index to fill.
904adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param end
905adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the last + 1 index to fill.
906adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param value
907adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the {@code double} element.
908f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * @throws IllegalArgumentException
909adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *                if {@code start > end}.
910f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * @throws ArrayIndexOutOfBoundsException
911adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *                if {@code start < 0} or {@code end > array.length}.
912adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
913adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static void fill(double[] array, int start, int end, double value) {
914b9cc455ed89df1a0cf4186c92b352c9649995d96Elliott Hughes        Arrays.checkStartAndEnd(array.length, start, end);
915adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        for (int i = start; i < end; i++) {
916adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            array[i] = value;
917adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
918adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
919adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
920adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
921adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Fills the specified array with the specified element.
922f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
923adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param array
924adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the {@code boolean} array to fill.
925adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param value
926adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the {@code boolean} element.
927adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
928adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static void fill(boolean[] array, boolean value) {
929adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        for (int i = 0; i < array.length; i++) {
930adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            array[i] = value;
931adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
932adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
933adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
934adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
935adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Fills the specified range in the array with the specified element.
936f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
937adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param array
938adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the {@code boolean} array to fill.
939adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param start
940adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the first index to fill.
941adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param end
942adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the last + 1 index to fill.
943adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param value
944adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the {@code boolean} element.
945f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * @throws IllegalArgumentException
946adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *                if {@code start > end}.
947f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * @throws ArrayIndexOutOfBoundsException
948adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *                if {@code start < 0} or {@code end > array.length}.
949adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
950adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static void fill(boolean[] array, int start, int end, boolean value) {
951b9cc455ed89df1a0cf4186c92b352c9649995d96Elliott Hughes        Arrays.checkStartAndEnd(array.length, start, end);
952adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        for (int i = start; i < end; i++) {
953adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            array[i] = value;
954adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
955adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
956adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
957adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
958adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Fills the specified array with the specified element.
959f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
960adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param array
961adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the {@code Object} array to fill.
962adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param value
963adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the {@code Object} element.
964adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
965adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static void fill(Object[] array, Object value) {
966adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        for (int i = 0; i < array.length; i++) {
967adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            array[i] = value;
968adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
969adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
970adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
971adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
972adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Fills the specified range in the array with the specified element.
973f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
974adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param array
975adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the {@code Object} array to fill.
976adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param start
977adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the first index to fill.
978adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param end
979adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the last + 1 index to fill.
980adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param value
981adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the {@code Object} element.
982f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * @throws IllegalArgumentException
983adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *                if {@code start > end}.
984f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * @throws ArrayIndexOutOfBoundsException
985adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *                if {@code start < 0} or {@code end > array.length}.
986adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
987adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static void fill(Object[] array, int start, int end, Object value) {
988b9cc455ed89df1a0cf4186c92b352c9649995d96Elliott Hughes        Arrays.checkStartAndEnd(array.length, start, end);
989adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        for (int i = start; i < end; i++) {
990adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            array[i] = value;
991adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
992adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
993adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
994adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
995adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns a hash code based on the contents of the given array. For any two
996f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * {@code boolean} arrays {@code a} and {@code b}, if
997adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code Arrays.equals(a, b)} returns {@code true}, it means
998adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * that the return value of {@code Arrays.hashCode(a)} equals {@code Arrays.hashCode(b)}.
999adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
1000adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * The value returned by this method is the same value as the
1001910544a773fa8be76ae1fd7d27c15ad6e775082cKenny Root     * {@link List#hashCode()} method which is invoked on a {@link List}
1002910544a773fa8be76ae1fd7d27c15ad6e775082cKenny Root     * containing a sequence of {@link Boolean} instances representing the
1003adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * elements of array in the same order. If the array is {@code null}, the return
1004adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * value is 0.
1005f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
1006adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param array
1007adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the array whose hash code to compute.
1008adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the hash code for {@code array}.
1009adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1010adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static int hashCode(boolean[] array) {
1011adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (array == null) {
1012adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return 0;
1013adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1014adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int hashCode = 1;
1015adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        for (boolean element : array) {
1016adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // 1231, 1237 are hash code values for boolean value
1017adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            hashCode = 31 * hashCode + (element ? 1231 : 1237);
1018adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1019adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return hashCode;
1020adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1021adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1022adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1023adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns a hash code based on the contents of the given array. For any two
1024f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * not-null {@code int} arrays {@code a} and {@code b}, if
1025adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code Arrays.equals(a, b)} returns {@code true}, it means
1026adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * that the return value of {@code Arrays.hashCode(a)} equals {@code Arrays.hashCode(b)}.
1027adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
1028adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * The value returned by this method is the same value as the
1029910544a773fa8be76ae1fd7d27c15ad6e775082cKenny Root     * {@link List#hashCode()} method which is invoked on a {@link List}
1030910544a773fa8be76ae1fd7d27c15ad6e775082cKenny Root     * containing a sequence of {@link Integer} instances representing the
1031adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * elements of array in the same order. If the array is {@code null}, the return
1032adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * value is 0.
1033f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
1034adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param array
1035adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the array whose hash code to compute.
1036adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the hash code for {@code array}.
1037adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1038adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static int hashCode(int[] array) {
1039adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (array == null) {
1040adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return 0;
1041adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1042adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int hashCode = 1;
1043adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        for (int element : array) {
1044adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // the hash code value for integer value is integer value itself
1045adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            hashCode = 31 * hashCode + element;
1046adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1047adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return hashCode;
1048adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1049adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1050adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1051adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns a hash code based on the contents of the given array. For any two
1052f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * {@code short} arrays {@code a} and {@code b}, if
1053adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code Arrays.equals(a, b)} returns {@code true}, it means
1054adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * that the return value of {@code Arrays.hashCode(a)} equals {@code Arrays.hashCode(b)}.
1055adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
1056adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * The value returned by this method is the same value as the
1057910544a773fa8be76ae1fd7d27c15ad6e775082cKenny Root     * {@link List#hashCode()} method which is invoked on a {@link List}
1058910544a773fa8be76ae1fd7d27c15ad6e775082cKenny Root     * containing a sequence of {@link Short} instances representing the
1059adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * elements of array in the same order. If the array is {@code null}, the return
1060adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * value is 0.
1061f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
1062adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param array
1063adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the array whose hash code to compute.
1064adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the hash code for {@code array}.
1065adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1066adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static int hashCode(short[] array) {
1067adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (array == null) {
1068adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return 0;
1069adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1070adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int hashCode = 1;
1071adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        for (short element : array) {
1072adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // the hash code value for short value is its integer value
1073adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            hashCode = 31 * hashCode + element;
1074adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1075adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return hashCode;
1076adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1077adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1078adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1079adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns a hash code based on the contents of the given array. For any two
1080f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * {@code char} arrays {@code a} and {@code b}, if
1081adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code Arrays.equals(a, b)} returns {@code true}, it means
1082adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * that the return value of {@code Arrays.hashCode(a)} equals {@code Arrays.hashCode(b)}.
1083adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
1084adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * The value returned by this method is the same value as the
1085910544a773fa8be76ae1fd7d27c15ad6e775082cKenny Root     * {@link List#hashCode()} method which is invoked on a {@link List}
1086910544a773fa8be76ae1fd7d27c15ad6e775082cKenny Root     * containing a sequence of {@link Character} instances representing the
1087adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * elements of array in the same order. If the array is {@code null}, the return
1088adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * value is 0.
1089f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
1090adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param array
1091adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the array whose hash code to compute.
1092adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the hash code for {@code array}.
1093adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1094adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static int hashCode(char[] array) {
1095adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (array == null) {
1096adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return 0;
1097adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1098adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int hashCode = 1;
1099adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        for (char element : array) {
1100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // the hash code value for char value is its integer value
1101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            hashCode = 31 * hashCode + element;
1102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return hashCode;
1104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns a hash code based on the contents of the given array. For any two
1108f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * {@code byte} arrays {@code a} and {@code b}, if
1109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code Arrays.equals(a, b)} returns {@code true}, it means
1110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * that the return value of {@code Arrays.hashCode(a)} equals {@code Arrays.hashCode(b)}.
1111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
1112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * The value returned by this method is the same value as the
1113910544a773fa8be76ae1fd7d27c15ad6e775082cKenny Root     * {@link List#hashCode()} method which is invoked on a {@link List}
1114910544a773fa8be76ae1fd7d27c15ad6e775082cKenny Root     * containing a sequence of {@link Byte} instances representing the
1115adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * elements of array in the same order. If the array is {@code null}, the return
1116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * value is 0.
1117f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
1118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param array
1119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the array whose hash code to compute.
1120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the hash code for {@code array}.
1121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static int hashCode(byte[] array) {
1123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (array == null) {
1124adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return 0;
1125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1126adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int hashCode = 1;
1127adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        for (byte element : array) {
1128adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // the hash code value for byte value is its integer value
1129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            hashCode = 31 * hashCode + element;
1130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return hashCode;
1132adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1133adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1135adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns a hash code based on the contents of the given array. For any two
1136f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * {@code long} arrays {@code a} and {@code b}, if
1137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code Arrays.equals(a, b)} returns {@code true}, it means
1138adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * that the return value of {@code Arrays.hashCode(a)} equals {@code Arrays.hashCode(b)}.
1139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
1140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * The value returned by this method is the same value as the
1141910544a773fa8be76ae1fd7d27c15ad6e775082cKenny Root     * {@link List#hashCode()} method which is invoked on a {@link List}
1142910544a773fa8be76ae1fd7d27c15ad6e775082cKenny Root     * containing a sequence of {@link Long} instances representing the
1143adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * elements of array in the same order. If the array is {@code null}, the return
1144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * value is 0.
1145f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
1146adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param array
1147adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the array whose hash code to compute.
1148adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the hash code for {@code array}.
1149adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1150adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static int hashCode(long[] array) {
1151adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (array == null) {
1152adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return 0;
1153adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1154adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int hashCode = 1;
1155adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        for (long elementValue : array) {
1156adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            /*
1157adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project             * the hash code value for long value is (int) (value ^ (value >>>
1158adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project             * 32))
1159adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project             */
1160adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            hashCode = 31 * hashCode
1161adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    + (int) (elementValue ^ (elementValue >>> 32));
1162adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1163adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return hashCode;
1164adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1165adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1166adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1167adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns a hash code based on the contents of the given array. For any two
1168f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * {@code float} arrays {@code a} and {@code b}, if
1169adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code Arrays.equals(a, b)} returns {@code true}, it means
1170adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * that the return value of {@code Arrays.hashCode(a)} equals {@code Arrays.hashCode(b)}.
1171adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
1172adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * The value returned by this method is the same value as the
1173910544a773fa8be76ae1fd7d27c15ad6e775082cKenny Root     * {@link List#hashCode()} method which is invoked on a {@link List}
1174910544a773fa8be76ae1fd7d27c15ad6e775082cKenny Root     * containing a sequence of {@link Float} instances representing the
1175adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * elements of array in the same order. If the array is {@code null}, the return
1176adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * value is 0.
1177f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
1178adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param array
1179adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the array whose hash code to compute.
1180adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the hash code for {@code array}.
1181adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1182adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static int hashCode(float[] array) {
1183adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (array == null) {
1184adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return 0;
1185adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1186adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int hashCode = 1;
1187adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        for (float element : array) {
1188adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            /*
1189adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project             * the hash code value for float value is
1190adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project             * Float.floatToIntBits(value)
1191adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project             */
1192adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            hashCode = 31 * hashCode + Float.floatToIntBits(element);
1193adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1194adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return hashCode;
1195adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1196adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1197adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1198adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns a hash code based on the contents of the given array. For any two
1199f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * {@code double} arrays {@code a} and {@code b}, if
1200adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code Arrays.equals(a, b)} returns {@code true}, it means
1201adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * that the return value of {@code Arrays.hashCode(a)} equals {@code Arrays.hashCode(b)}.
1202adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
1203adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * The value returned by this method is the same value as the
1204910544a773fa8be76ae1fd7d27c15ad6e775082cKenny Root     * {@link List#hashCode()} method which is invoked on a {@link List}
1205910544a773fa8be76ae1fd7d27c15ad6e775082cKenny Root     * containing a sequence of {@link Double} instances representing the
1206adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * elements of array in the same order. If the array is {@code null}, the return
1207adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * value is 0.
1208f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
1209adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param array
1210adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the array whose hash code to compute.
1211adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the hash code for {@code array}.
1212adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1213adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static int hashCode(double[] array) {
1214adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (array == null) {
1215adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return 0;
1216adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1217adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int hashCode = 1;
1218adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1219adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        for (double element : array) {
1220adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            long v = Double.doubleToLongBits(element);
1221adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            /*
1222adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project             * the hash code value for double value is (int) (v ^ (v >>> 32))
1223adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project             * where v = Double.doubleToLongBits(value)
1224adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project             */
1225adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            hashCode = 31 * hashCode + (int) (v ^ (v >>> 32));
1226adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1227adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return hashCode;
1228adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1229adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1230adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1231adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns a hash code based on the contents of the given array. If the
1232adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * array contains other arrays as its elements, the hash code is based on
1233adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * their identities not their contents. So it is acceptable to invoke this
1234adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * method on an array that contains itself as an element, either directly or
1235adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * indirectly.
1236adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
1237f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * For any two arrays {@code a} and {@code b}, if
1238adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code Arrays.equals(a, b)} returns {@code true}, it means
1239f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * that the return value of {@code Arrays.hashCode(a)} equals
1240adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code Arrays.hashCode(b)}.
1241adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
1242adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * The value returned by this method is the same value as the method
1243adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Arrays.asList(array).hashCode(). If the array is {@code null}, the return value
1244adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * is 0.
1245f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
1246adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param array
1247adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the array whose hash code to compute.
1248adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the hash code for {@code array}.
1249adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1250adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static int hashCode(Object[] array) {
1251adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (array == null) {
1252adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return 0;
1253adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1254adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int hashCode = 1;
1255adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        for (Object element : array) {
1256adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            int elementHashCode;
1257adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1258adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (element == null) {
1259adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                elementHashCode = 0;
1260adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            } else {
1261adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                elementHashCode = (element).hashCode();
1262adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
1263adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            hashCode = 31 * hashCode + elementHashCode;
1264adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1265adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return hashCode;
1266adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1267adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1268adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1269adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns a hash code based on the "deep contents" of the given array. If
1270adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * the array contains other arrays as its elements, the hash code is based
1271adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * on their contents not their identities. So it is not acceptable to invoke
1272adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * this method on an array that contains itself as an element, either
1273adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * directly or indirectly.
1274adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
1275f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * For any two arrays {@code a} and {@code b}, if
1276adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code Arrays.deepEquals(a, b)} returns {@code true}, it
1277adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * means that the return value of {@code Arrays.deepHashCode(a)} equals
1278adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code Arrays.deepHashCode(b)}.
1279adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
1280adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * The computation of the value returned by this method is similar to that
1281910544a773fa8be76ae1fd7d27c15ad6e775082cKenny Root     * of the value returned by {@link List#hashCode()} invoked on a
1282910544a773fa8be76ae1fd7d27c15ad6e775082cKenny Root     * {@link List} containing a sequence of instances representing the
1283adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * elements of array in the same order. The difference is: If an element e
1284adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * of array is itself an array, its hash code is computed by calling the
1285adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * appropriate overloading of {@code Arrays.hashCode(e)} if e is an array of a
1286adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * primitive type, or by calling {@code Arrays.deepHashCode(e)} recursively if e is
1287adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * an array of a reference type. The value returned by this method is the
1288adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * same value as the method {@code Arrays.asList(array).hashCode()}. If the array is
1289adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code null}, the return value is 0.
1290f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
1291adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param array
1292adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the array whose hash code to compute.
1293adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the hash code for {@code array}.
1294adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1295adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static int deepHashCode(Object[] array) {
1296adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (array == null) {
1297adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return 0;
1298adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1299adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int hashCode = 1;
1300adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        for (Object element : array) {
1301adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            int elementHashCode = deepHashCodeElement(element);
1302adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            hashCode = 31 * hashCode + elementHashCode;
1303adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1304adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return hashCode;
1305adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1306adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1307adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private static int deepHashCodeElement(Object element) {
1308adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Class<?> cl;
1309adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (element == null) {
1310adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return 0;
1311adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1312adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1313adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        cl = element.getClass().getComponentType();
1314adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1315adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (cl == null) {
1316adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return element.hashCode();
1317adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1318adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1319adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /*
1320adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * element is an array
1321adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
132209940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath        if (element instanceof Object[]) {
1323adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return deepHashCode((Object[]) element);
132409940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath        } else if (cl == int.class) {
1325adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return hashCode((int[]) element);
132609940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath        } else if (cl == char.class) {
1327adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return hashCode((char[]) element);
132809940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath        } else if (cl == boolean.class) {
1329adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return hashCode((boolean[]) element);
133009940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath        } else if (cl == byte.class) {
1331adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return hashCode((byte[]) element);
133209940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath        } else if (cl == long.class) {
1333adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return hashCode((long[]) element);
133409940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath        } else if (cl == float.class) {
1335adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return hashCode((float[]) element);
133609940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath        } else if (cl == double.class) {
1337adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return hashCode((double[]) element);
133809940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath        } else {
133909940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath            return hashCode((short[]) element);
1340adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1341adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1342adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1343adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1344adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Compares the two arrays.
1345f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
1346adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param array1
1347adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the first {@code byte} array.
1348adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param array2
1349adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the second {@code byte} array.
1350adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return {@code true} if both arrays are {@code null} or if the arrays have the
1351adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         same length and the elements at each index in the two arrays are
1352adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         equal, {@code false} otherwise.
1353adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1354adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static boolean equals(byte[] array1, byte[] array2) {
1355adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (array1 == array2) {
1356adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return true;
1357adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1358adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (array1 == null || array2 == null || array1.length != array2.length) {
1359adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return false;
1360adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1361adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        for (int i = 0; i < array1.length; i++) {
1362adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (array1[i] != array2[i]) {
1363adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                return false;
1364adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
1365adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1366adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return true;
1367adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1368adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1369adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1370adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Compares the two arrays.
1371f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
1372adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param array1
1373adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the first {@code short} array.
1374adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param array2
1375adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the second {@code short} array.
1376adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return {@code true} if both arrays are {@code null} or if the arrays have the
1377adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         same length and the elements at each index in the two arrays are
1378adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         equal, {@code false} otherwise.
1379adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1380adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static boolean equals(short[] array1, short[] array2) {
1381adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (array1 == array2) {
1382adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return true;
1383adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1384adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (array1 == null || array2 == null || array1.length != array2.length) {
1385adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return false;
1386adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1387adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        for (int i = 0; i < array1.length; i++) {
1388adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (array1[i] != array2[i]) {
1389adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                return false;
1390adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
1391adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1392adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return true;
1393adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1394adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1395adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1396adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Compares the two arrays.
1397f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
1398adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param array1
1399adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the first {@code char} array.
1400adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param array2
1401adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the second {@code char} array.
1402adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return {@code true} if both arrays are {@code null} or if the arrays have the
1403adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         same length and the elements at each index in the two arrays are
1404adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         equal, {@code false} otherwise.
1405adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1406adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static boolean equals(char[] array1, char[] array2) {
1407adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (array1 == array2) {
1408adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return true;
1409adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1410adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (array1 == null || array2 == null || array1.length != array2.length) {
1411adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return false;
1412adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1413adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        for (int i = 0; i < array1.length; i++) {
1414adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (array1[i] != array2[i]) {
1415adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                return false;
1416adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
1417adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1418adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return true;
1419adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1420adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1421adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1422adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Compares the two arrays.
1423f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
1424adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param array1
1425adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the first {@code int} array.
1426adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param array2
1427adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the second {@code int} array.
1428adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return {@code true} if both arrays are {@code null} or if the arrays have the
1429adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         same length and the elements at each index in the two arrays are
1430adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         equal, {@code false} otherwise.
1431adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1432adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static boolean equals(int[] array1, int[] array2) {
1433adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (array1 == array2) {
1434adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return true;
1435adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1436adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (array1 == null || array2 == null || array1.length != array2.length) {
1437adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return false;
1438adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1439adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        for (int i = 0; i < array1.length; i++) {
1440adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (array1[i] != array2[i]) {
1441adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                return false;
1442adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
1443adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1444adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return true;
1445adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1446adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1447adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1448adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Compares the two arrays.
1449f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
1450adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param array1
1451adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the first {@code long} array.
1452adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param array2
1453adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the second {@code long} array.
1454adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return {@code true} if both arrays are {@code null} or if the arrays have the
1455adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         same length and the elements at each index in the two arrays are
1456adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         equal, {@code false} otherwise.
1457adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1458adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static boolean equals(long[] array1, long[] array2) {
1459adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (array1 == array2) {
1460adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return true;
1461adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1462adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (array1 == null || array2 == null || array1.length != array2.length) {
1463adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return false;
1464adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1465adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        for (int i = 0; i < array1.length; i++) {
1466adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (array1[i] != array2[i]) {
1467adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                return false;
1468adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
1469adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1470adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return true;
1471adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1472adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1473adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1474adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Compares the two arrays. The values are compared in the same manner as
1475adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code Float.equals()}.
1476f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
1477adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param array1
1478adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the first {@code float} array.
1479adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param array2
1480adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the second {@code float} array.
1481adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return {@code true} if both arrays are {@code null} or if the arrays have the
1482adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         same length and the elements at each index in the two arrays are
1483adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         equal, {@code false} otherwise.
1484adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see Float#equals(Object)
1485adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1486adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static boolean equals(float[] array1, float[] array2) {
1487adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (array1 == array2) {
1488adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return true;
1489adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1490adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (array1 == null || array2 == null || array1.length != array2.length) {
1491adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return false;
1492adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1493adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        for (int i = 0; i < array1.length; i++) {
1494adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (Float.floatToIntBits(array1[i]) != Float
1495adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    .floatToIntBits(array2[i])) {
1496adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                return false;
1497adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
1498adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1499adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return true;
1500adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1501adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1502adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1503adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Compares the two arrays. The values are compared in the same manner as
1504adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code Double.equals()}.
1505f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
1506adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param array1
1507adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the first {@code double} array.
1508adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param array2
1509adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the second {@code double} array.
1510adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return {@code true} if both arrays are {@code null} or if the arrays have the
1511adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         same length and the elements at each index in the two arrays are
1512adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         equal, {@code false} otherwise.
1513adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see Double#equals(Object)
1514adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1515adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static boolean equals(double[] array1, double[] array2) {
1516adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (array1 == array2) {
1517adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return true;
1518adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1519adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (array1 == null || array2 == null || array1.length != array2.length) {
1520adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return false;
1521adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1522adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        for (int i = 0; i < array1.length; i++) {
1523adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (Double.doubleToLongBits(array1[i]) != Double
1524adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    .doubleToLongBits(array2[i])) {
1525adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                return false;
1526adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
1527adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1528adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return true;
1529adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1530adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1531adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1532adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Compares the two arrays.
1533f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
1534adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param array1
1535adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the first {@code boolean} array.
1536adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param array2
1537adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the second {@code boolean} array.
1538adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return {@code true} if both arrays are {@code null} or if the arrays have the
1539adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         same length and the elements at each index in the two arrays are
1540adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         equal, {@code false} otherwise.
1541adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1542adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static boolean equals(boolean[] array1, boolean[] array2) {
1543adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (array1 == array2) {
1544adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return true;
1545adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1546adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (array1 == null || array2 == null || array1.length != array2.length) {
1547adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return false;
1548adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1549adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        for (int i = 0; i < array1.length; i++) {
1550adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (array1[i] != array2[i]) {
1551adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                return false;
1552adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
1553adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1554adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return true;
1555adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1556adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1557adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1558adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Compares the two arrays.
1559f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
1560adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param array1
1561adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the first {@code Object} array.
1562adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param array2
1563adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the second {@code Object} array.
1564adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return {@code true} if both arrays are {@code null} or if the arrays have the
1565adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         same length and the elements at each index in the two arrays are
1566adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         equal according to {@code equals()}, {@code false} otherwise.
1567adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1568adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static boolean equals(Object[] array1, Object[] array2) {
1569adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (array1 == array2) {
1570adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return true;
1571adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1572adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (array1 == null || array2 == null || array1.length != array2.length) {
1573adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return false;
1574adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1575adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        for (int i = 0; i < array1.length; i++) {
1576adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            Object e1 = array1[i], e2 = array2[i];
1577adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (!(e1 == null ? e2 == null : e1.equals(e2))) {
1578adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                return false;
1579adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
1580adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1581adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return true;
1582adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1583adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1584adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1585adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns {@code true} if the two given arrays are deeply equal to one another.
1586adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Unlike the method {@code equals(Object[] array1, Object[] array2)}, this method
1587adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * is appropriate for use for nested arrays of arbitrary depth.
1588adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
1589adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Two array references are considered deeply equal if they are both {@code null},
1590adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * or if they refer to arrays that have the same length and the elements at
1591adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * each index in the two arrays are equal.
1592adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
1593adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Two {@code null} elements {@code element1} and {@code element2} are possibly deeply equal if any
1594adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * of the following conditions satisfied:
1595adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
1596adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code element1} and {@code element2} are both arrays of object reference types, and
1597adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code Arrays.deepEquals(element1, element2)} would return {@code true}.
1598adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
1599adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code element1} and {@code element2} are arrays of the same primitive type, and the
1600adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * appropriate overloading of {@code Arrays.equals(element1, element2)} would return
1601adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code true}.
1602adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
1603adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code element1 == element2}
1604adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
1605adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code element1.equals(element2)} would return {@code true}.
1606adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
1607adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Note that this definition permits {@code null} elements at any depth.
1608adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
1609adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * If either of the given arrays contain themselves as elements, the
1610adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * behavior of this method is uncertain.
1611f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
1612adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param array1
1613adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the first {@code Object} array.
1614adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param array2
1615adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the second {@code Object} array.
1616adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return {@code true} if both arrays are {@code null} or if the arrays have the
1617adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         same length and the elements at each index in the two arrays are
1618adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         equal according to {@code equals()}, {@code false} otherwise.
1619adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1620adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static boolean deepEquals(Object[] array1, Object[] array2) {
1621adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (array1 == array2) {
1622adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return true;
1623adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1624adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (array1 == null || array2 == null || array1.length != array2.length) {
1625adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return false;
1626adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1627adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        for (int i = 0; i < array1.length; i++) {
1628adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            Object e1 = array1[i], e2 = array2[i];
1629adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1630adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (!deepEqualsElements(e1, e2)) {
1631adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                return false;
1632adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
1633adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1634adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return true;
1635adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1636adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1637adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private static boolean deepEqualsElements(Object e1, Object e2) {
1638adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Class<?> cl1, cl2;
1639adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1640adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (e1 == e2) {
1641adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return true;
1642adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1643adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1644adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (e1 == null || e2 == null) {
1645adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return false;
1646adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1647adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1648adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        cl1 = e1.getClass().getComponentType();
1649adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        cl2 = e2.getClass().getComponentType();
1650adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1651adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (cl1 != cl2) {
1652adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return false;
1653adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1654adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1655adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (cl1 == null) {
1656adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return e1.equals(e2);
1657adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1658adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1659adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /*
1660adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * compare as arrays
1661adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
166209940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath        if (e1 instanceof Object[]) {
1663adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return deepEquals((Object[]) e1, (Object[]) e2);
166409940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath        } else if (cl1 == int.class) {
1665adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return equals((int[]) e1, (int[]) e2);
166609940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath        } else if (cl1 == char.class) {
1667adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return equals((char[]) e1, (char[]) e2);
166809940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath        } else if (cl1 == boolean.class) {
1669adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return equals((boolean[]) e1, (boolean[]) e2);
167009940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath        } else if (cl1 == byte.class) {
1671adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return equals((byte[]) e1, (byte[]) e2);
167209940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath        } else if (cl1 == long.class) {
1673adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return equals((long[]) e1, (long[]) e2);
167409940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath        } else if (cl1 == float.class) {
1675adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return equals((float[]) e1, (float[]) e2);
167609940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath        } else if (cl1 == double.class) {
1677adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return equals((double[]) e1, (double[]) e2);
167809940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath        } else {
167909940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath            return equals((short[]) e1, (short[]) e2);
1680adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1681adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1682adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1683adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1684adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sorts the specified array in ascending numerical order.
1685f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
1686adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param array
1687adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the {@code byte} array to be sorted.
1688adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1689adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static void sort(byte[] array) {
16902626284e3b8aa00ac87146a324854bbd40f0726fJoshua Bloch        DualPivotQuicksort.sort(array);
1691adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1692adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1693adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1694adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sorts the specified range in the array in ascending numerical order.
1695f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
1696adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param array
1697adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the {@code byte} array to be sorted.
1698adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param start
1699adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the start index to sort.
1700adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param end
1701adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the last + 1 index to sort.
1702f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * @throws IllegalArgumentException
1703adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *                if {@code start > end}.
1704f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * @throws ArrayIndexOutOfBoundsException
1705adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *                if {@code start < 0} or {@code end > array.length}.
1706adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1707adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static void sort(byte[] array, int start, int end) {
17082626284e3b8aa00ac87146a324854bbd40f0726fJoshua Bloch        DualPivotQuicksort.sort(array, start, end);
1709adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1710adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
17112d9c5fa8ce0182cd8c14736241b709fd50cab6f8Elliott Hughes    /**
17122d9c5fa8ce0182cd8c14736241b709fd50cab6f8Elliott Hughes     * Checks that the range described by {@code offset} and {@code count} doesn't exceed
17132d9c5fa8ce0182cd8c14736241b709fd50cab6f8Elliott Hughes     * {@code arrayLength}.
17142d9c5fa8ce0182cd8c14736241b709fd50cab6f8Elliott Hughes     *
17152d9c5fa8ce0182cd8c14736241b709fd50cab6f8Elliott Hughes     * @hide
17162d9c5fa8ce0182cd8c14736241b709fd50cab6f8Elliott Hughes     */
17172d9c5fa8ce0182cd8c14736241b709fd50cab6f8Elliott Hughes    public static void checkOffsetAndCount(int arrayLength, int offset, int count) {
1718a1603838fe9e865575c87982e32c6343740e464cElliott Hughes        if ((offset | count) < 0 || offset > arrayLength || arrayLength - offset < count) {
1719363291564f107e500e0b584baa0377757cc2ae09Dan Bornstein            throw new ArrayIndexOutOfBoundsException(arrayLength, offset,
1720363291564f107e500e0b584baa0377757cc2ae09Dan Bornstein                    count);
17212d9c5fa8ce0182cd8c14736241b709fd50cab6f8Elliott Hughes        }
17222d9c5fa8ce0182cd8c14736241b709fd50cab6f8Elliott Hughes    }
17232d9c5fa8ce0182cd8c14736241b709fd50cab6f8Elliott Hughes
1724b9cc455ed89df1a0cf4186c92b352c9649995d96Elliott Hughes    /**
1725b9cc455ed89df1a0cf4186c92b352c9649995d96Elliott Hughes     * Checks that the range described by {@code start} and {@code end} doesn't exceed
172609947fcafbd3cccda9ad25e75af173b24f1c10beJesse Wilson     * {@code len}.
1727b9cc455ed89df1a0cf4186c92b352c9649995d96Elliott Hughes     *
1728b9cc455ed89df1a0cf4186c92b352c9649995d96Elliott Hughes     * @hide
1729b9cc455ed89df1a0cf4186c92b352c9649995d96Elliott Hughes     */
1730c8ed4009f3ade95e6cf9ade8cfd1b08f90a8690fJesse Wilson    public static void checkStartAndEnd(int len, int start, int end) {
1731c8ed4009f3ade95e6cf9ade8cfd1b08f90a8690fJesse Wilson        if (start < 0 || end > len) {
1732c8ed4009f3ade95e6cf9ade8cfd1b08f90a8690fJesse Wilson            throw new ArrayIndexOutOfBoundsException("start < 0 || end > len."
1733c8ed4009f3ade95e6cf9ade8cfd1b08f90a8690fJesse Wilson                    + " start=" + start + ", end=" + end + ", len=" + len);
1734c8ed4009f3ade95e6cf9ade8cfd1b08f90a8690fJesse Wilson        }
1735adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (start > end) {
1736b9cc455ed89df1a0cf4186c92b352c9649995d96Elliott Hughes            throw new IllegalArgumentException("start > end: " + start + " > " + end);
17375839b909d9528b7726e678a4b696ed37df15d897Jesse Wilson        }
1738adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1739adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1740adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1741adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sorts the specified array in ascending numerical order.
1742f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
1743adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param array
1744adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the {@code char} array to be sorted.
1745adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1746adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static void sort(char[] array) {
17472626284e3b8aa00ac87146a324854bbd40f0726fJoshua Bloch        DualPivotQuicksort.sort(array);
1748adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1749adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1750adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1751adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sorts the specified range in the array in ascending numerical order.
1752f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
1753adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param array
1754adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the {@code char} array to be sorted.
1755adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param start
1756adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the start index to sort.
1757adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param end
1758adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the last + 1 index to sort.
1759f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * @throws IllegalArgumentException
1760adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *                if {@code start > end}.
1761f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * @throws ArrayIndexOutOfBoundsException
1762adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *                if {@code start < 0} or {@code end > array.length}.
1763adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1764adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static void sort(char[] array, int start, int end) {
17652626284e3b8aa00ac87146a324854bbd40f0726fJoshua Bloch        DualPivotQuicksort.sort(array, start, end);
1766adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1767adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1768adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1769adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sorts the specified array in ascending numerical order.
1770f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
1771adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param array
1772adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the {@code double} array to be sorted.
1773adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #sort(double[], int, int)
1774adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1775adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static void sort(double[] array) {
17762626284e3b8aa00ac87146a324854bbd40f0726fJoshua Bloch        DualPivotQuicksort.sort(array);
1777adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1778adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1779adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1780adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sorts the specified range in the array in ascending numerical order. The
1781adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * values are sorted according to the order imposed by {@code Double.compareTo()}.
1782f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
1783adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param array
1784adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the {@code double} array to be sorted.
1785adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param start
1786adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the start index to sort.
1787adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param end
1788adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the last + 1 index to sort.
1789f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * @throws IllegalArgumentException
1790adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *                if {@code start > end}.
1791f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * @throws ArrayIndexOutOfBoundsException
1792adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *                if {@code start < 0} or {@code end > array.length}.
1793adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see Double#compareTo(Double)
1794adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1795adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static void sort(double[] array, int start, int end) {
17962626284e3b8aa00ac87146a324854bbd40f0726fJoshua Bloch        DualPivotQuicksort.sort(array, start, end);
1797adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1798adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1799adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1800adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sorts the specified array in ascending numerical order.
1801f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
1802adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param array
1803adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the {@code float} array to be sorted.
1804adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #sort(float[], int, int)
1805adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1806adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static void sort(float[] array) {
18072626284e3b8aa00ac87146a324854bbd40f0726fJoshua Bloch        DualPivotQuicksort.sort(array);
1808adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1809adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1810adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1811adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sorts the specified range in the array in ascending numerical order. The
1812adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * values are sorted according to the order imposed by {@code Float.compareTo()}.
1813f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
1814adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param array
1815adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the {@code float} array to be sorted.
1816adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param start
1817adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the start index to sort.
1818adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param end
1819adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the last + 1 index to sort.
1820f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * @throws IllegalArgumentException
1821adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *                if {@code start > end}.
1822f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * @throws ArrayIndexOutOfBoundsException
1823adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *                if {@code start < 0} or {@code end > array.length}.
1824adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see Float#compareTo(Float)
1825adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1826adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static void sort(float[] array, int start, int end) {
18272626284e3b8aa00ac87146a324854bbd40f0726fJoshua Bloch        DualPivotQuicksort.sort(array, start, end);
1828adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1829adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1830adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1831adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sorts the specified array in ascending numerical order.
1832f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
1833adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param array
1834adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the {@code int} array to be sorted.
1835adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1836adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static void sort(int[] array) {
18372626284e3b8aa00ac87146a324854bbd40f0726fJoshua Bloch        DualPivotQuicksort.sort(array);
1838adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1839adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1840adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1841adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sorts the specified range in the array in ascending numerical order.
1842f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
1843adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param array
1844adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the {@code int} array to be sorted.
1845adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param start
1846adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the start index to sort.
1847adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param end
1848adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the last + 1 index to sort.
1849f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * @throws IllegalArgumentException
1850adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *                if {@code start > end}.
1851f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * @throws ArrayIndexOutOfBoundsException
1852adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *                if {@code start < 0} or {@code end > array.length}.
1853adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1854adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static void sort(int[] array, int start, int end) {
18552626284e3b8aa00ac87146a324854bbd40f0726fJoshua Bloch        DualPivotQuicksort.sort(array, start, end);
1856adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1857adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1858adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1859adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sorts the specified array in ascending numerical order.
1860f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
1861adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param array
1862adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the {@code long} array to be sorted.
1863adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1864adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static void sort(long[] array) {
18652626284e3b8aa00ac87146a324854bbd40f0726fJoshua Bloch        DualPivotQuicksort.sort(array);
1866adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1867adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1868adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1869adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sorts the specified range in the array in ascending numerical order.
1870f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
1871adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param array
1872adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the {@code long} array to be sorted.
1873adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param start
1874adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the start index to sort.
1875adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param end
1876adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the last + 1 index to sort.
1877f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * @throws IllegalArgumentException
1878adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *                if {@code start > end}.
1879f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * @throws ArrayIndexOutOfBoundsException
1880adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *                if {@code start < 0} or {@code end > array.length}.
1881adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1882adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static void sort(long[] array, int start, int end) {
18832626284e3b8aa00ac87146a324854bbd40f0726fJoshua Bloch        DualPivotQuicksort.sort(array, start, end);
18842626284e3b8aa00ac87146a324854bbd40f0726fJoshua Bloch    }
18852626284e3b8aa00ac87146a324854bbd40f0726fJoshua Bloch
18862626284e3b8aa00ac87146a324854bbd40f0726fJoshua Bloch    /**
18872626284e3b8aa00ac87146a324854bbd40f0726fJoshua Bloch     * Sorts the specified array in ascending numerical order.
18882626284e3b8aa00ac87146a324854bbd40f0726fJoshua Bloch     *
18892626284e3b8aa00ac87146a324854bbd40f0726fJoshua Bloch     * @param array
18902626284e3b8aa00ac87146a324854bbd40f0726fJoshua Bloch     *            the {@code short} array to be sorted.
18912626284e3b8aa00ac87146a324854bbd40f0726fJoshua Bloch     */
18922626284e3b8aa00ac87146a324854bbd40f0726fJoshua Bloch    public static void sort(short[] array) {
18932626284e3b8aa00ac87146a324854bbd40f0726fJoshua Bloch        DualPivotQuicksort.sort(array);
18942626284e3b8aa00ac87146a324854bbd40f0726fJoshua Bloch    }
18952626284e3b8aa00ac87146a324854bbd40f0726fJoshua Bloch
18962626284e3b8aa00ac87146a324854bbd40f0726fJoshua Bloch    /**
18972626284e3b8aa00ac87146a324854bbd40f0726fJoshua Bloch     * Sorts the specified range in the array in ascending numerical order.
18982626284e3b8aa00ac87146a324854bbd40f0726fJoshua Bloch     *
18992626284e3b8aa00ac87146a324854bbd40f0726fJoshua Bloch     * @param array
19002626284e3b8aa00ac87146a324854bbd40f0726fJoshua Bloch     *            the {@code short} array to be sorted.
19012626284e3b8aa00ac87146a324854bbd40f0726fJoshua Bloch     * @param start
19022626284e3b8aa00ac87146a324854bbd40f0726fJoshua Bloch     *            the start index to sort.
19032626284e3b8aa00ac87146a324854bbd40f0726fJoshua Bloch     * @param end
19042626284e3b8aa00ac87146a324854bbd40f0726fJoshua Bloch     *            the last + 1 index to sort.
19052626284e3b8aa00ac87146a324854bbd40f0726fJoshua Bloch     * @throws IllegalArgumentException
19062626284e3b8aa00ac87146a324854bbd40f0726fJoshua Bloch     *                if {@code start > end}.
19072626284e3b8aa00ac87146a324854bbd40f0726fJoshua Bloch     * @throws ArrayIndexOutOfBoundsException
19082626284e3b8aa00ac87146a324854bbd40f0726fJoshua Bloch     *                if {@code start < 0} or {@code end > array.length}.
19092626284e3b8aa00ac87146a324854bbd40f0726fJoshua Bloch     */
19102626284e3b8aa00ac87146a324854bbd40f0726fJoshua Bloch    public static void sort(short[] array, int start, int end) {
19112626284e3b8aa00ac87146a324854bbd40f0726fJoshua Bloch        DualPivotQuicksort.sort(array, start, end);
1912adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1913adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1914f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson// BEGIN android-note
1915adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1916adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /*
1917adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>If this platform has an optimizing VM, check whether ComparableTimSort
1918adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * offers any performance benefit over TimSort in conjunction with a
1919adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * comparator that returns:
1920adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *    {@code ((Comparable)first).compareTo(Second)}.
1921adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * If not, you are better off deleting ComparableTimSort to eliminate the
1922adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * code duplication.  In other words, the commented out code below
1923fb0ec0e650bf8be35acb0d47da0311a7c446aa33Elliott Hughes     * is the preferable implementation for sorting arrays of Comparables if it
1924adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * offers sufficient performance.
1925adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1926adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1927adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project//    /**
1928adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project//     * A comparator that implements the natural order of a group of
1929adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project//     * mutually comparable elements.  Using this comparator saves us
1930adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project//     * from duplicating most of the code in this file (one version for
1931fb0ec0e650bf8be35acb0d47da0311a7c446aa33Elliott Hughes//     * Comparables, one for explicit comparators).
1932adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project//     */
1933fb0ec0e650bf8be35acb0d47da0311a7c446aa33Elliott Hughes//    private static final Comparator<Object> NATURAL_ORDER = new Comparator<Object>() {
1934adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project//        @SuppressWarnings("unchecked")
1935adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project//        public int compare(Object first, Object second) {
1936adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project//            return ((Comparable<Object>)first).compareTo(second);
1937adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project//        }
1938adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project//    };
1939adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project//
1940adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project//    public static void sort(Object[] a) {
1941adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project//        sort(a, 0, a.length, NATURAL_ORDER);
1942adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project//    }
1943adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project//
1944adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project//    public static void sort(Object[] a, int fromIndex, int toIndex) {
1945adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project//        sort(a, fromIndex, toIndex, NATURAL_ORDER);
1946adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project//    }
1947adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1948f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson// END android-note
1949f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson
1950adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1951adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sorts the specified array in ascending natural order.
1952f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
195335def4c9d5fb52e0eb2cb4fa7d8d10618d7e8baaElliott Hughes     * @throws ClassCastException if any element does not implement {@code Comparable},
195435def4c9d5fb52e0eb2cb4fa7d8d10618d7e8baaElliott Hughes     *     or if {@code compareTo} throws for any pair of elements.
1955adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1956adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static void sort(Object[] array) {
1957adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        ComparableTimSort.sort(array);
1958adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1959adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1960adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
196135def4c9d5fb52e0eb2cb4fa7d8d10618d7e8baaElliott Hughes     * Sorts the specified range in the array in ascending natural order.
1962f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
1963adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param start
1964adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the start index to sort.
1965adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param end
1966adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the last + 1 index to sort.
196735def4c9d5fb52e0eb2cb4fa7d8d10618d7e8baaElliott Hughes     * @throws ClassCastException if any element does not implement {@code Comparable},
196835def4c9d5fb52e0eb2cb4fa7d8d10618d7e8baaElliott Hughes     *     or if {@code compareTo} throws for any pair of elements.
1969f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * @throws IllegalArgumentException
1970adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *                if {@code start > end}.
1971f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * @throws ArrayIndexOutOfBoundsException
1972adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *                if {@code start < 0} or {@code end > array.length}.
1973adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1974adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static void sort(Object[] array, int start, int end) {
1975adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        ComparableTimSort.sort(array, start, end);
1976f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson    }
1977f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson
1978adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1979adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sorts the specified range in the array using the specified {@code Comparator}.
1980adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * All elements must be comparable to each other without a
1981adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code ClassCastException} being thrown.
1982f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
1983adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param start
1984adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the start index to sort.
1985adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param end
1986adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the last + 1 index to sort.
1987adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param comparator
1988adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the {@code Comparator}.
1989f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * @throws ClassCastException
1990adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *                if elements in the array cannot be compared to each other
199135def4c9d5fb52e0eb2cb4fa7d8d10618d7e8baaElliott Hughes     *                using the given {@code Comparator}.
1992f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * @throws IllegalArgumentException
1993adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *                if {@code start > end}.
1994f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * @throws ArrayIndexOutOfBoundsException
1995adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *                if {@code start < 0} or {@code end > array.length}.
1996adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1997fb0ec0e650bf8be35acb0d47da0311a7c446aa33Elliott Hughes    public static <T> void sort(T[] array, int start, int end, Comparator<? super T> comparator) {
1998adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        TimSort.sort(array, start, end, comparator);
1999adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
2000adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
2001adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
2002adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sorts the specified array using the specified {@code Comparator}. All elements
2003adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * must be comparable to each other without a {@code ClassCastException} being thrown.
2004f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
2005f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * @throws ClassCastException
2006adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *                if elements in the array cannot be compared to each other
2007adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *                using the {@code Comparator}.
2008adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
2009adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static <T> void sort(T[] array, Comparator<? super T> comparator) {
2010adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        TimSort.sort(array, comparator);
2011adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
2012adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
2013adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
2014adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Creates a {@code String} representation of the {@code boolean[]} passed.
20151d58625189328f29c10fa98d52512ee6cf8cc641Ben Dodson     * The result is surrounded by brackets ({@code "[]"}), each
2016adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * element is converted to a {@code String} via the
20171d58625189328f29c10fa98d52512ee6cf8cc641Ben Dodson     * {@link String#valueOf(boolean)} and separated by {@code ", "}.
20181d58625189328f29c10fa98d52512ee6cf8cc641Ben Dodson     * If the array is {@code null}, then {@code "null"} is returned.
2019f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
2020adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param array
2021adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the {@code boolean} array to convert.
2022adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the {@code String} representation of {@code array}.
2023f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * @since 1.5
2024adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
2025adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static String toString(boolean[] array) {
2026adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (array == null) {
2027f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes            return "null";
2028adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
2029adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (array.length == 0) {
2030f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes            return "[]";
2031adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
2032fb0ec0e650bf8be35acb0d47da0311a7c446aa33Elliott Hughes        StringBuilder sb = new StringBuilder(array.length * 7);
2033adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        sb.append('[');
2034adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        sb.append(array[0]);
2035adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        for (int i = 1; i < array.length; i++) {
2036f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes            sb.append(", ");
2037adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            sb.append(array[i]);
2038adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
2039adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        sb.append(']');
2040adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return sb.toString();
2041adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
2042adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
2043adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
2044adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Creates a {@code String} representation of the {@code byte[]} passed. The
20451d58625189328f29c10fa98d52512ee6cf8cc641Ben Dodson     * result is surrounded by brackets ({@code "[]"}), each element
2046adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * is converted to a {@code String} via the {@link String#valueOf(int)} and
20471d58625189328f29c10fa98d52512ee6cf8cc641Ben Dodson     * separated by {@code ", "}. If the array is {@code null}, then
20481d58625189328f29c10fa98d52512ee6cf8cc641Ben Dodson     * {@code "null"} is returned.
2049f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
2050adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param array
2051adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the {@code byte} array to convert.
2052adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the {@code String} representation of {@code array}.
2053f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * @since 1.5
2054adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
2055adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static String toString(byte[] array) {
2056adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (array == null) {
2057f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes            return "null";
2058adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
2059adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (array.length == 0) {
2060f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes            return "[]";
2061adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
2062fb0ec0e650bf8be35acb0d47da0311a7c446aa33Elliott Hughes        StringBuilder sb = new StringBuilder(array.length * 6);
2063adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        sb.append('[');
2064adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        sb.append(array[0]);
2065adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        for (int i = 1; i < array.length; i++) {
2066f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes            sb.append(", ");
2067adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            sb.append(array[i]);
2068adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
2069adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        sb.append(']');
2070adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return sb.toString();
2071adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
2072adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
2073adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
2074adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Creates a {@code String} representation of the {@code char[]} passed. The
20751d58625189328f29c10fa98d52512ee6cf8cc641Ben Dodson     * result is surrounded by brackets ({@code "[]"}), each element
2076adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * is converted to a {@code String} via the {@link String#valueOf(char)} and
20771d58625189328f29c10fa98d52512ee6cf8cc641Ben Dodson     * separated by {@code ", "}. If the array is {@code null}, then
20781d58625189328f29c10fa98d52512ee6cf8cc641Ben Dodson     * {@code "null"} is returned.
2079f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
2080adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param array
2081adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the {@code char} array to convert.
2082adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the {@code String} representation of {@code array}.
2083f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * @since 1.5
2084adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
2085adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static String toString(char[] array) {
2086adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (array == null) {
2087f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes            return "null";
2088adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
2089adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (array.length == 0) {
2090f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes            return "[]";
2091adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
2092fb0ec0e650bf8be35acb0d47da0311a7c446aa33Elliott Hughes        StringBuilder sb = new StringBuilder(array.length * 3);
2093adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        sb.append('[');
2094adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        sb.append(array[0]);
2095adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        for (int i = 1; i < array.length; i++) {
2096f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes            sb.append(", ");
2097adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            sb.append(array[i]);
2098adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
2099adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        sb.append(']');
2100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return sb.toString();
2101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
2102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
2103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
2104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Creates a {@code String} representation of the {@code double[]} passed.
21051d58625189328f29c10fa98d52512ee6cf8cc641Ben Dodson     * The result is surrounded by brackets ({@code "[]"}), each
2106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * element is converted to a {@code String} via the
21071d58625189328f29c10fa98d52512ee6cf8cc641Ben Dodson     * {@link String#valueOf(double)} and separated by {@code ", "}.
21081d58625189328f29c10fa98d52512ee6cf8cc641Ben Dodson     * If the array is {@code null}, then {@code "null"} is returned.
2109f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
2110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param array
2111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the {@code double} array to convert.
2112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the {@code String} representation of {@code array}.
2113f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * @since 1.5
2114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
2115adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static String toString(double[] array) {
2116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (array == null) {
2117f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes            return "null";
2118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
2119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (array.length == 0) {
2120f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes            return "[]";
2121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
2122fb0ec0e650bf8be35acb0d47da0311a7c446aa33Elliott Hughes        StringBuilder sb = new StringBuilder(array.length * 7);
2123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        sb.append('[');
2124adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        sb.append(array[0]);
2125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        for (int i = 1; i < array.length; i++) {
2126f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes            sb.append(", ");
2127adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            sb.append(array[i]);
2128adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
2129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        sb.append(']');
2130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return sb.toString();
2131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
2132adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
2133adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
2134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Creates a {@code String} representation of the {@code float[]} passed.
21351d58625189328f29c10fa98d52512ee6cf8cc641Ben Dodson     * The result is surrounded by brackets ({@code "[]"}), each
2136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * element is converted to a {@code String} via the
21371d58625189328f29c10fa98d52512ee6cf8cc641Ben Dodson     * {@link String#valueOf(float)} and separated by {@code ", "}.
21381d58625189328f29c10fa98d52512ee6cf8cc641Ben Dodson     * If the array is {@code null}, then {@code "null"} is returned.
2139f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
2140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param array
2141adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the {@code float} array to convert.
2142adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the {@code String} representation of {@code array}.
2143f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * @since 1.5
2144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
2145adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static String toString(float[] array) {
2146adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (array == null) {
2147f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes            return "null";
2148adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
2149adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (array.length == 0) {
2150f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes            return "[]";
2151adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
2152fb0ec0e650bf8be35acb0d47da0311a7c446aa33Elliott Hughes        StringBuilder sb = new StringBuilder(array.length * 7);
2153adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        sb.append('[');
2154adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        sb.append(array[0]);
2155adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        for (int i = 1; i < array.length; i++) {
2156f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes            sb.append(", ");
2157adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            sb.append(array[i]);
2158adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
2159adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        sb.append(']');
2160adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return sb.toString();
2161adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
2162adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
2163adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
2164adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Creates a {@code String} representation of the {@code int[]} passed. The
21651d58625189328f29c10fa98d52512ee6cf8cc641Ben Dodson     * result is surrounded by brackets ({@code "[]"}), each element
2166adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * is converted to a {@code String} via the {@link String#valueOf(int)} and
21671d58625189328f29c10fa98d52512ee6cf8cc641Ben Dodson     * separated by {@code ", "}. If the array is {@code null}, then
21681d58625189328f29c10fa98d52512ee6cf8cc641Ben Dodson     * {@code "null"} is returned.
2169f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
2170adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param array
2171adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the {@code int} array to convert.
2172adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the {@code String} representation of {@code array}.
2173f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * @since 1.5
2174adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
2175adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static String toString(int[] array) {
2176adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (array == null) {
2177f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes            return "null";
2178adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
2179adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (array.length == 0) {
2180f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes            return "[]";
2181adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
2182fb0ec0e650bf8be35acb0d47da0311a7c446aa33Elliott Hughes        StringBuilder sb = new StringBuilder(array.length * 6);
2183adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        sb.append('[');
2184adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        sb.append(array[0]);
2185adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        for (int i = 1; i < array.length; i++) {
2186f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes            sb.append(", ");
2187adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            sb.append(array[i]);
2188adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
2189adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        sb.append(']');
2190adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return sb.toString();
2191adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
2192adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
2193adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
2194adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Creates a {@code String} representation of the {@code long[]} passed. The
21951d58625189328f29c10fa98d52512ee6cf8cc641Ben Dodson     * result is surrounded by brackets ({@code "[]"}), each element
2196adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * is converted to a {@code String} via the {@link String#valueOf(long)} and
21971d58625189328f29c10fa98d52512ee6cf8cc641Ben Dodson     * separated by {@code ", "}. If the array is {@code null}, then
21981d58625189328f29c10fa98d52512ee6cf8cc641Ben Dodson     * {@code "null"} is returned.
2199f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
2200adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param array
2201adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the {@code long} array to convert.
2202adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the {@code String} representation of {@code array}.
2203f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * @since 1.5
2204adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
2205adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static String toString(long[] array) {
2206adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (array == null) {
2207f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes            return "null";
2208adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
2209adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (array.length == 0) {
2210f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes            return "[]";
2211adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
2212fb0ec0e650bf8be35acb0d47da0311a7c446aa33Elliott Hughes        StringBuilder sb = new StringBuilder(array.length * 6);
2213adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        sb.append('[');
2214adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        sb.append(array[0]);
2215adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        for (int i = 1; i < array.length; i++) {
2216f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes            sb.append(", ");
2217adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            sb.append(array[i]);
2218adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
2219adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        sb.append(']');
2220adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return sb.toString();
2221adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
2222adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
2223adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
2224adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Creates a {@code String} representation of the {@code short[]} passed.
22251d58625189328f29c10fa98d52512ee6cf8cc641Ben Dodson     * The result is surrounded by brackets ({@code "[]"}), each
2226adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * element is converted to a {@code String} via the
22271d58625189328f29c10fa98d52512ee6cf8cc641Ben Dodson     * {@link String#valueOf(int)} and separated by {@code ", "}. If
22281d58625189328f29c10fa98d52512ee6cf8cc641Ben Dodson     * the array is {@code null}, then {@code "null"} is returned.
2229f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
2230adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param array
2231adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the {@code short} array to convert.
2232adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the {@code String} representation of {@code array}.
2233f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * @since 1.5
2234adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
2235adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static String toString(short[] array) {
2236adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (array == null) {
2237f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes            return "null";
2238adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
2239adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (array.length == 0) {
2240f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes            return "[]";
2241adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
2242fb0ec0e650bf8be35acb0d47da0311a7c446aa33Elliott Hughes        StringBuilder sb = new StringBuilder(array.length * 6);
2243adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        sb.append('[');
2244adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        sb.append(array[0]);
2245adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        for (int i = 1; i < array.length; i++) {
2246f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes            sb.append(", ");
2247adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            sb.append(array[i]);
2248adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
2249adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        sb.append(']');
2250adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return sb.toString();
2251adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
2252adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
2253adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
2254adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Creates a {@code String} representation of the {@code Object[]} passed.
22551d58625189328f29c10fa98d52512ee6cf8cc641Ben Dodson     * The result is surrounded by brackets ({@code "[]"}), each
2256adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * element is converted to a {@code String} via the
22571d58625189328f29c10fa98d52512ee6cf8cc641Ben Dodson     * {@link String#valueOf(Object)} and separated by {@code ", "}.
22581d58625189328f29c10fa98d52512ee6cf8cc641Ben Dodson     * If the array is {@code null}, then {@code "null"} is returned.
2259f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
2260adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param array
2261adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the {@code Object} array to convert.
2262adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the {@code String} representation of {@code array}.
2263f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * @since 1.5
2264adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
2265adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static String toString(Object[] array) {
2266adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (array == null) {
2267f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes            return "null";
2268adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
2269adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (array.length == 0) {
2270f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes            return "[]";
2271adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
2272fb0ec0e650bf8be35acb0d47da0311a7c446aa33Elliott Hughes        StringBuilder sb = new StringBuilder(array.length * 7);
2273adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        sb.append('[');
2274adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        sb.append(array[0]);
2275adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        for (int i = 1; i < array.length; i++) {
2276f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes            sb.append(", ");
2277adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            sb.append(array[i]);
2278adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
2279adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        sb.append(']');
2280adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return sb.toString();
2281adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
2282adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
2283adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
2284adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Creates a <i>"deep"</i> {@code String} representation of the
2285adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code Object[]} passed, such that if the array contains other arrays,
2286adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * the {@code String} representation of those arrays is generated as well.
2287adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
2288adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * If any of the elements are primitive arrays, the generation is delegated
2289adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * to the other {@code toString} methods in this class. If any element
2290adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * contains a reference to the original array, then it will be represented
2291adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * as {@code "[...]"}. If an element is an {@code Object[]}, then its
2292adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * representation is generated by a recursive call to this method. All other
2293adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * elements are converted via the {@link String#valueOf(Object)} method.
2294f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
2295adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param array
2296adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the {@code Object} array to convert.
2297adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the {@code String} representation of {@code array}.
2298f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * @since 1.5
2299adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
2300adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static String deepToString(Object[] array) {
2301283b3a99b7c7135db1d8a217629a76cf17ff0b7eJoshua Bloch        // Special case null to prevent NPE
2302283b3a99b7c7135db1d8a217629a76cf17ff0b7eJoshua Bloch        if (array == null) {
2303f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes            return "null";
2304283b3a99b7c7135db1d8a217629a76cf17ff0b7eJoshua Bloch        }
2305adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // delegate this to the recursive method
2306fb0ec0e650bf8be35acb0d47da0311a7c446aa33Elliott Hughes        StringBuilder buf = new StringBuilder(array.length * 9);
2307283b3a99b7c7135db1d8a217629a76cf17ff0b7eJoshua Bloch        deepToStringImpl(array, new Object[] { array }, buf);
2308283b3a99b7c7135db1d8a217629a76cf17ff0b7eJoshua Bloch        return buf.toString();
2309adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
2310adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
2311adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
2312adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Implementation method used by {@link #deepToString(Object[])}.
2313f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
2314adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param array
2315adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the {@code Object[]} to dive into.
2316adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param origArrays
2317adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the original {@code Object[]}; used to test for self
2318adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            references.
2319adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param sb
2320adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the {@code StringBuilder} instance to append to or
2321adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            {@code null} one hasn't been created yet.
2322adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the result.
2323adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #deepToString(Object[])
2324adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
2325283b3a99b7c7135db1d8a217629a76cf17ff0b7eJoshua Bloch    private static void deepToStringImpl(Object[] array, Object[] origArrays,
2326adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            StringBuilder sb) {
2327adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (array == null) {
2328f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes            sb.append("null");
2329283b3a99b7c7135db1d8a217629a76cf17ff0b7eJoshua Bloch            return;
2330adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
2331adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
2332adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        sb.append('[');
2333adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
2334adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        for (int i = 0; i < array.length; i++) {
2335adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (i != 0) {
2336f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes                sb.append(", ");
2337adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
2338adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // establish current element
2339adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            Object elem = array[i];
2340adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (elem == null) {
2341adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                // element is null
2342f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes                sb.append("null");
2343adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            } else {
2344adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                // get the Class of the current element
2345adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                Class<?> elemClass = elem.getClass();
2346adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                if (elemClass.isArray()) {
2347adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    // element is an array type
2348adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
2349adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    // get the declared Class of the array (element)
2350adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    Class<?> elemElemClass = elemClass.getComponentType();
2351adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    if (elemElemClass.isPrimitive()) {
2352adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        // element is a primitive array
2353adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        if (boolean.class.equals(elemElemClass)) {
2354adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                            sb.append(toString((boolean[]) elem));
2355adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        } else if (byte.class.equals(elemElemClass)) {
2356adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                            sb.append(toString((byte[]) elem));
2357adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        } else if (char.class.equals(elemElemClass)) {
2358adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                            sb.append(toString((char[]) elem));
2359adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        } else if (double.class.equals(elemElemClass)) {
2360adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                            sb.append(toString((double[]) elem));
2361adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        } else if (float.class.equals(elemElemClass)) {
2362adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                            sb.append(toString((float[]) elem));
2363adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        } else if (int.class.equals(elemElemClass)) {
2364adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                            sb.append(toString((int[]) elem));
2365adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        } else if (long.class.equals(elemElemClass)) {
2366adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                            sb.append(toString((long[]) elem));
2367adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        } else if (short.class.equals(elemElemClass)) {
2368adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                            sb.append(toString((short[]) elem));
2369adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        } else {
2370adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                            // no other possible primitives, so we assert that
2371adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                            throw new AssertionError();
2372adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        }
2373adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    } else {
2374adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        // element is an Object[], so we assert that
237567a368573213811c0037cb1b972a0d5fdb3eaf48Elliott Hughes                        // assert elem instanceof Object[];
2376adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        if (deepToStringImplContains(origArrays, elem)) {
2377f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes                            sb.append("[...]");
2378adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        } else {
2379adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                            Object[] newArray = (Object[]) elem;
2380adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                            Object[] newOrigArrays = new Object[origArrays.length + 1];
2381adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                            System.arraycopy(origArrays, 0, newOrigArrays, 0,
2382adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                                    origArrays.length);
2383adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                            newOrigArrays[origArrays.length] = newArray;
2384adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                            // make the recursive call to this method
2385adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                            deepToStringImpl(newArray, newOrigArrays, sb);
2386adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        }
2387adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    }
2388adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                } else { // element is NOT an array, just an Object
2389adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    sb.append(array[i]);
2390adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                }
2391adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
2392adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
2393adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        sb.append(']');
2394adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
2395adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
2396adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
2397adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Utility method used to assist the implementation of
2398adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@link #deepToString(Object[])}.
2399f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
2400adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param origArrays
2401adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            An array of Object[] references.
2402adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param array
2403adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            An Object[] reference to look for in {@code origArrays}.
2404adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return A value of {@code true} if {@code array} is an
2405adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         element in {@code origArrays}.
2406adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
2407adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private static boolean deepToStringImplContains(Object[] origArrays,
2408adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            Object array) {
2409adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (origArrays == null || origArrays.length == 0) {
2410adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return false;
2411adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
2412adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        for (Object element : origArrays) {
2413adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (element == array) {
2414adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                return true;
2415adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
2416adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
2417adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return false;
2418adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
2419055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes
2420055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes    /**
2421055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * Copies {@code newLength} elements from {@code original} into a new array.
2422055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * If {@code newLength} is greater than {@code original.length}, the result is padded
2423055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * with the value {@code false}.
2424055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     *
2425055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @param original the original array
2426055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @param newLength the length of the new array
2427055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @return the new array
2428055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @throws NegativeArraySizeException if {@code newLength < 0}
2429055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @throws NullPointerException if {@code original == null}
2430055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @since 1.6
2431055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     */
2432055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes    public static boolean[] copyOf(boolean[] original, int newLength) {
2433055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        if (newLength < 0) {
2434834ce234b54466ba230b3c7199d4363a837c5628Elliott Hughes            throw new NegativeArraySizeException(Integer.toString(newLength));
2435055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        }
2436055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        return copyOfRange(original, 0, newLength);
2437055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes    }
2438055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes
2439055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes    /**
2440055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * Copies {@code newLength} elements from {@code original} into a new array.
2441055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * If {@code newLength} is greater than {@code original.length}, the result is padded
2442055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * with the value {@code (byte) 0}.
2443055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     *
2444055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @param original the original array
2445055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @param newLength the length of the new array
2446055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @return the new array
2447055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @throws NegativeArraySizeException if {@code newLength < 0}
2448055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @throws NullPointerException if {@code original == null}
2449055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @since 1.6
2450055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     */
2451055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes    public static byte[] copyOf(byte[] original, int newLength) {
2452055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        if (newLength < 0) {
2453834ce234b54466ba230b3c7199d4363a837c5628Elliott Hughes            throw new NegativeArraySizeException(Integer.toString(newLength));
2454055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        }
2455055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        return copyOfRange(original, 0, newLength);
2456055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes    }
2457055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes
2458055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes    /**
2459055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * Copies {@code newLength} elements from {@code original} into a new array.
2460055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * If {@code newLength} is greater than {@code original.length}, the result is padded
2461055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * with the value {@code '\\u0000'}.
2462055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     *
2463055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @param original the original array
2464055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @param newLength the length of the new array
2465055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @return the new array
2466055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @throws NegativeArraySizeException if {@code newLength < 0}
2467055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @throws NullPointerException if {@code original == null}
2468055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @since 1.6
2469055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     */
2470055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes    public static char[] copyOf(char[] original, int newLength) {
2471055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        if (newLength < 0) {
2472834ce234b54466ba230b3c7199d4363a837c5628Elliott Hughes            throw new NegativeArraySizeException(Integer.toString(newLength));
2473055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        }
2474055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        return copyOfRange(original, 0, newLength);
2475055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes    }
2476055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes
2477055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes    /**
2478055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * Copies {@code newLength} elements from {@code original} into a new array.
2479055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * If {@code newLength} is greater than {@code original.length}, the result is padded
2480055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * with the value {@code 0.0d}.
2481055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     *
2482055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @param original the original array
2483055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @param newLength the length of the new array
2484055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @return the new array
2485055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @throws NegativeArraySizeException if {@code newLength < 0}
2486055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @throws NullPointerException if {@code original == null}
2487055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @since 1.6
2488055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     */
2489055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes    public static double[] copyOf(double[] original, int newLength) {
2490055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        if (newLength < 0) {
2491834ce234b54466ba230b3c7199d4363a837c5628Elliott Hughes            throw new NegativeArraySizeException(Integer.toString(newLength));
2492055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        }
2493055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        return copyOfRange(original, 0, newLength);
2494055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes    }
2495055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes
2496055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes    /**
2497055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * Copies {@code newLength} elements from {@code original} into a new array.
2498055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * If {@code newLength} is greater than {@code original.length}, the result is padded
2499055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * with the value {@code 0.0f}.
2500055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     *
2501055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @param original the original array
2502055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @param newLength the length of the new array
2503055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @return the new array
2504055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @throws NegativeArraySizeException if {@code newLength < 0}
2505055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @throws NullPointerException if {@code original == null}
2506055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @since 1.6
2507055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     */
2508055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes    public static float[] copyOf(float[] original, int newLength) {
2509055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        if (newLength < 0) {
2510834ce234b54466ba230b3c7199d4363a837c5628Elliott Hughes            throw new NegativeArraySizeException(Integer.toString(newLength));
2511055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        }
2512055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        return copyOfRange(original, 0, newLength);
2513055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes    }
2514055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes
2515055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes    /**
2516055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * Copies {@code newLength} elements from {@code original} into a new array.
2517055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * If {@code newLength} is greater than {@code original.length}, the result is padded
2518055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * with the value {@code 0}.
2519055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     *
2520055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @param original the original array
2521055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @param newLength the length of the new array
2522055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @return the new array
2523055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @throws NegativeArraySizeException if {@code newLength < 0}
2524055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @throws NullPointerException if {@code original == null}
2525055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @since 1.6
2526055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     */
2527055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes    public static int[] copyOf(int[] original, int newLength) {
2528055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        if (newLength < 0) {
2529834ce234b54466ba230b3c7199d4363a837c5628Elliott Hughes            throw new NegativeArraySizeException(Integer.toString(newLength));
2530055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        }
2531055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        return copyOfRange(original, 0, newLength);
2532055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes    }
2533055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes
2534055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes    /**
2535055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * Copies {@code newLength} elements from {@code original} into a new array.
2536055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * If {@code newLength} is greater than {@code original.length}, the result is padded
2537055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * with the value {@code 0L}.
2538055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     *
2539055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @param original the original array
2540055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @param newLength the length of the new array
2541055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @return the new array
2542055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @throws NegativeArraySizeException if {@code newLength < 0}
2543055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @throws NullPointerException if {@code original == null}
2544055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @since 1.6
2545055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     */
2546055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes    public static long[] copyOf(long[] original, int newLength) {
2547055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        if (newLength < 0) {
2548834ce234b54466ba230b3c7199d4363a837c5628Elliott Hughes            throw new NegativeArraySizeException(Integer.toString(newLength));
2549055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        }
2550055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        return copyOfRange(original, 0, newLength);
2551055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes    }
2552055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes
2553055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes    /**
2554055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * Copies {@code newLength} elements from {@code original} into a new array.
2555055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * If {@code newLength} is greater than {@code original.length}, the result is padded
2556055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * with the value {@code (short) 0}.
2557055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     *
2558055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @param original the original array
2559055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @param newLength the length of the new array
2560055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @return the new array
2561055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @throws NegativeArraySizeException if {@code newLength < 0}
2562055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @throws NullPointerException if {@code original == null}
2563055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @since 1.6
2564055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     */
2565055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes    public static short[] copyOf(short[] original, int newLength) {
2566055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        if (newLength < 0) {
2567834ce234b54466ba230b3c7199d4363a837c5628Elliott Hughes            throw new NegativeArraySizeException(Integer.toString(newLength));
2568055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        }
2569055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        return copyOfRange(original, 0, newLength);
2570055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes    }
2571055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes
2572055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes    /**
2573055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * Copies {@code newLength} elements from {@code original} into a new array.
2574055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * If {@code newLength} is greater than {@code original.length}, the result is padded
2575055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * with the value {@code null}.
2576055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     *
2577055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @param original the original array
2578055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @param newLength the length of the new array
2579055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @return the new array
2580055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @throws NegativeArraySizeException if {@code newLength < 0}
2581055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @throws NullPointerException if {@code original == null}
2582055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @since 1.6
2583055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     */
2584055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes    public static <T> T[] copyOf(T[] original, int newLength) {
2585055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        if (original == null) {
2586d43b9ef11a1095967a3396b246639b563e1a4128Kenny Root            throw new NullPointerException("original == null");
2587055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        }
2588055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        if (newLength < 0) {
2589834ce234b54466ba230b3c7199d4363a837c5628Elliott Hughes            throw new NegativeArraySizeException(Integer.toString(newLength));
2590055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        }
2591055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        return copyOfRange(original, 0, newLength);
2592055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes    }
2593055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes
2594055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes    /**
2595055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * Copies {@code newLength} elements from {@code original} into a new array.
2596055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * If {@code newLength} is greater than {@code original.length}, the result is padded
2597055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * with the value {@code null}.
2598055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     *
2599055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @param original the original array
2600055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @param newLength the length of the new array
2601055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @param newType the class of the new array
2602055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @return the new array
2603055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @throws NegativeArraySizeException if {@code newLength < 0}
2604055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @throws NullPointerException if {@code original == null}
2605055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @throws ArrayStoreException if a value in {@code original} is incompatible with T
2606055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @since 1.6
2607055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     */
2608055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes    public static <T, U> T[] copyOf(U[] original, int newLength, Class<? extends T[]> newType) {
2609055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        // We use the null pointer check in copyOfRange for exception priority compatibility.
2610055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        if (newLength < 0) {
2611834ce234b54466ba230b3c7199d4363a837c5628Elliott Hughes            throw new NegativeArraySizeException(Integer.toString(newLength));
2612055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        }
2613055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        return copyOfRange(original, 0, newLength, newType);
2614055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes    }
2615055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes
2616055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes    /**
2617055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * Copies elements from {@code original} into a new array, from indexes start (inclusive) to
2618055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * end (exclusive). The original order of elements is preserved.
2619055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * If {@code end} is greater than {@code original.length}, the result is padded
2620055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * with the value {@code false}.
2621055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     *
2622055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @param original the original array
2623055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @param start the start index, inclusive
2624055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @param end the end index, exclusive
2625055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @return the new array
2626055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @throws ArrayIndexOutOfBoundsException if {@code start < 0 || start > original.length}
2627055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @throws IllegalArgumentException if {@code start > end}
2628055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @throws NullPointerException if {@code original == null}
2629055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @since 1.6
2630055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     */
2631055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes    public static boolean[] copyOfRange(boolean[] original, int start, int end) {
2632055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        if (start > end) {
2633055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes            throw new IllegalArgumentException();
2634055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        }
2635055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        int originalLength = original.length;
2636055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        if (start < 0 || start > originalLength) {
2637055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes            throw new ArrayIndexOutOfBoundsException();
2638055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        }
2639055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        int resultLength = end - start;
2640055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        int copyLength = Math.min(resultLength, originalLength - start);
2641055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        boolean[] result = new boolean[resultLength];
2642055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        System.arraycopy(original, start, result, 0, copyLength);
2643055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        return result;
2644055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes    }
2645055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes
2646055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes    /**
2647055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * Copies elements from {@code original} into a new array, from indexes start (inclusive) to
2648055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * end (exclusive). The original order of elements is preserved.
2649055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * If {@code end} is greater than {@code original.length}, the result is padded
2650055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * with the value {@code (byte) 0}.
2651055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     *
2652055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @param original the original array
2653055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @param start the start index, inclusive
2654055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @param end the end index, exclusive
2655055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @return the new array
2656055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @throws ArrayIndexOutOfBoundsException if {@code start < 0 || start > original.length}
2657055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @throws IllegalArgumentException if {@code start > end}
2658055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @throws NullPointerException if {@code original == null}
2659055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @since 1.6
2660055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     */
2661055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes    public static byte[] copyOfRange(byte[] original, int start, int end) {
2662055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        if (start > end) {
2663055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes            throw new IllegalArgumentException();
2664055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        }
2665055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        int originalLength = original.length;
2666055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        if (start < 0 || start > originalLength) {
2667055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes            throw new ArrayIndexOutOfBoundsException();
2668055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        }
2669055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        int resultLength = end - start;
2670055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        int copyLength = Math.min(resultLength, originalLength - start);
2671055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        byte[] result = new byte[resultLength];
2672055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        System.arraycopy(original, start, result, 0, copyLength);
2673055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        return result;
2674055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes    }
2675055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes
2676055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes    /**
2677055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * Copies elements from {@code original} into a new array, from indexes start (inclusive) to
2678055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * end (exclusive). The original order of elements is preserved.
2679055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * If {@code end} is greater than {@code original.length}, the result is padded
2680055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * with the value {@code '\\u0000'}.
2681055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     *
2682055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @param original the original array
2683055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @param start the start index, inclusive
2684055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @param end the end index, exclusive
2685055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @return the new array
2686055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @throws ArrayIndexOutOfBoundsException if {@code start < 0 || start > original.length}
2687055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @throws IllegalArgumentException if {@code start > end}
2688055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @throws NullPointerException if {@code original == null}
2689055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @since 1.6
2690055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     */
2691055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes    public static char[] copyOfRange(char[] original, int start, int end) {
2692055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        if (start > end) {
2693055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes            throw new IllegalArgumentException();
2694055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        }
2695055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        int originalLength = original.length;
2696055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        if (start < 0 || start > originalLength) {
2697055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes            throw new ArrayIndexOutOfBoundsException();
2698055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        }
2699055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        int resultLength = end - start;
2700055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        int copyLength = Math.min(resultLength, originalLength - start);
2701055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        char[] result = new char[resultLength];
2702055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        System.arraycopy(original, start, result, 0, copyLength);
2703055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        return result;
2704055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes    }
2705055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes
2706055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes    /**
2707055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * Copies elements from {@code original} into a new array, from indexes start (inclusive) to
2708055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * end (exclusive). The original order of elements is preserved.
2709055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * If {@code end} is greater than {@code original.length}, the result is padded
2710055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * with the value {@code 0.0d}.
2711055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     *
2712055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @param original the original array
2713055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @param start the start index, inclusive
2714055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @param end the end index, exclusive
2715055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @return the new array
2716055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @throws ArrayIndexOutOfBoundsException if {@code start < 0 || start > original.length}
2717055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @throws IllegalArgumentException if {@code start > end}
2718055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @throws NullPointerException if {@code original == null}
2719055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @since 1.6
2720055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     */
2721055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes    public static double[] copyOfRange(double[] original, int start, int end) {
2722055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        if (start > end) {
2723055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes            throw new IllegalArgumentException();
2724055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        }
2725055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        int originalLength = original.length;
2726055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        if (start < 0 || start > originalLength) {
2727055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes            throw new ArrayIndexOutOfBoundsException();
2728055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        }
2729055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        int resultLength = end - start;
2730055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        int copyLength = Math.min(resultLength, originalLength - start);
2731055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        double[] result = new double[resultLength];
2732055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        System.arraycopy(original, start, result, 0, copyLength);
2733055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        return result;
2734055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes    }
2735055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes
2736055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes    /**
2737055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * Copies elements from {@code original} into a new array, from indexes start (inclusive) to
2738055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * end (exclusive). The original order of elements is preserved.
2739055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * If {@code end} is greater than {@code original.length}, the result is padded
2740055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * with the value {@code 0.0f}.
2741055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     *
2742055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @param original the original array
2743055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @param start the start index, inclusive
2744055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @param end the end index, exclusive
2745055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @return the new array
2746055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @throws ArrayIndexOutOfBoundsException if {@code start < 0 || start > original.length}
2747055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @throws IllegalArgumentException if {@code start > end}
2748055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @throws NullPointerException if {@code original == null}
2749055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @since 1.6
2750055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     */
2751055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes    public static float[] copyOfRange(float[] original, int start, int end) {
2752055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        if (start > end) {
2753055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes            throw new IllegalArgumentException();
2754055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        }
2755055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        int originalLength = original.length;
2756055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        if (start < 0 || start > originalLength) {
2757055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes            throw new ArrayIndexOutOfBoundsException();
2758055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        }
2759055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        int resultLength = end - start;
2760055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        int copyLength = Math.min(resultLength, originalLength - start);
2761055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        float[] result = new float[resultLength];
2762055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        System.arraycopy(original, start, result, 0, copyLength);
2763055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        return result;
2764055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes    }
2765055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes
2766055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes    /**
2767055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * Copies elements from {@code original} into a new array, from indexes start (inclusive) to
2768055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * end (exclusive). The original order of elements is preserved.
2769055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * If {@code end} is greater than {@code original.length}, the result is padded
2770055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * with the value {@code 0}.
2771055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     *
2772055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @param original the original array
2773055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @param start the start index, inclusive
2774055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @param end the end index, exclusive
2775055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @return the new array
2776055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @throws ArrayIndexOutOfBoundsException if {@code start < 0 || start > original.length}
2777055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @throws IllegalArgumentException if {@code start > end}
2778055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @throws NullPointerException if {@code original == null}
2779055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @since 1.6
2780055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     */
2781055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes    public static int[] copyOfRange(int[] original, int start, int end) {
2782055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        if (start > end) {
2783055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes            throw new IllegalArgumentException();
2784055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        }
2785055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        int originalLength = original.length;
2786055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        if (start < 0 || start > originalLength) {
2787055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes            throw new ArrayIndexOutOfBoundsException();
2788055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        }
2789055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        int resultLength = end - start;
2790055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        int copyLength = Math.min(resultLength, originalLength - start);
2791055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        int[] result = new int[resultLength];
2792055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        System.arraycopy(original, start, result, 0, copyLength);
2793055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        return result;
2794055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes    }
2795055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes
2796055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes    /**
2797055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * Copies elements from {@code original} into a new array, from indexes start (inclusive) to
2798055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * end (exclusive). The original order of elements is preserved.
2799055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * If {@code end} is greater than {@code original.length}, the result is padded
2800055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * with the value {@code 0L}.
2801055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     *
2802055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @param original the original array
2803055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @param start the start index, inclusive
2804055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @param end the end index, exclusive
2805055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @return the new array
2806055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @throws ArrayIndexOutOfBoundsException if {@code start < 0 || start > original.length}
2807055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @throws IllegalArgumentException if {@code start > end}
2808055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @throws NullPointerException if {@code original == null}
2809055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @since 1.6
2810055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     */
2811055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes    public static long[] copyOfRange(long[] original, int start, int end) {
2812055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        if (start > end) {
2813055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes            throw new IllegalArgumentException();
2814055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        }
2815055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        int originalLength = original.length;
2816055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        if (start < 0 || start > originalLength) {
2817055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes            throw new ArrayIndexOutOfBoundsException();
2818055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        }
2819055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        int resultLength = end - start;
2820055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        int copyLength = Math.min(resultLength, originalLength - start);
2821055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        long[] result = new long[resultLength];
2822055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        System.arraycopy(original, start, result, 0, copyLength);
2823055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        return result;
2824055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes    }
2825055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes
2826055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes    /**
2827055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * Copies elements from {@code original} into a new array, from indexes start (inclusive) to
2828055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * end (exclusive). The original order of elements is preserved.
2829055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * If {@code end} is greater than {@code original.length}, the result is padded
2830055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * with the value {@code (short) 0}.
2831055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     *
2832055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @param original the original array
2833055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @param start the start index, inclusive
2834055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @param end the end index, exclusive
2835055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @return the new array
2836055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @throws ArrayIndexOutOfBoundsException if {@code start < 0 || start > original.length}
2837055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @throws IllegalArgumentException if {@code start > end}
2838055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @throws NullPointerException if {@code original == null}
2839055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @since 1.6
2840055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     */
2841055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes    public static short[] copyOfRange(short[] original, int start, int end) {
2842055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        if (start > end) {
2843055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes            throw new IllegalArgumentException();
2844055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        }
2845055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        int originalLength = original.length;
2846055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        if (start < 0 || start > originalLength) {
2847055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes            throw new ArrayIndexOutOfBoundsException();
2848055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        }
2849055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        int resultLength = end - start;
2850055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        int copyLength = Math.min(resultLength, originalLength - start);
2851055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        short[] result = new short[resultLength];
2852055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        System.arraycopy(original, start, result, 0, copyLength);
2853055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        return result;
2854055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes    }
2855055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes
2856055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes    /**
2857055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * Copies elements from {@code original} into a new array, from indexes start (inclusive) to
2858055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * end (exclusive). The original order of elements is preserved.
2859055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * If {@code end} is greater than {@code original.length}, the result is padded
2860055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * with the value {@code null}.
2861055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     *
2862055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @param original the original array
2863055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @param start the start index, inclusive
2864055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @param end the end index, exclusive
2865055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @return the new array
2866055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @throws ArrayIndexOutOfBoundsException if {@code start < 0 || start > original.length}
2867055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @throws IllegalArgumentException if {@code start > end}
2868055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @throws NullPointerException if {@code original == null}
2869055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @since 1.6
2870055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     */
2871055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes    @SuppressWarnings("unchecked")
2872055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes    public static <T> T[] copyOfRange(T[] original, int start, int end) {
2873055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        int originalLength = original.length; // For exception priority compatibility.
2874055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        if (start > end) {
2875055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes            throw new IllegalArgumentException();
2876055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        }
2877055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        if (start < 0 || start > originalLength) {
2878055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes            throw new ArrayIndexOutOfBoundsException();
2879055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        }
2880055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        int resultLength = end - start;
2881055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        int copyLength = Math.min(resultLength, originalLength - start);
2882055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        T[] result = (T[]) Array.newInstance(original.getClass().getComponentType(), resultLength);
2883055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        System.arraycopy(original, start, result, 0, copyLength);
2884055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        return result;
2885055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes    }
2886055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes
2887055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes    /**
2888055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * Copies elements from {@code original} into a new array, from indexes start (inclusive) to
2889055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * end (exclusive). The original order of elements is preserved.
2890055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * If {@code end} is greater than {@code original.length}, the result is padded
2891055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * with the value {@code null}.
2892055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     *
2893055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @param original the original array
2894055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @param start the start index, inclusive
2895055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @param end the end index, exclusive
2896055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @return the new array
2897055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @throws ArrayIndexOutOfBoundsException if {@code start < 0 || start > original.length}
2898055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @throws IllegalArgumentException if {@code start > end}
2899055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @throws NullPointerException if {@code original == null}
2900055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @throws ArrayStoreException if a value in {@code original} is incompatible with T
2901055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     * @since 1.6
2902055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes     */
2903055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes    @SuppressWarnings("unchecked")
2904055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes    public static <T, U> T[] copyOfRange(U[] original, int start, int end, Class<? extends T[]> newType) {
2905055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        if (start > end) {
2906055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes            throw new IllegalArgumentException();
2907055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        }
2908055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        int originalLength = original.length;
2909055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        if (start < 0 || start > originalLength) {
2910055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes            throw new ArrayIndexOutOfBoundsException();
2911055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        }
2912055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        int resultLength = end - start;
2913055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        int copyLength = Math.min(resultLength, originalLength - start);
2914055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        T[] result = (T[]) Array.newInstance(newType.getComponentType(), resultLength);
2915055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        System.arraycopy(original, start, result, 0, copyLength);
2916055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes        return result;
2917055c2521fc7776a0651de9be5be0fbbd2b312e7bElliott Hughes    }
2918adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project}
2919