Arrays.java revision 1eae5d5c81785d589e337d408f2f3b87fdbb4c8e
1/*
2 * Copyright (C) 2014 The Android Open Source Project
3 * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
4 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5 *
6 * This code is free software; you can redistribute it and/or modify it
7 * under the terms of the GNU General Public License version 2 only, as
8 * published by the Free Software Foundation.  Oracle designates this
9 * particular file as subject to the "Classpath" exception as provided
10 * by Oracle in the LICENSE file that accompanied this code.
11 *
12 * This code is distributed in the hope that it will be useful, but WITHOUT
13 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
15 * version 2 for more details (a copy is included in the LICENSE file that
16 * accompanied this code).
17 *
18 * You should have received a copy of the GNU General Public License version
19 * 2 along with this work; if not, write to the Free Software Foundation,
20 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
21 *
22 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
23 * or visit www.oracle.com if you need additional information or have any
24 * questions.
25 */
26
27package java.util;
28
29import java.lang.reflect.*;
30import java.util.concurrent.ForkJoinPool;
31import java.util.function.BinaryOperator;
32import java.util.function.Consumer;
33import java.util.function.DoubleBinaryOperator;
34import java.util.function.IntBinaryOperator;
35import java.util.function.IntFunction;
36import java.util.function.IntToDoubleFunction;
37import java.util.function.IntToLongFunction;
38import java.util.function.IntUnaryOperator;
39import java.util.function.LongBinaryOperator;
40import java.util.function.UnaryOperator;
41import java.util.stream.DoubleStream;
42import java.util.stream.IntStream;
43import java.util.stream.LongStream;
44import java.util.stream.Stream;
45import java.util.stream.StreamSupport;
46
47/**
48 * This class contains various methods for manipulating arrays (such as
49 * sorting and searching). This class also contains a static factory
50 * that allows arrays to be viewed as lists.
51 *
52 * <p>The methods in this class all throw a {@code NullPointerException},
53 * if the specified array reference is null, except where noted.
54 *
55 * <p>The documentation for the methods contained in this class includes
56 * briefs description of the <i>implementations</i>. Such descriptions should
57 * be regarded as <i>implementation notes</i>, rather than parts of the
58 * <i>specification</i>. Implementors should feel free to substitute other
59 * algorithms, so long as the specification itself is adhered to. (For
60 * example, the algorithm used by {@code sort(Object[])} does not have to be
61 * a MergeSort, but it does have to be <i>stable</i>.)
62 *
63 * <p>This class is a member of the
64 * <a href="{@docRoot}/../technotes/guides/collections/index.html">
65 * Java Collections Framework</a>.
66 *
67 * @author Josh Bloch
68 * @author Neal Gafter
69 * @author John Rose
70 * @since  1.2
71 */
72public class Arrays {
73
74    /**
75     * The minimum array length below which a parallel sorting
76     * algorithm will not further partition the sorting task. Using
77     * smaller sizes typically results in memory contention across
78     * tasks that makes parallel speedups unlikely.
79     * @hide
80     */
81    public static final int MIN_ARRAY_SORT_GRAN = 1 << 13;
82
83
84    /**
85     * A comparator that implements the natural ordering of a group of
86     * mutually comparable elements. May be used when a supplied
87     * comparator is null. To simplify code-sharing within underlying
88     * implementations, the compare method only declares type Object
89     * for its second argument.
90     *
91     * Arrays class implementor's note: It is an empirical matter
92     * whether ComparableTimSort offers any performance benefit over
93     * TimSort used with this comparator.  If not, you are better off
94     * deleting or bypassing ComparableTimSort.  There is currently no
95     * empirical case for separating them for parallel sorting, so all
96     * public Object parallelSort methods use the same comparator
97     * based implementation.
98     */
99    static final class NaturalOrder implements Comparator<Object> {
100        @SuppressWarnings("unchecked")
101        public int compare(Object first, Object second) {
102            return ((Comparable<Object>)first).compareTo(second);
103        }
104        static final NaturalOrder INSTANCE = new NaturalOrder();
105    }
106
107    // Suppresses default constructor, ensuring non-instantiability.
108    private Arrays() {}
109
110    /*
111     * Sorting of primitive type arrays.
112     */
113
114    /**
115     * Sorts the specified array into ascending numerical order.
116     *
117     * <p>Implementation note: The sorting algorithm is a Dual-Pivot Quicksort
118     * by Vladimir Yaroslavskiy, Jon Bentley, and Joshua Bloch. This algorithm
119     * offers O(n log(n)) performance on many data sets that cause other
120     * quicksorts to degrade to quadratic performance, and is typically
121     * faster than traditional (one-pivot) Quicksort implementations.
122     *
123     * @param a the array to be sorted
124     */
125    public static void sort(int[] a) {
126        DualPivotQuicksort.sort(a, 0, a.length - 1, null, 0, 0);
127    }
128
129    /**
130     * Sorts the specified range of the array into ascending order. The range
131     * to be sorted extends from the index {@code fromIndex}, inclusive, to
132     * the index {@code toIndex}, exclusive. If {@code fromIndex == toIndex},
133     * the range to be sorted is empty.
134     *
135     * <p>Implementation note: The sorting algorithm is a Dual-Pivot Quicksort
136     * by Vladimir Yaroslavskiy, Jon Bentley, and Joshua Bloch. This algorithm
137     * offers O(n log(n)) performance on many data sets that cause other
138     * quicksorts to degrade to quadratic performance, and is typically
139     * faster than traditional (one-pivot) Quicksort implementations.
140     *
141     * @param a the array to be sorted
142     * @param fromIndex the index of the first element, inclusive, to be sorted
143     * @param toIndex the index of the last element, exclusive, to be sorted
144     *
145     * @throws IllegalArgumentException if {@code fromIndex > toIndex}
146     * @throws ArrayIndexOutOfBoundsException
147     *     if {@code fromIndex < 0} or {@code toIndex > a.length}
148     */
149    public static void sort(int[] a, int fromIndex, int toIndex) {
150        rangeCheck(a.length, fromIndex, toIndex);
151        DualPivotQuicksort.sort(a, fromIndex, toIndex - 1, null, 0, 0);
152    }
153
154    /**
155     * Sorts the specified array into ascending numerical order.
156     *
157     * <p>Implementation note: The sorting algorithm is a Dual-Pivot Quicksort
158     * by Vladimir Yaroslavskiy, Jon Bentley, and Joshua Bloch. This algorithm
159     * offers O(n log(n)) performance on many data sets that cause other
160     * quicksorts to degrade to quadratic performance, and is typically
161     * faster than traditional (one-pivot) Quicksort implementations.
162     *
163     * @param a the array to be sorted
164     */
165    public static void sort(long[] a) {
166        DualPivotQuicksort.sort(a, 0, a.length - 1, null, 0, 0);
167    }
168
169    /**
170     * Sorts the specified range of the array into ascending order. The range
171     * to be sorted extends from the index {@code fromIndex}, inclusive, to
172     * the index {@code toIndex}, exclusive. If {@code fromIndex == toIndex},
173     * the range to be sorted is empty.
174     *
175     * <p>Implementation note: The sorting algorithm is a Dual-Pivot Quicksort
176     * by Vladimir Yaroslavskiy, Jon Bentley, and Joshua Bloch. This algorithm
177     * offers O(n log(n)) performance on many data sets that cause other
178     * quicksorts to degrade to quadratic performance, and is typically
179     * faster than traditional (one-pivot) Quicksort implementations.
180     *
181     * @param a the array to be sorted
182     * @param fromIndex the index of the first element, inclusive, to be sorted
183     * @param toIndex the index of the last element, exclusive, to be sorted
184     *
185     * @throws IllegalArgumentException if {@code fromIndex > toIndex}
186     * @throws ArrayIndexOutOfBoundsException
187     *     if {@code fromIndex < 0} or {@code toIndex > a.length}
188     */
189    public static void sort(long[] a, int fromIndex, int toIndex) {
190        rangeCheck(a.length, fromIndex, toIndex);
191        DualPivotQuicksort.sort(a, fromIndex, toIndex - 1, null, 0, 0);
192    }
193
194    /**
195     * Sorts the specified array into ascending numerical order.
196     *
197     * <p>Implementation note: The sorting algorithm is a Dual-Pivot Quicksort
198     * by Vladimir Yaroslavskiy, Jon Bentley, and Joshua Bloch. This algorithm
199     * offers O(n log(n)) performance on many data sets that cause other
200     * quicksorts to degrade to quadratic performance, and is typically
201     * faster than traditional (one-pivot) Quicksort implementations.
202     *
203     * @param a the array to be sorted
204     */
205    public static void sort(short[] a) {
206        DualPivotQuicksort.sort(a, 0, a.length - 1, null, 0, 0);
207    }
208
209    /**
210     * Sorts the specified range of the array into ascending order. The range
211     * to be sorted extends from the index {@code fromIndex}, inclusive, to
212     * the index {@code toIndex}, exclusive. If {@code fromIndex == toIndex},
213     * the range to be sorted is empty.
214     *
215     * <p>Implementation note: The sorting algorithm is a Dual-Pivot Quicksort
216     * by Vladimir Yaroslavskiy, Jon Bentley, and Joshua Bloch. This algorithm
217     * offers O(n log(n)) performance on many data sets that cause other
218     * quicksorts to degrade to quadratic performance, and is typically
219     * faster than traditional (one-pivot) Quicksort implementations.
220     *
221     * @param a the array to be sorted
222     * @param fromIndex the index of the first element, inclusive, to be sorted
223     * @param toIndex the index of the last element, exclusive, to be sorted
224     *
225     * @throws IllegalArgumentException if {@code fromIndex > toIndex}
226     * @throws ArrayIndexOutOfBoundsException
227     *     if {@code fromIndex < 0} or {@code toIndex > a.length}
228     */
229    public static void sort(short[] a, int fromIndex, int toIndex) {
230        rangeCheck(a.length, fromIndex, toIndex);
231        DualPivotQuicksort.sort(a, fromIndex, toIndex - 1, null, 0, 0);
232    }
233
234    /**
235     * Sorts the specified array into ascending numerical order.
236     *
237     * <p>Implementation note: The sorting algorithm is a Dual-Pivot Quicksort
238     * by Vladimir Yaroslavskiy, Jon Bentley, and Joshua Bloch. This algorithm
239     * offers O(n log(n)) performance on many data sets that cause other
240     * quicksorts to degrade to quadratic performance, and is typically
241     * faster than traditional (one-pivot) Quicksort implementations.
242     *
243     * @param a the array to be sorted
244     */
245    public static void sort(char[] a) {
246        DualPivotQuicksort.sort(a, 0, a.length - 1, null, 0, 0);
247    }
248
249    /**
250     * Sorts the specified range of the array into ascending order. The range
251     * to be sorted extends from the index {@code fromIndex}, inclusive, to
252     * the index {@code toIndex}, exclusive. If {@code fromIndex == toIndex},
253     * the range to be sorted is empty.
254     *
255     * <p>Implementation note: The sorting algorithm is a Dual-Pivot Quicksort
256     * by Vladimir Yaroslavskiy, Jon Bentley, and Joshua Bloch. This algorithm
257     * offers O(n log(n)) performance on many data sets that cause other
258     * quicksorts to degrade to quadratic performance, and is typically
259     * faster than traditional (one-pivot) Quicksort implementations.
260     *
261     * @param a the array to be sorted
262     * @param fromIndex the index of the first element, inclusive, to be sorted
263     * @param toIndex the index of the last element, exclusive, to be sorted
264     *
265     * @throws IllegalArgumentException if {@code fromIndex > toIndex}
266     * @throws ArrayIndexOutOfBoundsException
267     *     if {@code fromIndex < 0} or {@code toIndex > a.length}
268     */
269    public static void sort(char[] a, int fromIndex, int toIndex) {
270        rangeCheck(a.length, fromIndex, toIndex);
271        DualPivotQuicksort.sort(a, fromIndex, toIndex - 1, null, 0, 0);
272    }
273
274    /**
275     * Sorts the specified array into ascending numerical order.
276     *
277     * <p>Implementation note: The sorting algorithm is a Dual-Pivot Quicksort
278     * by Vladimir Yaroslavskiy, Jon Bentley, and Joshua Bloch. This algorithm
279     * offers O(n log(n)) performance on many data sets that cause other
280     * quicksorts to degrade to quadratic performance, and is typically
281     * faster than traditional (one-pivot) Quicksort implementations.
282     *
283     * @param a the array to be sorted
284     */
285    public static void sort(byte[] a) {
286        DualPivotQuicksort.sort(a, 0, a.length - 1);
287    }
288
289    /**
290     * Sorts the specified range of the array into ascending order. The range
291     * to be sorted extends from the index {@code fromIndex}, inclusive, to
292     * the index {@code toIndex}, exclusive. If {@code fromIndex == toIndex},
293     * the range to be sorted is empty.
294     *
295     * <p>Implementation note: The sorting algorithm is a Dual-Pivot Quicksort
296     * by Vladimir Yaroslavskiy, Jon Bentley, and Joshua Bloch. This algorithm
297     * offers O(n log(n)) performance on many data sets that cause other
298     * quicksorts to degrade to quadratic performance, and is typically
299     * faster than traditional (one-pivot) Quicksort implementations.
300     *
301     * @param a the array to be sorted
302     * @param fromIndex the index of the first element, inclusive, to be sorted
303     * @param toIndex the index of the last element, exclusive, to be sorted
304     *
305     * @throws IllegalArgumentException if {@code fromIndex > toIndex}
306     * @throws ArrayIndexOutOfBoundsException
307     *     if {@code fromIndex < 0} or {@code toIndex > a.length}
308     */
309    public static void sort(byte[] a, int fromIndex, int toIndex) {
310        rangeCheck(a.length, fromIndex, toIndex);
311        DualPivotQuicksort.sort(a, fromIndex, toIndex - 1);
312    }
313
314    /**
315     * Sorts the specified array into ascending numerical order.
316     *
317     * <p>The {@code <} relation does not provide a total order on all float
318     * values: {@code -0.0f == 0.0f} is {@code true} and a {@code Float.NaN}
319     * value compares neither less than, greater than, nor equal to any value,
320     * even itself. This method uses the total order imposed by the method
321     * {@link Float#compareTo}: {@code -0.0f} is treated as less than value
322     * {@code 0.0f} and {@code Float.NaN} is considered greater than any
323     * other value and all {@code Float.NaN} values are considered equal.
324     *
325     * <p>Implementation note: The sorting algorithm is a Dual-Pivot Quicksort
326     * by Vladimir Yaroslavskiy, Jon Bentley, and Joshua Bloch. This algorithm
327     * offers O(n log(n)) performance on many data sets that cause other
328     * quicksorts to degrade to quadratic performance, and is typically
329     * faster than traditional (one-pivot) Quicksort implementations.
330     *
331     * @param a the array to be sorted
332     */
333    public static void sort(float[] a) {
334        DualPivotQuicksort.sort(a, 0, a.length - 1, null, 0, 0);
335    }
336
337    /**
338     * Sorts the specified range of the array into ascending order. The range
339     * to be sorted extends from the index {@code fromIndex}, inclusive, to
340     * the index {@code toIndex}, exclusive. If {@code fromIndex == toIndex},
341     * the range to be sorted is empty.
342     *
343     * <p>The {@code <} relation does not provide a total order on all float
344     * values: {@code -0.0f == 0.0f} is {@code true} and a {@code Float.NaN}
345     * value compares neither less than, greater than, nor equal to any value,
346     * even itself. This method uses the total order imposed by the method
347     * {@link Float#compareTo}: {@code -0.0f} is treated as less than value
348     * {@code 0.0f} and {@code Float.NaN} is considered greater than any
349     * other value and all {@code Float.NaN} values are considered equal.
350     *
351     * <p>Implementation note: The sorting algorithm is a Dual-Pivot Quicksort
352     * by Vladimir Yaroslavskiy, Jon Bentley, and Joshua Bloch. This algorithm
353     * offers O(n log(n)) performance on many data sets that cause other
354     * quicksorts to degrade to quadratic performance, and is typically
355     * faster than traditional (one-pivot) Quicksort implementations.
356     *
357     * @param a the array to be sorted
358     * @param fromIndex the index of the first element, inclusive, to be sorted
359     * @param toIndex the index of the last element, exclusive, to be sorted
360     *
361     * @throws IllegalArgumentException if {@code fromIndex > toIndex}
362     * @throws ArrayIndexOutOfBoundsException
363     *     if {@code fromIndex < 0} or {@code toIndex > a.length}
364     */
365    public static void sort(float[] a, int fromIndex, int toIndex) {
366        rangeCheck(a.length, fromIndex, toIndex);
367        DualPivotQuicksort.sort(a, fromIndex, toIndex - 1, null, 0, 0);
368    }
369
370    /**
371     * Sorts the specified array into ascending numerical order.
372     *
373     * <p>The {@code <} relation does not provide a total order on all double
374     * values: {@code -0.0d == 0.0d} is {@code true} and a {@code Double.NaN}
375     * value compares neither less than, greater than, nor equal to any value,
376     * even itself. This method uses the total order imposed by the method
377     * {@link Double#compareTo}: {@code -0.0d} is treated as less than value
378     * {@code 0.0d} and {@code Double.NaN} is considered greater than any
379     * other value and all {@code Double.NaN} values are considered equal.
380     *
381     * <p>Implementation note: The sorting algorithm is a Dual-Pivot Quicksort
382     * by Vladimir Yaroslavskiy, Jon Bentley, and Joshua Bloch. This algorithm
383     * offers O(n log(n)) performance on many data sets that cause other
384     * quicksorts to degrade to quadratic performance, and is typically
385     * faster than traditional (one-pivot) Quicksort implementations.
386     *
387     * @param a the array to be sorted
388     */
389    public static void sort(double[] a) {
390        DualPivotQuicksort.sort(a, 0, a.length - 1, null, 0, 0);
391    }
392
393    /**
394     * Sorts the specified range of the array into ascending order. The range
395     * to be sorted extends from the index {@code fromIndex}, inclusive, to
396     * the index {@code toIndex}, exclusive. If {@code fromIndex == toIndex},
397     * the range to be sorted is empty.
398     *
399     * <p>The {@code <} relation does not provide a total order on all double
400     * values: {@code -0.0d == 0.0d} is {@code true} and a {@code Double.NaN}
401     * value compares neither less than, greater than, nor equal to any value,
402     * even itself. This method uses the total order imposed by the method
403     * {@link Double#compareTo}: {@code -0.0d} is treated as less than value
404     * {@code 0.0d} and {@code Double.NaN} is considered greater than any
405     * other value and all {@code Double.NaN} values are considered equal.
406     *
407     * <p>Implementation note: The sorting algorithm is a Dual-Pivot Quicksort
408     * by Vladimir Yaroslavskiy, Jon Bentley, and Joshua Bloch. This algorithm
409     * offers O(n log(n)) performance on many data sets that cause other
410     * quicksorts to degrade to quadratic performance, and is typically
411     * faster than traditional (one-pivot) Quicksort implementations.
412     *
413     * @param a the array to be sorted
414     * @param fromIndex the index of the first element, inclusive, to be sorted
415     * @param toIndex the index of the last element, exclusive, to be sorted
416     *
417     * @throws IllegalArgumentException if {@code fromIndex > toIndex}
418     * @throws ArrayIndexOutOfBoundsException
419     *     if {@code fromIndex < 0} or {@code toIndex > a.length}
420     */
421    public static void sort(double[] a, int fromIndex, int toIndex) {
422        rangeCheck(a.length, fromIndex, toIndex);
423        DualPivotQuicksort.sort(a, fromIndex, toIndex - 1, null, 0, 0);
424    }
425
426    /**
427     * Sorts the specified array into ascending numerical order.
428     *
429     * @implNote The sorting algorithm is a parallel sort-merge that breaks the
430     * array into sub-arrays that are themselves sorted and then merged. When
431     * the sub-array length reaches a minimum granularity, the sub-array is
432     * sorted using the appropriate {@link Arrays#sort(byte[]) Arrays.sort}
433     * method. If the length of the specified array is less than the minimum
434     * granularity, then it is sorted using the appropriate {@link
435     * Arrays#sort(byte[]) Arrays.sort} method. The algorithm requires a
436     * working space no greater than the size of the original array. The
437     * {@link ForkJoinPool#commonPool() ForkJoin common pool} is used to
438     * execute any parallel tasks.
439     *
440     * @param a the array to be sorted
441     *
442     * @since 1.8
443     */
444    public static void parallelSort(byte[] a) {
445        int n = a.length, p, g;
446        if (n <= MIN_ARRAY_SORT_GRAN ||
447            (p = ForkJoinPool.getCommonPoolParallelism()) == 1)
448            DualPivotQuicksort.sort(a, 0, n - 1);
449        else
450            new ArraysParallelSortHelpers.FJByte.Sorter
451                (null, a, new byte[n], 0, n, 0,
452                 ((g = n / (p << 2)) <= MIN_ARRAY_SORT_GRAN) ?
453                 MIN_ARRAY_SORT_GRAN : g).invoke();
454    }
455
456    /**
457     * Sorts the specified range of the array into ascending numerical order.
458     * The range to be sorted extends from the index {@code fromIndex},
459     * inclusive, to the index {@code toIndex}, exclusive. If
460     * {@code fromIndex == toIndex}, the range to be sorted is empty.
461     *
462     * @implNote The sorting algorithm is a parallel sort-merge that breaks the
463     * array into sub-arrays that are themselves sorted and then merged. When
464     * the sub-array length reaches a minimum granularity, the sub-array is
465     * sorted using the appropriate {@link Arrays#sort(byte[]) Arrays.sort}
466     * method. If the length of the specified array is less than the minimum
467     * granularity, then it is sorted using the appropriate {@link
468     * Arrays#sort(byte[]) Arrays.sort} method. The algorithm requires a working
469     * space no greater than the size of the specified range of the original
470     * array. The {@link ForkJoinPool#commonPool() ForkJoin common pool} is
471     * used to execute any parallel tasks.
472     *
473     * @param a the array to be sorted
474     * @param fromIndex the index of the first element, inclusive, to be sorted
475     * @param toIndex the index of the last element, exclusive, to be sorted
476     *
477     * @throws IllegalArgumentException if {@code fromIndex > toIndex}
478     * @throws ArrayIndexOutOfBoundsException
479     *     if {@code fromIndex < 0} or {@code toIndex > a.length}
480     *
481     * @since 1.8
482     */
483    public static void parallelSort(byte[] a, int fromIndex, int toIndex) {
484        rangeCheck(a.length, fromIndex, toIndex);
485        int n = toIndex - fromIndex, p, g;
486        if (n <= MIN_ARRAY_SORT_GRAN ||
487            (p = ForkJoinPool.getCommonPoolParallelism()) == 1)
488            DualPivotQuicksort.sort(a, fromIndex, toIndex - 1);
489        else
490            new ArraysParallelSortHelpers.FJByte.Sorter
491                (null, a, new byte[n], fromIndex, n, 0,
492                 ((g = n / (p << 2)) <= MIN_ARRAY_SORT_GRAN) ?
493                 MIN_ARRAY_SORT_GRAN : g).invoke();
494    }
495
496    /**
497     * Sorts the specified array into ascending numerical order.
498     *
499     * @implNote The sorting algorithm is a parallel sort-merge that breaks the
500     * array into sub-arrays that are themselves sorted and then merged. When
501     * the sub-array length reaches a minimum granularity, the sub-array is
502     * sorted using the appropriate {@link Arrays#sort(char[]) Arrays.sort}
503     * method. If the length of the specified array is less than the minimum
504     * granularity, then it is sorted using the appropriate {@link
505     * Arrays#sort(char[]) Arrays.sort} method. The algorithm requires a
506     * working space no greater than the size of the original array. The
507     * {@link ForkJoinPool#commonPool() ForkJoin common pool} is used to
508     * execute any parallel tasks.
509     *
510     * @param a the array to be sorted
511     *
512     * @since 1.8
513     */
514    public static void parallelSort(char[] a) {
515        int n = a.length, p, g;
516        if (n <= MIN_ARRAY_SORT_GRAN ||
517            (p = ForkJoinPool.getCommonPoolParallelism()) == 1)
518            DualPivotQuicksort.sort(a, 0, n - 1, null, 0, 0);
519        else
520            new ArraysParallelSortHelpers.FJChar.Sorter
521                (null, a, new char[n], 0, n, 0,
522                 ((g = n / (p << 2)) <= MIN_ARRAY_SORT_GRAN) ?
523                 MIN_ARRAY_SORT_GRAN : g).invoke();
524    }
525
526    /**
527     * Sorts the specified range of the array into ascending numerical order.
528     * The range to be sorted extends from the index {@code fromIndex},
529     * inclusive, to the index {@code toIndex}, exclusive. If
530     * {@code fromIndex == toIndex}, the range to be sorted is empty.
531     *
532      @implNote The sorting algorithm is a parallel sort-merge that breaks the
533     * array into sub-arrays that are themselves sorted and then merged. When
534     * the sub-array length reaches a minimum granularity, the sub-array is
535     * sorted using the appropriate {@link Arrays#sort(char[]) Arrays.sort}
536     * method. If the length of the specified array is less than the minimum
537     * granularity, then it is sorted using the appropriate {@link
538     * Arrays#sort(char[]) Arrays.sort} method. The algorithm requires a working
539     * space no greater than the size of the specified range of the original
540     * array. The {@link ForkJoinPool#commonPool() ForkJoin common pool} is
541     * used to execute any parallel tasks.
542     *
543     * @param a the array to be sorted
544     * @param fromIndex the index of the first element, inclusive, to be sorted
545     * @param toIndex the index of the last element, exclusive, to be sorted
546     *
547     * @throws IllegalArgumentException if {@code fromIndex > toIndex}
548     * @throws ArrayIndexOutOfBoundsException
549     *     if {@code fromIndex < 0} or {@code toIndex > a.length}
550     *
551     * @since 1.8
552     */
553    public static void parallelSort(char[] a, int fromIndex, int toIndex) {
554        rangeCheck(a.length, fromIndex, toIndex);
555        int n = toIndex - fromIndex, p, g;
556        if (n <= MIN_ARRAY_SORT_GRAN ||
557            (p = ForkJoinPool.getCommonPoolParallelism()) == 1)
558            DualPivotQuicksort.sort(a, fromIndex, toIndex - 1, null, 0, 0);
559        else
560            new ArraysParallelSortHelpers.FJChar.Sorter
561                (null, a, new char[n], fromIndex, n, 0,
562                 ((g = n / (p << 2)) <= MIN_ARRAY_SORT_GRAN) ?
563                 MIN_ARRAY_SORT_GRAN : g).invoke();
564    }
565
566    /**
567     * Sorts the specified array into ascending numerical order.
568     *
569     * @implNote The sorting algorithm is a parallel sort-merge that breaks the
570     * array into sub-arrays that are themselves sorted and then merged. When
571     * the sub-array length reaches a minimum granularity, the sub-array is
572     * sorted using the appropriate {@link Arrays#sort(short[]) Arrays.sort}
573     * method. If the length of the specified array is less than the minimum
574     * granularity, then it is sorted using the appropriate {@link
575     * Arrays#sort(short[]) Arrays.sort} method. The algorithm requires a
576     * working space no greater than the size of the original array. The
577     * {@link ForkJoinPool#commonPool() ForkJoin common pool} is used to
578     * execute any parallel tasks.
579     *
580     * @param a the array to be sorted
581     *
582     * @since 1.8
583     */
584    public static void parallelSort(short[] a) {
585        int n = a.length, p, g;
586        if (n <= MIN_ARRAY_SORT_GRAN ||
587            (p = ForkJoinPool.getCommonPoolParallelism()) == 1)
588            DualPivotQuicksort.sort(a, 0, n - 1, null, 0, 0);
589        else
590            new ArraysParallelSortHelpers.FJShort.Sorter
591                (null, a, new short[n], 0, n, 0,
592                 ((g = n / (p << 2)) <= MIN_ARRAY_SORT_GRAN) ?
593                 MIN_ARRAY_SORT_GRAN : g).invoke();
594    }
595
596    /**
597     * Sorts the specified range of the array into ascending numerical order.
598     * The range to be sorted extends from the index {@code fromIndex},
599     * inclusive, to the index {@code toIndex}, exclusive. If
600     * {@code fromIndex == toIndex}, the range to be sorted is empty.
601     *
602     * @implNote The sorting algorithm is a parallel sort-merge that breaks the
603     * array into sub-arrays that are themselves sorted and then merged. When
604     * the sub-array length reaches a minimum granularity, the sub-array is
605     * sorted using the appropriate {@link Arrays#sort(short[]) Arrays.sort}
606     * method. If the length of the specified array is less than the minimum
607     * granularity, then it is sorted using the appropriate {@link
608     * Arrays#sort(short[]) Arrays.sort} method. The algorithm requires a working
609     * space no greater than the size of the specified range of the original
610     * array. The {@link ForkJoinPool#commonPool() ForkJoin common pool} is
611     * used to execute any parallel tasks.
612     *
613     * @param a the array to be sorted
614     * @param fromIndex the index of the first element, inclusive, to be sorted
615     * @param toIndex the index of the last element, exclusive, to be sorted
616     *
617     * @throws IllegalArgumentException if {@code fromIndex > toIndex}
618     * @throws ArrayIndexOutOfBoundsException
619     *     if {@code fromIndex < 0} or {@code toIndex > a.length}
620     *
621     * @since 1.8
622     */
623    public static void parallelSort(short[] a, int fromIndex, int toIndex) {
624        rangeCheck(a.length, fromIndex, toIndex);
625        int n = toIndex - fromIndex, p, g;
626        if (n <= MIN_ARRAY_SORT_GRAN ||
627            (p = ForkJoinPool.getCommonPoolParallelism()) == 1)
628            DualPivotQuicksort.sort(a, fromIndex, toIndex - 1, null, 0, 0);
629        else
630            new ArraysParallelSortHelpers.FJShort.Sorter
631                (null, a, new short[n], fromIndex, n, 0,
632                 ((g = n / (p << 2)) <= MIN_ARRAY_SORT_GRAN) ?
633                 MIN_ARRAY_SORT_GRAN : g).invoke();
634    }
635
636    /**
637     * Sorts the specified array into ascending numerical order.
638     *
639     * @implNote The sorting algorithm is a parallel sort-merge that breaks the
640     * array into sub-arrays that are themselves sorted and then merged. When
641     * the sub-array length reaches a minimum granularity, the sub-array is
642     * sorted using the appropriate {@link Arrays#sort(int[]) Arrays.sort}
643     * method. If the length of the specified array is less than the minimum
644     * granularity, then it is sorted using the appropriate {@link
645     * Arrays#sort(int[]) Arrays.sort} method. The algorithm requires a
646     * working space no greater than the size of the original array. The
647     * {@link ForkJoinPool#commonPool() ForkJoin common pool} is used to
648     * execute any parallel tasks.
649     *
650     * @param a the array to be sorted
651     *
652     * @since 1.8
653     */
654    public static void parallelSort(int[] a) {
655        int n = a.length, p, g;
656        if (n <= MIN_ARRAY_SORT_GRAN ||
657            (p = ForkJoinPool.getCommonPoolParallelism()) == 1)
658            DualPivotQuicksort.sort(a, 0, n - 1, null, 0, 0);
659        else
660            new ArraysParallelSortHelpers.FJInt.Sorter
661                (null, a, new int[n], 0, n, 0,
662                 ((g = n / (p << 2)) <= MIN_ARRAY_SORT_GRAN) ?
663                 MIN_ARRAY_SORT_GRAN : g).invoke();
664    }
665
666    /**
667     * Sorts the specified range of the array into ascending numerical order.
668     * The range to be sorted extends from the index {@code fromIndex},
669     * inclusive, to the index {@code toIndex}, exclusive. If
670     * {@code fromIndex == toIndex}, the range to be sorted is empty.
671     *
672     * @implNote The sorting algorithm is a parallel sort-merge that breaks the
673     * array into sub-arrays that are themselves sorted and then merged. When
674     * the sub-array length reaches a minimum granularity, the sub-array is
675     * sorted using the appropriate {@link Arrays#sort(int[]) Arrays.sort}
676     * method. If the length of the specified array is less than the minimum
677     * granularity, then it is sorted using the appropriate {@link
678     * Arrays#sort(int[]) Arrays.sort} method. The algorithm requires a working
679     * space no greater than the size of the specified range of the original
680     * array. The {@link ForkJoinPool#commonPool() ForkJoin common pool} is
681     * used to execute any parallel tasks.
682     *
683     * @param a the array to be sorted
684     * @param fromIndex the index of the first element, inclusive, to be sorted
685     * @param toIndex the index of the last element, exclusive, to be sorted
686     *
687     * @throws IllegalArgumentException if {@code fromIndex > toIndex}
688     * @throws ArrayIndexOutOfBoundsException
689     *     if {@code fromIndex < 0} or {@code toIndex > a.length}
690     *
691     * @since 1.8
692     */
693    public static void parallelSort(int[] a, int fromIndex, int toIndex) {
694        rangeCheck(a.length, fromIndex, toIndex);
695        int n = toIndex - fromIndex, p, g;
696        if (n <= MIN_ARRAY_SORT_GRAN ||
697            (p = ForkJoinPool.getCommonPoolParallelism()) == 1)
698            DualPivotQuicksort.sort(a, fromIndex, toIndex - 1, null, 0, 0);
699        else
700            new ArraysParallelSortHelpers.FJInt.Sorter
701                (null, a, new int[n], fromIndex, n, 0,
702                 ((g = n / (p << 2)) <= MIN_ARRAY_SORT_GRAN) ?
703                 MIN_ARRAY_SORT_GRAN : g).invoke();
704    }
705
706    /**
707     * Sorts the specified array into ascending numerical order.
708     *
709     * @implNote The sorting algorithm is a parallel sort-merge that breaks the
710     * array into sub-arrays that are themselves sorted and then merged. When
711     * the sub-array length reaches a minimum granularity, the sub-array is
712     * sorted using the appropriate {@link Arrays#sort(long[]) Arrays.sort}
713     * method. If the length of the specified array is less than the minimum
714     * granularity, then it is sorted using the appropriate {@link
715     * Arrays#sort(long[]) Arrays.sort} method. The algorithm requires a
716     * working space no greater than the size of the original array. The
717     * {@link ForkJoinPool#commonPool() ForkJoin common pool} is used to
718     * execute any parallel tasks.
719     *
720     * @param a the array to be sorted
721     *
722     * @since 1.8
723     */
724    public static void parallelSort(long[] a) {
725        int n = a.length, p, g;
726        if (n <= MIN_ARRAY_SORT_GRAN ||
727            (p = ForkJoinPool.getCommonPoolParallelism()) == 1)
728            DualPivotQuicksort.sort(a, 0, n - 1, null, 0, 0);
729        else
730            new ArraysParallelSortHelpers.FJLong.Sorter
731                (null, a, new long[n], 0, n, 0,
732                 ((g = n / (p << 2)) <= MIN_ARRAY_SORT_GRAN) ?
733                 MIN_ARRAY_SORT_GRAN : g).invoke();
734    }
735
736    /**
737     * Sorts the specified range of the array into ascending numerical order.
738     * The range to be sorted extends from the index {@code fromIndex},
739     * inclusive, to the index {@code toIndex}, exclusive. If
740     * {@code fromIndex == toIndex}, the range to be sorted is empty.
741     *
742     * @implNote The sorting algorithm is a parallel sort-merge that breaks the
743     * array into sub-arrays that are themselves sorted and then merged. When
744     * the sub-array length reaches a minimum granularity, the sub-array is
745     * sorted using the appropriate {@link Arrays#sort(long[]) Arrays.sort}
746     * method. If the length of the specified array is less than the minimum
747     * granularity, then it is sorted using the appropriate {@link
748     * Arrays#sort(long[]) Arrays.sort} method. The algorithm requires a working
749     * space no greater than the size of the specified range of the original
750     * array. The {@link ForkJoinPool#commonPool() ForkJoin common pool} is
751     * used to execute any parallel tasks.
752     *
753     * @param a the array to be sorted
754     * @param fromIndex the index of the first element, inclusive, to be sorted
755     * @param toIndex the index of the last element, exclusive, to be sorted
756     *
757     * @throws IllegalArgumentException if {@code fromIndex > toIndex}
758     * @throws ArrayIndexOutOfBoundsException
759     *     if {@code fromIndex < 0} or {@code toIndex > a.length}
760     *
761     * @since 1.8
762     */
763    public static void parallelSort(long[] a, int fromIndex, int toIndex) {
764        rangeCheck(a.length, fromIndex, toIndex);
765        int n = toIndex - fromIndex, p, g;
766        if (n <= MIN_ARRAY_SORT_GRAN ||
767            (p = ForkJoinPool.getCommonPoolParallelism()) == 1)
768            DualPivotQuicksort.sort(a, fromIndex, toIndex - 1, null, 0, 0);
769        else
770            new ArraysParallelSortHelpers.FJLong.Sorter
771                (null, a, new long[n], fromIndex, n, 0,
772                 ((g = n / (p << 2)) <= MIN_ARRAY_SORT_GRAN) ?
773                 MIN_ARRAY_SORT_GRAN : g).invoke();
774    }
775
776    /**
777     * Sorts the specified array into ascending numerical order.
778     *
779     * <p>The {@code <} relation does not provide a total order on all float
780     * values: {@code -0.0f == 0.0f} is {@code true} and a {@code Float.NaN}
781     * value compares neither less than, greater than, nor equal to any value,
782     * even itself. This method uses the total order imposed by the method
783     * {@link Float#compareTo}: {@code -0.0f} is treated as less than value
784     * {@code 0.0f} and {@code Float.NaN} is considered greater than any
785     * other value and all {@code Float.NaN} values are considered equal.
786     *
787     * @implNote The sorting algorithm is a parallel sort-merge that breaks the
788     * array into sub-arrays that are themselves sorted and then merged. When
789     * the sub-array length reaches a minimum granularity, the sub-array is
790     * sorted using the appropriate {@link Arrays#sort(float[]) Arrays.sort}
791     * method. If the length of the specified array is less than the minimum
792     * granularity, then it is sorted using the appropriate {@link
793     * Arrays#sort(float[]) Arrays.sort} method. The algorithm requires a
794     * working space no greater than the size of the original array. The
795     * {@link ForkJoinPool#commonPool() ForkJoin common pool} is used to
796     * execute any parallel tasks.
797     *
798     * @param a the array to be sorted
799     *
800     * @since 1.8
801     */
802    public static void parallelSort(float[] a) {
803        int n = a.length, p, g;
804        if (n <= MIN_ARRAY_SORT_GRAN ||
805            (p = ForkJoinPool.getCommonPoolParallelism()) == 1)
806            DualPivotQuicksort.sort(a, 0, n - 1, null, 0, 0);
807        else
808            new ArraysParallelSortHelpers.FJFloat.Sorter
809                (null, a, new float[n], 0, n, 0,
810                 ((g = n / (p << 2)) <= MIN_ARRAY_SORT_GRAN) ?
811                 MIN_ARRAY_SORT_GRAN : g).invoke();
812    }
813
814    /**
815     * Sorts the specified range of the array into ascending numerical order.
816     * The range to be sorted extends from the index {@code fromIndex},
817     * inclusive, to the index {@code toIndex}, exclusive. If
818     * {@code fromIndex == toIndex}, the range to be sorted is empty.
819     *
820     * <p>The {@code <} relation does not provide a total order on all float
821     * values: {@code -0.0f == 0.0f} is {@code true} and a {@code Float.NaN}
822     * value compares neither less than, greater than, nor equal to any value,
823     * even itself. This method uses the total order imposed by the method
824     * {@link Float#compareTo}: {@code -0.0f} is treated as less than value
825     * {@code 0.0f} and {@code Float.NaN} is considered greater than any
826     * other value and all {@code Float.NaN} values are considered equal.
827     *
828     * @implNote The sorting algorithm is a parallel sort-merge that breaks the
829     * array into sub-arrays that are themselves sorted and then merged. When
830     * the sub-array length reaches a minimum granularity, the sub-array is
831     * sorted using the appropriate {@link Arrays#sort(float[]) Arrays.sort}
832     * method. If the length of the specified array is less than the minimum
833     * granularity, then it is sorted using the appropriate {@link
834     * Arrays#sort(float[]) Arrays.sort} method. The algorithm requires a working
835     * space no greater than the size of the specified range of the original
836     * array. The {@link ForkJoinPool#commonPool() ForkJoin common pool} is
837     * used to execute any parallel tasks.
838     *
839     * @param a the array to be sorted
840     * @param fromIndex the index of the first element, inclusive, to be sorted
841     * @param toIndex the index of the last element, exclusive, to be sorted
842     *
843     * @throws IllegalArgumentException if {@code fromIndex > toIndex}
844     * @throws ArrayIndexOutOfBoundsException
845     *     if {@code fromIndex < 0} or {@code toIndex > a.length}
846     *
847     * @since 1.8
848     */
849    public static void parallelSort(float[] a, int fromIndex, int toIndex) {
850        rangeCheck(a.length, fromIndex, toIndex);
851        int n = toIndex - fromIndex, p, g;
852        if (n <= MIN_ARRAY_SORT_GRAN ||
853            (p = ForkJoinPool.getCommonPoolParallelism()) == 1)
854            DualPivotQuicksort.sort(a, fromIndex, toIndex - 1, null, 0, 0);
855        else
856            new ArraysParallelSortHelpers.FJFloat.Sorter
857                (null, a, new float[n], fromIndex, n, 0,
858                 ((g = n / (p << 2)) <= MIN_ARRAY_SORT_GRAN) ?
859                 MIN_ARRAY_SORT_GRAN : g).invoke();
860    }
861
862    /**
863     * Sorts the specified array into ascending numerical order.
864     *
865     * <p>The {@code <} relation does not provide a total order on all double
866     * values: {@code -0.0d == 0.0d} is {@code true} and a {@code Double.NaN}
867     * value compares neither less than, greater than, nor equal to any value,
868     * even itself. This method uses the total order imposed by the method
869     * {@link Double#compareTo}: {@code -0.0d} is treated as less than value
870     * {@code 0.0d} and {@code Double.NaN} is considered greater than any
871     * other value and all {@code Double.NaN} values are considered equal.
872     *
873     * @implNote The sorting algorithm is a parallel sort-merge that breaks the
874     * array into sub-arrays that are themselves sorted and then merged. When
875     * the sub-array length reaches a minimum granularity, the sub-array is
876     * sorted using the appropriate {@link Arrays#sort(double[]) Arrays.sort}
877     * method. If the length of the specified array is less than the minimum
878     * granularity, then it is sorted using the appropriate {@link
879     * Arrays#sort(double[]) Arrays.sort} method. The algorithm requires a
880     * working space no greater than the size of the original array. The
881     * {@link ForkJoinPool#commonPool() ForkJoin common pool} is used to
882     * execute any parallel tasks.
883     *
884     * @param a the array to be sorted
885     *
886     * @since 1.8
887     */
888    public static void parallelSort(double[] a) {
889        int n = a.length, p, g;
890        if (n <= MIN_ARRAY_SORT_GRAN ||
891            (p = ForkJoinPool.getCommonPoolParallelism()) == 1)
892            DualPivotQuicksort.sort(a, 0, n - 1, null, 0, 0);
893        else
894            new ArraysParallelSortHelpers.FJDouble.Sorter
895                (null, a, new double[n], 0, n, 0,
896                 ((g = n / (p << 2)) <= MIN_ARRAY_SORT_GRAN) ?
897                 MIN_ARRAY_SORT_GRAN : g).invoke();
898    }
899
900    /**
901     * Sorts the specified range of the array into ascending numerical order.
902     * The range to be sorted extends from the index {@code fromIndex},
903     * inclusive, to the index {@code toIndex}, exclusive. If
904     * {@code fromIndex == toIndex}, the range to be sorted is empty.
905     *
906     * <p>The {@code <} relation does not provide a total order on all double
907     * values: {@code -0.0d == 0.0d} is {@code true} and a {@code Double.NaN}
908     * value compares neither less than, greater than, nor equal to any value,
909     * even itself. This method uses the total order imposed by the method
910     * {@link Double#compareTo}: {@code -0.0d} is treated as less than value
911     * {@code 0.0d} and {@code Double.NaN} is considered greater than any
912     * other value and all {@code Double.NaN} values are considered equal.
913     *
914     * @implNote The sorting algorithm is a parallel sort-merge that breaks the
915     * array into sub-arrays that are themselves sorted and then merged. When
916     * the sub-array length reaches a minimum granularity, the sub-array is
917     * sorted using the appropriate {@link Arrays#sort(double[]) Arrays.sort}
918     * method. If the length of the specified array is less than the minimum
919     * granularity, then it is sorted using the appropriate {@link
920     * Arrays#sort(double[]) Arrays.sort} method. The algorithm requires a working
921     * space no greater than the size of the specified range of the original
922     * array. The {@link ForkJoinPool#commonPool() ForkJoin common pool} is
923     * used to execute any parallel tasks.
924     *
925     * @param a the array to be sorted
926     * @param fromIndex the index of the first element, inclusive, to be sorted
927     * @param toIndex the index of the last element, exclusive, to be sorted
928     *
929     * @throws IllegalArgumentException if {@code fromIndex > toIndex}
930     * @throws ArrayIndexOutOfBoundsException
931     *     if {@code fromIndex < 0} or {@code toIndex > a.length}
932     *
933     * @since 1.8
934     */
935    public static void parallelSort(double[] a, int fromIndex, int toIndex) {
936        rangeCheck(a.length, fromIndex, toIndex);
937        int n = toIndex - fromIndex, p, g;
938        if (n <= MIN_ARRAY_SORT_GRAN ||
939            (p = ForkJoinPool.getCommonPoolParallelism()) == 1)
940            DualPivotQuicksort.sort(a, fromIndex, toIndex - 1, null, 0, 0);
941        else
942            new ArraysParallelSortHelpers.FJDouble.Sorter
943                (null, a, new double[n], fromIndex, n, 0,
944                 ((g = n / (p << 2)) <= MIN_ARRAY_SORT_GRAN) ?
945                 MIN_ARRAY_SORT_GRAN : g).invoke();
946    }
947
948    /**
949     * Sorts the specified array of objects into ascending order, according
950     * to the {@linkplain Comparable natural ordering} of its elements.
951     * All elements in the array must implement the {@link Comparable}
952     * interface.  Furthermore, all elements in the array must be
953     * <i>mutually comparable</i> (that is, {@code e1.compareTo(e2)} must
954     * not throw a {@code ClassCastException} for any elements {@code e1}
955     * and {@code e2} in the array).
956     *
957     * <p>This sort is guaranteed to be <i>stable</i>:  equal elements will
958     * not be reordered as a result of the sort.
959     *
960     * @implNote The sorting algorithm is a parallel sort-merge that breaks the
961     * array into sub-arrays that are themselves sorted and then merged. When
962     * the sub-array length reaches a minimum granularity, the sub-array is
963     * sorted using the appropriate {@link Arrays#sort(Object[]) Arrays.sort}
964     * method. If the length of the specified array is less than the minimum
965     * granularity, then it is sorted using the appropriate {@link
966     * Arrays#sort(Object[]) Arrays.sort} method. The algorithm requires a
967     * working space no greater than the size of the original array. The
968     * {@link ForkJoinPool#commonPool() ForkJoin common pool} is used to
969     * execute any parallel tasks.
970     *
971     * @param <T> the class of the objects to be sorted
972     * @param a the array to be sorted
973     *
974     * @throws ClassCastException if the array contains elements that are not
975     *         <i>mutually comparable</i> (for example, strings and integers)
976     * @throws IllegalArgumentException (optional) if the natural
977     *         ordering of the array elements is found to violate the
978     *         {@link Comparable} contract
979     *
980     * @since 1.8
981     */
982    @SuppressWarnings("unchecked")
983    public static <T extends Comparable<? super T>> void parallelSort(T[] a) {
984        int n = a.length, p, g;
985        if (n <= MIN_ARRAY_SORT_GRAN ||
986            (p = ForkJoinPool.getCommonPoolParallelism()) == 1)
987            TimSort.sort(a, 0, n, NaturalOrder.INSTANCE, null, 0, 0);
988        else
989            new ArraysParallelSortHelpers.FJObject.Sorter<T>
990                (null, a,
991                 (T[])Array.newInstance(a.getClass().getComponentType(), n),
992                 0, n, 0, ((g = n / (p << 2)) <= MIN_ARRAY_SORT_GRAN) ?
993                 MIN_ARRAY_SORT_GRAN : g, NaturalOrder.INSTANCE).invoke();
994    }
995
996    /**
997     * Sorts the specified range of the specified array of objects into
998     * ascending order, according to the
999     * {@linkplain Comparable natural ordering} of its
1000     * elements.  The range to be sorted extends from index
1001     * {@code fromIndex}, inclusive, to index {@code toIndex}, exclusive.
1002     * (If {@code fromIndex==toIndex}, the range to be sorted is empty.)  All
1003     * elements in this range must implement the {@link Comparable}
1004     * interface.  Furthermore, all elements in this range must be <i>mutually
1005     * comparable</i> (that is, {@code e1.compareTo(e2)} must not throw a
1006     * {@code ClassCastException} for any elements {@code e1} and
1007     * {@code e2} in the array).
1008     *
1009     * <p>This sort is guaranteed to be <i>stable</i>:  equal elements will
1010     * not be reordered as a result of the sort.
1011     *
1012     * @implNote The sorting algorithm is a parallel sort-merge that breaks the
1013     * array into sub-arrays that are themselves sorted and then merged. When
1014     * the sub-array length reaches a minimum granularity, the sub-array is
1015     * sorted using the appropriate {@link Arrays#sort(Object[]) Arrays.sort}
1016     * method. If the length of the specified array is less than the minimum
1017     * granularity, then it is sorted using the appropriate {@link
1018     * Arrays#sort(Object[]) Arrays.sort} method. The algorithm requires a working
1019     * space no greater than the size of the specified range of the original
1020     * array. The {@link ForkJoinPool#commonPool() ForkJoin common pool} is
1021     * used to execute any parallel tasks.
1022     *
1023     * @param <T> the class of the objects to be sorted
1024     * @param a the array to be sorted
1025     * @param fromIndex the index of the first element (inclusive) to be
1026     *        sorted
1027     * @param toIndex the index of the last element (exclusive) to be sorted
1028     * @throws IllegalArgumentException if {@code fromIndex > toIndex} or
1029     *         (optional) if the natural ordering of the array elements is
1030     *         found to violate the {@link Comparable} contract
1031     * @throws ArrayIndexOutOfBoundsException if {@code fromIndex < 0} or
1032     *         {@code toIndex > a.length}
1033     * @throws ClassCastException if the array contains elements that are
1034     *         not <i>mutually comparable</i> (for example, strings and
1035     *         integers).
1036     *
1037     * @since 1.8
1038     */
1039    @SuppressWarnings("unchecked")
1040    public static <T extends Comparable<? super T>>
1041    void parallelSort(T[] a, int fromIndex, int toIndex) {
1042        rangeCheck(a.length, fromIndex, toIndex);
1043        int n = toIndex - fromIndex, p, g;
1044        if (n <= MIN_ARRAY_SORT_GRAN ||
1045            (p = ForkJoinPool.getCommonPoolParallelism()) == 1)
1046            TimSort.sort(a, fromIndex, toIndex, NaturalOrder.INSTANCE, null, 0, 0);
1047        else
1048            new ArraysParallelSortHelpers.FJObject.Sorter<T>
1049                (null, a,
1050                 (T[])Array.newInstance(a.getClass().getComponentType(), n),
1051                 fromIndex, n, 0, ((g = n / (p << 2)) <= MIN_ARRAY_SORT_GRAN) ?
1052                 MIN_ARRAY_SORT_GRAN : g, NaturalOrder.INSTANCE).invoke();
1053    }
1054
1055    /**
1056     * Sorts the specified array of objects according to the order induced by
1057     * the specified comparator.  All elements in the array must be
1058     * <i>mutually comparable</i> by the specified comparator (that is,
1059     * {@code c.compare(e1, e2)} must not throw a {@code ClassCastException}
1060     * for any elements {@code e1} and {@code e2} in the array).
1061     *
1062     * <p>This sort is guaranteed to be <i>stable</i>:  equal elements will
1063     * not be reordered as a result of the sort.
1064     *
1065     * @implNote The sorting algorithm is a parallel sort-merge that breaks the
1066     * array into sub-arrays that are themselves sorted and then merged. When
1067     * the sub-array length reaches a minimum granularity, the sub-array is
1068     * sorted using the appropriate {@link Arrays#sort(Object[]) Arrays.sort}
1069     * method. If the length of the specified array is less than the minimum
1070     * granularity, then it is sorted using the appropriate {@link
1071     * Arrays#sort(Object[]) Arrays.sort} method. The algorithm requires a
1072     * working space no greater than the size of the original array. The
1073     * {@link ForkJoinPool#commonPool() ForkJoin common pool} is used to
1074     * execute any parallel tasks.
1075     *
1076     * @param <T> the class of the objects to be sorted
1077     * @param a the array to be sorted
1078     * @param cmp the comparator to determine the order of the array.  A
1079     *        {@code null} value indicates that the elements'
1080     *        {@linkplain Comparable natural ordering} should be used.
1081     * @throws ClassCastException if the array contains elements that are
1082     *         not <i>mutually comparable</i> using the specified comparator
1083     * @throws IllegalArgumentException (optional) if the comparator is
1084     *         found to violate the {@link java.util.Comparator} contract
1085     *
1086     * @since 1.8
1087     */
1088    @SuppressWarnings("unchecked")
1089    public static <T> void parallelSort(T[] a, Comparator<? super T> cmp) {
1090        if (cmp == null)
1091            cmp = NaturalOrder.INSTANCE;
1092        int n = a.length, p, g;
1093        if (n <= MIN_ARRAY_SORT_GRAN ||
1094            (p = ForkJoinPool.getCommonPoolParallelism()) == 1)
1095            TimSort.sort(a, 0, n, cmp, null, 0, 0);
1096        else
1097            new ArraysParallelSortHelpers.FJObject.Sorter<T>
1098                (null, a,
1099                 (T[])Array.newInstance(a.getClass().getComponentType(), n),
1100                 0, n, 0, ((g = n / (p << 2)) <= MIN_ARRAY_SORT_GRAN) ?
1101                 MIN_ARRAY_SORT_GRAN : g, cmp).invoke();
1102    }
1103
1104    /**
1105     * Sorts the specified range of the specified array of objects according
1106     * to the order induced by the specified comparator.  The range to be
1107     * sorted extends from index {@code fromIndex}, inclusive, to index
1108     * {@code toIndex}, exclusive.  (If {@code fromIndex==toIndex}, the
1109     * range to be sorted is empty.)  All elements in the range must be
1110     * <i>mutually comparable</i> by the specified comparator (that is,
1111     * {@code c.compare(e1, e2)} must not throw a {@code ClassCastException}
1112     * for any elements {@code e1} and {@code e2} in the range).
1113     *
1114     * <p>This sort is guaranteed to be <i>stable</i>:  equal elements will
1115     * not be reordered as a result of the sort.
1116     *
1117     * @implNote The sorting algorithm is a parallel sort-merge that breaks the
1118     * array into sub-arrays that are themselves sorted and then merged. When
1119     * the sub-array length reaches a minimum granularity, the sub-array is
1120     * sorted using the appropriate {@link Arrays#sort(Object[]) Arrays.sort}
1121     * method. If the length of the specified array is less than the minimum
1122     * granularity, then it is sorted using the appropriate {@link
1123     * Arrays#sort(Object[]) Arrays.sort} method. The algorithm requires a working
1124     * space no greater than the size of the specified range of the original
1125     * array. The {@link ForkJoinPool#commonPool() ForkJoin common pool} is
1126     * used to execute any parallel tasks.
1127     *
1128     * @param <T> the class of the objects to be sorted
1129     * @param a the array to be sorted
1130     * @param fromIndex the index of the first element (inclusive) to be
1131     *        sorted
1132     * @param toIndex the index of the last element (exclusive) to be sorted
1133     * @param cmp the comparator to determine the order of the array.  A
1134     *        {@code null} value indicates that the elements'
1135     *        {@linkplain Comparable natural ordering} should be used.
1136     * @throws IllegalArgumentException if {@code fromIndex > toIndex} or
1137     *         (optional) if the natural ordering of the array elements is
1138     *         found to violate the {@link Comparable} contract
1139     * @throws ArrayIndexOutOfBoundsException if {@code fromIndex < 0} or
1140     *         {@code toIndex > a.length}
1141     * @throws ClassCastException if the array contains elements that are
1142     *         not <i>mutually comparable</i> (for example, strings and
1143     *         integers).
1144     *
1145     * @since 1.8
1146     */
1147    @SuppressWarnings("unchecked")
1148    public static <T> void parallelSort(T[] a, int fromIndex, int toIndex,
1149                                        Comparator<? super T> cmp) {
1150        rangeCheck(a.length, fromIndex, toIndex);
1151        if (cmp == null)
1152            cmp = NaturalOrder.INSTANCE;
1153        int n = toIndex - fromIndex, p, g;
1154        if (n <= MIN_ARRAY_SORT_GRAN ||
1155            (p = ForkJoinPool.getCommonPoolParallelism()) == 1)
1156            TimSort.sort(a, fromIndex, toIndex, cmp, null, 0, 0);
1157        else
1158            new ArraysParallelSortHelpers.FJObject.Sorter<T>
1159                (null, a,
1160                 (T[])Array.newInstance(a.getClass().getComponentType(), n),
1161                 fromIndex, n, 0, ((g = n / (p << 2)) <= MIN_ARRAY_SORT_GRAN) ?
1162                 MIN_ARRAY_SORT_GRAN : g, cmp).invoke();
1163    }
1164
1165    /*
1166     * Sorting of complex type arrays.
1167     */
1168
1169    /**
1170     * Old merge sort implementation can be selected (for
1171     * compatibility with broken comparators) using a system property.
1172     * Cannot be a static boolean in the enclosing class due to
1173     * circular dependencies. To be removed in a future release.
1174     */
1175    static final class LegacyMergeSort {
1176        // Android-changed: Never use circular merge sort.
1177        private static final boolean userRequested = false;
1178    }
1179
1180    /*
1181     * If this platform has an optimizing VM, check whether ComparableTimSort
1182     * offers any performance benefit over TimSort in conjunction with a
1183     * comparator that returns:
1184     *    {@code ((Comparable)first).compareTo(Second)}.
1185     * If not, you are better off deleting ComparableTimSort to
1186     * eliminate the code duplication.  In other words, the commented
1187     * out code below is the preferable implementation for sorting
1188     * arrays of Comparables if it offers sufficient performance.
1189     */
1190
1191//    /**
1192//     * A comparator that implements the natural ordering of a group of
1193//     * mutually comparable elements.  Using this comparator saves us
1194//     * from duplicating most of the code in this file (one version for
1195//     * Comparables, one for explicit Comparators).
1196//     */
1197//    private static final Comparator<Object> NATURAL_ORDER =
1198//            new Comparator<Object>() {
1199//        @SuppressWarnings("unchecked")
1200//        public int compare(Object first, Object second) {
1201//            return ((Comparable<Object>)first).compareTo(second);
1202//        }
1203//    };
1204//
1205//    public static void sort(Object[] a) {
1206//        sort(a, 0, a.length, NATURAL_ORDER);
1207//    }
1208//
1209//    public static void sort(Object[] a, int fromIndex, int toIndex) {
1210//        sort(a, fromIndex, toIndex, NATURAL_ORDER);
1211//    }
1212
1213    /**
1214     * Sorts the specified array of objects into ascending order, according
1215     * to the {@linkplain Comparable natural ordering} of its elements.
1216     * All elements in the array must implement the {@link Comparable}
1217     * interface.  Furthermore, all elements in the array must be
1218     * <i>mutually comparable</i> (that is, {@code e1.compareTo(e2)} must
1219     * not throw a {@code ClassCastException} for any elements {@code e1}
1220     * and {@code e2} in the array).
1221     *
1222     * <p>This sort is guaranteed to be <i>stable</i>:  equal elements will
1223     * not be reordered as a result of the sort.
1224     *
1225     * <p>Implementation note: This implementation is a stable, adaptive,
1226     * iterative mergesort that requires far fewer than n lg(n) comparisons
1227     * when the input array is partially sorted, while offering the
1228     * performance of a traditional mergesort when the input array is
1229     * randomly ordered.  If the input array is nearly sorted, the
1230     * implementation requires approximately n comparisons.  Temporary
1231     * storage requirements vary from a small constant for nearly sorted
1232     * input arrays to n/2 object references for randomly ordered input
1233     * arrays.
1234     *
1235     * <p>The implementation takes equal advantage of ascending and
1236     * descending order in its input array, and can take advantage of
1237     * ascending and descending order in different parts of the the same
1238     * input array.  It is well-suited to merging two or more sorted arrays:
1239     * simply concatenate the arrays and sort the resulting array.
1240     *
1241     * <p>The implementation was adapted from Tim Peters's list sort for Python
1242     * (<a href="http://svn.python.org/projects/python/trunk/Objects/listsort.txt">
1243     * TimSort</a>).  It uses techiques from Peter McIlroy's "Optimistic
1244     * Sorting and Information Theoretic Complexity", in Proceedings of the
1245     * Fourth Annual ACM-SIAM Symposium on Discrete Algorithms, pp 467-474,
1246     * January 1993.
1247     *
1248     * @param a the array to be sorted
1249     * @throws ClassCastException if the array contains elements that are not
1250     *         <i>mutually comparable</i> (for example, strings and integers)
1251     * @throws IllegalArgumentException (optional) if the natural
1252     *         ordering of the array elements is found to violate the
1253     *         {@link Comparable} contract
1254     */
1255    public static void sort(Object[] a) {
1256        if (LegacyMergeSort.userRequested)
1257            legacyMergeSort(a);
1258        else
1259            ComparableTimSort.sort(a, 0, a.length, null, 0, 0);
1260    }
1261
1262    /** To be removed in a future release. */
1263    private static void legacyMergeSort(Object[] a) {
1264        Object[] aux = a.clone();
1265        mergeSort(aux, a, 0, a.length, 0);
1266    }
1267
1268    /**
1269     * Sorts the specified range of the specified array of objects into
1270     * ascending order, according to the
1271     * {@linkplain Comparable natural ordering} of its
1272     * elements.  The range to be sorted extends from index
1273     * {@code fromIndex}, inclusive, to index {@code toIndex}, exclusive.
1274     * (If {@code fromIndex==toIndex}, the range to be sorted is empty.)  All
1275     * elements in this range must implement the {@link Comparable}
1276     * interface.  Furthermore, all elements in this range must be <i>mutually
1277     * comparable</i> (that is, {@code e1.compareTo(e2)} must not throw a
1278     * {@code ClassCastException} for any elements {@code e1} and
1279     * {@code e2} in the array).
1280     *
1281     * <p>This sort is guaranteed to be <i>stable</i>:  equal elements will
1282     * not be reordered as a result of the sort.
1283     *
1284     * <p>Implementation note: This implementation is a stable, adaptive,
1285     * iterative mergesort that requires far fewer than n lg(n) comparisons
1286     * when the input array is partially sorted, while offering the
1287     * performance of a traditional mergesort when the input array is
1288     * randomly ordered.  If the input array is nearly sorted, the
1289     * implementation requires approximately n comparisons.  Temporary
1290     * storage requirements vary from a small constant for nearly sorted
1291     * input arrays to n/2 object references for randomly ordered input
1292     * arrays.
1293     *
1294     * <p>The implementation takes equal advantage of ascending and
1295     * descending order in its input array, and can take advantage of
1296     * ascending and descending order in different parts of the the same
1297     * input array.  It is well-suited to merging two or more sorted arrays:
1298     * simply concatenate the arrays and sort the resulting array.
1299     *
1300     * <p>The implementation was adapted from Tim Peters's list sort for Python
1301     * (<a href="http://svn.python.org/projects/python/trunk/Objects/listsort.txt">
1302     * TimSort</a>).  It uses techiques from Peter McIlroy's "Optimistic
1303     * Sorting and Information Theoretic Complexity", in Proceedings of the
1304     * Fourth Annual ACM-SIAM Symposium on Discrete Algorithms, pp 467-474,
1305     * January 1993.
1306     *
1307     * @param a the array to be sorted
1308     * @param fromIndex the index of the first element (inclusive) to be
1309     *        sorted
1310     * @param toIndex the index of the last element (exclusive) to be sorted
1311     * @throws IllegalArgumentException if {@code fromIndex > toIndex} or
1312     *         (optional) if the natural ordering of the array elements is
1313     *         found to violate the {@link Comparable} contract
1314     * @throws ArrayIndexOutOfBoundsException if {@code fromIndex < 0} or
1315     *         {@code toIndex > a.length}
1316     * @throws ClassCastException if the array contains elements that are
1317     *         not <i>mutually comparable</i> (for example, strings and
1318     *         integers).
1319     */
1320    public static void sort(Object[] a, int fromIndex, int toIndex) {
1321        rangeCheck(a.length, fromIndex, toIndex);
1322        if (LegacyMergeSort.userRequested)
1323            legacyMergeSort(a, fromIndex, toIndex);
1324        else
1325            ComparableTimSort.sort(a, fromIndex, toIndex, null, 0, 0);
1326    }
1327
1328    /** To be removed in a future release. */
1329    private static void legacyMergeSort(Object[] a,
1330                                        int fromIndex, int toIndex) {
1331        rangeCheck(a.length, fromIndex, toIndex);
1332        Object[] aux = copyOfRange(a, fromIndex, toIndex);
1333        mergeSort(aux, a, fromIndex, toIndex, -fromIndex);
1334    }
1335
1336    /**
1337     * Tuning parameter: list size at or below which insertion sort will be
1338     * used in preference to mergesort.
1339     * To be removed in a future release.
1340     */
1341    private static final int INSERTIONSORT_THRESHOLD = 7;
1342
1343    /**
1344     * Src is the source array that starts at index 0
1345     * Dest is the (possibly larger) array destination with a possible offset
1346     * low is the index in dest to start sorting
1347     * high is the end index in dest to end sorting
1348     * off is the offset to generate corresponding low, high in src
1349     * To be removed in a future release.
1350     */
1351    private static void mergeSort(Object[] src,
1352                                  Object[] dest,
1353                                  int low,
1354                                  int high,
1355                                  int off) {
1356        int length = high - low;
1357
1358        // Insertion sort on smallest arrays
1359        if (length < INSERTIONSORT_THRESHOLD) {
1360            for (int i=low; i<high; i++)
1361                for (int j=i; j>low &&
1362                         ((Comparable) dest[j-1]).compareTo(dest[j])>0; j--)
1363                    swap(dest, j, j-1);
1364            return;
1365        }
1366
1367        // Recursively sort halves of dest into src
1368        int destLow  = low;
1369        int destHigh = high;
1370        low  += off;
1371        high += off;
1372        int mid = (low + high) >>> 1;
1373        mergeSort(dest, src, low, mid, -off);
1374        mergeSort(dest, src, mid, high, -off);
1375
1376        // If list is already sorted, just copy from src to dest.  This is an
1377        // optimization that results in faster sorts for nearly ordered lists.
1378        if (((Comparable)src[mid-1]).compareTo(src[mid]) <= 0) {
1379            System.arraycopy(src, low, dest, destLow, length);
1380            return;
1381        }
1382
1383        // Merge sorted halves (now in src) into dest
1384        for(int i = destLow, p = low, q = mid; i < destHigh; i++) {
1385            if (q >= high || p < mid && ((Comparable)src[p]).compareTo(src[q])<=0)
1386                dest[i] = src[p++];
1387            else
1388                dest[i] = src[q++];
1389        }
1390    }
1391
1392    /**
1393     * Swaps x[a] with x[b].
1394     */
1395    private static void swap(Object[] x, int a, int b) {
1396        Object t = x[a];
1397        x[a] = x[b];
1398        x[b] = t;
1399    }
1400
1401    /**
1402     * Sorts the specified array of objects according to the order induced by
1403     * the specified comparator.  All elements in the array must be
1404     * <i>mutually comparable</i> by the specified comparator (that is,
1405     * {@code c.compare(e1, e2)} must not throw a {@code ClassCastException}
1406     * for any elements {@code e1} and {@code e2} in the array).
1407     *
1408     * <p>This sort is guaranteed to be <i>stable</i>:  equal elements will
1409     * not be reordered as a result of the sort.
1410     *
1411     * <p>Implementation note: This implementation is a stable, adaptive,
1412     * iterative mergesort that requires far fewer than n lg(n) comparisons
1413     * when the input array is partially sorted, while offering the
1414     * performance of a traditional mergesort when the input array is
1415     * randomly ordered.  If the input array is nearly sorted, the
1416     * implementation requires approximately n comparisons.  Temporary
1417     * storage requirements vary from a small constant for nearly sorted
1418     * input arrays to n/2 object references for randomly ordered input
1419     * arrays.
1420     *
1421     * <p>The implementation takes equal advantage of ascending and
1422     * descending order in its input array, and can take advantage of
1423     * ascending and descending order in different parts of the the same
1424     * input array.  It is well-suited to merging two or more sorted arrays:
1425     * simply concatenate the arrays and sort the resulting array.
1426     *
1427     * <p>The implementation was adapted from Tim Peters's list sort for Python
1428     * (<a href="http://svn.python.org/projects/python/trunk/Objects/listsort.txt">
1429     * TimSort</a>).  It uses techiques from Peter McIlroy's "Optimistic
1430     * Sorting and Information Theoretic Complexity", in Proceedings of the
1431     * Fourth Annual ACM-SIAM Symposium on Discrete Algorithms, pp 467-474,
1432     * January 1993.
1433     *
1434     * @param a the array to be sorted
1435     * @param c the comparator to determine the order of the array.  A
1436     *        {@code null} value indicates that the elements'
1437     *        {@linkplain Comparable natural ordering} should be used.
1438     * @throws ClassCastException if the array contains elements that are
1439     *         not <i>mutually comparable</i> using the specified comparator
1440     * @throws IllegalArgumentException (optional) if the comparator is
1441     *         found to violate the {@link Comparator} contract
1442     */
1443    public static <T> void sort(T[] a, Comparator<? super T> c) {
1444        if (c == null) {
1445            sort(a);
1446        } else {
1447            if (LegacyMergeSort.userRequested)
1448                legacyMergeSort(a, c);
1449            else
1450                TimSort.sort(a, 0, a.length, c, null, 0, 0);
1451        }
1452    }
1453
1454    /** To be removed in a future release. */
1455    private static <T> void legacyMergeSort(T[] a, Comparator<? super T> c) {
1456        T[] aux = a.clone();
1457        if (c==null)
1458            mergeSort(aux, a, 0, a.length, 0);
1459        else
1460            mergeSort(aux, a, 0, a.length, 0, c);
1461    }
1462
1463    /**
1464     * Sorts the specified range of the specified array of objects according
1465     * to the order induced by the specified comparator.  The range to be
1466     * sorted extends from index {@code fromIndex}, inclusive, to index
1467     * {@code toIndex}, exclusive.  (If {@code fromIndex==toIndex}, the
1468     * range to be sorted is empty.)  All elements in the range must be
1469     * <i>mutually comparable</i> by the specified comparator (that is,
1470     * {@code c.compare(e1, e2)} must not throw a {@code ClassCastException}
1471     * for any elements {@code e1} and {@code e2} in the range).
1472     *
1473     * <p>This sort is guaranteed to be <i>stable</i>:  equal elements will
1474     * not be reordered as a result of the sort.
1475     *
1476     * <p>Implementation note: This implementation is a stable, adaptive,
1477     * iterative mergesort that requires far fewer than n lg(n) comparisons
1478     * when the input array is partially sorted, while offering the
1479     * performance of a traditional mergesort when the input array is
1480     * randomly ordered.  If the input array is nearly sorted, the
1481     * implementation requires approximately n comparisons.  Temporary
1482     * storage requirements vary from a small constant for nearly sorted
1483     * input arrays to n/2 object references for randomly ordered input
1484     * arrays.
1485     *
1486     * <p>The implementation takes equal advantage of ascending and
1487     * descending order in its input array, and can take advantage of
1488     * ascending and descending order in different parts of the the same
1489     * input array.  It is well-suited to merging two or more sorted arrays:
1490     * simply concatenate the arrays and sort the resulting array.
1491     *
1492     * <p>The implementation was adapted from Tim Peters's list sort for Python
1493     * (<a href="http://svn.python.org/projects/python/trunk/Objects/listsort.txt">
1494     * TimSort</a>).  It uses techiques from Peter McIlroy's "Optimistic
1495     * Sorting and Information Theoretic Complexity", in Proceedings of the
1496     * Fourth Annual ACM-SIAM Symposium on Discrete Algorithms, pp 467-474,
1497     * January 1993.
1498     *
1499     * @param a the array to be sorted
1500     * @param fromIndex the index of the first element (inclusive) to be
1501     *        sorted
1502     * @param toIndex the index of the last element (exclusive) to be sorted
1503     * @param c the comparator to determine the order of the array.  A
1504     *        {@code null} value indicates that the elements'
1505     *        {@linkplain Comparable natural ordering} should be used.
1506     * @throws ClassCastException if the array contains elements that are not
1507     *         <i>mutually comparable</i> using the specified comparator.
1508     * @throws IllegalArgumentException if {@code fromIndex > toIndex} or
1509     *         (optional) if the comparator is found to violate the
1510     *         {@link Comparator} contract
1511     * @throws ArrayIndexOutOfBoundsException if {@code fromIndex < 0} or
1512     *         {@code toIndex > a.length}
1513     */
1514    public static <T> void sort(T[] a, int fromIndex, int toIndex,
1515                                Comparator<? super T> c) {
1516        if (c == null) {
1517            sort(a, fromIndex, toIndex);
1518        } else {
1519            rangeCheck(a.length, fromIndex, toIndex);
1520            if (LegacyMergeSort.userRequested)
1521                legacyMergeSort(a, fromIndex, toIndex, c);
1522            else
1523                TimSort.sort(a, fromIndex, toIndex, c, null, 0, 0);
1524        }
1525    }
1526
1527    /** To be removed in a future release. */
1528    private static <T> void legacyMergeSort(T[] a, int fromIndex, int toIndex,
1529                                            Comparator<? super T> c) {
1530        rangeCheck(a.length, fromIndex, toIndex);
1531        T[] aux = copyOfRange(a, fromIndex, toIndex);
1532        if (c==null)
1533            mergeSort(aux, a, fromIndex, toIndex, -fromIndex);
1534        else
1535            mergeSort(aux, a, fromIndex, toIndex, -fromIndex, c);
1536    }
1537
1538    /**
1539     * Src is the source array that starts at index 0
1540     * Dest is the (possibly larger) array destination with a possible offset
1541     * low is the index in dest to start sorting
1542     * high is the end index in dest to end sorting
1543     * off is the offset into src corresponding to low in dest
1544     * To be removed in a future release.
1545     */
1546    private static void mergeSort(Object[] src,
1547                                  Object[] dest,
1548                                  int low, int high, int off,
1549                                  Comparator c) {
1550        int length = high - low;
1551
1552        // Insertion sort on smallest arrays
1553        if (length < INSERTIONSORT_THRESHOLD) {
1554            for (int i=low; i<high; i++)
1555                for (int j=i; j>low && c.compare(dest[j-1], dest[j])>0; j--)
1556                    swap(dest, j, j-1);
1557            return;
1558        }
1559
1560        // Recursively sort halves of dest into src
1561        int destLow  = low;
1562        int destHigh = high;
1563        low  += off;
1564        high += off;
1565        int mid = (low + high) >>> 1;
1566        mergeSort(dest, src, low, mid, -off, c);
1567        mergeSort(dest, src, mid, high, -off, c);
1568
1569        // If list is already sorted, just copy from src to dest.  This is an
1570        // optimization that results in faster sorts for nearly ordered lists.
1571        if (c.compare(src[mid-1], src[mid]) <= 0) {
1572           System.arraycopy(src, low, dest, destLow, length);
1573           return;
1574        }
1575
1576        // Merge sorted halves (now in src) into dest
1577        for(int i = destLow, p = low, q = mid; i < destHigh; i++) {
1578            if (q >= high || p < mid && c.compare(src[p], src[q]) <= 0)
1579                dest[i] = src[p++];
1580            else
1581                dest[i] = src[q++];
1582        }
1583    }
1584
1585    /**
1586     * Checks that {@code fromIndex} and {@code toIndex} are in
1587     * the range and throws an appropriate exception, if they aren't.
1588     */
1589    private static void rangeCheck(int length, int fromIndex, int toIndex) {
1590        if (fromIndex > toIndex) {
1591            throw new IllegalArgumentException(
1592                "fromIndex(" + fromIndex + ") > toIndex(" + toIndex + ")");
1593        }
1594        if (fromIndex < 0) {
1595            throw new ArrayIndexOutOfBoundsException(fromIndex);
1596        }
1597        if (toIndex > length) {
1598            throw new ArrayIndexOutOfBoundsException(toIndex);
1599        }
1600    }
1601
1602
1603    // Parallel prefix
1604
1605    /**
1606     * Cumulates, in parallel, each element of the given array in place,
1607     * using the supplied function. For example if the array initially
1608     * holds {@code [2, 1, 0, 3]} and the operation performs addition,
1609     * then upon return the array holds {@code [2, 3, 3, 6]}.
1610     * Parallel prefix computation is usually more efficient than
1611     * sequential loops for large arrays.
1612     *
1613     * @param <T> the class of the objects in the array
1614     * @param array the array, which is modified in-place by this method
1615     * @param op a side-effect-free, associative function to perform the
1616     * cumulation
1617     * @throws NullPointerException if the specified array or function is null
1618     * @since 1.8
1619     */
1620    public static <T> void parallelPrefix(T[] array, BinaryOperator<T> op) {
1621        Objects.requireNonNull(op);
1622        if (array.length > 0)
1623            new ArrayPrefixHelpers.CumulateTask<>
1624                    (null, op, array, 0, array.length).invoke();
1625    }
1626
1627    /**
1628     * Performs {@link #parallelPrefix(Object[], BinaryOperator)}
1629     * for the given subrange of the array.
1630     *
1631     * @param <T> the class of the objects in the array
1632     * @param array the array
1633     * @param fromIndex the index of the first element, inclusive
1634     * @param toIndex the index of the last element, exclusive
1635     * @param op a side-effect-free, associative function to perform the
1636     * cumulation
1637     * @throws IllegalArgumentException if {@code fromIndex > toIndex}
1638     * @throws ArrayIndexOutOfBoundsException
1639     *     if {@code fromIndex < 0} or {@code toIndex > array.length}
1640     * @throws NullPointerException if the specified array or function is null
1641     * @since 1.8
1642     */
1643    public static <T> void parallelPrefix(T[] array, int fromIndex,
1644                                          int toIndex, BinaryOperator<T> op) {
1645        Objects.requireNonNull(op);
1646        rangeCheck(array.length, fromIndex, toIndex);
1647        if (fromIndex < toIndex)
1648            new ArrayPrefixHelpers.CumulateTask<>
1649                    (null, op, array, fromIndex, toIndex).invoke();
1650    }
1651
1652    /**
1653     * Cumulates, in parallel, each element of the given array in place,
1654     * using the supplied function. For example if the array initially
1655     * holds {@code [2, 1, 0, 3]} and the operation performs addition,
1656     * then upon return the array holds {@code [2, 3, 3, 6]}.
1657     * Parallel prefix computation is usually more efficient than
1658     * sequential loops for large arrays.
1659     *
1660     * @param array the array, which is modified in-place by this method
1661     * @param op a side-effect-free, associative function to perform the
1662     * cumulation
1663     * @throws NullPointerException if the specified array or function is null
1664     * @since 1.8
1665     */
1666    public static void parallelPrefix(long[] array, LongBinaryOperator op) {
1667        Objects.requireNonNull(op);
1668        if (array.length > 0)
1669            new ArrayPrefixHelpers.LongCumulateTask
1670                    (null, op, array, 0, array.length).invoke();
1671    }
1672
1673    /**
1674     * Performs {@link #parallelPrefix(long[], LongBinaryOperator)}
1675     * for the given subrange of the array.
1676     *
1677     * @param array the array
1678     * @param fromIndex the index of the first element, inclusive
1679     * @param toIndex the index of the last element, exclusive
1680     * @param op a side-effect-free, associative function to perform the
1681     * cumulation
1682     * @throws IllegalArgumentException if {@code fromIndex > toIndex}
1683     * @throws ArrayIndexOutOfBoundsException
1684     *     if {@code fromIndex < 0} or {@code toIndex > array.length}
1685     * @throws NullPointerException if the specified array or function is null
1686     * @since 1.8
1687     */
1688    public static void parallelPrefix(long[] array, int fromIndex,
1689                                      int toIndex, LongBinaryOperator op) {
1690        Objects.requireNonNull(op);
1691        rangeCheck(array.length, fromIndex, toIndex);
1692        if (fromIndex < toIndex)
1693            new ArrayPrefixHelpers.LongCumulateTask
1694                    (null, op, array, fromIndex, toIndex).invoke();
1695    }
1696
1697    /**
1698     * Cumulates, in parallel, each element of the given array in place,
1699     * using the supplied function. For example if the array initially
1700     * holds {@code [2.0, 1.0, 0.0, 3.0]} and the operation performs addition,
1701     * then upon return the array holds {@code [2.0, 3.0, 3.0, 6.0]}.
1702     * Parallel prefix computation is usually more efficient than
1703     * sequential loops for large arrays.
1704     *
1705     * <p> Because floating-point operations may not be strictly associative,
1706     * the returned result may not be identical to the value that would be
1707     * obtained if the operation was performed sequentially.
1708     *
1709     * @param array the array, which is modified in-place by this method
1710     * @param op a side-effect-free function to perform the cumulation
1711     * @throws NullPointerException if the specified array or function is null
1712     * @since 1.8
1713     */
1714    public static void parallelPrefix(double[] array, DoubleBinaryOperator op) {
1715        Objects.requireNonNull(op);
1716        if (array.length > 0)
1717            new ArrayPrefixHelpers.DoubleCumulateTask
1718                    (null, op, array, 0, array.length).invoke();
1719    }
1720
1721    /**
1722     * Performs {@link #parallelPrefix(double[], DoubleBinaryOperator)}
1723     * for the given subrange of the array.
1724     *
1725     * @param array the array
1726     * @param fromIndex the index of the first element, inclusive
1727     * @param toIndex the index of the last element, exclusive
1728     * @param op a side-effect-free, associative function to perform the
1729     * cumulation
1730     * @throws IllegalArgumentException if {@code fromIndex > toIndex}
1731     * @throws ArrayIndexOutOfBoundsException
1732     *     if {@code fromIndex < 0} or {@code toIndex > array.length}
1733     * @throws NullPointerException if the specified array or function is null
1734     * @since 1.8
1735     */
1736    public static void parallelPrefix(double[] array, int fromIndex,
1737                                      int toIndex, DoubleBinaryOperator op) {
1738        Objects.requireNonNull(op);
1739        rangeCheck(array.length, fromIndex, toIndex);
1740        if (fromIndex < toIndex)
1741            new ArrayPrefixHelpers.DoubleCumulateTask
1742                    (null, op, array, fromIndex, toIndex).invoke();
1743    }
1744
1745    /**
1746     * Cumulates, in parallel, each element of the given array in place,
1747     * using the supplied function. For example if the array initially
1748     * holds {@code [2, 1, 0, 3]} and the operation performs addition,
1749     * then upon return the array holds {@code [2, 3, 3, 6]}.
1750     * Parallel prefix computation is usually more efficient than
1751     * sequential loops for large arrays.
1752     *
1753     * @param array the array, which is modified in-place by this method
1754     * @param op a side-effect-free, associative function to perform the
1755     * cumulation
1756     * @throws NullPointerException if the specified array or function is null
1757     * @since 1.8
1758     */
1759    public static void parallelPrefix(int[] array, IntBinaryOperator op) {
1760        Objects.requireNonNull(op);
1761        if (array.length > 0)
1762            new ArrayPrefixHelpers.IntCumulateTask
1763                    (null, op, array, 0, array.length).invoke();
1764    }
1765
1766    /**
1767     * Performs {@link #parallelPrefix(int[], IntBinaryOperator)}
1768     * for the given subrange of the array.
1769     *
1770     * @param array the array
1771     * @param fromIndex the index of the first element, inclusive
1772     * @param toIndex the index of the last element, exclusive
1773     * @param op a side-effect-free, associative function to perform the
1774     * cumulation
1775     * @throws IllegalArgumentException if {@code fromIndex > toIndex}
1776     * @throws ArrayIndexOutOfBoundsException
1777     *     if {@code fromIndex < 0} or {@code toIndex > array.length}
1778     * @throws NullPointerException if the specified array or function is null
1779     * @since 1.8
1780     */
1781    public static void parallelPrefix(int[] array, int fromIndex,
1782                                      int toIndex, IntBinaryOperator op) {
1783        Objects.requireNonNull(op);
1784        rangeCheck(array.length, fromIndex, toIndex);
1785        if (fromIndex < toIndex)
1786            new ArrayPrefixHelpers.IntCumulateTask
1787                    (null, op, array, fromIndex, toIndex).invoke();
1788    }
1789
1790    // Searching
1791
1792    /**
1793     * Searches the specified array of longs for the specified value using the
1794     * binary search algorithm.  The array must be sorted (as
1795     * by the {@link #sort(long[])} method) prior to making this call.  If it
1796     * is not sorted, the results are undefined.  If the array contains
1797     * multiple elements with the specified value, there is no guarantee which
1798     * one will be found.
1799     *
1800     * @param a the array to be searched
1801     * @param key the value to be searched for
1802     * @return index of the search key, if it is contained in the array;
1803     *         otherwise, <tt>(-(<i>insertion point</i>) - 1)</tt>.  The
1804     *         <i>insertion point</i> is defined as the point at which the
1805     *         key would be inserted into the array: the index of the first
1806     *         element greater than the key, or <tt>a.length</tt> if all
1807     *         elements in the array are less than the specified key.  Note
1808     *         that this guarantees that the return value will be &gt;= 0 if
1809     *         and only if the key is found.
1810     */
1811    public static int binarySearch(long[] a, long key) {
1812        return binarySearch0(a, 0, a.length, key);
1813    }
1814
1815    /**
1816     * Searches a range of
1817     * the specified array of longs for the specified value using the
1818     * binary search algorithm.
1819     * The range must be sorted (as
1820     * by the {@link #sort(long[], int, int)} method)
1821     * prior to making this call.  If it
1822     * is not sorted, the results are undefined.  If the range contains
1823     * multiple elements with the specified value, there is no guarantee which
1824     * one will be found.
1825     *
1826     * @param a the array to be searched
1827     * @param fromIndex the index of the first element (inclusive) to be
1828     *          searched
1829     * @param toIndex the index of the last element (exclusive) to be searched
1830     * @param key the value to be searched for
1831     * @return index of the search key, if it is contained in the array
1832     *         within the specified range;
1833     *         otherwise, <tt>(-(<i>insertion point</i>) - 1)</tt>.  The
1834     *         <i>insertion point</i> is defined as the point at which the
1835     *         key would be inserted into the array: the index of the first
1836     *         element in the range greater than the key,
1837     *         or <tt>toIndex</tt> if all
1838     *         elements in the range are less than the specified key.  Note
1839     *         that this guarantees that the return value will be &gt;= 0 if
1840     *         and only if the key is found.
1841     * @throws IllegalArgumentException
1842     *         if {@code fromIndex > toIndex}
1843     * @throws ArrayIndexOutOfBoundsException
1844     *         if {@code fromIndex < 0 or toIndex > a.length}
1845     * @since 1.6
1846     */
1847    public static int binarySearch(long[] a, int fromIndex, int toIndex,
1848                                   long key) {
1849        rangeCheck(a.length, fromIndex, toIndex);
1850        return binarySearch0(a, fromIndex, toIndex, key);
1851    }
1852
1853    // Like public version, but without range checks.
1854    private static int binarySearch0(long[] a, int fromIndex, int toIndex,
1855                                     long key) {
1856        int low = fromIndex;
1857        int high = toIndex - 1;
1858
1859        while (low <= high) {
1860            int mid = (low + high) >>> 1;
1861            long midVal = a[mid];
1862
1863            if (midVal < key)
1864                low = mid + 1;
1865            else if (midVal > key)
1866                high = mid - 1;
1867            else
1868                return mid; // key found
1869        }
1870        return -(low + 1);  // key not found.
1871    }
1872
1873    /**
1874     * Searches the specified array of ints for the specified value using the
1875     * binary search algorithm.  The array must be sorted (as
1876     * by the {@link #sort(int[])} method) prior to making this call.  If it
1877     * is not sorted, the results are undefined.  If the array contains
1878     * multiple elements with the specified value, there is no guarantee which
1879     * one will be found.
1880     *
1881     * @param a the array to be searched
1882     * @param key the value to be searched for
1883     * @return index of the search key, if it is contained in the array;
1884     *         otherwise, <tt>(-(<i>insertion point</i>) - 1)</tt>.  The
1885     *         <i>insertion point</i> is defined as the point at which the
1886     *         key would be inserted into the array: the index of the first
1887     *         element greater than the key, or <tt>a.length</tt> if all
1888     *         elements in the array are less than the specified key.  Note
1889     *         that this guarantees that the return value will be &gt;= 0 if
1890     *         and only if the key is found.
1891     */
1892    public static int binarySearch(int[] a, int key) {
1893        return binarySearch0(a, 0, a.length, key);
1894    }
1895
1896    /**
1897     * Searches a range of
1898     * the specified array of ints for the specified value using the
1899     * binary search algorithm.
1900     * The range must be sorted (as
1901     * by the {@link #sort(int[], int, int)} method)
1902     * prior to making this call.  If it
1903     * is not sorted, the results are undefined.  If the range contains
1904     * multiple elements with the specified value, there is no guarantee which
1905     * one will be found.
1906     *
1907     * @param a the array to be searched
1908     * @param fromIndex the index of the first element (inclusive) to be
1909     *          searched
1910     * @param toIndex the index of the last element (exclusive) to be searched
1911     * @param key the value to be searched for
1912     * @return index of the search key, if it is contained in the array
1913     *         within the specified range;
1914     *         otherwise, <tt>(-(<i>insertion point</i>) - 1)</tt>.  The
1915     *         <i>insertion point</i> is defined as the point at which the
1916     *         key would be inserted into the array: the index of the first
1917     *         element in the range greater than the key,
1918     *         or <tt>toIndex</tt> if all
1919     *         elements in the range are less than the specified key.  Note
1920     *         that this guarantees that the return value will be &gt;= 0 if
1921     *         and only if the key is found.
1922     * @throws IllegalArgumentException
1923     *         if {@code fromIndex > toIndex}
1924     * @throws ArrayIndexOutOfBoundsException
1925     *         if {@code fromIndex < 0 or toIndex > a.length}
1926     * @since 1.6
1927     */
1928    public static int binarySearch(int[] a, int fromIndex, int toIndex,
1929                                   int key) {
1930        rangeCheck(a.length, fromIndex, toIndex);
1931        return binarySearch0(a, fromIndex, toIndex, key);
1932    }
1933
1934    // Like public version, but without range checks.
1935    private static int binarySearch0(int[] a, int fromIndex, int toIndex,
1936                                     int key) {
1937        int low = fromIndex;
1938        int high = toIndex - 1;
1939
1940        while (low <= high) {
1941            int mid = (low + high) >>> 1;
1942            int midVal = a[mid];
1943
1944            if (midVal < key)
1945                low = mid + 1;
1946            else if (midVal > key)
1947                high = mid - 1;
1948            else
1949                return mid; // key found
1950        }
1951        return -(low + 1);  // key not found.
1952    }
1953
1954    /**
1955     * Searches the specified array of shorts for the specified value using
1956     * the binary search algorithm.  The array must be sorted
1957     * (as by the {@link #sort(short[])} method) prior to making this call.  If
1958     * it is not sorted, the results are undefined.  If the array contains
1959     * multiple elements with the specified value, there is no guarantee which
1960     * one will be found.
1961     *
1962     * @param a the array to be searched
1963     * @param key the value to be searched for
1964     * @return index of the search key, if it is contained in the array;
1965     *         otherwise, <tt>(-(<i>insertion point</i>) - 1)</tt>.  The
1966     *         <i>insertion point</i> is defined as the point at which the
1967     *         key would be inserted into the array: the index of the first
1968     *         element greater than the key, or <tt>a.length</tt> if all
1969     *         elements in the array are less than the specified key.  Note
1970     *         that this guarantees that the return value will be &gt;= 0 if
1971     *         and only if the key is found.
1972     */
1973    public static int binarySearch(short[] a, short key) {
1974        return binarySearch0(a, 0, a.length, key);
1975    }
1976
1977    /**
1978     * Searches a range of
1979     * the specified array of shorts for the specified value using
1980     * the binary search algorithm.
1981     * The range must be sorted
1982     * (as by the {@link #sort(short[], int, int)} method)
1983     * prior to making this call.  If
1984     * it is not sorted, the results are undefined.  If the range contains
1985     * multiple elements with the specified value, there is no guarantee which
1986     * one will be found.
1987     *
1988     * @param a the array to be searched
1989     * @param fromIndex the index of the first element (inclusive) to be
1990     *          searched
1991     * @param toIndex the index of the last element (exclusive) to be searched
1992     * @param key the value to be searched for
1993     * @return index of the search key, if it is contained in the array
1994     *         within the specified range;
1995     *         otherwise, <tt>(-(<i>insertion point</i>) - 1)</tt>.  The
1996     *         <i>insertion point</i> is defined as the point at which the
1997     *         key would be inserted into the array: the index of the first
1998     *         element in the range greater than the key,
1999     *         or <tt>toIndex</tt> if all
2000     *         elements in the range are less than the specified key.  Note
2001     *         that this guarantees that the return value will be &gt;= 0 if
2002     *         and only if the key is found.
2003     * @throws IllegalArgumentException
2004     *         if {@code fromIndex > toIndex}
2005     * @throws ArrayIndexOutOfBoundsException
2006     *         if {@code fromIndex < 0 or toIndex > a.length}
2007     * @since 1.6
2008     */
2009    public static int binarySearch(short[] a, int fromIndex, int toIndex,
2010                                   short key) {
2011        rangeCheck(a.length, fromIndex, toIndex);
2012        return binarySearch0(a, fromIndex, toIndex, key);
2013    }
2014
2015    // Like public version, but without range checks.
2016    private static int binarySearch0(short[] a, int fromIndex, int toIndex,
2017                                     short key) {
2018        int low = fromIndex;
2019        int high = toIndex - 1;
2020
2021        while (low <= high) {
2022            int mid = (low + high) >>> 1;
2023            short midVal = a[mid];
2024
2025            if (midVal < key)
2026                low = mid + 1;
2027            else if (midVal > key)
2028                high = mid - 1;
2029            else
2030                return mid; // key found
2031        }
2032        return -(low + 1);  // key not found.
2033    }
2034
2035    /**
2036     * Searches the specified array of chars for the specified value using the
2037     * binary search algorithm.  The array must be sorted (as
2038     * by the {@link #sort(char[])} method) prior to making this call.  If it
2039     * is not sorted, the results are undefined.  If the array contains
2040     * multiple elements with the specified value, there is no guarantee which
2041     * one will be found.
2042     *
2043     * @param a the array to be searched
2044     * @param key the value to be searched for
2045     * @return index of the search key, if it is contained in the array;
2046     *         otherwise, <tt>(-(<i>insertion point</i>) - 1)</tt>.  The
2047     *         <i>insertion point</i> is defined as the point at which the
2048     *         key would be inserted into the array: the index of the first
2049     *         element greater than the key, or <tt>a.length</tt> if all
2050     *         elements in the array are less than the specified key.  Note
2051     *         that this guarantees that the return value will be &gt;= 0 if
2052     *         and only if the key is found.
2053     */
2054    public static int binarySearch(char[] a, char key) {
2055        return binarySearch0(a, 0, a.length, key);
2056    }
2057
2058    /**
2059     * Searches a range of
2060     * the specified array of chars for the specified value using the
2061     * binary search algorithm.
2062     * The range must be sorted (as
2063     * by the {@link #sort(char[], int, int)} method)
2064     * prior to making this call.  If it
2065     * is not sorted, the results are undefined.  If the range contains
2066     * multiple elements with the specified value, there is no guarantee which
2067     * one will be found.
2068     *
2069     * @param a the array to be searched
2070     * @param fromIndex the index of the first element (inclusive) to be
2071     *          searched
2072     * @param toIndex the index of the last element (exclusive) to be searched
2073     * @param key the value to be searched for
2074     * @return index of the search key, if it is contained in the array
2075     *         within the specified range;
2076     *         otherwise, <tt>(-(<i>insertion point</i>) - 1)</tt>.  The
2077     *         <i>insertion point</i> is defined as the point at which the
2078     *         key would be inserted into the array: the index of the first
2079     *         element in the range greater than the key,
2080     *         or <tt>toIndex</tt> if all
2081     *         elements in the range are less than the specified key.  Note
2082     *         that this guarantees that the return value will be &gt;= 0 if
2083     *         and only if the key is found.
2084     * @throws IllegalArgumentException
2085     *         if {@code fromIndex > toIndex}
2086     * @throws ArrayIndexOutOfBoundsException
2087     *         if {@code fromIndex < 0 or toIndex > a.length}
2088     * @since 1.6
2089     */
2090    public static int binarySearch(char[] a, int fromIndex, int toIndex,
2091                                   char key) {
2092        rangeCheck(a.length, fromIndex, toIndex);
2093        return binarySearch0(a, fromIndex, toIndex, key);
2094    }
2095
2096    // Like public version, but without range checks.
2097    private static int binarySearch0(char[] a, int fromIndex, int toIndex,
2098                                     char key) {
2099        int low = fromIndex;
2100        int high = toIndex - 1;
2101
2102        while (low <= high) {
2103            int mid = (low + high) >>> 1;
2104            char midVal = a[mid];
2105
2106            if (midVal < key)
2107                low = mid + 1;
2108            else if (midVal > key)
2109                high = mid - 1;
2110            else
2111                return mid; // key found
2112        }
2113        return -(low + 1);  // key not found.
2114    }
2115
2116    /**
2117     * Searches the specified array of bytes for the specified value using the
2118     * binary search algorithm.  The array must be sorted (as
2119     * by the {@link #sort(byte[])} method) prior to making this call.  If it
2120     * is not sorted, the results are undefined.  If the array contains
2121     * multiple elements with the specified value, there is no guarantee which
2122     * one will be found.
2123     *
2124     * @param a the array to be searched
2125     * @param key the value to be searched for
2126     * @return index of the search key, if it is contained in the array;
2127     *         otherwise, <tt>(-(<i>insertion point</i>) - 1)</tt>.  The
2128     *         <i>insertion point</i> is defined as the point at which the
2129     *         key would be inserted into the array: the index of the first
2130     *         element greater than the key, or <tt>a.length</tt> if all
2131     *         elements in the array are less than the specified key.  Note
2132     *         that this guarantees that the return value will be &gt;= 0 if
2133     *         and only if the key is found.
2134     */
2135    public static int binarySearch(byte[] a, byte key) {
2136        return binarySearch0(a, 0, a.length, key);
2137    }
2138
2139    /**
2140     * Searches a range of
2141     * the specified array of bytes for the specified value using the
2142     * binary search algorithm.
2143     * The range must be sorted (as
2144     * by the {@link #sort(byte[], int, int)} method)
2145     * prior to making this call.  If it
2146     * is not sorted, the results are undefined.  If the range contains
2147     * multiple elements with the specified value, there is no guarantee which
2148     * one will be found.
2149     *
2150     * @param a the array to be searched
2151     * @param fromIndex the index of the first element (inclusive) to be
2152     *          searched
2153     * @param toIndex the index of the last element (exclusive) to be searched
2154     * @param key the value to be searched for
2155     * @return index of the search key, if it is contained in the array
2156     *         within the specified range;
2157     *         otherwise, <tt>(-(<i>insertion point</i>) - 1)</tt>.  The
2158     *         <i>insertion point</i> is defined as the point at which the
2159     *         key would be inserted into the array: the index of the first
2160     *         element in the range greater than the key,
2161     *         or <tt>toIndex</tt> if all
2162     *         elements in the range are less than the specified key.  Note
2163     *         that this guarantees that the return value will be &gt;= 0 if
2164     *         and only if the key is found.
2165     * @throws IllegalArgumentException
2166     *         if {@code fromIndex > toIndex}
2167     * @throws ArrayIndexOutOfBoundsException
2168     *         if {@code fromIndex < 0 or toIndex > a.length}
2169     * @since 1.6
2170     */
2171    public static int binarySearch(byte[] a, int fromIndex, int toIndex,
2172                                   byte key) {
2173        rangeCheck(a.length, fromIndex, toIndex);
2174        return binarySearch0(a, fromIndex, toIndex, key);
2175    }
2176
2177    // Like public version, but without range checks.
2178    private static int binarySearch0(byte[] a, int fromIndex, int toIndex,
2179                                     byte key) {
2180        int low = fromIndex;
2181        int high = toIndex - 1;
2182
2183        while (low <= high) {
2184            int mid = (low + high) >>> 1;
2185            byte midVal = a[mid];
2186
2187            if (midVal < key)
2188                low = mid + 1;
2189            else if (midVal > key)
2190                high = mid - 1;
2191            else
2192                return mid; // key found
2193        }
2194        return -(low + 1);  // key not found.
2195    }
2196
2197    /**
2198     * Searches the specified array of doubles for the specified value using
2199     * the binary search algorithm.  The array must be sorted
2200     * (as by the {@link #sort(double[])} method) prior to making this call.
2201     * If it is not sorted, the results are undefined.  If the array contains
2202     * multiple elements with the specified value, there is no guarantee which
2203     * one will be found.  This method considers all NaN values to be
2204     * equivalent and equal.
2205     *
2206     * @param a the array to be searched
2207     * @param key the value to be searched for
2208     * @return index of the search key, if it is contained in the array;
2209     *         otherwise, <tt>(-(<i>insertion point</i>) - 1)</tt>.  The
2210     *         <i>insertion point</i> is defined as the point at which the
2211     *         key would be inserted into the array: the index of the first
2212     *         element greater than the key, or <tt>a.length</tt> if all
2213     *         elements in the array are less than the specified key.  Note
2214     *         that this guarantees that the return value will be &gt;= 0 if
2215     *         and only if the key is found.
2216     */
2217    public static int binarySearch(double[] a, double key) {
2218        return binarySearch0(a, 0, a.length, key);
2219    }
2220
2221    /**
2222     * Searches a range of
2223     * the specified array of doubles for the specified value using
2224     * the binary search algorithm.
2225     * The range must be sorted
2226     * (as by the {@link #sort(double[], int, int)} method)
2227     * prior to making this call.
2228     * If it is not sorted, the results are undefined.  If the range contains
2229     * multiple elements with the specified value, there is no guarantee which
2230     * one will be found.  This method considers all NaN values to be
2231     * equivalent and equal.
2232     *
2233     * @param a the array to be searched
2234     * @param fromIndex the index of the first element (inclusive) to be
2235     *          searched
2236     * @param toIndex the index of the last element (exclusive) to be searched
2237     * @param key the value to be searched for
2238     * @return index of the search key, if it is contained in the array
2239     *         within the specified range;
2240     *         otherwise, <tt>(-(<i>insertion point</i>) - 1)</tt>.  The
2241     *         <i>insertion point</i> is defined as the point at which the
2242     *         key would be inserted into the array: the index of the first
2243     *         element in the range greater than the key,
2244     *         or <tt>toIndex</tt> if all
2245     *         elements in the range are less than the specified key.  Note
2246     *         that this guarantees that the return value will be &gt;= 0 if
2247     *         and only if the key is found.
2248     * @throws IllegalArgumentException
2249     *         if {@code fromIndex > toIndex}
2250     * @throws ArrayIndexOutOfBoundsException
2251     *         if {@code fromIndex < 0 or toIndex > a.length}
2252     * @since 1.6
2253     */
2254    public static int binarySearch(double[] a, int fromIndex, int toIndex,
2255                                   double key) {
2256        rangeCheck(a.length, fromIndex, toIndex);
2257        return binarySearch0(a, fromIndex, toIndex, key);
2258    }
2259
2260    // Like public version, but without range checks.
2261    private static int binarySearch0(double[] a, int fromIndex, int toIndex,
2262                                     double key) {
2263        int low = fromIndex;
2264        int high = toIndex - 1;
2265
2266        while (low <= high) {
2267            int mid = (low + high) >>> 1;
2268            double midVal = a[mid];
2269
2270            if (midVal < key)
2271                low = mid + 1;  // Neither val is NaN, thisVal is smaller
2272            else if (midVal > key)
2273                high = mid - 1; // Neither val is NaN, thisVal is larger
2274            else {
2275                long midBits = Double.doubleToLongBits(midVal);
2276                long keyBits = Double.doubleToLongBits(key);
2277                if (midBits == keyBits)     // Values are equal
2278                    return mid;             // Key found
2279                else if (midBits < keyBits) // (-0.0, 0.0) or (!NaN, NaN)
2280                    low = mid + 1;
2281                else                        // (0.0, -0.0) or (NaN, !NaN)
2282                    high = mid - 1;
2283            }
2284        }
2285        return -(low + 1);  // key not found.
2286    }
2287
2288    /**
2289     * Searches the specified array of floats for the specified value using
2290     * the binary search algorithm. The array must be sorted
2291     * (as by the {@link #sort(float[])} method) prior to making this call. If
2292     * it is not sorted, the results are undefined. If the array contains
2293     * multiple elements with the specified value, there is no guarantee which
2294     * one will be found. This method considers all NaN values to be
2295     * equivalent and equal.
2296     *
2297     * @param a the array to be searched
2298     * @param key the value to be searched for
2299     * @return index of the search key, if it is contained in the array;
2300     *         otherwise, <tt>(-(<i>insertion point</i>) - 1)</tt>. The
2301     *         <i>insertion point</i> is defined as the point at which the
2302     *         key would be inserted into the array: the index of the first
2303     *         element greater than the key, or <tt>a.length</tt> if all
2304     *         elements in the array are less than the specified key. Note
2305     *         that this guarantees that the return value will be &gt;= 0 if
2306     *         and only if the key is found.
2307     */
2308    public static int binarySearch(float[] a, float key) {
2309        return binarySearch0(a, 0, a.length, key);
2310    }
2311
2312    /**
2313     * Searches a range of
2314     * the specified array of floats for the specified value using
2315     * the binary search algorithm.
2316     * The range must be sorted
2317     * (as by the {@link #sort(float[], int, int)} method)
2318     * prior to making this call. If
2319     * it is not sorted, the results are undefined. If the range contains
2320     * multiple elements with the specified value, there is no guarantee which
2321     * one will be found. This method considers all NaN values to be
2322     * equivalent and equal.
2323     *
2324     * @param a the array to be searched
2325     * @param fromIndex the index of the first element (inclusive) to be
2326     *          searched
2327     * @param toIndex the index of the last element (exclusive) to be searched
2328     * @param key the value to be searched for
2329     * @return index of the search key, if it is contained in the array
2330     *         within the specified range;
2331     *         otherwise, <tt>(-(<i>insertion point</i>) - 1)</tt>. The
2332     *         <i>insertion point</i> is defined as the point at which the
2333     *         key would be inserted into the array: the index of the first
2334     *         element in the range greater than the key,
2335     *         or <tt>toIndex</tt> if all
2336     *         elements in the range are less than the specified key. Note
2337     *         that this guarantees that the return value will be &gt;= 0 if
2338     *         and only if the key is found.
2339     * @throws IllegalArgumentException
2340     *         if {@code fromIndex > toIndex}
2341     * @throws ArrayIndexOutOfBoundsException
2342     *         if {@code fromIndex < 0 or toIndex > a.length}
2343     * @since 1.6
2344     */
2345    public static int binarySearch(float[] a, int fromIndex, int toIndex,
2346                                   float key) {
2347        rangeCheck(a.length, fromIndex, toIndex);
2348        return binarySearch0(a, fromIndex, toIndex, key);
2349    }
2350
2351    // Like public version, but without range checks.
2352    private static int binarySearch0(float[] a, int fromIndex, int toIndex,
2353                                     float key) {
2354        int low = fromIndex;
2355        int high = toIndex - 1;
2356
2357        while (low <= high) {
2358            int mid = (low + high) >>> 1;
2359            float midVal = a[mid];
2360
2361            if (midVal < key)
2362                low = mid + 1;  // Neither val is NaN, thisVal is smaller
2363            else if (midVal > key)
2364                high = mid - 1; // Neither val is NaN, thisVal is larger
2365            else {
2366                int midBits = Float.floatToIntBits(midVal);
2367                int keyBits = Float.floatToIntBits(key);
2368                if (midBits == keyBits)     // Values are equal
2369                    return mid;             // Key found
2370                else if (midBits < keyBits) // (-0.0, 0.0) or (!NaN, NaN)
2371                    low = mid + 1;
2372                else                        // (0.0, -0.0) or (NaN, !NaN)
2373                    high = mid - 1;
2374            }
2375        }
2376        return -(low + 1);  // key not found.
2377    }
2378
2379    /**
2380     * Searches the specified array for the specified object using the binary
2381     * search algorithm. The array must be sorted into ascending order
2382     * according to the
2383     * {@linkplain Comparable natural ordering}
2384     * of its elements (as by the
2385     * {@link #sort(Object[])} method) prior to making this call.
2386     * If it is not sorted, the results are undefined.
2387     * (If the array contains elements that are not mutually comparable (for
2388     * example, strings and integers), it <i>cannot</i> be sorted according
2389     * to the natural ordering of its elements, hence results are undefined.)
2390     * If the array contains multiple
2391     * elements equal to the specified object, there is no guarantee which
2392     * one will be found.
2393     *
2394     * @param a the array to be searched
2395     * @param key the value to be searched for
2396     * @return index of the search key, if it is contained in the array;
2397     *         otherwise, <tt>(-(<i>insertion point</i>) - 1)</tt>.  The
2398     *         <i>insertion point</i> is defined as the point at which the
2399     *         key would be inserted into the array: the index of the first
2400     *         element greater than the key, or <tt>a.length</tt> if all
2401     *         elements in the array are less than the specified key.  Note
2402     *         that this guarantees that the return value will be &gt;= 0 if
2403     *         and only if the key is found.
2404     * @throws ClassCastException if the search key is not comparable to the
2405     *         elements of the array.
2406     */
2407    public static int binarySearch(Object[] a, Object key) {
2408        return binarySearch0(a, 0, a.length, key);
2409    }
2410
2411    /**
2412     * Searches a range of
2413     * the specified array for the specified object using the binary
2414     * search algorithm.
2415     * The range must be sorted into ascending order
2416     * according to the
2417     * {@linkplain Comparable natural ordering}
2418     * of its elements (as by the
2419     * {@link #sort(Object[], int, int)} method) prior to making this
2420     * call.  If it is not sorted, the results are undefined.
2421     * (If the range contains elements that are not mutually comparable (for
2422     * example, strings and integers), it <i>cannot</i> be sorted according
2423     * to the natural ordering of its elements, hence results are undefined.)
2424     * If the range contains multiple
2425     * elements equal to the specified object, there is no guarantee which
2426     * one will be found.
2427     *
2428     * @param a the array to be searched
2429     * @param fromIndex the index of the first element (inclusive) to be
2430     *          searched
2431     * @param toIndex the index of the last element (exclusive) to be searched
2432     * @param key the value to be searched for
2433     * @return index of the search key, if it is contained in the array
2434     *         within the specified range;
2435     *         otherwise, <tt>(-(<i>insertion point</i>) - 1)</tt>.  The
2436     *         <i>insertion point</i> is defined as the point at which the
2437     *         key would be inserted into the array: the index of the first
2438     *         element in the range greater than the key,
2439     *         or <tt>toIndex</tt> if all
2440     *         elements in the range are less than the specified key.  Note
2441     *         that this guarantees that the return value will be &gt;= 0 if
2442     *         and only if the key is found.
2443     * @throws ClassCastException if the search key is not comparable to the
2444     *         elements of the array within the specified range.
2445     * @throws IllegalArgumentException
2446     *         if {@code fromIndex > toIndex}
2447     * @throws ArrayIndexOutOfBoundsException
2448     *         if {@code fromIndex < 0 or toIndex > a.length}
2449     * @since 1.6
2450     */
2451    public static int binarySearch(Object[] a, int fromIndex, int toIndex,
2452                                   Object key) {
2453        rangeCheck(a.length, fromIndex, toIndex);
2454        return binarySearch0(a, fromIndex, toIndex, key);
2455    }
2456
2457    // Like public version, but without range checks.
2458    private static int binarySearch0(Object[] a, int fromIndex, int toIndex,
2459                                     Object key) {
2460        int low = fromIndex;
2461        int high = toIndex - 1;
2462
2463        while (low <= high) {
2464            int mid = (low + high) >>> 1;
2465            Comparable midVal = (Comparable)a[mid];
2466            int cmp = midVal.compareTo(key);
2467
2468            if (cmp < 0)
2469                low = mid + 1;
2470            else if (cmp > 0)
2471                high = mid - 1;
2472            else
2473                return mid; // key found
2474        }
2475        return -(low + 1);  // key not found.
2476    }
2477
2478    /**
2479     * Searches the specified array for the specified object using the binary
2480     * search algorithm.  The array must be sorted into ascending order
2481     * according to the specified comparator (as by the
2482     * {@link #sort(Object[], Comparator) sort(T[], Comparator)}
2483     * method) prior to making this call.  If it is
2484     * not sorted, the results are undefined.
2485     * If the array contains multiple
2486     * elements equal to the specified object, there is no guarantee which one
2487     * will be found.
2488     *
2489     * @param a the array to be searched
2490     * @param key the value to be searched for
2491     * @param c the comparator by which the array is ordered.  A
2492     *        <tt>null</tt> value indicates that the elements'
2493     *        {@linkplain Comparable natural ordering} should be used.
2494     * @return index of the search key, if it is contained in the array;
2495     *         otherwise, <tt>(-(<i>insertion point</i>) - 1)</tt>.  The
2496     *         <i>insertion point</i> is defined as the point at which the
2497     *         key would be inserted into the array: the index of the first
2498     *         element greater than the key, or <tt>a.length</tt> if all
2499     *         elements in the array are less than the specified key.  Note
2500     *         that this guarantees that the return value will be &gt;= 0 if
2501     *         and only if the key is found.
2502     * @throws ClassCastException if the array contains elements that are not
2503     *         <i>mutually comparable</i> using the specified comparator,
2504     *         or the search key is not comparable to the
2505     *         elements of the array using this comparator.
2506     */
2507    public static <T> int binarySearch(T[] a, T key, Comparator<? super T> c) {
2508        return binarySearch0(a, 0, a.length, key, c);
2509    }
2510
2511    /**
2512     * Searches a range of
2513     * the specified array for the specified object using the binary
2514     * search algorithm.
2515     * The range must be sorted into ascending order
2516     * according to the specified comparator (as by the
2517     * {@link #sort(Object[], int, int, Comparator)
2518     * sort(T[], int, int, Comparator)}
2519     * method) prior to making this call.
2520     * If it is not sorted, the results are undefined.
2521     * If the range contains multiple elements equal to the specified object,
2522     * there is no guarantee which one will be found.
2523     *
2524     * @param a the array to be searched
2525     * @param fromIndex the index of the first element (inclusive) to be
2526     *          searched
2527     * @param toIndex the index of the last element (exclusive) to be searched
2528     * @param key the value to be searched for
2529     * @param c the comparator by which the array is ordered.  A
2530     *        <tt>null</tt> value indicates that the elements'
2531     *        {@linkplain Comparable natural ordering} should be used.
2532     * @return index of the search key, if it is contained in the array
2533     *         within the specified range;
2534     *         otherwise, <tt>(-(<i>insertion point</i>) - 1)</tt>.  The
2535     *         <i>insertion point</i> is defined as the point at which the
2536     *         key would be inserted into the array: the index of the first
2537     *         element in the range greater than the key,
2538     *         or <tt>toIndex</tt> if all
2539     *         elements in the range are less than the specified key.  Note
2540     *         that this guarantees that the return value will be &gt;= 0 if
2541     *         and only if the key is found.
2542     * @throws ClassCastException if the range contains elements that are not
2543     *         <i>mutually comparable</i> using the specified comparator,
2544     *         or the search key is not comparable to the
2545     *         elements in the range using this comparator.
2546     * @throws IllegalArgumentException
2547     *         if {@code fromIndex > toIndex}
2548     * @throws ArrayIndexOutOfBoundsException
2549     *         if {@code fromIndex < 0 or toIndex > a.length}
2550     * @since 1.6
2551     */
2552    public static <T> int binarySearch(T[] a, int fromIndex, int toIndex,
2553                                       T key, Comparator<? super T> c) {
2554        rangeCheck(a.length, fromIndex, toIndex);
2555        return binarySearch0(a, fromIndex, toIndex, key, c);
2556    }
2557
2558    // Like public version, but without range checks.
2559    private static <T> int binarySearch0(T[] a, int fromIndex, int toIndex,
2560                                         T key, Comparator<? super T> c) {
2561        if (c == null) {
2562            return binarySearch0(a, fromIndex, toIndex, key);
2563        }
2564        int low = fromIndex;
2565        int high = toIndex - 1;
2566
2567        while (low <= high) {
2568            int mid = (low + high) >>> 1;
2569            T midVal = a[mid];
2570            int cmp = c.compare(midVal, key);
2571            if (cmp < 0)
2572                low = mid + 1;
2573            else if (cmp > 0)
2574                high = mid - 1;
2575            else
2576                return mid; // key found
2577        }
2578        return -(low + 1);  // key not found.
2579    }
2580
2581    // Equality Testing
2582
2583    /**
2584     * Returns <tt>true</tt> if the two specified arrays of longs are
2585     * <i>equal</i> to one another.  Two arrays are considered equal if both
2586     * arrays contain the same number of elements, and all corresponding pairs
2587     * of elements in the two arrays are equal.  In other words, two arrays
2588     * are equal if they contain the same elements in the same order.  Also,
2589     * two array references are considered equal if both are <tt>null</tt>.<p>
2590     *
2591     * @param a one array to be tested for equality
2592     * @param a2 the other array to be tested for equality
2593     * @return <tt>true</tt> if the two arrays are equal
2594     */
2595    public static boolean equals(long[] a, long[] a2) {
2596        if (a==a2)
2597            return true;
2598        if (a==null || a2==null)
2599            return false;
2600
2601        int length = a.length;
2602        if (a2.length != length)
2603            return false;
2604
2605        for (int i=0; i<length; i++)
2606            if (a[i] != a2[i])
2607                return false;
2608
2609        return true;
2610    }
2611
2612    /**
2613     * Returns <tt>true</tt> if the two specified arrays of ints are
2614     * <i>equal</i> to one another.  Two arrays are considered equal if both
2615     * arrays contain the same number of elements, and all corresponding pairs
2616     * of elements in the two arrays are equal.  In other words, two arrays
2617     * are equal if they contain the same elements in the same order.  Also,
2618     * two array references are considered equal if both are <tt>null</tt>.<p>
2619     *
2620     * @param a one array to be tested for equality
2621     * @param a2 the other array to be tested for equality
2622     * @return <tt>true</tt> if the two arrays are equal
2623     */
2624    public static boolean equals(int[] a, int[] a2) {
2625        if (a==a2)
2626            return true;
2627        if (a==null || a2==null)
2628            return false;
2629
2630        int length = a.length;
2631        if (a2.length != length)
2632            return false;
2633
2634        for (int i=0; i<length; i++)
2635            if (a[i] != a2[i])
2636                return false;
2637
2638        return true;
2639    }
2640
2641    /**
2642     * Returns <tt>true</tt> if the two specified arrays of shorts are
2643     * <i>equal</i> to one another.  Two arrays are considered equal if both
2644     * arrays contain the same number of elements, and all corresponding pairs
2645     * of elements in the two arrays are equal.  In other words, two arrays
2646     * are equal if they contain the same elements in the same order.  Also,
2647     * two array references are considered equal if both are <tt>null</tt>.<p>
2648     *
2649     * @param a one array to be tested for equality
2650     * @param a2 the other array to be tested for equality
2651     * @return <tt>true</tt> if the two arrays are equal
2652     */
2653    public static boolean equals(short[] a, short a2[]) {
2654        if (a==a2)
2655            return true;
2656        if (a==null || a2==null)
2657            return false;
2658
2659        int length = a.length;
2660        if (a2.length != length)
2661            return false;
2662
2663        for (int i=0; i<length; i++)
2664            if (a[i] != a2[i])
2665                return false;
2666
2667        return true;
2668    }
2669
2670    /**
2671     * Returns <tt>true</tt> if the two specified arrays of chars are
2672     * <i>equal</i> to one another.  Two arrays are considered equal if both
2673     * arrays contain the same number of elements, and all corresponding pairs
2674     * of elements in the two arrays are equal.  In other words, two arrays
2675     * are equal if they contain the same elements in the same order.  Also,
2676     * two array references are considered equal if both are <tt>null</tt>.<p>
2677     *
2678     * @param a one array to be tested for equality
2679     * @param a2 the other array to be tested for equality
2680     * @return <tt>true</tt> if the two arrays are equal
2681     */
2682    public static boolean equals(char[] a, char[] a2) {
2683        if (a==a2)
2684            return true;
2685        if (a==null || a2==null)
2686            return false;
2687
2688        int length = a.length;
2689        if (a2.length != length)
2690            return false;
2691
2692        for (int i=0; i<length; i++)
2693            if (a[i] != a2[i])
2694                return false;
2695
2696        return true;
2697    }
2698
2699    /**
2700     * Returns <tt>true</tt> if the two specified arrays of bytes are
2701     * <i>equal</i> to one another.  Two arrays are considered equal if both
2702     * arrays contain the same number of elements, and all corresponding pairs
2703     * of elements in the two arrays are equal.  In other words, two arrays
2704     * are equal if they contain the same elements in the same order.  Also,
2705     * two array references are considered equal if both are <tt>null</tt>.<p>
2706     *
2707     * @param a one array to be tested for equality
2708     * @param a2 the other array to be tested for equality
2709     * @return <tt>true</tt> if the two arrays are equal
2710     */
2711    public static boolean equals(byte[] a, byte[] a2) {
2712        if (a==a2)
2713            return true;
2714        if (a==null || a2==null)
2715            return false;
2716
2717        int length = a.length;
2718        if (a2.length != length)
2719            return false;
2720
2721        for (int i=0; i<length; i++)
2722            if (a[i] != a2[i])
2723                return false;
2724
2725        return true;
2726    }
2727
2728    /**
2729     * Returns <tt>true</tt> if the two specified arrays of booleans are
2730     * <i>equal</i> to one another.  Two arrays are considered equal if both
2731     * arrays contain the same number of elements, and all corresponding pairs
2732     * of elements in the two arrays are equal.  In other words, two arrays
2733     * are equal if they contain the same elements in the same order.  Also,
2734     * two array references are considered equal if both are <tt>null</tt>.<p>
2735     *
2736     * @param a one array to be tested for equality
2737     * @param a2 the other array to be tested for equality
2738     * @return <tt>true</tt> if the two arrays are equal
2739     */
2740    public static boolean equals(boolean[] a, boolean[] a2) {
2741        if (a==a2)
2742            return true;
2743        if (a==null || a2==null)
2744            return false;
2745
2746        int length = a.length;
2747        if (a2.length != length)
2748            return false;
2749
2750        for (int i=0; i<length; i++)
2751            if (a[i] != a2[i])
2752                return false;
2753
2754        return true;
2755    }
2756
2757    /**
2758     * Returns <tt>true</tt> if the two specified arrays of doubles are
2759     * <i>equal</i> to one another.  Two arrays are considered equal if both
2760     * arrays contain the same number of elements, and all corresponding pairs
2761     * of elements in the two arrays are equal.  In other words, two arrays
2762     * are equal if they contain the same elements in the same order.  Also,
2763     * two array references are considered equal if both are <tt>null</tt>.<p>
2764     *
2765     * Two doubles <tt>d1</tt> and <tt>d2</tt> are considered equal if:
2766     * <pre>    <tt>new Double(d1).equals(new Double(d2))</tt></pre>
2767     * (Unlike the <tt>==</tt> operator, this method considers
2768     * <tt>NaN</tt> equals to itself, and 0.0d unequal to -0.0d.)
2769     *
2770     * @param a one array to be tested for equality
2771     * @param a2 the other array to be tested for equality
2772     * @return <tt>true</tt> if the two arrays are equal
2773     * @see Double#equals(Object)
2774     */
2775    public static boolean equals(double[] a, double[] a2) {
2776        if (a==a2)
2777            return true;
2778        if (a==null || a2==null)
2779            return false;
2780
2781        int length = a.length;
2782        if (a2.length != length)
2783            return false;
2784
2785        for (int i=0; i<length; i++)
2786            if (Double.doubleToLongBits(a[i])!=Double.doubleToLongBits(a2[i]))
2787                return false;
2788
2789        return true;
2790    }
2791
2792    /**
2793     * Returns <tt>true</tt> if the two specified arrays of floats are
2794     * <i>equal</i> to one another.  Two arrays are considered equal if both
2795     * arrays contain the same number of elements, and all corresponding pairs
2796     * of elements in the two arrays are equal.  In other words, two arrays
2797     * are equal if they contain the same elements in the same order.  Also,
2798     * two array references are considered equal if both are <tt>null</tt>.<p>
2799     *
2800     * Two floats <tt>f1</tt> and <tt>f2</tt> are considered equal if:
2801     * <pre>    <tt>new Float(f1).equals(new Float(f2))</tt></pre>
2802     * (Unlike the <tt>==</tt> operator, this method considers
2803     * <tt>NaN</tt> equals to itself, and 0.0f unequal to -0.0f.)
2804     *
2805     * @param a one array to be tested for equality
2806     * @param a2 the other array to be tested for equality
2807     * @return <tt>true</tt> if the two arrays are equal
2808     * @see Float#equals(Object)
2809     */
2810    public static boolean equals(float[] a, float[] a2) {
2811        if (a==a2)
2812            return true;
2813        if (a==null || a2==null)
2814            return false;
2815
2816        int length = a.length;
2817        if (a2.length != length)
2818            return false;
2819
2820        for (int i=0; i<length; i++)
2821            if (Float.floatToIntBits(a[i])!=Float.floatToIntBits(a2[i]))
2822                return false;
2823
2824        return true;
2825    }
2826
2827    /**
2828     * Returns <tt>true</tt> if the two specified arrays of Objects are
2829     * <i>equal</i> to one another.  The two arrays are considered equal if
2830     * both arrays contain the same number of elements, and all corresponding
2831     * pairs of elements in the two arrays are equal.  Two objects <tt>e1</tt>
2832     * and <tt>e2</tt> are considered <i>equal</i> if <tt>(e1==null ? e2==null
2833     * : e1.equals(e2))</tt>.  In other words, the two arrays are equal if
2834     * they contain the same elements in the same order.  Also, two array
2835     * references are considered equal if both are <tt>null</tt>.<p>
2836     *
2837     * @param a one array to be tested for equality
2838     * @param a2 the other array to be tested for equality
2839     * @return <tt>true</tt> if the two arrays are equal
2840     */
2841    public static boolean equals(Object[] a, Object[] a2) {
2842        if (a==a2)
2843            return true;
2844        if (a==null || a2==null)
2845            return false;
2846
2847        int length = a.length;
2848        if (a2.length != length)
2849            return false;
2850
2851        for (int i=0; i<length; i++) {
2852            Object o1 = a[i];
2853            Object o2 = a2[i];
2854            if (!(o1==null ? o2==null : o1.equals(o2)))
2855                return false;
2856        }
2857
2858        return true;
2859    }
2860
2861    // Filling
2862
2863    /**
2864     * Assigns the specified long value to each element of the specified array
2865     * of longs.
2866     *
2867     * @param a the array to be filled
2868     * @param val the value to be stored in all elements of the array
2869     */
2870    public static void fill(long[] a, long val) {
2871        for (int i = 0, len = a.length; i < len; i++)
2872            a[i] = val;
2873    }
2874
2875    /**
2876     * Assigns the specified long value to each element of the specified
2877     * range of the specified array of longs.  The range to be filled
2878     * extends from index <tt>fromIndex</tt>, inclusive, to index
2879     * <tt>toIndex</tt>, exclusive.  (If <tt>fromIndex==toIndex</tt>, the
2880     * range to be filled is empty.)
2881     *
2882     * @param a the array to be filled
2883     * @param fromIndex the index of the first element (inclusive) to be
2884     *        filled with the specified value
2885     * @param toIndex the index of the last element (exclusive) to be
2886     *        filled with the specified value
2887     * @param val the value to be stored in all elements of the array
2888     * @throws IllegalArgumentException if <tt>fromIndex &gt; toIndex</tt>
2889     * @throws ArrayIndexOutOfBoundsException if <tt>fromIndex &lt; 0</tt> or
2890     *         <tt>toIndex &gt; a.length</tt>
2891     */
2892    public static void fill(long[] a, int fromIndex, int toIndex, long val) {
2893        rangeCheck(a.length, fromIndex, toIndex);
2894        for (int i = fromIndex; i < toIndex; i++)
2895            a[i] = val;
2896    }
2897
2898    /**
2899     * Assigns the specified int value to each element of the specified array
2900     * of ints.
2901     *
2902     * @param a the array to be filled
2903     * @param val the value to be stored in all elements of the array
2904     */
2905    public static void fill(int[] a, int val) {
2906        for (int i = 0, len = a.length; i < len; i++)
2907            a[i] = val;
2908    }
2909
2910    /**
2911     * Assigns the specified int value to each element of the specified
2912     * range of the specified array of ints.  The range to be filled
2913     * extends from index <tt>fromIndex</tt>, inclusive, to index
2914     * <tt>toIndex</tt>, exclusive.  (If <tt>fromIndex==toIndex</tt>, the
2915     * range to be filled is empty.)
2916     *
2917     * @param a the array to be filled
2918     * @param fromIndex the index of the first element (inclusive) to be
2919     *        filled with the specified value
2920     * @param toIndex the index of the last element (exclusive) to be
2921     *        filled with the specified value
2922     * @param val the value to be stored in all elements of the array
2923     * @throws IllegalArgumentException if <tt>fromIndex &gt; toIndex</tt>
2924     * @throws ArrayIndexOutOfBoundsException if <tt>fromIndex &lt; 0</tt> or
2925     *         <tt>toIndex &gt; a.length</tt>
2926     */
2927    public static void fill(int[] a, int fromIndex, int toIndex, int val) {
2928        rangeCheck(a.length, fromIndex, toIndex);
2929        for (int i = fromIndex; i < toIndex; i++)
2930            a[i] = val;
2931    }
2932
2933    /**
2934     * Assigns the specified short value to each element of the specified array
2935     * of shorts.
2936     *
2937     * @param a the array to be filled
2938     * @param val the value to be stored in all elements of the array
2939     */
2940    public static void fill(short[] a, short val) {
2941        for (int i = 0, len = a.length; i < len; i++)
2942            a[i] = val;
2943    }
2944
2945    /**
2946     * Assigns the specified short value to each element of the specified
2947     * range of the specified array of shorts.  The range to be filled
2948     * extends from index <tt>fromIndex</tt>, inclusive, to index
2949     * <tt>toIndex</tt>, exclusive.  (If <tt>fromIndex==toIndex</tt>, the
2950     * range to be filled is empty.)
2951     *
2952     * @param a the array to be filled
2953     * @param fromIndex the index of the first element (inclusive) to be
2954     *        filled with the specified value
2955     * @param toIndex the index of the last element (exclusive) to be
2956     *        filled with the specified value
2957     * @param val the value to be stored in all elements of the array
2958     * @throws IllegalArgumentException if <tt>fromIndex &gt; toIndex</tt>
2959     * @throws ArrayIndexOutOfBoundsException if <tt>fromIndex &lt; 0</tt> or
2960     *         <tt>toIndex &gt; a.length</tt>
2961     */
2962    public static void fill(short[] a, int fromIndex, int toIndex, short val) {
2963        rangeCheck(a.length, fromIndex, toIndex);
2964        for (int i = fromIndex; i < toIndex; i++)
2965            a[i] = val;
2966    }
2967
2968    /**
2969     * Assigns the specified char value to each element of the specified array
2970     * of chars.
2971     *
2972     * @param a the array to be filled
2973     * @param val the value to be stored in all elements of the array
2974     */
2975    public static void fill(char[] a, char val) {
2976        for (int i = 0, len = a.length; i < len; i++)
2977            a[i] = val;
2978    }
2979
2980    /**
2981     * Assigns the specified char value to each element of the specified
2982     * range of the specified array of chars.  The range to be filled
2983     * extends from index <tt>fromIndex</tt>, inclusive, to index
2984     * <tt>toIndex</tt>, exclusive.  (If <tt>fromIndex==toIndex</tt>, the
2985     * range to be filled is empty.)
2986     *
2987     * @param a the array to be filled
2988     * @param fromIndex the index of the first element (inclusive) to be
2989     *        filled with the specified value
2990     * @param toIndex the index of the last element (exclusive) to be
2991     *        filled with the specified value
2992     * @param val the value to be stored in all elements of the array
2993     * @throws IllegalArgumentException if <tt>fromIndex &gt; toIndex</tt>
2994     * @throws ArrayIndexOutOfBoundsException if <tt>fromIndex &lt; 0</tt> or
2995     *         <tt>toIndex &gt; a.length</tt>
2996     */
2997    public static void fill(char[] a, int fromIndex, int toIndex, char val) {
2998        rangeCheck(a.length, fromIndex, toIndex);
2999        for (int i = fromIndex; i < toIndex; i++)
3000            a[i] = val;
3001    }
3002
3003    /**
3004     * Assigns the specified byte value to each element of the specified array
3005     * of bytes.
3006     *
3007     * @param a the array to be filled
3008     * @param val the value to be stored in all elements of the array
3009     */
3010    public static void fill(byte[] a, byte val) {
3011        for (int i = 0, len = a.length; i < len; i++)
3012            a[i] = val;
3013    }
3014
3015    /**
3016     * Assigns the specified byte value to each element of the specified
3017     * range of the specified array of bytes.  The range to be filled
3018     * extends from index <tt>fromIndex</tt>, inclusive, to index
3019     * <tt>toIndex</tt>, exclusive.  (If <tt>fromIndex==toIndex</tt>, the
3020     * range to be filled is empty.)
3021     *
3022     * @param a the array to be filled
3023     * @param fromIndex the index of the first element (inclusive) to be
3024     *        filled with the specified value
3025     * @param toIndex the index of the last element (exclusive) to be
3026     *        filled with the specified value
3027     * @param val the value to be stored in all elements of the array
3028     * @throws IllegalArgumentException if <tt>fromIndex &gt; toIndex</tt>
3029     * @throws ArrayIndexOutOfBoundsException if <tt>fromIndex &lt; 0</tt> or
3030     *         <tt>toIndex &gt; a.length</tt>
3031     */
3032    public static void fill(byte[] a, int fromIndex, int toIndex, byte val) {
3033        rangeCheck(a.length, fromIndex, toIndex);
3034        for (int i = fromIndex; i < toIndex; i++)
3035            a[i] = val;
3036    }
3037
3038    /**
3039     * Assigns the specified boolean value to each element of the specified
3040     * array of booleans.
3041     *
3042     * @param a the array to be filled
3043     * @param val the value to be stored in all elements of the array
3044     */
3045    public static void fill(boolean[] a, boolean val) {
3046        for (int i = 0, len = a.length; i < len; i++)
3047            a[i] = val;
3048    }
3049
3050    /**
3051     * Assigns the specified boolean value to each element of the specified
3052     * range of the specified array of booleans.  The range to be filled
3053     * extends from index <tt>fromIndex</tt>, inclusive, to index
3054     * <tt>toIndex</tt>, exclusive.  (If <tt>fromIndex==toIndex</tt>, the
3055     * range to be filled is empty.)
3056     *
3057     * @param a the array to be filled
3058     * @param fromIndex the index of the first element (inclusive) to be
3059     *        filled with the specified value
3060     * @param toIndex the index of the last element (exclusive) to be
3061     *        filled with the specified value
3062     * @param val the value to be stored in all elements of the array
3063     * @throws IllegalArgumentException if <tt>fromIndex &gt; toIndex</tt>
3064     * @throws ArrayIndexOutOfBoundsException if <tt>fromIndex &lt; 0</tt> or
3065     *         <tt>toIndex &gt; a.length</tt>
3066     */
3067    public static void fill(boolean[] a, int fromIndex, int toIndex,
3068                            boolean val) {
3069        rangeCheck(a.length, fromIndex, toIndex);
3070        for (int i = fromIndex; i < toIndex; i++)
3071            a[i] = val;
3072    }
3073
3074    /**
3075     * Assigns the specified double value to each element of the specified
3076     * array of doubles.
3077     *
3078     * @param a the array to be filled
3079     * @param val the value to be stored in all elements of the array
3080     */
3081    public static void fill(double[] a, double val) {
3082        for (int i = 0, len = a.length; i < len; i++)
3083            a[i] = val;
3084    }
3085
3086    /**
3087     * Assigns the specified double value to each element of the specified
3088     * range of the specified array of doubles.  The range to be filled
3089     * extends from index <tt>fromIndex</tt>, inclusive, to index
3090     * <tt>toIndex</tt>, exclusive.  (If <tt>fromIndex==toIndex</tt>, the
3091     * range to be filled is empty.)
3092     *
3093     * @param a the array to be filled
3094     * @param fromIndex the index of the first element (inclusive) to be
3095     *        filled with the specified value
3096     * @param toIndex the index of the last element (exclusive) to be
3097     *        filled with the specified value
3098     * @param val the value to be stored in all elements of the array
3099     * @throws IllegalArgumentException if <tt>fromIndex &gt; toIndex</tt>
3100     * @throws ArrayIndexOutOfBoundsException if <tt>fromIndex &lt; 0</tt> or
3101     *         <tt>toIndex &gt; a.length</tt>
3102     */
3103    public static void fill(double[] a, int fromIndex, int toIndex,double val){
3104        rangeCheck(a.length, fromIndex, toIndex);
3105        for (int i = fromIndex; i < toIndex; i++)
3106            a[i] = val;
3107    }
3108
3109    /**
3110     * Assigns the specified float value to each element of the specified array
3111     * of floats.
3112     *
3113     * @param a the array to be filled
3114     * @param val the value to be stored in all elements of the array
3115     */
3116    public static void fill(float[] a, float val) {
3117        for (int i = 0, len = a.length; i < len; i++)
3118            a[i] = val;
3119    }
3120
3121    /**
3122     * Assigns the specified float value to each element of the specified
3123     * range of the specified array of floats.  The range to be filled
3124     * extends from index <tt>fromIndex</tt>, inclusive, to index
3125     * <tt>toIndex</tt>, exclusive.  (If <tt>fromIndex==toIndex</tt>, the
3126     * range to be filled is empty.)
3127     *
3128     * @param a the array to be filled
3129     * @param fromIndex the index of the first element (inclusive) to be
3130     *        filled with the specified value
3131     * @param toIndex the index of the last element (exclusive) to be
3132     *        filled with the specified value
3133     * @param val the value to be stored in all elements of the array
3134     * @throws IllegalArgumentException if <tt>fromIndex &gt; toIndex</tt>
3135     * @throws ArrayIndexOutOfBoundsException if <tt>fromIndex &lt; 0</tt> or
3136     *         <tt>toIndex &gt; a.length</tt>
3137     */
3138    public static void fill(float[] a, int fromIndex, int toIndex, float val) {
3139        rangeCheck(a.length, fromIndex, toIndex);
3140        for (int i = fromIndex; i < toIndex; i++)
3141            a[i] = val;
3142    }
3143
3144    /**
3145     * Assigns the specified Object reference to each element of the specified
3146     * array of Objects.
3147     *
3148     * @param a the array to be filled
3149     * @param val the value to be stored in all elements of the array
3150     * @throws ArrayStoreException if the specified value is not of a
3151     *         runtime type that can be stored in the specified array
3152     */
3153    public static void fill(Object[] a, Object val) {
3154        for (int i = 0, len = a.length; i < len; i++)
3155            a[i] = val;
3156    }
3157
3158    /**
3159     * Assigns the specified Object reference to each element of the specified
3160     * range of the specified array of Objects.  The range to be filled
3161     * extends from index <tt>fromIndex</tt>, inclusive, to index
3162     * <tt>toIndex</tt>, exclusive.  (If <tt>fromIndex==toIndex</tt>, the
3163     * range to be filled is empty.)
3164     *
3165     * @param a the array to be filled
3166     * @param fromIndex the index of the first element (inclusive) to be
3167     *        filled with the specified value
3168     * @param toIndex the index of the last element (exclusive) to be
3169     *        filled with the specified value
3170     * @param val the value to be stored in all elements of the array
3171     * @throws IllegalArgumentException if <tt>fromIndex &gt; toIndex</tt>
3172     * @throws ArrayIndexOutOfBoundsException if <tt>fromIndex &lt; 0</tt> or
3173     *         <tt>toIndex &gt; a.length</tt>
3174     * @throws ArrayStoreException if the specified value is not of a
3175     *         runtime type that can be stored in the specified array
3176     */
3177    public static void fill(Object[] a, int fromIndex, int toIndex, Object val) {
3178        rangeCheck(a.length, fromIndex, toIndex);
3179        for (int i = fromIndex; i < toIndex; i++)
3180            a[i] = val;
3181    }
3182
3183    // Cloning
3184
3185    /**
3186     * Copies the specified array, truncating or padding with nulls (if necessary)
3187     * so the copy has the specified length.  For all indices that are
3188     * valid in both the original array and the copy, the two arrays will
3189     * contain identical values.  For any indices that are valid in the
3190     * copy but not the original, the copy will contain <tt>null</tt>.
3191     * Such indices will exist if and only if the specified length
3192     * is greater than that of the original array.
3193     * The resulting array is of exactly the same class as the original array.
3194     *
3195     * @param original the array to be copied
3196     * @param newLength the length of the copy to be returned
3197     * @return a copy of the original array, truncated or padded with nulls
3198     *     to obtain the specified length
3199     * @throws NegativeArraySizeException if <tt>newLength</tt> is negative
3200     * @throws NullPointerException if <tt>original</tt> is null
3201     * @since 1.6
3202     */
3203    public static <T> T[] copyOf(T[] original, int newLength) {
3204        return (T[]) copyOf(original, newLength, original.getClass());
3205    }
3206
3207    /**
3208     * Copies the specified array, truncating or padding with nulls (if necessary)
3209     * so the copy has the specified length.  For all indices that are
3210     * valid in both the original array and the copy, the two arrays will
3211     * contain identical values.  For any indices that are valid in the
3212     * copy but not the original, the copy will contain <tt>null</tt>.
3213     * Such indices will exist if and only if the specified length
3214     * is greater than that of the original array.
3215     * The resulting array is of the class <tt>newType</tt>.
3216     *
3217     * @param original the array to be copied
3218     * @param newLength the length of the copy to be returned
3219     * @param newType the class of the copy to be returned
3220     * @return a copy of the original array, truncated or padded with nulls
3221     *     to obtain the specified length
3222     * @throws NegativeArraySizeException if <tt>newLength</tt> is negative
3223     * @throws NullPointerException if <tt>original</tt> is null
3224     * @throws ArrayStoreException if an element copied from
3225     *     <tt>original</tt> is not of a runtime type that can be stored in
3226     *     an array of class <tt>newType</tt>
3227     * @since 1.6
3228     */
3229    public static <T,U> T[] copyOf(U[] original, int newLength, Class<? extends T[]> newType) {
3230        T[] copy = ((Object)newType == (Object)Object[].class)
3231            ? (T[]) new Object[newLength]
3232            : (T[]) Array.newInstance(newType.getComponentType(), newLength);
3233        System.arraycopy(original, 0, copy, 0,
3234                         Math.min(original.length, newLength));
3235        return copy;
3236    }
3237
3238    /**
3239     * Copies the specified array, truncating or padding with zeros (if necessary)
3240     * so the copy has the specified length.  For all indices that are
3241     * valid in both the original array and the copy, the two arrays will
3242     * contain identical values.  For any indices that are valid in the
3243     * copy but not the original, the copy will contain <tt>(byte)0</tt>.
3244     * Such indices will exist if and only if the specified length
3245     * is greater than that of the original array.
3246     *
3247     * @param original the array to be copied
3248     * @param newLength the length of the copy to be returned
3249     * @return a copy of the original array, truncated or padded with zeros
3250     *     to obtain the specified length
3251     * @throws NegativeArraySizeException if <tt>newLength</tt> is negative
3252     * @throws NullPointerException if <tt>original</tt> is null
3253     * @since 1.6
3254     */
3255    public static byte[] copyOf(byte[] original, int newLength) {
3256        byte[] copy = new byte[newLength];
3257        System.arraycopy(original, 0, copy, 0,
3258                         Math.min(original.length, newLength));
3259        return copy;
3260    }
3261
3262    /**
3263     * Copies the specified array, truncating or padding with zeros (if necessary)
3264     * so the copy has the specified length.  For all indices that are
3265     * valid in both the original array and the copy, the two arrays will
3266     * contain identical values.  For any indices that are valid in the
3267     * copy but not the original, the copy will contain <tt>(short)0</tt>.
3268     * Such indices will exist if and only if the specified length
3269     * is greater than that of the original array.
3270     *
3271     * @param original the array to be copied
3272     * @param newLength the length of the copy to be returned
3273     * @return a copy of the original array, truncated or padded with zeros
3274     *     to obtain the specified length
3275     * @throws NegativeArraySizeException if <tt>newLength</tt> is negative
3276     * @throws NullPointerException if <tt>original</tt> is null
3277     * @since 1.6
3278     */
3279    public static short[] copyOf(short[] original, int newLength) {
3280        short[] copy = new short[newLength];
3281        System.arraycopy(original, 0, copy, 0,
3282                         Math.min(original.length, newLength));
3283        return copy;
3284    }
3285
3286    /**
3287     * Copies the specified array, truncating or padding with zeros (if necessary)
3288     * so the copy has the specified length.  For all indices that are
3289     * valid in both the original array and the copy, the two arrays will
3290     * contain identical values.  For any indices that are valid in the
3291     * copy but not the original, the copy will contain <tt>0</tt>.
3292     * Such indices will exist if and only if the specified length
3293     * is greater than that of the original array.
3294     *
3295     * @param original the array to be copied
3296     * @param newLength the length of the copy to be returned
3297     * @return a copy of the original array, truncated or padded with zeros
3298     *     to obtain the specified length
3299     * @throws NegativeArraySizeException if <tt>newLength</tt> is negative
3300     * @throws NullPointerException if <tt>original</tt> is null
3301     * @since 1.6
3302     */
3303    public static int[] copyOf(int[] original, int newLength) {
3304        int[] copy = new int[newLength];
3305        System.arraycopy(original, 0, copy, 0,
3306                         Math.min(original.length, newLength));
3307        return copy;
3308    }
3309
3310    /**
3311     * Copies the specified array, truncating or padding with zeros (if necessary)
3312     * so the copy has the specified length.  For all indices that are
3313     * valid in both the original array and the copy, the two arrays will
3314     * contain identical values.  For any indices that are valid in the
3315     * copy but not the original, the copy will contain <tt>0L</tt>.
3316     * Such indices will exist if and only if the specified length
3317     * is greater than that of the original array.
3318     *
3319     * @param original the array to be copied
3320     * @param newLength the length of the copy to be returned
3321     * @return a copy of the original array, truncated or padded with zeros
3322     *     to obtain the specified length
3323     * @throws NegativeArraySizeException if <tt>newLength</tt> is negative
3324     * @throws NullPointerException if <tt>original</tt> is null
3325     * @since 1.6
3326     */
3327    public static long[] copyOf(long[] original, int newLength) {
3328        long[] copy = new long[newLength];
3329        System.arraycopy(original, 0, copy, 0,
3330                         Math.min(original.length, newLength));
3331        return copy;
3332    }
3333
3334    /**
3335     * Copies the specified array, truncating or padding with null characters (if necessary)
3336     * so the copy has the specified length.  For all indices that are valid
3337     * in both the original array and the copy, the two arrays will contain
3338     * identical values.  For any indices that are valid in the copy but not
3339     * the original, the copy will contain <tt>'\\u000'</tt>.  Such indices
3340     * will exist if and only if the specified length is greater than that of
3341     * the original array.
3342     *
3343     * @param original the array to be copied
3344     * @param newLength the length of the copy to be returned
3345     * @return a copy of the original array, truncated or padded with null characters
3346     *     to obtain the specified length
3347     * @throws NegativeArraySizeException if <tt>newLength</tt> is negative
3348     * @throws NullPointerException if <tt>original</tt> is null
3349     * @since 1.6
3350     */
3351    public static char[] copyOf(char[] original, int newLength) {
3352        char[] copy = new char[newLength];
3353        System.arraycopy(original, 0, copy, 0,
3354                         Math.min(original.length, newLength));
3355        return copy;
3356    }
3357
3358    /**
3359     * Copies the specified array, truncating or padding with zeros (if necessary)
3360     * so the copy has the specified length.  For all indices that are
3361     * valid in both the original array and the copy, the two arrays will
3362     * contain identical values.  For any indices that are valid in the
3363     * copy but not the original, the copy will contain <tt>0f</tt>.
3364     * Such indices will exist if and only if the specified length
3365     * is greater than that of the original array.
3366     *
3367     * @param original the array to be copied
3368     * @param newLength the length of the copy to be returned
3369     * @return a copy of the original array, truncated or padded with zeros
3370     *     to obtain the specified length
3371     * @throws NegativeArraySizeException if <tt>newLength</tt> is negative
3372     * @throws NullPointerException if <tt>original</tt> is null
3373     * @since 1.6
3374     */
3375    public static float[] copyOf(float[] original, int newLength) {
3376        float[] copy = new float[newLength];
3377        System.arraycopy(original, 0, copy, 0,
3378                         Math.min(original.length, newLength));
3379        return copy;
3380    }
3381
3382    /**
3383     * Copies the specified array, truncating or padding with zeros (if necessary)
3384     * so the copy has the specified length.  For all indices that are
3385     * valid in both the original array and the copy, the two arrays will
3386     * contain identical values.  For any indices that are valid in the
3387     * copy but not the original, the copy will contain <tt>0d</tt>.
3388     * Such indices will exist if and only if the specified length
3389     * is greater than that of the original array.
3390     *
3391     * @param original the array to be copied
3392     * @param newLength the length of the copy to be returned
3393     * @return a copy of the original array, truncated or padded with zeros
3394     *     to obtain the specified length
3395     * @throws NegativeArraySizeException if <tt>newLength</tt> is negative
3396     * @throws NullPointerException if <tt>original</tt> is null
3397     * @since 1.6
3398     */
3399    public static double[] copyOf(double[] original, int newLength) {
3400        double[] copy = new double[newLength];
3401        System.arraycopy(original, 0, copy, 0,
3402                         Math.min(original.length, newLength));
3403        return copy;
3404    }
3405
3406    /**
3407     * Copies the specified array, truncating or padding with <tt>false</tt> (if necessary)
3408     * so the copy has the specified length.  For all indices that are
3409     * valid in both the original array and the copy, the two arrays will
3410     * contain identical values.  For any indices that are valid in the
3411     * copy but not the original, the copy will contain <tt>false</tt>.
3412     * Such indices will exist if and only if the specified length
3413     * is greater than that of the original array.
3414     *
3415     * @param original the array to be copied
3416     * @param newLength the length of the copy to be returned
3417     * @return a copy of the original array, truncated or padded with false elements
3418     *     to obtain the specified length
3419     * @throws NegativeArraySizeException if <tt>newLength</tt> is negative
3420     * @throws NullPointerException if <tt>original</tt> is null
3421     * @since 1.6
3422     */
3423    public static boolean[] copyOf(boolean[] original, int newLength) {
3424        boolean[] copy = new boolean[newLength];
3425        System.arraycopy(original, 0, copy, 0,
3426                         Math.min(original.length, newLength));
3427        return copy;
3428    }
3429
3430    /**
3431     * Copies the specified range of the specified array into a new array.
3432     * The initial index of the range (<tt>from</tt>) must lie between zero
3433     * and <tt>original.length</tt>, inclusive.  The value at
3434     * <tt>original[from]</tt> is placed into the initial element of the copy
3435     * (unless <tt>from == original.length</tt> or <tt>from == to</tt>).
3436     * Values from subsequent elements in the original array are placed into
3437     * subsequent elements in the copy.  The final index of the range
3438     * (<tt>to</tt>), which must be greater than or equal to <tt>from</tt>,
3439     * may be greater than <tt>original.length</tt>, in which case
3440     * <tt>null</tt> is placed in all elements of the copy whose index is
3441     * greater than or equal to <tt>original.length - from</tt>.  The length
3442     * of the returned array will be <tt>to - from</tt>.
3443     * <p>
3444     * The resulting array is of exactly the same class as the original array.
3445     *
3446     * @param original the array from which a range is to be copied
3447     * @param from the initial index of the range to be copied, inclusive
3448     * @param to the final index of the range to be copied, exclusive.
3449     *     (This index may lie outside the array.)
3450     * @return a new array containing the specified range from the original array,
3451     *     truncated or padded with nulls to obtain the required length
3452     * @throws ArrayIndexOutOfBoundsException if {@code from < 0}
3453     *     or {@code from > original.length}
3454     * @throws IllegalArgumentException if <tt>from &gt; to</tt>
3455     * @throws NullPointerException if <tt>original</tt> is null
3456     * @since 1.6
3457     */
3458    public static <T> T[] copyOfRange(T[] original, int from, int to) {
3459        return copyOfRange(original, from, to, (Class<T[]>) original.getClass());
3460    }
3461
3462    /**
3463     * Copies the specified range of the specified array into a new array.
3464     * The initial index of the range (<tt>from</tt>) must lie between zero
3465     * and <tt>original.length</tt>, inclusive.  The value at
3466     * <tt>original[from]</tt> is placed into the initial element of the copy
3467     * (unless <tt>from == original.length</tt> or <tt>from == to</tt>).
3468     * Values from subsequent elements in the original array are placed into
3469     * subsequent elements in the copy.  The final index of the range
3470     * (<tt>to</tt>), which must be greater than or equal to <tt>from</tt>,
3471     * may be greater than <tt>original.length</tt>, in which case
3472     * <tt>null</tt> is placed in all elements of the copy whose index is
3473     * greater than or equal to <tt>original.length - from</tt>.  The length
3474     * of the returned array will be <tt>to - from</tt>.
3475     * The resulting array is of the class <tt>newType</tt>.
3476     *
3477     * @param original the array from which a range is to be copied
3478     * @param from the initial index of the range to be copied, inclusive
3479     * @param to the final index of the range to be copied, exclusive.
3480     *     (This index may lie outside the array.)
3481     * @param newType the class of the copy to be returned
3482     * @return a new array containing the specified range from the original array,
3483     *     truncated or padded with nulls to obtain the required length
3484     * @throws ArrayIndexOutOfBoundsException if {@code from < 0}
3485     *     or {@code from > original.length}
3486     * @throws IllegalArgumentException if <tt>from &gt; to</tt>
3487     * @throws NullPointerException if <tt>original</tt> is null
3488     * @throws ArrayStoreException if an element copied from
3489     *     <tt>original</tt> is not of a runtime type that can be stored in
3490     *     an array of class <tt>newType</tt>.
3491     * @since 1.6
3492     */
3493    public static <T,U> T[] copyOfRange(U[] original, int from, int to, Class<? extends T[]> newType) {
3494        int newLength = to - from;
3495        if (newLength < 0)
3496            throw new IllegalArgumentException(from + " > " + to);
3497        T[] copy = ((Object)newType == (Object)Object[].class)
3498            ? (T[]) new Object[newLength]
3499            : (T[]) Array.newInstance(newType.getComponentType(), newLength);
3500        System.arraycopy(original, from, copy, 0,
3501                         Math.min(original.length - from, newLength));
3502        return copy;
3503    }
3504
3505    /**
3506     * Copies the specified range of the specified array into a new array.
3507     * The initial index of the range (<tt>from</tt>) must lie between zero
3508     * and <tt>original.length</tt>, inclusive.  The value at
3509     * <tt>original[from]</tt> is placed into the initial element of the copy
3510     * (unless <tt>from == original.length</tt> or <tt>from == to</tt>).
3511     * Values from subsequent elements in the original array are placed into
3512     * subsequent elements in the copy.  The final index of the range
3513     * (<tt>to</tt>), which must be greater than or equal to <tt>from</tt>,
3514     * may be greater than <tt>original.length</tt>, in which case
3515     * <tt>(byte)0</tt> is placed in all elements of the copy whose index is
3516     * greater than or equal to <tt>original.length - from</tt>.  The length
3517     * of the returned array will be <tt>to - from</tt>.
3518     *
3519     * @param original the array from which a range is to be copied
3520     * @param from the initial index of the range to be copied, inclusive
3521     * @param to the final index of the range to be copied, exclusive.
3522     *     (This index may lie outside the array.)
3523     * @return a new array containing the specified range from the original array,
3524     *     truncated or padded with zeros to obtain the required length
3525     * @throws ArrayIndexOutOfBoundsException if {@code from < 0}
3526     *     or {@code from > original.length}
3527     * @throws IllegalArgumentException if <tt>from &gt; to</tt>
3528     * @throws NullPointerException if <tt>original</tt> is null
3529     * @since 1.6
3530     */
3531    public static byte[] copyOfRange(byte[] original, int from, int to) {
3532        int newLength = to - from;
3533        if (newLength < 0)
3534            throw new IllegalArgumentException(from + " > " + to);
3535        byte[] copy = new byte[newLength];
3536        System.arraycopy(original, from, copy, 0,
3537                         Math.min(original.length - from, newLength));
3538        return copy;
3539    }
3540
3541    /**
3542     * Copies the specified range of the specified array into a new array.
3543     * The initial index of the range (<tt>from</tt>) must lie between zero
3544     * and <tt>original.length</tt>, inclusive.  The value at
3545     * <tt>original[from]</tt> is placed into the initial element of the copy
3546     * (unless <tt>from == original.length</tt> or <tt>from == to</tt>).
3547     * Values from subsequent elements in the original array are placed into
3548     * subsequent elements in the copy.  The final index of the range
3549     * (<tt>to</tt>), which must be greater than or equal to <tt>from</tt>,
3550     * may be greater than <tt>original.length</tt>, in which case
3551     * <tt>(short)0</tt> is placed in all elements of the copy whose index is
3552     * greater than or equal to <tt>original.length - from</tt>.  The length
3553     * of the returned array will be <tt>to - from</tt>.
3554     *
3555     * @param original the array from which a range is to be copied
3556     * @param from the initial index of the range to be copied, inclusive
3557     * @param to the final index of the range to be copied, exclusive.
3558     *     (This index may lie outside the array.)
3559     * @return a new array containing the specified range from the original array,
3560     *     truncated or padded with zeros to obtain the required length
3561     * @throws ArrayIndexOutOfBoundsException if {@code from < 0}
3562     *     or {@code from > original.length}
3563     * @throws IllegalArgumentException if <tt>from &gt; to</tt>
3564     * @throws NullPointerException if <tt>original</tt> is null
3565     * @since 1.6
3566     */
3567    public static short[] copyOfRange(short[] original, int from, int to) {
3568        int newLength = to - from;
3569        if (newLength < 0)
3570            throw new IllegalArgumentException(from + " > " + to);
3571        short[] copy = new short[newLength];
3572        System.arraycopy(original, from, copy, 0,
3573                         Math.min(original.length - from, newLength));
3574        return copy;
3575    }
3576
3577    /**
3578     * Copies the specified range of the specified array into a new array.
3579     * The initial index of the range (<tt>from</tt>) must lie between zero
3580     * and <tt>original.length</tt>, inclusive.  The value at
3581     * <tt>original[from]</tt> is placed into the initial element of the copy
3582     * (unless <tt>from == original.length</tt> or <tt>from == to</tt>).
3583     * Values from subsequent elements in the original array are placed into
3584     * subsequent elements in the copy.  The final index of the range
3585     * (<tt>to</tt>), which must be greater than or equal to <tt>from</tt>,
3586     * may be greater than <tt>original.length</tt>, in which case
3587     * <tt>0</tt> is placed in all elements of the copy whose index is
3588     * greater than or equal to <tt>original.length - from</tt>.  The length
3589     * of the returned array will be <tt>to - from</tt>.
3590     *
3591     * @param original the array from which a range is to be copied
3592     * @param from the initial index of the range to be copied, inclusive
3593     * @param to the final index of the range to be copied, exclusive.
3594     *     (This index may lie outside the array.)
3595     * @return a new array containing the specified range from the original array,
3596     *     truncated or padded with zeros to obtain the required length
3597     * @throws ArrayIndexOutOfBoundsException if {@code from < 0}
3598     *     or {@code from > original.length}
3599     * @throws IllegalArgumentException if <tt>from &gt; to</tt>
3600     * @throws NullPointerException if <tt>original</tt> is null
3601     * @since 1.6
3602     */
3603    public static int[] copyOfRange(int[] original, int from, int to) {
3604        int newLength = to - from;
3605        if (newLength < 0)
3606            throw new IllegalArgumentException(from + " > " + to);
3607        int[] copy = new int[newLength];
3608        System.arraycopy(original, from, copy, 0,
3609                         Math.min(original.length - from, newLength));
3610        return copy;
3611    }
3612
3613    /**
3614     * Copies the specified range of the specified array into a new array.
3615     * The initial index of the range (<tt>from</tt>) must lie between zero
3616     * and <tt>original.length</tt>, inclusive.  The value at
3617     * <tt>original[from]</tt> is placed into the initial element of the copy
3618     * (unless <tt>from == original.length</tt> or <tt>from == to</tt>).
3619     * Values from subsequent elements in the original array are placed into
3620     * subsequent elements in the copy.  The final index of the range
3621     * (<tt>to</tt>), which must be greater than or equal to <tt>from</tt>,
3622     * may be greater than <tt>original.length</tt>, in which case
3623     * <tt>0L</tt> is placed in all elements of the copy whose index is
3624     * greater than or equal to <tt>original.length - from</tt>.  The length
3625     * of the returned array will be <tt>to - from</tt>.
3626     *
3627     * @param original the array from which a range is to be copied
3628     * @param from the initial index of the range to be copied, inclusive
3629     * @param to the final index of the range to be copied, exclusive.
3630     *     (This index may lie outside the array.)
3631     * @return a new array containing the specified range from the original array,
3632     *     truncated or padded with zeros to obtain the required length
3633     * @throws ArrayIndexOutOfBoundsException if {@code from < 0}
3634     *     or {@code from > original.length}
3635     * @throws IllegalArgumentException if <tt>from &gt; to</tt>
3636     * @throws NullPointerException if <tt>original</tt> is null
3637     * @since 1.6
3638     */
3639    public static long[] copyOfRange(long[] original, int from, int to) {
3640        int newLength = to - from;
3641        if (newLength < 0)
3642            throw new IllegalArgumentException(from + " > " + to);
3643        long[] copy = new long[newLength];
3644        System.arraycopy(original, from, copy, 0,
3645                         Math.min(original.length - from, newLength));
3646        return copy;
3647    }
3648
3649    /**
3650     * Copies the specified range of the specified array into a new array.
3651     * The initial index of the range (<tt>from</tt>) must lie between zero
3652     * and <tt>original.length</tt>, inclusive.  The value at
3653     * <tt>original[from]</tt> is placed into the initial element of the copy
3654     * (unless <tt>from == original.length</tt> or <tt>from == to</tt>).
3655     * Values from subsequent elements in the original array are placed into
3656     * subsequent elements in the copy.  The final index of the range
3657     * (<tt>to</tt>), which must be greater than or equal to <tt>from</tt>,
3658     * may be greater than <tt>original.length</tt>, in which case
3659     * <tt>'\\u000'</tt> is placed in all elements of the copy whose index is
3660     * greater than or equal to <tt>original.length - from</tt>.  The length
3661     * of the returned array will be <tt>to - from</tt>.
3662     *
3663     * @param original the array from which a range is to be copied
3664     * @param from the initial index of the range to be copied, inclusive
3665     * @param to the final index of the range to be copied, exclusive.
3666     *     (This index may lie outside the array.)
3667     * @return a new array containing the specified range from the original array,
3668     *     truncated or padded with null characters to obtain the required length
3669     * @throws ArrayIndexOutOfBoundsException if {@code from < 0}
3670     *     or {@code from > original.length}
3671     * @throws IllegalArgumentException if <tt>from &gt; to</tt>
3672     * @throws NullPointerException if <tt>original</tt> is null
3673     * @since 1.6
3674     */
3675    public static char[] copyOfRange(char[] original, int from, int to) {
3676        int newLength = to - from;
3677        if (newLength < 0)
3678            throw new IllegalArgumentException(from + " > " + to);
3679        char[] copy = new char[newLength];
3680        System.arraycopy(original, from, copy, 0,
3681                         Math.min(original.length - from, newLength));
3682        return copy;
3683    }
3684
3685    /**
3686     * Copies the specified range of the specified array into a new array.
3687     * The initial index of the range (<tt>from</tt>) must lie between zero
3688     * and <tt>original.length</tt>, inclusive.  The value at
3689     * <tt>original[from]</tt> is placed into the initial element of the copy
3690     * (unless <tt>from == original.length</tt> or <tt>from == to</tt>).
3691     * Values from subsequent elements in the original array are placed into
3692     * subsequent elements in the copy.  The final index of the range
3693     * (<tt>to</tt>), which must be greater than or equal to <tt>from</tt>,
3694     * may be greater than <tt>original.length</tt>, in which case
3695     * <tt>0f</tt> is placed in all elements of the copy whose index is
3696     * greater than or equal to <tt>original.length - from</tt>.  The length
3697     * of the returned array will be <tt>to - from</tt>.
3698     *
3699     * @param original the array from which a range is to be copied
3700     * @param from the initial index of the range to be copied, inclusive
3701     * @param to the final index of the range to be copied, exclusive.
3702     *     (This index may lie outside the array.)
3703     * @return a new array containing the specified range from the original array,
3704     *     truncated or padded with zeros to obtain the required length
3705     * @throws ArrayIndexOutOfBoundsException if {@code from < 0}
3706     *     or {@code from > original.length}
3707     * @throws IllegalArgumentException if <tt>from &gt; to</tt>
3708     * @throws NullPointerException if <tt>original</tt> is null
3709     * @since 1.6
3710     */
3711    public static float[] copyOfRange(float[] original, int from, int to) {
3712        int newLength = to - from;
3713        if (newLength < 0)
3714            throw new IllegalArgumentException(from + " > " + to);
3715        float[] copy = new float[newLength];
3716        System.arraycopy(original, from, copy, 0,
3717                         Math.min(original.length - from, newLength));
3718        return copy;
3719    }
3720
3721    /**
3722     * Copies the specified range of the specified array into a new array.
3723     * The initial index of the range (<tt>from</tt>) must lie between zero
3724     * and <tt>original.length</tt>, inclusive.  The value at
3725     * <tt>original[from]</tt> is placed into the initial element of the copy
3726     * (unless <tt>from == original.length</tt> or <tt>from == to</tt>).
3727     * Values from subsequent elements in the original array are placed into
3728     * subsequent elements in the copy.  The final index of the range
3729     * (<tt>to</tt>), which must be greater than or equal to <tt>from</tt>,
3730     * may be greater than <tt>original.length</tt>, in which case
3731     * <tt>0d</tt> is placed in all elements of the copy whose index is
3732     * greater than or equal to <tt>original.length - from</tt>.  The length
3733     * of the returned array will be <tt>to - from</tt>.
3734     *
3735     * @param original the array from which a range is to be copied
3736     * @param from the initial index of the range to be copied, inclusive
3737     * @param to the final index of the range to be copied, exclusive.
3738     *     (This index may lie outside the array.)
3739     * @return a new array containing the specified range from the original array,
3740     *     truncated or padded with zeros to obtain the required length
3741     * @throws ArrayIndexOutOfBoundsException if {@code from < 0}
3742     *     or {@code from > original.length}
3743     * @throws IllegalArgumentException if <tt>from &gt; to</tt>
3744     * @throws NullPointerException if <tt>original</tt> is null
3745     * @since 1.6
3746     */
3747    public static double[] copyOfRange(double[] original, int from, int to) {
3748        int newLength = to - from;
3749        if (newLength < 0)
3750            throw new IllegalArgumentException(from + " > " + to);
3751        double[] copy = new double[newLength];
3752        System.arraycopy(original, from, copy, 0,
3753                         Math.min(original.length - from, newLength));
3754        return copy;
3755    }
3756
3757    /**
3758     * Copies the specified range of the specified array into a new array.
3759     * The initial index of the range (<tt>from</tt>) must lie between zero
3760     * and <tt>original.length</tt>, inclusive.  The value at
3761     * <tt>original[from]</tt> is placed into the initial element of the copy
3762     * (unless <tt>from == original.length</tt> or <tt>from == to</tt>).
3763     * Values from subsequent elements in the original array are placed into
3764     * subsequent elements in the copy.  The final index of the range
3765     * (<tt>to</tt>), which must be greater than or equal to <tt>from</tt>,
3766     * may be greater than <tt>original.length</tt>, in which case
3767     * <tt>false</tt> is placed in all elements of the copy whose index is
3768     * greater than or equal to <tt>original.length - from</tt>.  The length
3769     * of the returned array will be <tt>to - from</tt>.
3770     *
3771     * @param original the array from which a range is to be copied
3772     * @param from the initial index of the range to be copied, inclusive
3773     * @param to the final index of the range to be copied, exclusive.
3774     *     (This index may lie outside the array.)
3775     * @return a new array containing the specified range from the original array,
3776     *     truncated or padded with false elements to obtain the required length
3777     * @throws ArrayIndexOutOfBoundsException if {@code from < 0}
3778     *     or {@code from > original.length}
3779     * @throws IllegalArgumentException if <tt>from &gt; to</tt>
3780     * @throws NullPointerException if <tt>original</tt> is null
3781     * @since 1.6
3782     */
3783    public static boolean[] copyOfRange(boolean[] original, int from, int to) {
3784        int newLength = to - from;
3785        if (newLength < 0)
3786            throw new IllegalArgumentException(from + " > " + to);
3787        boolean[] copy = new boolean[newLength];
3788        System.arraycopy(original, from, copy, 0,
3789                         Math.min(original.length - from, newLength));
3790        return copy;
3791    }
3792
3793    // Misc
3794
3795    /**
3796     * Returns a fixed-size list backed by the specified array.  (Changes to
3797     * the returned list "write through" to the array.)  This method acts
3798     * as bridge between array-based and collection-based APIs, in
3799     * combination with {@link Collection#toArray}.  The returned list is
3800     * serializable and implements {@link RandomAccess}.
3801     *
3802     * <p>This method also provides a convenient way to create a fixed-size
3803     * list initialized to contain several elements:
3804     * <pre>
3805     *     List&lt;String&gt; stooges = Arrays.asList("Larry", "Moe", "Curly");
3806     * </pre>
3807     *
3808     * @param a the array by which the list will be backed
3809     * @return a list view of the specified array
3810     */
3811    @SafeVarargs
3812    public static <T> List<T> asList(T... a) {
3813        return new ArrayList<>(a);
3814    }
3815
3816    /**
3817     * @serial include
3818     */
3819    private static class ArrayList<E> extends AbstractList<E>
3820        implements RandomAccess, java.io.Serializable
3821    {
3822        private static final long serialVersionUID = -2764017481108945198L;
3823        private final E[] a;
3824
3825        ArrayList(E[] array) {
3826            a = Objects.requireNonNull(array);
3827        }
3828
3829        @Override
3830        public int size() {
3831            return a.length;
3832        }
3833
3834        @Override
3835        public Object[] toArray() {
3836            return a.clone();
3837        }
3838
3839        @Override
3840        @SuppressWarnings("unchecked")
3841        public <T> T[] toArray(T[] a) {
3842            int size = size();
3843            if (a.length < size)
3844                return Arrays.copyOf(this.a, size,
3845                                     (Class<? extends T[]>) a.getClass());
3846            System.arraycopy(this.a, 0, a, 0, size);
3847            if (a.length > size)
3848                a[size] = null;
3849            return a;
3850        }
3851
3852        @Override
3853        public E get(int index) {
3854            return a[index];
3855        }
3856
3857        @Override
3858        public E set(int index, E element) {
3859            E oldValue = a[index];
3860            a[index] = element;
3861            return oldValue;
3862        }
3863
3864        @Override
3865        public int indexOf(Object o) {
3866            if (o==null) {
3867                for (int i=0; i<a.length; i++)
3868                    if (a[i]==null)
3869                        return i;
3870            } else {
3871                for (int i=0; i<a.length; i++)
3872                    if (o.equals(a[i]))
3873                        return i;
3874            }
3875            return -1;
3876        }
3877
3878        @Override
3879        public boolean contains(Object o) {
3880            return indexOf(o) != -1;
3881        }
3882
3883        @Override
3884        public void forEach(Consumer<? super E> action) {
3885            Objects.requireNonNull(action);
3886            for (E e : a) {
3887                action.accept(e);
3888            }
3889        }
3890
3891        @Override
3892        public void replaceAll(UnaryOperator<E> operator) {
3893            Objects.requireNonNull(operator);
3894            E[] a = this.a;
3895            for (int i = 0; i < a.length; i++) {
3896                a[i] = operator.apply(a[i]);
3897            }
3898        }
3899
3900        @Override
3901        public Spliterator<E> spliterator() {
3902            return Spliterators.spliterator(a, Spliterator.ORDERED);
3903        }
3904    }
3905
3906    /**
3907     * Returns a hash code based on the contents of the specified array.
3908     * For any two <tt>long</tt> arrays <tt>a</tt> and <tt>b</tt>
3909     * such that <tt>Arrays.equals(a, b)</tt>, it is also the case that
3910     * <tt>Arrays.hashCode(a) == Arrays.hashCode(b)</tt>.
3911     *
3912     * <p>The value returned by this method is the same value that would be
3913     * obtained by invoking the {@link List#hashCode() <tt>hashCode</tt>}
3914     * method on a {@link List} containing a sequence of {@link Long}
3915     * instances representing the elements of <tt>a</tt> in the same order.
3916     * If <tt>a</tt> is <tt>null</tt>, this method returns 0.
3917     *
3918     * @param a the array whose hash value to compute
3919     * @return a content-based hash code for <tt>a</tt>
3920     * @since 1.5
3921     */
3922    public static int hashCode(long a[]) {
3923        if (a == null)
3924            return 0;
3925
3926        int result = 1;
3927        for (long element : a) {
3928            int elementHash = (int)(element ^ (element >>> 32));
3929            result = 31 * result + elementHash;
3930        }
3931
3932        return result;
3933    }
3934
3935    /**
3936     * Returns a hash code based on the contents of the specified array.
3937     * For any two non-null <tt>int</tt> arrays <tt>a</tt> and <tt>b</tt>
3938     * such that <tt>Arrays.equals(a, b)</tt>, it is also the case that
3939     * <tt>Arrays.hashCode(a) == Arrays.hashCode(b)</tt>.
3940     *
3941     * <p>The value returned by this method is the same value that would be
3942     * obtained by invoking the {@link List#hashCode() <tt>hashCode</tt>}
3943     * method on a {@link List} containing a sequence of {@link Integer}
3944     * instances representing the elements of <tt>a</tt> in the same order.
3945     * If <tt>a</tt> is <tt>null</tt>, this method returns 0.
3946     *
3947     * @param a the array whose hash value to compute
3948     * @return a content-based hash code for <tt>a</tt>
3949     * @since 1.5
3950     */
3951    public static int hashCode(int a[]) {
3952        if (a == null)
3953            return 0;
3954
3955        int result = 1;
3956        for (int element : a)
3957            result = 31 * result + element;
3958
3959        return result;
3960    }
3961
3962    /**
3963     * Returns a hash code based on the contents of the specified array.
3964     * For any two <tt>short</tt> arrays <tt>a</tt> and <tt>b</tt>
3965     * such that <tt>Arrays.equals(a, b)</tt>, it is also the case that
3966     * <tt>Arrays.hashCode(a) == Arrays.hashCode(b)</tt>.
3967     *
3968     * <p>The value returned by this method is the same value that would be
3969     * obtained by invoking the {@link List#hashCode() <tt>hashCode</tt>}
3970     * method on a {@link List} containing a sequence of {@link Short}
3971     * instances representing the elements of <tt>a</tt> in the same order.
3972     * If <tt>a</tt> is <tt>null</tt>, this method returns 0.
3973     *
3974     * @param a the array whose hash value to compute
3975     * @return a content-based hash code for <tt>a</tt>
3976     * @since 1.5
3977     */
3978    public static int hashCode(short a[]) {
3979        if (a == null)
3980            return 0;
3981
3982        int result = 1;
3983        for (short element : a)
3984            result = 31 * result + element;
3985
3986        return result;
3987    }
3988
3989    /**
3990     * Returns a hash code based on the contents of the specified array.
3991     * For any two <tt>char</tt> arrays <tt>a</tt> and <tt>b</tt>
3992     * such that <tt>Arrays.equals(a, b)</tt>, it is also the case that
3993     * <tt>Arrays.hashCode(a) == Arrays.hashCode(b)</tt>.
3994     *
3995     * <p>The value returned by this method is the same value that would be
3996     * obtained by invoking the {@link List#hashCode() <tt>hashCode</tt>}
3997     * method on a {@link List} containing a sequence of {@link Character}
3998     * instances representing the elements of <tt>a</tt> in the same order.
3999     * If <tt>a</tt> is <tt>null</tt>, this method returns 0.
4000     *
4001     * @param a the array whose hash value to compute
4002     * @return a content-based hash code for <tt>a</tt>
4003     * @since 1.5
4004     */
4005    public static int hashCode(char a[]) {
4006        if (a == null)
4007            return 0;
4008
4009        int result = 1;
4010        for (char element : a)
4011            result = 31 * result + element;
4012
4013        return result;
4014    }
4015
4016    /**
4017     * Returns a hash code based on the contents of the specified array.
4018     * For any two <tt>byte</tt> arrays <tt>a</tt> and <tt>b</tt>
4019     * such that <tt>Arrays.equals(a, b)</tt>, it is also the case that
4020     * <tt>Arrays.hashCode(a) == Arrays.hashCode(b)</tt>.
4021     *
4022     * <p>The value returned by this method is the same value that would be
4023     * obtained by invoking the {@link List#hashCode() <tt>hashCode</tt>}
4024     * method on a {@link List} containing a sequence of {@link Byte}
4025     * instances representing the elements of <tt>a</tt> in the same order.
4026     * If <tt>a</tt> is <tt>null</tt>, this method returns 0.
4027     *
4028     * @param a the array whose hash value to compute
4029     * @return a content-based hash code for <tt>a</tt>
4030     * @since 1.5
4031     */
4032    public static int hashCode(byte a[]) {
4033        if (a == null)
4034            return 0;
4035
4036        int result = 1;
4037        for (byte element : a)
4038            result = 31 * result + element;
4039
4040        return result;
4041    }
4042
4043    /**
4044     * Returns a hash code based on the contents of the specified array.
4045     * For any two <tt>boolean</tt> arrays <tt>a</tt> and <tt>b</tt>
4046     * such that <tt>Arrays.equals(a, b)</tt>, it is also the case that
4047     * <tt>Arrays.hashCode(a) == Arrays.hashCode(b)</tt>.
4048     *
4049     * <p>The value returned by this method is the same value that would be
4050     * obtained by invoking the {@link List#hashCode() <tt>hashCode</tt>}
4051     * method on a {@link List} containing a sequence of {@link Boolean}
4052     * instances representing the elements of <tt>a</tt> in the same order.
4053     * If <tt>a</tt> is <tt>null</tt>, this method returns 0.
4054     *
4055     * @param a the array whose hash value to compute
4056     * @return a content-based hash code for <tt>a</tt>
4057     * @since 1.5
4058     */
4059    public static int hashCode(boolean a[]) {
4060        if (a == null)
4061            return 0;
4062
4063        int result = 1;
4064        for (boolean element : a)
4065            result = 31 * result + (element ? 1231 : 1237);
4066
4067        return result;
4068    }
4069
4070    /**
4071     * Returns a hash code based on the contents of the specified array.
4072     * For any two <tt>float</tt> arrays <tt>a</tt> and <tt>b</tt>
4073     * such that <tt>Arrays.equals(a, b)</tt>, it is also the case that
4074     * <tt>Arrays.hashCode(a) == Arrays.hashCode(b)</tt>.
4075     *
4076     * <p>The value returned by this method is the same value that would be
4077     * obtained by invoking the {@link List#hashCode() <tt>hashCode</tt>}
4078     * method on a {@link List} containing a sequence of {@link Float}
4079     * instances representing the elements of <tt>a</tt> in the same order.
4080     * If <tt>a</tt> is <tt>null</tt>, this method returns 0.
4081     *
4082     * @param a the array whose hash value to compute
4083     * @return a content-based hash code for <tt>a</tt>
4084     * @since 1.5
4085     */
4086    public static int hashCode(float a[]) {
4087        if (a == null)
4088            return 0;
4089
4090        int result = 1;
4091        for (float element : a)
4092            result = 31 * result + Float.floatToIntBits(element);
4093
4094        return result;
4095    }
4096
4097    /**
4098     * Returns a hash code based on the contents of the specified array.
4099     * For any two <tt>double</tt> arrays <tt>a</tt> and <tt>b</tt>
4100     * such that <tt>Arrays.equals(a, b)</tt>, it is also the case that
4101     * <tt>Arrays.hashCode(a) == Arrays.hashCode(b)</tt>.
4102     *
4103     * <p>The value returned by this method is the same value that would be
4104     * obtained by invoking the {@link List#hashCode() <tt>hashCode</tt>}
4105     * method on a {@link List} containing a sequence of {@link Double}
4106     * instances representing the elements of <tt>a</tt> in the same order.
4107     * If <tt>a</tt> is <tt>null</tt>, this method returns 0.
4108     *
4109     * @param a the array whose hash value to compute
4110     * @return a content-based hash code for <tt>a</tt>
4111     * @since 1.5
4112     */
4113    public static int hashCode(double a[]) {
4114        if (a == null)
4115            return 0;
4116
4117        int result = 1;
4118        for (double element : a) {
4119            long bits = Double.doubleToLongBits(element);
4120            result = 31 * result + (int)(bits ^ (bits >>> 32));
4121        }
4122        return result;
4123    }
4124
4125    /**
4126     * Returns a hash code based on the contents of the specified array.  If
4127     * the array contains other arrays as elements, the hash code is based on
4128     * their identities rather than their contents.  It is therefore
4129     * acceptable to invoke this method on an array that contains itself as an
4130     * element,  either directly or indirectly through one or more levels of
4131     * arrays.
4132     *
4133     * <p>For any two arrays <tt>a</tt> and <tt>b</tt> such that
4134     * <tt>Arrays.equals(a, b)</tt>, it is also the case that
4135     * <tt>Arrays.hashCode(a) == Arrays.hashCode(b)</tt>.
4136     *
4137     * <p>The value returned by this method is equal to the value that would
4138     * be returned by <tt>Arrays.asList(a).hashCode()</tt>, unless <tt>a</tt>
4139     * is <tt>null</tt>, in which case <tt>0</tt> is returned.
4140     *
4141     * @param a the array whose content-based hash code to compute
4142     * @return a content-based hash code for <tt>a</tt>
4143     * @see #deepHashCode(Object[])
4144     * @since 1.5
4145     */
4146    public static int hashCode(Object a[]) {
4147        if (a == null)
4148            return 0;
4149
4150        int result = 1;
4151
4152        for (Object element : a)
4153            result = 31 * result + (element == null ? 0 : element.hashCode());
4154
4155        return result;
4156    }
4157
4158    /**
4159     * Returns a hash code based on the "deep contents" of the specified
4160     * array.  If the array contains other arrays as elements, the
4161     * hash code is based on their contents and so on, ad infinitum.
4162     * It is therefore unacceptable to invoke this method on an array that
4163     * contains itself as an element, either directly or indirectly through
4164     * one or more levels of arrays.  The behavior of such an invocation is
4165     * undefined.
4166     *
4167     * <p>For any two arrays <tt>a</tt> and <tt>b</tt> such that
4168     * <tt>Arrays.deepEquals(a, b)</tt>, it is also the case that
4169     * <tt>Arrays.deepHashCode(a) == Arrays.deepHashCode(b)</tt>.
4170     *
4171     * <p>The computation of the value returned by this method is similar to
4172     * that of the value returned by {@link List#hashCode()} on a list
4173     * containing the same elements as <tt>a</tt> in the same order, with one
4174     * difference: If an element <tt>e</tt> of <tt>a</tt> is itself an array,
4175     * its hash code is computed not by calling <tt>e.hashCode()</tt>, but as
4176     * by calling the appropriate overloading of <tt>Arrays.hashCode(e)</tt>
4177     * if <tt>e</tt> is an array of a primitive type, or as by calling
4178     * <tt>Arrays.deepHashCode(e)</tt> recursively if <tt>e</tt> is an array
4179     * of a reference type.  If <tt>a</tt> is <tt>null</tt>, this method
4180     * returns 0.
4181     *
4182     * @param a the array whose deep-content-based hash code to compute
4183     * @return a deep-content-based hash code for <tt>a</tt>
4184     * @see #hashCode(Object[])
4185     * @since 1.5
4186     */
4187    public static int deepHashCode(Object a[]) {
4188        if (a == null)
4189            return 0;
4190
4191        int result = 1;
4192
4193        for (Object element : a) {
4194            int elementHash = 0;
4195            if (element != null) {
4196                Class<?> cl = element.getClass().getComponentType();
4197                if (cl == null)
4198                    elementHash = element.hashCode();
4199                else if (element instanceof Object[])
4200                    elementHash = deepHashCode((Object[]) element);
4201                else if (cl == byte.class)
4202                    elementHash = hashCode((byte[]) element);
4203                else if (cl == short.class)
4204                    elementHash = hashCode((short[]) element);
4205                else if (cl == int.class)
4206                    elementHash = hashCode((int[]) element);
4207                else if (cl == long.class)
4208                    elementHash = hashCode((long[]) element);
4209                else if (cl == char.class)
4210                    elementHash = hashCode((char[]) element);
4211                else if (cl == float.class)
4212                    elementHash = hashCode((float[]) element);
4213                else if (cl == double.class)
4214                    elementHash = hashCode((double[]) element);
4215                else if (cl == boolean.class)
4216                    elementHash = hashCode((boolean[]) element);
4217                else
4218                    elementHash = element.hashCode();
4219            }
4220            result = 31 * result + elementHash;
4221        }
4222
4223        return result;
4224    }
4225
4226    /**
4227     * Returns <tt>true</tt> if the two specified arrays are <i>deeply
4228     * equal</i> to one another.  Unlike the {@link #equals(Object[],Object[])}
4229     * method, this method is appropriate for use with nested arrays of
4230     * arbitrary depth.
4231     *
4232     * <p>Two array references are considered deeply equal if both
4233     * are <tt>null</tt>, or if they refer to arrays that contain the same
4234     * number of elements and all corresponding pairs of elements in the two
4235     * arrays are deeply equal.
4236     *
4237     * <p>Two possibly <tt>null</tt> elements <tt>e1</tt> and <tt>e2</tt> are
4238     * deeply equal if any of the following conditions hold:
4239     * <ul>
4240     *    <li> <tt>e1</tt> and <tt>e2</tt> are both arrays of object reference
4241     *         types, and <tt>Arrays.deepEquals(e1, e2) would return true</tt>
4242     *    <li> <tt>e1</tt> and <tt>e2</tt> are arrays of the same primitive
4243     *         type, and the appropriate overloading of
4244     *         <tt>Arrays.equals(e1, e2)</tt> would return true.
4245     *    <li> <tt>e1 == e2</tt>
4246     *    <li> <tt>e1.equals(e2)</tt> would return true.
4247     * </ul>
4248     * Note that this definition permits <tt>null</tt> elements at any depth.
4249     *
4250     * <p>If either of the specified arrays contain themselves as elements
4251     * either directly or indirectly through one or more levels of arrays,
4252     * the behavior of this method is undefined.
4253     *
4254     * @param a1 one array to be tested for equality
4255     * @param a2 the other array to be tested for equality
4256     * @return <tt>true</tt> if the two arrays are equal
4257     * @see #equals(Object[],Object[])
4258     * @see Objects#deepEquals(Object, Object)
4259     * @since 1.5
4260     */
4261    public static boolean deepEquals(Object[] a1, Object[] a2) {
4262        if (a1 == a2)
4263            return true;
4264        if (a1 == null || a2==null)
4265            return false;
4266        int length = a1.length;
4267        if (a2.length != length)
4268            return false;
4269
4270        for (int i = 0; i < length; i++) {
4271            Object e1 = a1[i];
4272            Object e2 = a2[i];
4273
4274            if (e1 == e2)
4275                continue;
4276            if (e1 == null || e2 == null)
4277                return false;
4278
4279            // Figure out whether the two elements are equal
4280            boolean eq = deepEquals0(e1, e2);
4281
4282            if (!eq)
4283                return false;
4284        }
4285        return true;
4286    }
4287
4288    static boolean deepEquals0(Object e1, Object e2) {
4289        Class<?> cl1 = e1.getClass().getComponentType();
4290        Class<?> cl2 = e2.getClass().getComponentType();
4291
4292        if (cl1 != cl2) {
4293            return false;
4294        }
4295        if (e1 instanceof Object[])
4296            return deepEquals ((Object[]) e1, (Object[]) e2);
4297        else if (cl1 == byte.class)
4298            return equals((byte[]) e1, (byte[]) e2);
4299        else if (cl1 == short.class)
4300            return equals((short[]) e1, (short[]) e2);
4301        else if (cl1 == int.class)
4302            return equals((int[]) e1, (int[]) e2);
4303        else if (cl1 == long.class)
4304            return equals((long[]) e1, (long[]) e2);
4305        else if (cl1 == char.class)
4306            return equals((char[]) e1, (char[]) e2);
4307        else if (cl1 == float.class)
4308            return equals((float[]) e1, (float[]) e2);
4309        else if (cl1 == double.class)
4310            return equals((double[]) e1, (double[]) e2);
4311        else if (cl1 == boolean.class)
4312            return equals((boolean[]) e1, (boolean[]) e2);
4313        else
4314            return e1.equals(e2);
4315    }
4316
4317    /**
4318     * Returns a string representation of the contents of the specified array.
4319     * The string representation consists of a list of the array's elements,
4320     * enclosed in square brackets (<tt>"[]"</tt>).  Adjacent elements are
4321     * separated by the characters <tt>", "</tt> (a comma followed by a
4322     * space).  Elements are converted to strings as by
4323     * <tt>String.valueOf(long)</tt>.  Returns <tt>"null"</tt> if <tt>a</tt>
4324     * is <tt>null</tt>.
4325     *
4326     * @param a the array whose string representation to return
4327     * @return a string representation of <tt>a</tt>
4328     * @since 1.5
4329     */
4330    public static String toString(long[] a) {
4331        if (a == null)
4332            return "null";
4333        int iMax = a.length - 1;
4334        if (iMax == -1)
4335            return "[]";
4336
4337        StringBuilder b = new StringBuilder();
4338        b.append('[');
4339        for (int i = 0; ; i++) {
4340            b.append(a[i]);
4341            if (i == iMax)
4342                return b.append(']').toString();
4343            b.append(", ");
4344        }
4345    }
4346
4347    /**
4348     * Returns a string representation of the contents of the specified array.
4349     * The string representation consists of a list of the array's elements,
4350     * enclosed in square brackets (<tt>"[]"</tt>).  Adjacent elements are
4351     * separated by the characters <tt>", "</tt> (a comma followed by a
4352     * space).  Elements are converted to strings as by
4353     * <tt>String.valueOf(int)</tt>.  Returns <tt>"null"</tt> if <tt>a</tt> is
4354     * <tt>null</tt>.
4355     *
4356     * @param a the array whose string representation to return
4357     * @return a string representation of <tt>a</tt>
4358     * @since 1.5
4359     */
4360    public static String toString(int[] a) {
4361        if (a == null)
4362            return "null";
4363        int iMax = a.length - 1;
4364        if (iMax == -1)
4365            return "[]";
4366
4367        StringBuilder b = new StringBuilder();
4368        b.append('[');
4369        for (int i = 0; ; i++) {
4370            b.append(a[i]);
4371            if (i == iMax)
4372                return b.append(']').toString();
4373            b.append(", ");
4374        }
4375    }
4376
4377    /**
4378     * Returns a string representation of the contents of the specified array.
4379     * The string representation consists of a list of the array's elements,
4380     * enclosed in square brackets (<tt>"[]"</tt>).  Adjacent elements are
4381     * separated by the characters <tt>", "</tt> (a comma followed by a
4382     * space).  Elements are converted to strings as by
4383     * <tt>String.valueOf(short)</tt>.  Returns <tt>"null"</tt> if <tt>a</tt>
4384     * is <tt>null</tt>.
4385     *
4386     * @param a the array whose string representation to return
4387     * @return a string representation of <tt>a</tt>
4388     * @since 1.5
4389     */
4390    public static String toString(short[] a) {
4391        if (a == null)
4392            return "null";
4393        int iMax = a.length - 1;
4394        if (iMax == -1)
4395            return "[]";
4396
4397        StringBuilder b = new StringBuilder();
4398        b.append('[');
4399        for (int i = 0; ; i++) {
4400            b.append(a[i]);
4401            if (i == iMax)
4402                return b.append(']').toString();
4403            b.append(", ");
4404        }
4405    }
4406
4407    /**
4408     * Returns a string representation of the contents of the specified array.
4409     * The string representation consists of a list of the array's elements,
4410     * enclosed in square brackets (<tt>"[]"</tt>).  Adjacent elements are
4411     * separated by the characters <tt>", "</tt> (a comma followed by a
4412     * space).  Elements are converted to strings as by
4413     * <tt>String.valueOf(char)</tt>.  Returns <tt>"null"</tt> if <tt>a</tt>
4414     * is <tt>null</tt>.
4415     *
4416     * @param a the array whose string representation to return
4417     * @return a string representation of <tt>a</tt>
4418     * @since 1.5
4419     */
4420    public static String toString(char[] a) {
4421        if (a == null)
4422            return "null";
4423        int iMax = a.length - 1;
4424        if (iMax == -1)
4425            return "[]";
4426
4427        StringBuilder b = new StringBuilder();
4428        b.append('[');
4429        for (int i = 0; ; i++) {
4430            b.append(a[i]);
4431            if (i == iMax)
4432                return b.append(']').toString();
4433            b.append(", ");
4434        }
4435    }
4436
4437    /**
4438     * Returns a string representation of the contents of the specified array.
4439     * The string representation consists of a list of the array's elements,
4440     * enclosed in square brackets (<tt>"[]"</tt>).  Adjacent elements
4441     * are separated by the characters <tt>", "</tt> (a comma followed
4442     * by a space).  Elements are converted to strings as by
4443     * <tt>String.valueOf(byte)</tt>.  Returns <tt>"null"</tt> if
4444     * <tt>a</tt> is <tt>null</tt>.
4445     *
4446     * @param a the array whose string representation to return
4447     * @return a string representation of <tt>a</tt>
4448     * @since 1.5
4449     */
4450    public static String toString(byte[] a) {
4451        if (a == null)
4452            return "null";
4453        int iMax = a.length - 1;
4454        if (iMax == -1)
4455            return "[]";
4456
4457        StringBuilder b = new StringBuilder();
4458        b.append('[');
4459        for (int i = 0; ; i++) {
4460            b.append(a[i]);
4461            if (i == iMax)
4462                return b.append(']').toString();
4463            b.append(", ");
4464        }
4465    }
4466
4467    /**
4468     * Returns a string representation of the contents of the specified array.
4469     * The string representation consists of a list of the array's elements,
4470     * enclosed in square brackets (<tt>"[]"</tt>).  Adjacent elements are
4471     * separated by the characters <tt>", "</tt> (a comma followed by a
4472     * space).  Elements are converted to strings as by
4473     * <tt>String.valueOf(boolean)</tt>.  Returns <tt>"null"</tt> if
4474     * <tt>a</tt> is <tt>null</tt>.
4475     *
4476     * @param a the array whose string representation to return
4477     * @return a string representation of <tt>a</tt>
4478     * @since 1.5
4479     */
4480    public static String toString(boolean[] a) {
4481        if (a == null)
4482            return "null";
4483        int iMax = a.length - 1;
4484        if (iMax == -1)
4485            return "[]";
4486
4487        StringBuilder b = new StringBuilder();
4488        b.append('[');
4489        for (int i = 0; ; i++) {
4490            b.append(a[i]);
4491            if (i == iMax)
4492                return b.append(']').toString();
4493            b.append(", ");
4494        }
4495    }
4496
4497    /**
4498     * Returns a string representation of the contents of the specified array.
4499     * The string representation consists of a list of the array's elements,
4500     * enclosed in square brackets (<tt>"[]"</tt>).  Adjacent elements are
4501     * separated by the characters <tt>", "</tt> (a comma followed by a
4502     * space).  Elements are converted to strings as by
4503     * <tt>String.valueOf(float)</tt>.  Returns <tt>"null"</tt> if <tt>a</tt>
4504     * is <tt>null</tt>.
4505     *
4506     * @param a the array whose string representation to return
4507     * @return a string representation of <tt>a</tt>
4508     * @since 1.5
4509     */
4510    public static String toString(float[] a) {
4511        if (a == null)
4512            return "null";
4513
4514        int iMax = a.length - 1;
4515        if (iMax == -1)
4516            return "[]";
4517
4518        StringBuilder b = new StringBuilder();
4519        b.append('[');
4520        for (int i = 0; ; i++) {
4521            b.append(a[i]);
4522            if (i == iMax)
4523                return b.append(']').toString();
4524            b.append(", ");
4525        }
4526    }
4527
4528    /**
4529     * Returns a string representation of the contents of the specified array.
4530     * The string representation consists of a list of the array's elements,
4531     * enclosed in square brackets (<tt>"[]"</tt>).  Adjacent elements are
4532     * separated by the characters <tt>", "</tt> (a comma followed by a
4533     * space).  Elements are converted to strings as by
4534     * <tt>String.valueOf(double)</tt>.  Returns <tt>"null"</tt> if <tt>a</tt>
4535     * is <tt>null</tt>.
4536     *
4537     * @param a the array whose string representation to return
4538     * @return a string representation of <tt>a</tt>
4539     * @since 1.5
4540     */
4541    public static String toString(double[] a) {
4542        if (a == null)
4543            return "null";
4544        int iMax = a.length - 1;
4545        if (iMax == -1)
4546            return "[]";
4547
4548        StringBuilder b = new StringBuilder();
4549        b.append('[');
4550        for (int i = 0; ; i++) {
4551            b.append(a[i]);
4552            if (i == iMax)
4553                return b.append(']').toString();
4554            b.append(", ");
4555        }
4556    }
4557
4558    /**
4559     * Returns a string representation of the contents of the specified array.
4560     * If the array contains other arrays as elements, they are converted to
4561     * strings by the {@link Object#toString} method inherited from
4562     * <tt>Object</tt>, which describes their <i>identities</i> rather than
4563     * their contents.
4564     *
4565     * <p>The value returned by this method is equal to the value that would
4566     * be returned by <tt>Arrays.asList(a).toString()</tt>, unless <tt>a</tt>
4567     * is <tt>null</tt>, in which case <tt>"null"</tt> is returned.
4568     *
4569     * @param a the array whose string representation to return
4570     * @return a string representation of <tt>a</tt>
4571     * @see #deepToString(Object[])
4572     * @since 1.5
4573     */
4574    public static String toString(Object[] a) {
4575        if (a == null)
4576            return "null";
4577
4578        int iMax = a.length - 1;
4579        if (iMax == -1)
4580            return "[]";
4581
4582        StringBuilder b = new StringBuilder();
4583        b.append('[');
4584        for (int i = 0; ; i++) {
4585            b.append(String.valueOf(a[i]));
4586            if (i == iMax)
4587                return b.append(']').toString();
4588            b.append(", ");
4589        }
4590    }
4591
4592    /**
4593     * Returns a string representation of the "deep contents" of the specified
4594     * array.  If the array contains other arrays as elements, the string
4595     * representation contains their contents and so on.  This method is
4596     * designed for converting multidimensional arrays to strings.
4597     *
4598     * <p>The string representation consists of a list of the array's
4599     * elements, enclosed in square brackets (<tt>"[]"</tt>).  Adjacent
4600     * elements are separated by the characters <tt>", "</tt> (a comma
4601     * followed by a space).  Elements are converted to strings as by
4602     * <tt>String.valueOf(Object)</tt>, unless they are themselves
4603     * arrays.
4604     *
4605     * <p>If an element <tt>e</tt> is an array of a primitive type, it is
4606     * converted to a string as by invoking the appropriate overloading of
4607     * <tt>Arrays.toString(e)</tt>.  If an element <tt>e</tt> is an array of a
4608     * reference type, it is converted to a string as by invoking
4609     * this method recursively.
4610     *
4611     * <p>To avoid infinite recursion, if the specified array contains itself
4612     * as an element, or contains an indirect reference to itself through one
4613     * or more levels of arrays, the self-reference is converted to the string
4614     * <tt>"[...]"</tt>.  For example, an array containing only a reference
4615     * to itself would be rendered as <tt>"[[...]]"</tt>.
4616     *
4617     * <p>This method returns <tt>"null"</tt> if the specified array
4618     * is <tt>null</tt>.
4619     *
4620     * @param a the array whose string representation to return
4621     * @return a string representation of <tt>a</tt>
4622     * @see #toString(Object[])
4623     * @since 1.5
4624     */
4625    public static String deepToString(Object[] a) {
4626        if (a == null)
4627            return "null";
4628
4629        int bufLen = 20 * a.length;
4630        if (a.length != 0 && bufLen <= 0)
4631            bufLen = Integer.MAX_VALUE;
4632        StringBuilder buf = new StringBuilder(bufLen);
4633        deepToString(a, buf, new HashSet<Object[]>());
4634        return buf.toString();
4635    }
4636
4637    private static void deepToString(Object[] a, StringBuilder buf,
4638                                     Set<Object[]> dejaVu) {
4639        if (a == null) {
4640            buf.append("null");
4641            return;
4642        }
4643        int iMax = a.length - 1;
4644        if (iMax == -1) {
4645            buf.append("[]");
4646            return;
4647        }
4648
4649        dejaVu.add(a);
4650        buf.append('[');
4651        for (int i = 0; ; i++) {
4652
4653            Object element = a[i];
4654            if (element == null) {
4655                buf.append("null");
4656            } else {
4657                Class eClass = element.getClass();
4658
4659                if (eClass.isArray()) {
4660                    if (eClass == byte[].class)
4661                        buf.append(toString((byte[]) element));
4662                    else if (eClass == short[].class)
4663                        buf.append(toString((short[]) element));
4664                    else if (eClass == int[].class)
4665                        buf.append(toString((int[]) element));
4666                    else if (eClass == long[].class)
4667                        buf.append(toString((long[]) element));
4668                    else if (eClass == char[].class)
4669                        buf.append(toString((char[]) element));
4670                    else if (eClass == float[].class)
4671                        buf.append(toString((float[]) element));
4672                    else if (eClass == double[].class)
4673                        buf.append(toString((double[]) element));
4674                    else if (eClass == boolean[].class)
4675                        buf.append(toString((boolean[]) element));
4676                    else { // element is an array of object references
4677                        if (dejaVu.contains(element))
4678                            buf.append("[...]");
4679                        else
4680                            deepToString((Object[])element, buf, dejaVu);
4681                    }
4682                } else {  // element is non-null and not an array
4683                    buf.append(element.toString());
4684                }
4685            }
4686            if (i == iMax)
4687                break;
4688            buf.append(", ");
4689        }
4690        buf.append(']');
4691        dejaVu.remove(a);
4692    }
4693
4694    /**
4695     * Set all elements of the specified array, using the provided
4696     * generator function to compute each element.
4697     *
4698     * <p>If the generator function throws an exception, it is relayed to
4699     * the caller and the array is left in an indeterminate state.
4700     *
4701     * @param <T> type of elements of the array
4702     * @param array array to be initialized
4703     * @param generator a function accepting an index and producing the desired
4704     *        value for that position
4705     * @throws NullPointerException if the generator is null
4706     * @since 1.8
4707     */
4708    public static <T> void setAll(T[] array, IntFunction<? extends T> generator) {
4709        Objects.requireNonNull(generator);
4710        for (int i = 0; i < array.length; i++)
4711            array[i] = generator.apply(i);
4712    }
4713
4714    /**
4715     * Set all elements of the specified array, in parallel, using the
4716     * provided generator function to compute each element.
4717     *
4718     * <p>If the generator function throws an exception, an unchecked exception
4719     * is thrown from {@code parallelSetAll} and the array is left in an
4720     * indeterminate state.
4721     *
4722     * @param <T> type of elements of the array
4723     * @param array array to be initialized
4724     * @param generator a function accepting an index and producing the desired
4725     *        value for that position
4726     * @throws NullPointerException if the generator is null
4727     * @since 1.8
4728     */
4729    public static <T> void parallelSetAll(T[] array, IntFunction<? extends T> generator) {
4730        Objects.requireNonNull(generator);
4731        IntStream.range(0, array.length).parallel().forEach(i -> { array[i] = generator.apply(i); });
4732    }
4733
4734    /**
4735     * Set all elements of the specified array, using the provided
4736     * generator function to compute each element.
4737     *
4738     * <p>If the generator function throws an exception, it is relayed to
4739     * the caller and the array is left in an indeterminate state.
4740     *
4741     * @param array array to be initialized
4742     * @param generator a function accepting an index and producing the desired
4743     *        value for that position
4744     * @throws NullPointerException if the generator is null
4745     * @since 1.8
4746     */
4747    public static void setAll(int[] array, IntUnaryOperator generator) {
4748        Objects.requireNonNull(generator);
4749        for (int i = 0; i < array.length; i++)
4750            array[i] = generator.applyAsInt(i);
4751    }
4752
4753    /**
4754     * Set all elements of the specified array, in parallel, using the
4755     * provided generator function to compute each element.
4756     *
4757     * <p>If the generator function throws an exception, an unchecked exception
4758     * is thrown from {@code parallelSetAll} and the array is left in an
4759     * indeterminate state.
4760     *
4761     * @param array array to be initialized
4762     * @param generator a function accepting an index and producing the desired
4763     * value for that position
4764     * @throws NullPointerException if the generator is null
4765     * @since 1.8
4766     */
4767    public static void parallelSetAll(int[] array, IntUnaryOperator generator) {
4768        Objects.requireNonNull(generator);
4769        IntStream.range(0, array.length).parallel().forEach(i -> { array[i] = generator.applyAsInt(i); });
4770    }
4771
4772    /**
4773     * Set all elements of the specified array, using the provided
4774     * generator function to compute each element.
4775     *
4776     * <p>If the generator function throws an exception, it is relayed to
4777     * the caller and the array is left in an indeterminate state.
4778     *
4779     * @param array array to be initialized
4780     * @param generator a function accepting an index and producing the desired
4781     *        value for that position
4782     * @throws NullPointerException if the generator is null
4783     * @since 1.8
4784     */
4785    public static void setAll(long[] array, IntToLongFunction generator) {
4786        Objects.requireNonNull(generator);
4787        for (int i = 0; i < array.length; i++)
4788            array[i] = generator.applyAsLong(i);
4789    }
4790
4791    /**
4792     * Set all elements of the specified array, in parallel, using the
4793     * provided generator function to compute each element.
4794     *
4795     * <p>If the generator function throws an exception, an unchecked exception
4796     * is thrown from {@code parallelSetAll} and the array is left in an
4797     * indeterminate state.
4798     *
4799     * @param array array to be initialized
4800     * @param generator a function accepting an index and producing the desired
4801     *        value for that position
4802     * @throws NullPointerException if the generator is null
4803     * @since 1.8
4804     */
4805    public static void parallelSetAll(long[] array, IntToLongFunction generator) {
4806        Objects.requireNonNull(generator);
4807        IntStream.range(0, array.length).parallel().forEach(i -> { array[i] = generator.applyAsLong(i); });
4808    }
4809
4810    /**
4811     * Set all elements of the specified array, using the provided
4812     * generator function to compute each element.
4813     *
4814     * <p>If the generator function throws an exception, it is relayed to
4815     * the caller and the array is left in an indeterminate state.
4816     *
4817     * @param array array to be initialized
4818     * @param generator a function accepting an index and producing the desired
4819     *        value for that position
4820     * @throws NullPointerException if the generator is null
4821     * @since 1.8
4822     */
4823    public static void setAll(double[] array, IntToDoubleFunction generator) {
4824        Objects.requireNonNull(generator);
4825        for (int i = 0; i < array.length; i++)
4826            array[i] = generator.applyAsDouble(i);
4827    }
4828
4829    /**
4830     * Set all elements of the specified array, in parallel, using the
4831     * provided generator function to compute each element.
4832     *
4833     * <p>If the generator function throws an exception, an unchecked exception
4834     * is thrown from {@code parallelSetAll} and the array is left in an
4835     * indeterminate state.
4836     *
4837     * @param array array to be initialized
4838     * @param generator a function accepting an index and producing the desired
4839     *        value for that position
4840     * @throws NullPointerException if the generator is null
4841     * @since 1.8
4842     */
4843    public static void parallelSetAll(double[] array, IntToDoubleFunction generator) {
4844        Objects.requireNonNull(generator);
4845        IntStream.range(0, array.length).parallel().forEach(i -> { array[i] = generator.applyAsDouble(i); });
4846    }
4847
4848    /**
4849     * Checks that the range described by {@code offset} and {@code count} doesn't exceed
4850     * {@code arrayLength}.
4851     *
4852     * Android changed.
4853     * @hide
4854     */
4855    public static void checkOffsetAndCount(int arrayLength, int offset, int count) {
4856        if ((offset | count) < 0 || offset > arrayLength || arrayLength - offset < count) {
4857            throw new ArrayIndexOutOfBoundsException(arrayLength, offset,
4858                    count);
4859        }
4860    }
4861
4862
4863    /**
4864     * Returns a {@link Spliterator} covering all of the specified array.
4865     *
4866     * <p>The spliterator reports {@link Spliterator#SIZED},
4867     * {@link Spliterator#SUBSIZED}, {@link Spliterator#ORDERED}, and
4868     * {@link Spliterator#IMMUTABLE}.
4869     *
4870     * @param <T> type of elements
4871     * @param array the array, assumed to be unmodified during use
4872     * @return a spliterator for the array elements
4873     * @since 1.8
4874     */
4875    public static <T> Spliterator<T> spliterator(T[] array) {
4876        return Spliterators.spliterator(array,
4877                                        Spliterator.ORDERED | Spliterator.IMMUTABLE);
4878    }
4879
4880    /**
4881     * Returns a {@link Spliterator} covering the specified range of the
4882     * specified array.
4883     *
4884     * <p>The spliterator reports {@link Spliterator#SIZED},
4885     * {@link Spliterator#SUBSIZED}, {@link Spliterator#ORDERED}, and
4886     * {@link Spliterator#IMMUTABLE}.
4887     *
4888     * @param <T> type of elements
4889     * @param array the array, assumed to be unmodified during use
4890     * @param startInclusive the first index to cover, inclusive
4891     * @param endExclusive index immediately past the last index to cover
4892     * @return a spliterator for the array elements
4893     * @throws ArrayIndexOutOfBoundsException if {@code startInclusive} is
4894     *         negative, {@code endExclusive} is less than
4895     *         {@code startInclusive}, or {@code endExclusive} is greater than
4896     *         the array size
4897     * @since 1.8
4898     */
4899    public static <T> Spliterator<T> spliterator(T[] array, int startInclusive, int endExclusive) {
4900        return Spliterators.spliterator(array, startInclusive, endExclusive,
4901                                        Spliterator.ORDERED | Spliterator.IMMUTABLE);
4902    }
4903
4904    /**
4905     * Returns a {@link Spliterator.OfInt} covering all of the specified array.
4906     *
4907     * <p>The spliterator reports {@link Spliterator#SIZED},
4908     * {@link Spliterator#SUBSIZED}, {@link Spliterator#ORDERED}, and
4909     * {@link Spliterator#IMMUTABLE}.
4910     *
4911     * @param array the array, assumed to be unmodified during use
4912     * @return a spliterator for the array elements
4913     * @since 1.8
4914     */
4915    public static Spliterator.OfInt spliterator(int[] array) {
4916        return Spliterators.spliterator(array,
4917                                        Spliterator.ORDERED | Spliterator.IMMUTABLE);
4918    }
4919
4920    /**
4921     * Returns a {@link Spliterator.OfInt} covering the specified range of the
4922     * specified array.
4923     *
4924     * <p>The spliterator reports {@link Spliterator#SIZED},
4925     * {@link Spliterator#SUBSIZED}, {@link Spliterator#ORDERED}, and
4926     * {@link Spliterator#IMMUTABLE}.
4927     *
4928     * @param array the array, assumed to be unmodified during use
4929     * @param startInclusive the first index to cover, inclusive
4930     * @param endExclusive index immediately past the last index to cover
4931     * @return a spliterator for the array elements
4932     * @throws ArrayIndexOutOfBoundsException if {@code startInclusive} is
4933     *         negative, {@code endExclusive} is less than
4934     *         {@code startInclusive}, or {@code endExclusive} is greater than
4935     *         the array size
4936     * @since 1.8
4937     */
4938    public static Spliterator.OfInt spliterator(int[] array, int startInclusive, int endExclusive) {
4939        return Spliterators.spliterator(array, startInclusive, endExclusive,
4940                                        Spliterator.ORDERED | Spliterator.IMMUTABLE);
4941    }
4942
4943    /**
4944     * Returns a {@link Spliterator.OfLong} covering all of the specified array.
4945     *
4946     * <p>The spliterator reports {@link Spliterator#SIZED},
4947     * {@link Spliterator#SUBSIZED}, {@link Spliterator#ORDERED}, and
4948     * {@link Spliterator#IMMUTABLE}.
4949     *
4950     * @param array the array, assumed to be unmodified during use
4951     * @return the spliterator for the array elements
4952     * @since 1.8
4953     */
4954    public static Spliterator.OfLong spliterator(long[] array) {
4955        return Spliterators.spliterator(array,
4956                                        Spliterator.ORDERED | Spliterator.IMMUTABLE);
4957    }
4958
4959    /**
4960     * Returns a {@link Spliterator.OfLong} covering the specified range of the
4961     * specified array.
4962     *
4963     * <p>The spliterator reports {@link Spliterator#SIZED},
4964     * {@link Spliterator#SUBSIZED}, {@link Spliterator#ORDERED}, and
4965     * {@link Spliterator#IMMUTABLE}.
4966     *
4967     * @param array the array, assumed to be unmodified during use
4968     * @param startInclusive the first index to cover, inclusive
4969     * @param endExclusive index immediately past the last index to cover
4970     * @return a spliterator for the array elements
4971     * @throws ArrayIndexOutOfBoundsException if {@code startInclusive} is
4972     *         negative, {@code endExclusive} is less than
4973     *         {@code startInclusive}, or {@code endExclusive} is greater than
4974     *         the array size
4975     * @since 1.8
4976     */
4977    public static Spliterator.OfLong spliterator(long[] array, int startInclusive, int endExclusive) {
4978        return Spliterators.spliterator(array, startInclusive, endExclusive,
4979                                        Spliterator.ORDERED | Spliterator.IMMUTABLE);
4980    }
4981
4982    /**
4983     * Returns a {@link Spliterator.OfDouble} covering all of the specified
4984     * array.
4985     *
4986     * <p>The spliterator reports {@link Spliterator#SIZED},
4987     * {@link Spliterator#SUBSIZED}, {@link Spliterator#ORDERED}, and
4988     * {@link Spliterator#IMMUTABLE}.
4989     *
4990     * @param array the array, assumed to be unmodified during use
4991     * @return a spliterator for the array elements
4992     * @since 1.8
4993     */
4994    public static Spliterator.OfDouble spliterator(double[] array) {
4995        return Spliterators.spliterator(array,
4996                                        Spliterator.ORDERED | Spliterator.IMMUTABLE);
4997    }
4998
4999    /**
5000     * Returns a {@link Spliterator.OfDouble} covering the specified range of
5001     * the specified array.
5002     *
5003     * <p>The spliterator reports {@link Spliterator#SIZED},
5004     * {@link Spliterator#SUBSIZED}, {@link Spliterator#ORDERED}, and
5005     * {@link Spliterator#IMMUTABLE}.
5006     *
5007     * @param array the array, assumed to be unmodified during use
5008     * @param startInclusive the first index to cover, inclusive
5009     * @param endExclusive index immediately past the last index to cover
5010     * @return a spliterator for the array elements
5011     * @throws ArrayIndexOutOfBoundsException if {@code startInclusive} is
5012     *         negative, {@code endExclusive} is less than
5013     *         {@code startInclusive}, or {@code endExclusive} is greater than
5014     *         the array size
5015     * @since 1.8
5016     */
5017    public static Spliterator.OfDouble spliterator(double[] array, int startInclusive, int endExclusive) {
5018        return Spliterators.spliterator(array, startInclusive, endExclusive,
5019                                        Spliterator.ORDERED | Spliterator.IMMUTABLE);
5020    }
5021
5022
5023    /**
5024     * Returns a sequential {@link Stream} with the specified array as its
5025     * source.
5026     *
5027     * @param <T> The type of the array elements
5028     * @param array The array, assumed to be unmodified during use
5029     * @return a {@code Stream} for the array
5030     * @since 1.8
5031     */
5032    public static <T> Stream<T> stream(T[] array) {
5033        return stream(array, 0, array.length);
5034    }
5035
5036    /**
5037     * Returns a sequential {@link Stream} with the specified range of the
5038     * specified array as its source.
5039     *
5040     * @param <T> the type of the array elements
5041     * @param array the array, assumed to be unmodified during use
5042     * @param startInclusive the first index to cover, inclusive
5043     * @param endExclusive index immediately past the last index to cover
5044     * @return a {@code Stream} for the array range
5045     * @throws ArrayIndexOutOfBoundsException if {@code startInclusive} is
5046     *         negative, {@code endExclusive} is less than
5047     *         {@code startInclusive}, or {@code endExclusive} is greater than
5048     *         the array size
5049     * @since 1.8
5050     */
5051    public static <T> Stream<T> stream(T[] array, int startInclusive, int endExclusive) {
5052        return StreamSupport.stream(spliterator(array, startInclusive, endExclusive), false);
5053    }
5054
5055    /**
5056     * Returns a sequential {@link IntStream} with the specified array as its
5057     * source.
5058     *
5059     * @param array the array, assumed to be unmodified during use
5060     * @return an {@code IntStream} for the array
5061     * @since 1.8
5062     */
5063    public static IntStream stream(int[] array) {
5064        return stream(array, 0, array.length);
5065    }
5066
5067    /**
5068     * Returns a sequential {@link IntStream} with the specified range of the
5069     * specified array as its source.
5070     *
5071     * @param array the array, assumed to be unmodified during use
5072     * @param startInclusive the first index to cover, inclusive
5073     * @param endExclusive index immediately past the last index to cover
5074     * @return an {@code IntStream} for the array range
5075     * @throws ArrayIndexOutOfBoundsException if {@code startInclusive} is
5076     *         negative, {@code endExclusive} is less than
5077     *         {@code startInclusive}, or {@code endExclusive} is greater than
5078     *         the array size
5079     * @since 1.8
5080     */
5081    public static IntStream stream(int[] array, int startInclusive, int endExclusive) {
5082        return StreamSupport.intStream(spliterator(array, startInclusive, endExclusive), false);
5083    }
5084
5085    /**
5086     * Returns a sequential {@link LongStream} with the specified array as its
5087     * source.
5088     *
5089     * @param array the array, assumed to be unmodified during use
5090     * @return a {@code LongStream} for the array
5091     * @since 1.8
5092     */
5093    public static LongStream stream(long[] array) {
5094        return stream(array, 0, array.length);
5095    }
5096
5097    /**
5098     * Returns a sequential {@link LongStream} with the specified range of the
5099     * specified array as its source.
5100     *
5101     * @param array the array, assumed to be unmodified during use
5102     * @param startInclusive the first index to cover, inclusive
5103     * @param endExclusive index immediately past the last index to cover
5104     * @return a {@code LongStream} for the array range
5105     * @throws ArrayIndexOutOfBoundsException if {@code startInclusive} is
5106     *         negative, {@code endExclusive} is less than
5107     *         {@code startInclusive}, or {@code endExclusive} is greater than
5108     *         the array size
5109     * @since 1.8
5110     */
5111    public static LongStream stream(long[] array, int startInclusive, int endExclusive) {
5112        return StreamSupport.longStream(spliterator(array, startInclusive, endExclusive), false);
5113    }
5114
5115    /**
5116     * Returns a sequential {@link DoubleStream} with the specified array as its
5117     * source.
5118     *
5119     * @param array the array, assumed to be unmodified during use
5120     * @return a {@code DoubleStream} for the array
5121     * @since 1.8
5122     */
5123    public static DoubleStream stream(double[] array) {
5124        return stream(array, 0, array.length);
5125    }
5126
5127    /**
5128     * Returns a sequential {@link DoubleStream} with the specified range of the
5129     * specified array as its source.
5130     *
5131     * @param array the array, assumed to be unmodified during use
5132     * @param startInclusive the first index to cover, inclusive
5133     * @param endExclusive index immediately past the last index to cover
5134     * @return a {@code DoubleStream} for the array range
5135     * @throws ArrayIndexOutOfBoundsException if {@code startInclusive} is
5136     *         negative, {@code endExclusive} is less than
5137     *         {@code startInclusive}, or {@code endExclusive} is greater than
5138     *         the array size
5139     * @since 1.8
5140     */
5141    public static DoubleStream stream(double[] array, int startInclusive, int endExclusive) {
5142        return StreamSupport.doubleStream(spliterator(array, startInclusive, endExclusive), false);
5143    }
5144}
5145