emul/compact/src/main/java/java/util/Arrays.java
author Jaroslav Tulach <jaroslav.tulach@apidesign.org>
Wed, 23 Jan 2013 22:32:27 +0100
branchjdk7-b147
changeset 557 5be31d9fa455
child 564 353102c8cf9f
permissions -rw-r--r--
Basic classes needed to support ServiceLoader
     1 /*
     2  * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
     3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     4  *
     5  * This code is free software; you can redistribute it and/or modify it
     6  * under the terms of the GNU General Public License version 2 only, as
     7  * published by the Free Software Foundation.  Oracle designates this
     8  * particular file as subject to the "Classpath" exception as provided
     9  * by Oracle in the LICENSE file that accompanied this code.
    10  *
    11  * This code is distributed in the hope that it will be useful, but WITHOUT
    12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    14  * version 2 for more details (a copy is included in the LICENSE file that
    15  * accompanied this code).
    16  *
    17  * You should have received a copy of the GNU General Public License version
    18  * 2 along with this work; if not, write to the Free Software Foundation,
    19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    20  *
    21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    22  * or visit www.oracle.com if you need additional information or have any
    23  * questions.
    24  */
    25 
    26 package java.util;
    27 
    28 import java.lang.reflect.*;
    29 
    30 /**
    31  * This class contains various methods for manipulating arrays (such as
    32  * sorting and searching). This class also contains a static factory
    33  * that allows arrays to be viewed as lists.
    34  *
    35  * <p>The methods in this class all throw a {@code NullPointerException},
    36  * if the specified array reference is null, except where noted.
    37  *
    38  * <p>The documentation for the methods contained in this class includes
    39  * briefs description of the <i>implementations</i>. Such descriptions should
    40  * be regarded as <i>implementation notes</i>, rather than parts of the
    41  * <i>specification</i>. Implementors should feel free to substitute other
    42  * algorithms, so long as the specification itself is adhered to. (For
    43  * example, the algorithm used by {@code sort(Object[])} does not have to be
    44  * a MergeSort, but it does have to be <i>stable</i>.)
    45  *
    46  * <p>This class is a member of the
    47  * <a href="{@docRoot}/../technotes/guides/collections/index.html">
    48  * Java Collections Framework</a>.
    49  *
    50  * @author Josh Bloch
    51  * @author Neal Gafter
    52  * @author John Rose
    53  * @since  1.2
    54  */
    55 public class Arrays {
    56 
    57     // Suppresses default constructor, ensuring non-instantiability.
    58     private Arrays() {}
    59 
    60     /*
    61      * Sorting of primitive type arrays.
    62      */
    63 
    64     /**
    65      * Sorts the specified array into ascending numerical order.
    66      *
    67      * <p>Implementation note: The sorting algorithm is a Dual-Pivot Quicksort
    68      * by Vladimir Yaroslavskiy, Jon Bentley, and Joshua Bloch. This algorithm
    69      * offers O(n log(n)) performance on many data sets that cause other
    70      * quicksorts to degrade to quadratic performance, and is typically
    71      * faster than traditional (one-pivot) Quicksort implementations.
    72      *
    73      * @param a the array to be sorted
    74      */
    75     public static void sort(int[] a) {
    76         DualPivotQuicksort.sort(a);
    77     }
    78 
    79     /**
    80      * Sorts the specified range of the array into ascending order. The range
    81      * to be sorted extends from the index {@code fromIndex}, inclusive, to
    82      * the index {@code toIndex}, exclusive. If {@code fromIndex == toIndex},
    83      * the range to be sorted is empty.
    84      *
    85      * <p>Implementation note: The sorting algorithm is a Dual-Pivot Quicksort
    86      * by Vladimir Yaroslavskiy, Jon Bentley, and Joshua Bloch. This algorithm
    87      * offers O(n log(n)) performance on many data sets that cause other
    88      * quicksorts to degrade to quadratic performance, and is typically
    89      * faster than traditional (one-pivot) Quicksort implementations.
    90      *
    91      * @param a the array to be sorted
    92      * @param fromIndex the index of the first element, inclusive, to be sorted
    93      * @param toIndex the index of the last element, exclusive, to be sorted
    94      *
    95      * @throws IllegalArgumentException if {@code fromIndex > toIndex}
    96      * @throws ArrayIndexOutOfBoundsException
    97      *     if {@code fromIndex < 0} or {@code toIndex > a.length}
    98      */
    99     public static void sort(int[] a, int fromIndex, int toIndex) {
   100         rangeCheck(a.length, fromIndex, toIndex);
   101         DualPivotQuicksort.sort(a, fromIndex, toIndex - 1);
   102     }
   103 
   104     /**
   105      * Sorts the specified array into ascending numerical order.
   106      *
   107      * <p>Implementation note: The sorting algorithm is a Dual-Pivot Quicksort
   108      * by Vladimir Yaroslavskiy, Jon Bentley, and Joshua Bloch. This algorithm
   109      * offers O(n log(n)) performance on many data sets that cause other
   110      * quicksorts to degrade to quadratic performance, and is typically
   111      * faster than traditional (one-pivot) Quicksort implementations.
   112      *
   113      * @param a the array to be sorted
   114      */
   115     public static void sort(long[] a) {
   116         DualPivotQuicksort.sort(a);
   117     }
   118 
   119     /**
   120      * Sorts the specified range of the array into ascending order. The range
   121      * to be sorted extends from the index {@code fromIndex}, inclusive, to
   122      * the index {@code toIndex}, exclusive. If {@code fromIndex == toIndex},
   123      * the range to be sorted is empty.
   124      *
   125      * <p>Implementation note: The sorting algorithm is a Dual-Pivot Quicksort
   126      * by Vladimir Yaroslavskiy, Jon Bentley, and Joshua Bloch. This algorithm
   127      * offers O(n log(n)) performance on many data sets that cause other
   128      * quicksorts to degrade to quadratic performance, and is typically
   129      * faster than traditional (one-pivot) Quicksort implementations.
   130      *
   131      * @param a the array to be sorted
   132      * @param fromIndex the index of the first element, inclusive, to be sorted
   133      * @param toIndex the index of the last element, exclusive, to be sorted
   134      *
   135      * @throws IllegalArgumentException if {@code fromIndex > toIndex}
   136      * @throws ArrayIndexOutOfBoundsException
   137      *     if {@code fromIndex < 0} or {@code toIndex > a.length}
   138      */
   139     public static void sort(long[] a, int fromIndex, int toIndex) {
   140         rangeCheck(a.length, fromIndex, toIndex);
   141         DualPivotQuicksort.sort(a, fromIndex, toIndex - 1);
   142     }
   143 
   144     /**
   145      * Sorts the specified array into ascending numerical order.
   146      *
   147      * <p>Implementation note: The sorting algorithm is a Dual-Pivot Quicksort
   148      * by Vladimir Yaroslavskiy, Jon Bentley, and Joshua Bloch. This algorithm
   149      * offers O(n log(n)) performance on many data sets that cause other
   150      * quicksorts to degrade to quadratic performance, and is typically
   151      * faster than traditional (one-pivot) Quicksort implementations.
   152      *
   153      * @param a the array to be sorted
   154      */
   155     public static void sort(short[] a) {
   156         DualPivotQuicksort.sort(a);
   157     }
   158 
   159     /**
   160      * Sorts the specified range of the array into ascending order. The range
   161      * to be sorted extends from the index {@code fromIndex}, inclusive, to
   162      * the index {@code toIndex}, exclusive. If {@code fromIndex == toIndex},
   163      * the range to be sorted is empty.
   164      *
   165      * <p>Implementation note: The sorting algorithm is a Dual-Pivot Quicksort
   166      * by Vladimir Yaroslavskiy, Jon Bentley, and Joshua Bloch. This algorithm
   167      * offers O(n log(n)) performance on many data sets that cause other
   168      * quicksorts to degrade to quadratic performance, and is typically
   169      * faster than traditional (one-pivot) Quicksort implementations.
   170      *
   171      * @param a the array to be sorted
   172      * @param fromIndex the index of the first element, inclusive, to be sorted
   173      * @param toIndex the index of the last element, exclusive, to be sorted
   174      *
   175      * @throws IllegalArgumentException if {@code fromIndex > toIndex}
   176      * @throws ArrayIndexOutOfBoundsException
   177      *     if {@code fromIndex < 0} or {@code toIndex > a.length}
   178      */
   179     public static void sort(short[] a, int fromIndex, int toIndex) {
   180         rangeCheck(a.length, fromIndex, toIndex);
   181         DualPivotQuicksort.sort(a, fromIndex, toIndex - 1);
   182     }
   183 
   184     /**
   185      * Sorts the specified array into ascending numerical order.
   186      *
   187      * <p>Implementation note: The sorting algorithm is a Dual-Pivot Quicksort
   188      * by Vladimir Yaroslavskiy, Jon Bentley, and Joshua Bloch. This algorithm
   189      * offers O(n log(n)) performance on many data sets that cause other
   190      * quicksorts to degrade to quadratic performance, and is typically
   191      * faster than traditional (one-pivot) Quicksort implementations.
   192      *
   193      * @param a the array to be sorted
   194      */
   195     public static void sort(char[] a) {
   196         DualPivotQuicksort.sort(a);
   197     }
   198 
   199     /**
   200      * Sorts the specified range of the array into ascending order. The range
   201      * to be sorted extends from the index {@code fromIndex}, inclusive, to
   202      * the index {@code toIndex}, exclusive. If {@code fromIndex == toIndex},
   203      * the range to be sorted is empty.
   204      *
   205      * <p>Implementation note: The sorting algorithm is a Dual-Pivot Quicksort
   206      * by Vladimir Yaroslavskiy, Jon Bentley, and Joshua Bloch. This algorithm
   207      * offers O(n log(n)) performance on many data sets that cause other
   208      * quicksorts to degrade to quadratic performance, and is typically
   209      * faster than traditional (one-pivot) Quicksort implementations.
   210      *
   211      * @param a the array to be sorted
   212      * @param fromIndex the index of the first element, inclusive, to be sorted
   213      * @param toIndex the index of the last element, exclusive, to be sorted
   214      *
   215      * @throws IllegalArgumentException if {@code fromIndex > toIndex}
   216      * @throws ArrayIndexOutOfBoundsException
   217      *     if {@code fromIndex < 0} or {@code toIndex > a.length}
   218      */
   219     public static void sort(char[] a, int fromIndex, int toIndex) {
   220         rangeCheck(a.length, fromIndex, toIndex);
   221         DualPivotQuicksort.sort(a, fromIndex, toIndex - 1);
   222     }
   223 
   224     /**
   225      * Sorts the specified array into ascending numerical order.
   226      *
   227      * <p>Implementation note: The sorting algorithm is a Dual-Pivot Quicksort
   228      * by Vladimir Yaroslavskiy, Jon Bentley, and Joshua Bloch. This algorithm
   229      * offers O(n log(n)) performance on many data sets that cause other
   230      * quicksorts to degrade to quadratic performance, and is typically
   231      * faster than traditional (one-pivot) Quicksort implementations.
   232      *
   233      * @param a the array to be sorted
   234      */
   235     public static void sort(byte[] a) {
   236         DualPivotQuicksort.sort(a);
   237     }
   238 
   239     /**
   240      * Sorts the specified range of the array into ascending order. The range
   241      * to be sorted extends from the index {@code fromIndex}, inclusive, to
   242      * the index {@code toIndex}, exclusive. If {@code fromIndex == toIndex},
   243      * the range to be sorted is empty.
   244      *
   245      * <p>Implementation note: The sorting algorithm is a Dual-Pivot Quicksort
   246      * by Vladimir Yaroslavskiy, Jon Bentley, and Joshua Bloch. This algorithm
   247      * offers O(n log(n)) performance on many data sets that cause other
   248      * quicksorts to degrade to quadratic performance, and is typically
   249      * faster than traditional (one-pivot) Quicksort implementations.
   250      *
   251      * @param a the array to be sorted
   252      * @param fromIndex the index of the first element, inclusive, to be sorted
   253      * @param toIndex the index of the last element, exclusive, to be sorted
   254      *
   255      * @throws IllegalArgumentException if {@code fromIndex > toIndex}
   256      * @throws ArrayIndexOutOfBoundsException
   257      *     if {@code fromIndex < 0} or {@code toIndex > a.length}
   258      */
   259     public static void sort(byte[] a, int fromIndex, int toIndex) {
   260         rangeCheck(a.length, fromIndex, toIndex);
   261         DualPivotQuicksort.sort(a, fromIndex, toIndex - 1);
   262     }
   263 
   264     /**
   265      * Sorts the specified array into ascending numerical order.
   266      *
   267      * <p>The {@code <} relation does not provide a total order on all float
   268      * values: {@code -0.0f == 0.0f} is {@code true} and a {@code Float.NaN}
   269      * value compares neither less than, greater than, nor equal to any value,
   270      * even itself. This method uses the total order imposed by the method
   271      * {@link Float#compareTo}: {@code -0.0f} is treated as less than value
   272      * {@code 0.0f} and {@code Float.NaN} is considered greater than any
   273      * other value and all {@code Float.NaN} values are considered equal.
   274      *
   275      * <p>Implementation note: The sorting algorithm is a Dual-Pivot Quicksort
   276      * by Vladimir Yaroslavskiy, Jon Bentley, and Joshua Bloch. This algorithm
   277      * offers O(n log(n)) performance on many data sets that cause other
   278      * quicksorts to degrade to quadratic performance, and is typically
   279      * faster than traditional (one-pivot) Quicksort implementations.
   280      *
   281      * @param a the array to be sorted
   282      */
   283     public static void sort(float[] a) {
   284         DualPivotQuicksort.sort(a);
   285     }
   286 
   287     /**
   288      * Sorts the specified range of the array into ascending order. The range
   289      * to be sorted extends from the index {@code fromIndex}, inclusive, to
   290      * the index {@code toIndex}, exclusive. If {@code fromIndex == toIndex},
   291      * the range to be sorted is empty.
   292      *
   293      * <p>The {@code <} relation does not provide a total order on all float
   294      * values: {@code -0.0f == 0.0f} is {@code true} and a {@code Float.NaN}
   295      * value compares neither less than, greater than, nor equal to any value,
   296      * even itself. This method uses the total order imposed by the method
   297      * {@link Float#compareTo}: {@code -0.0f} is treated as less than value
   298      * {@code 0.0f} and {@code Float.NaN} is considered greater than any
   299      * other value and all {@code Float.NaN} values are considered equal.
   300      *
   301      * <p>Implementation note: The sorting algorithm is a Dual-Pivot Quicksort
   302      * by Vladimir Yaroslavskiy, Jon Bentley, and Joshua Bloch. This algorithm
   303      * offers O(n log(n)) performance on many data sets that cause other
   304      * quicksorts to degrade to quadratic performance, and is typically
   305      * faster than traditional (one-pivot) Quicksort implementations.
   306      *
   307      * @param a the array to be sorted
   308      * @param fromIndex the index of the first element, inclusive, to be sorted
   309      * @param toIndex the index of the last element, exclusive, to be sorted
   310      *
   311      * @throws IllegalArgumentException if {@code fromIndex > toIndex}
   312      * @throws ArrayIndexOutOfBoundsException
   313      *     if {@code fromIndex < 0} or {@code toIndex > a.length}
   314      */
   315     public static void sort(float[] a, int fromIndex, int toIndex) {
   316         rangeCheck(a.length, fromIndex, toIndex);
   317         DualPivotQuicksort.sort(a, fromIndex, toIndex - 1);
   318     }
   319 
   320     /**
   321      * Sorts the specified array into ascending numerical order.
   322      *
   323      * <p>The {@code <} relation does not provide a total order on all double
   324      * values: {@code -0.0d == 0.0d} is {@code true} and a {@code Double.NaN}
   325      * value compares neither less than, greater than, nor equal to any value,
   326      * even itself. This method uses the total order imposed by the method
   327      * {@link Double#compareTo}: {@code -0.0d} is treated as less than value
   328      * {@code 0.0d} and {@code Double.NaN} is considered greater than any
   329      * other value and all {@code Double.NaN} values are considered equal.
   330      *
   331      * <p>Implementation note: The sorting algorithm is a Dual-Pivot Quicksort
   332      * by Vladimir Yaroslavskiy, Jon Bentley, and Joshua Bloch. This algorithm
   333      * offers O(n log(n)) performance on many data sets that cause other
   334      * quicksorts to degrade to quadratic performance, and is typically
   335      * faster than traditional (one-pivot) Quicksort implementations.
   336      *
   337      * @param a the array to be sorted
   338      */
   339     public static void sort(double[] a) {
   340         DualPivotQuicksort.sort(a);
   341     }
   342 
   343     /**
   344      * Sorts the specified range of the array into ascending order. The range
   345      * to be sorted extends from the index {@code fromIndex}, inclusive, to
   346      * the index {@code toIndex}, exclusive. If {@code fromIndex == toIndex},
   347      * the range to be sorted is empty.
   348      *
   349      * <p>The {@code <} relation does not provide a total order on all double
   350      * values: {@code -0.0d == 0.0d} is {@code true} and a {@code Double.NaN}
   351      * value compares neither less than, greater than, nor equal to any value,
   352      * even itself. This method uses the total order imposed by the method
   353      * {@link Double#compareTo}: {@code -0.0d} is treated as less than value
   354      * {@code 0.0d} and {@code Double.NaN} is considered greater than any
   355      * other value and all {@code Double.NaN} values are considered equal.
   356      *
   357      * <p>Implementation note: The sorting algorithm is a Dual-Pivot Quicksort
   358      * by Vladimir Yaroslavskiy, Jon Bentley, and Joshua Bloch. This algorithm
   359      * offers O(n log(n)) performance on many data sets that cause other
   360      * quicksorts to degrade to quadratic performance, and is typically
   361      * faster than traditional (one-pivot) Quicksort implementations.
   362      *
   363      * @param a the array to be sorted
   364      * @param fromIndex the index of the first element, inclusive, to be sorted
   365      * @param toIndex the index of the last element, exclusive, to be sorted
   366      *
   367      * @throws IllegalArgumentException if {@code fromIndex > toIndex}
   368      * @throws ArrayIndexOutOfBoundsException
   369      *     if {@code fromIndex < 0} or {@code toIndex > a.length}
   370      */
   371     public static void sort(double[] a, int fromIndex, int toIndex) {
   372         rangeCheck(a.length, fromIndex, toIndex);
   373         DualPivotQuicksort.sort(a, fromIndex, toIndex - 1);
   374     }
   375 
   376     /*
   377      * Sorting of complex type arrays.
   378      */
   379 
   380     /**
   381      * Old merge sort implementation can be selected (for
   382      * compatibility with broken comparators) using a system property.
   383      * Cannot be a static boolean in the enclosing class due to
   384      * circular dependencies. To be removed in a future release.
   385      */
   386     static final class LegacyMergeSort {
   387         private static final boolean userRequested =
   388             java.security.AccessController.doPrivileged(
   389                 new sun.security.action.GetBooleanAction(
   390                     "java.util.Arrays.useLegacyMergeSort")).booleanValue();
   391     }
   392 
   393     /*
   394      * If this platform has an optimizing VM, check whether ComparableTimSort
   395      * offers any performance benefit over TimSort in conjunction with a
   396      * comparator that returns:
   397      *    {@code ((Comparable)first).compareTo(Second)}.
   398      * If not, you are better off deleting ComparableTimSort to
   399      * eliminate the code duplication.  In other words, the commented
   400      * out code below is the preferable implementation for sorting
   401      * arrays of Comparables if it offers sufficient performance.
   402      */
   403 
   404 //    /**
   405 //     * A comparator that implements the natural ordering of a group of
   406 //     * mutually comparable elements.  Using this comparator saves us
   407 //     * from duplicating most of the code in this file (one version for
   408 //     * Comparables, one for explicit Comparators).
   409 //     */
   410 //    private static final Comparator<Object> NATURAL_ORDER =
   411 //            new Comparator<Object>() {
   412 //        @SuppressWarnings("unchecked")
   413 //        public int compare(Object first, Object second) {
   414 //            return ((Comparable<Object>)first).compareTo(second);
   415 //        }
   416 //    };
   417 //
   418 //    public static void sort(Object[] a) {
   419 //        sort(a, 0, a.length, NATURAL_ORDER);
   420 //    }
   421 //
   422 //    public static void sort(Object[] a, int fromIndex, int toIndex) {
   423 //        sort(a, fromIndex, toIndex, NATURAL_ORDER);
   424 //    }
   425 
   426     /**
   427      * Sorts the specified array of objects into ascending order, according
   428      * to the {@linkplain Comparable natural ordering} of its elements.
   429      * All elements in the array must implement the {@link Comparable}
   430      * interface.  Furthermore, all elements in the array must be
   431      * <i>mutually comparable</i> (that is, {@code e1.compareTo(e2)} must
   432      * not throw a {@code ClassCastException} for any elements {@code e1}
   433      * and {@code e2} in the array).
   434      *
   435      * <p>This sort is guaranteed to be <i>stable</i>:  equal elements will
   436      * not be reordered as a result of the sort.
   437      *
   438      * <p>Implementation note: This implementation is a stable, adaptive,
   439      * iterative mergesort that requires far fewer than n lg(n) comparisons
   440      * when the input array is partially sorted, while offering the
   441      * performance of a traditional mergesort when the input array is
   442      * randomly ordered.  If the input array is nearly sorted, the
   443      * implementation requires approximately n comparisons.  Temporary
   444      * storage requirements vary from a small constant for nearly sorted
   445      * input arrays to n/2 object references for randomly ordered input
   446      * arrays.
   447      *
   448      * <p>The implementation takes equal advantage of ascending and
   449      * descending order in its input array, and can take advantage of
   450      * ascending and descending order in different parts of the the same
   451      * input array.  It is well-suited to merging two or more sorted arrays:
   452      * simply concatenate the arrays and sort the resulting array.
   453      *
   454      * <p>The implementation was adapted from Tim Peters's list sort for Python
   455      * (<a href="http://svn.python.org/projects/python/trunk/Objects/listsort.txt">
   456      * TimSort</a>).  It uses techiques from Peter McIlroy's "Optimistic
   457      * Sorting and Information Theoretic Complexity", in Proceedings of the
   458      * Fourth Annual ACM-SIAM Symposium on Discrete Algorithms, pp 467-474,
   459      * January 1993.
   460      *
   461      * @param a the array to be sorted
   462      * @throws ClassCastException if the array contains elements that are not
   463      *         <i>mutually comparable</i> (for example, strings and integers)
   464      * @throws IllegalArgumentException (optional) if the natural
   465      *         ordering of the array elements is found to violate the
   466      *         {@link Comparable} contract
   467      */
   468     public static void sort(Object[] a) {
   469         if (LegacyMergeSort.userRequested)
   470             legacyMergeSort(a);
   471         else
   472             ComparableTimSort.sort(a);
   473     }
   474 
   475     /** To be removed in a future release. */
   476     private static void legacyMergeSort(Object[] a) {
   477         Object[] aux = a.clone();
   478         mergeSort(aux, a, 0, a.length, 0);
   479     }
   480 
   481     /**
   482      * Sorts the specified range of the specified array of objects into
   483      * ascending order, according to the
   484      * {@linkplain Comparable natural ordering} of its
   485      * elements.  The range to be sorted extends from index
   486      * {@code fromIndex}, inclusive, to index {@code toIndex}, exclusive.
   487      * (If {@code fromIndex==toIndex}, the range to be sorted is empty.)  All
   488      * elements in this range must implement the {@link Comparable}
   489      * interface.  Furthermore, all elements in this range must be <i>mutually
   490      * comparable</i> (that is, {@code e1.compareTo(e2)} must not throw a
   491      * {@code ClassCastException} for any elements {@code e1} and
   492      * {@code e2} in the array).
   493      *
   494      * <p>This sort is guaranteed to be <i>stable</i>:  equal elements will
   495      * not be reordered as a result of the sort.
   496      *
   497      * <p>Implementation note: This implementation is a stable, adaptive,
   498      * iterative mergesort that requires far fewer than n lg(n) comparisons
   499      * when the input array is partially sorted, while offering the
   500      * performance of a traditional mergesort when the input array is
   501      * randomly ordered.  If the input array is nearly sorted, the
   502      * implementation requires approximately n comparisons.  Temporary
   503      * storage requirements vary from a small constant for nearly sorted
   504      * input arrays to n/2 object references for randomly ordered input
   505      * arrays.
   506      *
   507      * <p>The implementation takes equal advantage of ascending and
   508      * descending order in its input array, and can take advantage of
   509      * ascending and descending order in different parts of the the same
   510      * input array.  It is well-suited to merging two or more sorted arrays:
   511      * simply concatenate the arrays and sort the resulting array.
   512      *
   513      * <p>The implementation was adapted from Tim Peters's list sort for Python
   514      * (<a href="http://svn.python.org/projects/python/trunk/Objects/listsort.txt">
   515      * TimSort</a>).  It uses techiques from Peter McIlroy's "Optimistic
   516      * Sorting and Information Theoretic Complexity", in Proceedings of the
   517      * Fourth Annual ACM-SIAM Symposium on Discrete Algorithms, pp 467-474,
   518      * January 1993.
   519      *
   520      * @param a the array to be sorted
   521      * @param fromIndex the index of the first element (inclusive) to be
   522      *        sorted
   523      * @param toIndex the index of the last element (exclusive) to be sorted
   524      * @throws IllegalArgumentException if {@code fromIndex > toIndex} or
   525      *         (optional) if the natural ordering of the array elements is
   526      *         found to violate the {@link Comparable} contract
   527      * @throws ArrayIndexOutOfBoundsException if {@code fromIndex < 0} or
   528      *         {@code toIndex > a.length}
   529      * @throws ClassCastException if the array contains elements that are
   530      *         not <i>mutually comparable</i> (for example, strings and
   531      *         integers).
   532      */
   533     public static void sort(Object[] a, int fromIndex, int toIndex) {
   534         if (LegacyMergeSort.userRequested)
   535             legacyMergeSort(a, fromIndex, toIndex);
   536         else
   537             ComparableTimSort.sort(a, fromIndex, toIndex);
   538     }
   539 
   540     /** To be removed in a future release. */
   541     private static void legacyMergeSort(Object[] a,
   542                                         int fromIndex, int toIndex) {
   543         rangeCheck(a.length, fromIndex, toIndex);
   544         Object[] aux = copyOfRange(a, fromIndex, toIndex);
   545         mergeSort(aux, a, fromIndex, toIndex, -fromIndex);
   546     }
   547 
   548     /**
   549      * Tuning parameter: list size at or below which insertion sort will be
   550      * used in preference to mergesort.
   551      * To be removed in a future release.
   552      */
   553     private static final int INSERTIONSORT_THRESHOLD = 7;
   554 
   555     /**
   556      * Src is the source array that starts at index 0
   557      * Dest is the (possibly larger) array destination with a possible offset
   558      * low is the index in dest to start sorting
   559      * high is the end index in dest to end sorting
   560      * off is the offset to generate corresponding low, high in src
   561      * To be removed in a future release.
   562      */
   563     private static void mergeSort(Object[] src,
   564                                   Object[] dest,
   565                                   int low,
   566                                   int high,
   567                                   int off) {
   568         int length = high - low;
   569 
   570         // Insertion sort on smallest arrays
   571         if (length < INSERTIONSORT_THRESHOLD) {
   572             for (int i=low; i<high; i++)
   573                 for (int j=i; j>low &&
   574                          ((Comparable) dest[j-1]).compareTo(dest[j])>0; j--)
   575                     swap(dest, j, j-1);
   576             return;
   577         }
   578 
   579         // Recursively sort halves of dest into src
   580         int destLow  = low;
   581         int destHigh = high;
   582         low  += off;
   583         high += off;
   584         int mid = (low + high) >>> 1;
   585         mergeSort(dest, src, low, mid, -off);
   586         mergeSort(dest, src, mid, high, -off);
   587 
   588         // If list is already sorted, just copy from src to dest.  This is an
   589         // optimization that results in faster sorts for nearly ordered lists.
   590         if (((Comparable)src[mid-1]).compareTo(src[mid]) <= 0) {
   591             System.arraycopy(src, low, dest, destLow, length);
   592             return;
   593         }
   594 
   595         // Merge sorted halves (now in src) into dest
   596         for(int i = destLow, p = low, q = mid; i < destHigh; i++) {
   597             if (q >= high || p < mid && ((Comparable)src[p]).compareTo(src[q])<=0)
   598                 dest[i] = src[p++];
   599             else
   600                 dest[i] = src[q++];
   601         }
   602     }
   603 
   604     /**
   605      * Swaps x[a] with x[b].
   606      */
   607     private static void swap(Object[] x, int a, int b) {
   608         Object t = x[a];
   609         x[a] = x[b];
   610         x[b] = t;
   611     }
   612 
   613     /**
   614      * Sorts the specified array of objects according to the order induced by
   615      * the specified comparator.  All elements in the array must be
   616      * <i>mutually comparable</i> by the specified comparator (that is,
   617      * {@code c.compare(e1, e2)} must not throw a {@code ClassCastException}
   618      * for any elements {@code e1} and {@code e2} in the array).
   619      *
   620      * <p>This sort is guaranteed to be <i>stable</i>:  equal elements will
   621      * not be reordered as a result of the sort.
   622      *
   623      * <p>Implementation note: This implementation is a stable, adaptive,
   624      * iterative mergesort that requires far fewer than n lg(n) comparisons
   625      * when the input array is partially sorted, while offering the
   626      * performance of a traditional mergesort when the input array is
   627      * randomly ordered.  If the input array is nearly sorted, the
   628      * implementation requires approximately n comparisons.  Temporary
   629      * storage requirements vary from a small constant for nearly sorted
   630      * input arrays to n/2 object references for randomly ordered input
   631      * arrays.
   632      *
   633      * <p>The implementation takes equal advantage of ascending and
   634      * descending order in its input array, and can take advantage of
   635      * ascending and descending order in different parts of the the same
   636      * input array.  It is well-suited to merging two or more sorted arrays:
   637      * simply concatenate the arrays and sort the resulting array.
   638      *
   639      * <p>The implementation was adapted from Tim Peters's list sort for Python
   640      * (<a href="http://svn.python.org/projects/python/trunk/Objects/listsort.txt">
   641      * TimSort</a>).  It uses techiques from Peter McIlroy's "Optimistic
   642      * Sorting and Information Theoretic Complexity", in Proceedings of the
   643      * Fourth Annual ACM-SIAM Symposium on Discrete Algorithms, pp 467-474,
   644      * January 1993.
   645      *
   646      * @param a the array to be sorted
   647      * @param c the comparator to determine the order of the array.  A
   648      *        {@code null} value indicates that the elements'
   649      *        {@linkplain Comparable natural ordering} should be used.
   650      * @throws ClassCastException if the array contains elements that are
   651      *         not <i>mutually comparable</i> using the specified comparator
   652      * @throws IllegalArgumentException (optional) if the comparator is
   653      *         found to violate the {@link Comparator} contract
   654      */
   655     public static <T> void sort(T[] a, Comparator<? super T> c) {
   656         if (LegacyMergeSort.userRequested)
   657             legacyMergeSort(a, c);
   658         else
   659             TimSort.sort(a, c);
   660     }
   661 
   662     /** To be removed in a future release. */
   663     private static <T> void legacyMergeSort(T[] a, Comparator<? super T> c) {
   664         T[] aux = a.clone();
   665         if (c==null)
   666             mergeSort(aux, a, 0, a.length, 0);
   667         else
   668             mergeSort(aux, a, 0, a.length, 0, c);
   669     }
   670 
   671     /**
   672      * Sorts the specified range of the specified array of objects according
   673      * to the order induced by the specified comparator.  The range to be
   674      * sorted extends from index {@code fromIndex}, inclusive, to index
   675      * {@code toIndex}, exclusive.  (If {@code fromIndex==toIndex}, the
   676      * range to be sorted is empty.)  All elements in the range must be
   677      * <i>mutually comparable</i> by the specified comparator (that is,
   678      * {@code c.compare(e1, e2)} must not throw a {@code ClassCastException}
   679      * for any elements {@code e1} and {@code e2} in the range).
   680      *
   681      * <p>This sort is guaranteed to be <i>stable</i>:  equal elements will
   682      * not be reordered as a result of the sort.
   683      *
   684      * <p>Implementation note: This implementation is a stable, adaptive,
   685      * iterative mergesort that requires far fewer than n lg(n) comparisons
   686      * when the input array is partially sorted, while offering the
   687      * performance of a traditional mergesort when the input array is
   688      * randomly ordered.  If the input array is nearly sorted, the
   689      * implementation requires approximately n comparisons.  Temporary
   690      * storage requirements vary from a small constant for nearly sorted
   691      * input arrays to n/2 object references for randomly ordered input
   692      * arrays.
   693      *
   694      * <p>The implementation takes equal advantage of ascending and
   695      * descending order in its input array, and can take advantage of
   696      * ascending and descending order in different parts of the the same
   697      * input array.  It is well-suited to merging two or more sorted arrays:
   698      * simply concatenate the arrays and sort the resulting array.
   699      *
   700      * <p>The implementation was adapted from Tim Peters's list sort for Python
   701      * (<a href="http://svn.python.org/projects/python/trunk/Objects/listsort.txt">
   702      * TimSort</a>).  It uses techiques from Peter McIlroy's "Optimistic
   703      * Sorting and Information Theoretic Complexity", in Proceedings of the
   704      * Fourth Annual ACM-SIAM Symposium on Discrete Algorithms, pp 467-474,
   705      * January 1993.
   706      *
   707      * @param a the array to be sorted
   708      * @param fromIndex the index of the first element (inclusive) to be
   709      *        sorted
   710      * @param toIndex the index of the last element (exclusive) to be sorted
   711      * @param c the comparator to determine the order of the array.  A
   712      *        {@code null} value indicates that the elements'
   713      *        {@linkplain Comparable natural ordering} should be used.
   714      * @throws ClassCastException if the array contains elements that are not
   715      *         <i>mutually comparable</i> using the specified comparator.
   716      * @throws IllegalArgumentException if {@code fromIndex > toIndex} or
   717      *         (optional) if the comparator is found to violate the
   718      *         {@link Comparator} contract
   719      * @throws ArrayIndexOutOfBoundsException if {@code fromIndex < 0} or
   720      *         {@code toIndex > a.length}
   721      */
   722     public static <T> void sort(T[] a, int fromIndex, int toIndex,
   723                                 Comparator<? super T> c) {
   724         if (LegacyMergeSort.userRequested)
   725             legacyMergeSort(a, fromIndex, toIndex, c);
   726         else
   727             TimSort.sort(a, fromIndex, toIndex, c);
   728     }
   729 
   730     /** To be removed in a future release. */
   731     private static <T> void legacyMergeSort(T[] a, int fromIndex, int toIndex,
   732                                             Comparator<? super T> c) {
   733         rangeCheck(a.length, fromIndex, toIndex);
   734         T[] aux = copyOfRange(a, fromIndex, toIndex);
   735         if (c==null)
   736             mergeSort(aux, a, fromIndex, toIndex, -fromIndex);
   737         else
   738             mergeSort(aux, a, fromIndex, toIndex, -fromIndex, c);
   739     }
   740 
   741     /**
   742      * Src is the source array that starts at index 0
   743      * Dest is the (possibly larger) array destination with a possible offset
   744      * low is the index in dest to start sorting
   745      * high is the end index in dest to end sorting
   746      * off is the offset into src corresponding to low in dest
   747      * To be removed in a future release.
   748      */
   749     private static void mergeSort(Object[] src,
   750                                   Object[] dest,
   751                                   int low, int high, int off,
   752                                   Comparator c) {
   753         int length = high - low;
   754 
   755         // Insertion sort on smallest arrays
   756         if (length < INSERTIONSORT_THRESHOLD) {
   757             for (int i=low; i<high; i++)
   758                 for (int j=i; j>low && c.compare(dest[j-1], dest[j])>0; j--)
   759                     swap(dest, j, j-1);
   760             return;
   761         }
   762 
   763         // Recursively sort halves of dest into src
   764         int destLow  = low;
   765         int destHigh = high;
   766         low  += off;
   767         high += off;
   768         int mid = (low + high) >>> 1;
   769         mergeSort(dest, src, low, mid, -off, c);
   770         mergeSort(dest, src, mid, high, -off, c);
   771 
   772         // If list is already sorted, just copy from src to dest.  This is an
   773         // optimization that results in faster sorts for nearly ordered lists.
   774         if (c.compare(src[mid-1], src[mid]) <= 0) {
   775            System.arraycopy(src, low, dest, destLow, length);
   776            return;
   777         }
   778 
   779         // Merge sorted halves (now in src) into dest
   780         for(int i = destLow, p = low, q = mid; i < destHigh; i++) {
   781             if (q >= high || p < mid && c.compare(src[p], src[q]) <= 0)
   782                 dest[i] = src[p++];
   783             else
   784                 dest[i] = src[q++];
   785         }
   786     }
   787 
   788     /**
   789      * Checks that {@code fromIndex} and {@code toIndex} are in
   790      * the range and throws an appropriate exception, if they aren't.
   791      */
   792     private static void rangeCheck(int length, int fromIndex, int toIndex) {
   793         if (fromIndex > toIndex) {
   794             throw new IllegalArgumentException(
   795                 "fromIndex(" + fromIndex + ") > toIndex(" + toIndex + ")");
   796         }
   797         if (fromIndex < 0) {
   798             throw new ArrayIndexOutOfBoundsException(fromIndex);
   799         }
   800         if (toIndex > length) {
   801             throw new ArrayIndexOutOfBoundsException(toIndex);
   802         }
   803     }
   804 
   805     // Searching
   806 
   807     /**
   808      * Searches the specified array of longs for the specified value using the
   809      * binary search algorithm.  The array must be sorted (as
   810      * by the {@link #sort(long[])} method) prior to making this call.  If it
   811      * is not sorted, the results are undefined.  If the array contains
   812      * multiple elements with the specified value, there is no guarantee which
   813      * one will be found.
   814      *
   815      * @param a the array to be searched
   816      * @param key the value to be searched for
   817      * @return index of the search key, if it is contained in the array;
   818      *         otherwise, <tt>(-(<i>insertion point</i>) - 1)</tt>.  The
   819      *         <i>insertion point</i> is defined as the point at which the
   820      *         key would be inserted into the array: the index of the first
   821      *         element greater than the key, or <tt>a.length</tt> if all
   822      *         elements in the array are less than the specified key.  Note
   823      *         that this guarantees that the return value will be &gt;= 0 if
   824      *         and only if the key is found.
   825      */
   826     public static int binarySearch(long[] a, long key) {
   827         return binarySearch0(a, 0, a.length, key);
   828     }
   829 
   830     /**
   831      * Searches a range of
   832      * the specified array of longs for the specified value using the
   833      * binary search algorithm.
   834      * The range must be sorted (as
   835      * by the {@link #sort(long[], int, int)} method)
   836      * prior to making this call.  If it
   837      * is not sorted, the results are undefined.  If the range contains
   838      * multiple elements with the specified value, there is no guarantee which
   839      * one will be found.
   840      *
   841      * @param a the array to be searched
   842      * @param fromIndex the index of the first element (inclusive) to be
   843      *          searched
   844      * @param toIndex the index of the last element (exclusive) to be searched
   845      * @param key the value to be searched for
   846      * @return index of the search key, if it is contained in the array
   847      *         within the specified range;
   848      *         otherwise, <tt>(-(<i>insertion point</i>) - 1)</tt>.  The
   849      *         <i>insertion point</i> is defined as the point at which the
   850      *         key would be inserted into the array: the index of the first
   851      *         element in the range greater than the key,
   852      *         or <tt>toIndex</tt> if all
   853      *         elements in the range are less than the specified key.  Note
   854      *         that this guarantees that the return value will be &gt;= 0 if
   855      *         and only if the key is found.
   856      * @throws IllegalArgumentException
   857      *         if {@code fromIndex > toIndex}
   858      * @throws ArrayIndexOutOfBoundsException
   859      *         if {@code fromIndex < 0 or toIndex > a.length}
   860      * @since 1.6
   861      */
   862     public static int binarySearch(long[] a, int fromIndex, int toIndex,
   863                                    long key) {
   864         rangeCheck(a.length, fromIndex, toIndex);
   865         return binarySearch0(a, fromIndex, toIndex, key);
   866     }
   867 
   868     // Like public version, but without range checks.
   869     private static int binarySearch0(long[] a, int fromIndex, int toIndex,
   870                                      long key) {
   871         int low = fromIndex;
   872         int high = toIndex - 1;
   873 
   874         while (low <= high) {
   875             int mid = (low + high) >>> 1;
   876             long midVal = a[mid];
   877 
   878             if (midVal < key)
   879                 low = mid + 1;
   880             else if (midVal > key)
   881                 high = mid - 1;
   882             else
   883                 return mid; // key found
   884         }
   885         return -(low + 1);  // key not found.
   886     }
   887 
   888     /**
   889      * Searches the specified array of ints for the specified value using the
   890      * binary search algorithm.  The array must be sorted (as
   891      * by the {@link #sort(int[])} method) prior to making this call.  If it
   892      * is not sorted, the results are undefined.  If the array contains
   893      * multiple elements with the specified value, there is no guarantee which
   894      * one will be found.
   895      *
   896      * @param a the array to be searched
   897      * @param key the value to be searched for
   898      * @return index of the search key, if it is contained in the array;
   899      *         otherwise, <tt>(-(<i>insertion point</i>) - 1)</tt>.  The
   900      *         <i>insertion point</i> is defined as the point at which the
   901      *         key would be inserted into the array: the index of the first
   902      *         element greater than the key, or <tt>a.length</tt> if all
   903      *         elements in the array are less than the specified key.  Note
   904      *         that this guarantees that the return value will be &gt;= 0 if
   905      *         and only if the key is found.
   906      */
   907     public static int binarySearch(int[] a, int key) {
   908         return binarySearch0(a, 0, a.length, key);
   909     }
   910 
   911     /**
   912      * Searches a range of
   913      * the specified array of ints for the specified value using the
   914      * binary search algorithm.
   915      * The range must be sorted (as
   916      * by the {@link #sort(int[], int, int)} method)
   917      * prior to making this call.  If it
   918      * is not sorted, the results are undefined.  If the range contains
   919      * multiple elements with the specified value, there is no guarantee which
   920      * one will be found.
   921      *
   922      * @param a the array to be searched
   923      * @param fromIndex the index of the first element (inclusive) to be
   924      *          searched
   925      * @param toIndex the index of the last element (exclusive) to be searched
   926      * @param key the value to be searched for
   927      * @return index of the search key, if it is contained in the array
   928      *         within the specified range;
   929      *         otherwise, <tt>(-(<i>insertion point</i>) - 1)</tt>.  The
   930      *         <i>insertion point</i> is defined as the point at which the
   931      *         key would be inserted into the array: the index of the first
   932      *         element in the range greater than the key,
   933      *         or <tt>toIndex</tt> if all
   934      *         elements in the range are less than the specified key.  Note
   935      *         that this guarantees that the return value will be &gt;= 0 if
   936      *         and only if the key is found.
   937      * @throws IllegalArgumentException
   938      *         if {@code fromIndex > toIndex}
   939      * @throws ArrayIndexOutOfBoundsException
   940      *         if {@code fromIndex < 0 or toIndex > a.length}
   941      * @since 1.6
   942      */
   943     public static int binarySearch(int[] a, int fromIndex, int toIndex,
   944                                    int key) {
   945         rangeCheck(a.length, fromIndex, toIndex);
   946         return binarySearch0(a, fromIndex, toIndex, key);
   947     }
   948 
   949     // Like public version, but without range checks.
   950     private static int binarySearch0(int[] a, int fromIndex, int toIndex,
   951                                      int key) {
   952         int low = fromIndex;
   953         int high = toIndex - 1;
   954 
   955         while (low <= high) {
   956             int mid = (low + high) >>> 1;
   957             int midVal = a[mid];
   958 
   959             if (midVal < key)
   960                 low = mid + 1;
   961             else if (midVal > key)
   962                 high = mid - 1;
   963             else
   964                 return mid; // key found
   965         }
   966         return -(low + 1);  // key not found.
   967     }
   968 
   969     /**
   970      * Searches the specified array of shorts for the specified value using
   971      * the binary search algorithm.  The array must be sorted
   972      * (as by the {@link #sort(short[])} method) prior to making this call.  If
   973      * it is not sorted, the results are undefined.  If the array contains
   974      * multiple elements with the specified value, there is no guarantee which
   975      * one will be found.
   976      *
   977      * @param a the array to be searched
   978      * @param key the value to be searched for
   979      * @return index of the search key, if it is contained in the array;
   980      *         otherwise, <tt>(-(<i>insertion point</i>) - 1)</tt>.  The
   981      *         <i>insertion point</i> is defined as the point at which the
   982      *         key would be inserted into the array: the index of the first
   983      *         element greater than the key, or <tt>a.length</tt> if all
   984      *         elements in the array are less than the specified key.  Note
   985      *         that this guarantees that the return value will be &gt;= 0 if
   986      *         and only if the key is found.
   987      */
   988     public static int binarySearch(short[] a, short key) {
   989         return binarySearch0(a, 0, a.length, key);
   990     }
   991 
   992     /**
   993      * Searches a range of
   994      * the specified array of shorts for the specified value using
   995      * the binary search algorithm.
   996      * The range must be sorted
   997      * (as by the {@link #sort(short[], int, int)} method)
   998      * prior to making this call.  If
   999      * it is not sorted, the results are undefined.  If the range contains
  1000      * multiple elements with the specified value, there is no guarantee which
  1001      * one will be found.
  1002      *
  1003      * @param a the array to be searched
  1004      * @param fromIndex the index of the first element (inclusive) to be
  1005      *          searched
  1006      * @param toIndex the index of the last element (exclusive) to be searched
  1007      * @param key the value to be searched for
  1008      * @return index of the search key, if it is contained in the array
  1009      *         within the specified range;
  1010      *         otherwise, <tt>(-(<i>insertion point</i>) - 1)</tt>.  The
  1011      *         <i>insertion point</i> is defined as the point at which the
  1012      *         key would be inserted into the array: the index of the first
  1013      *         element in the range greater than the key,
  1014      *         or <tt>toIndex</tt> if all
  1015      *         elements in the range are less than the specified key.  Note
  1016      *         that this guarantees that the return value will be &gt;= 0 if
  1017      *         and only if the key is found.
  1018      * @throws IllegalArgumentException
  1019      *         if {@code fromIndex > toIndex}
  1020      * @throws ArrayIndexOutOfBoundsException
  1021      *         if {@code fromIndex < 0 or toIndex > a.length}
  1022      * @since 1.6
  1023      */
  1024     public static int binarySearch(short[] a, int fromIndex, int toIndex,
  1025                                    short key) {
  1026         rangeCheck(a.length, fromIndex, toIndex);
  1027         return binarySearch0(a, fromIndex, toIndex, key);
  1028     }
  1029 
  1030     // Like public version, but without range checks.
  1031     private static int binarySearch0(short[] a, int fromIndex, int toIndex,
  1032                                      short key) {
  1033         int low = fromIndex;
  1034         int high = toIndex - 1;
  1035 
  1036         while (low <= high) {
  1037             int mid = (low + high) >>> 1;
  1038             short midVal = a[mid];
  1039 
  1040             if (midVal < key)
  1041                 low = mid + 1;
  1042             else if (midVal > key)
  1043                 high = mid - 1;
  1044             else
  1045                 return mid; // key found
  1046         }
  1047         return -(low + 1);  // key not found.
  1048     }
  1049 
  1050     /**
  1051      * Searches the specified array of chars for the specified value using the
  1052      * binary search algorithm.  The array must be sorted (as
  1053      * by the {@link #sort(char[])} method) prior to making this call.  If it
  1054      * is not sorted, the results are undefined.  If the array contains
  1055      * multiple elements with the specified value, there is no guarantee which
  1056      * one will be found.
  1057      *
  1058      * @param a the array to be searched
  1059      * @param key the value to be searched for
  1060      * @return index of the search key, if it is contained in the array;
  1061      *         otherwise, <tt>(-(<i>insertion point</i>) - 1)</tt>.  The
  1062      *         <i>insertion point</i> is defined as the point at which the
  1063      *         key would be inserted into the array: the index of the first
  1064      *         element greater than the key, or <tt>a.length</tt> if all
  1065      *         elements in the array are less than the specified key.  Note
  1066      *         that this guarantees that the return value will be &gt;= 0 if
  1067      *         and only if the key is found.
  1068      */
  1069     public static int binarySearch(char[] a, char key) {
  1070         return binarySearch0(a, 0, a.length, key);
  1071     }
  1072 
  1073     /**
  1074      * Searches a range of
  1075      * the specified array of chars for the specified value using the
  1076      * binary search algorithm.
  1077      * The range must be sorted (as
  1078      * by the {@link #sort(char[], int, int)} method)
  1079      * prior to making this call.  If it
  1080      * is not sorted, the results are undefined.  If the range contains
  1081      * multiple elements with the specified value, there is no guarantee which
  1082      * one will be found.
  1083      *
  1084      * @param a the array to be searched
  1085      * @param fromIndex the index of the first element (inclusive) to be
  1086      *          searched
  1087      * @param toIndex the index of the last element (exclusive) to be searched
  1088      * @param key the value to be searched for
  1089      * @return index of the search key, if it is contained in the array
  1090      *         within the specified range;
  1091      *         otherwise, <tt>(-(<i>insertion point</i>) - 1)</tt>.  The
  1092      *         <i>insertion point</i> is defined as the point at which the
  1093      *         key would be inserted into the array: the index of the first
  1094      *         element in the range greater than the key,
  1095      *         or <tt>toIndex</tt> if all
  1096      *         elements in the range are less than the specified key.  Note
  1097      *         that this guarantees that the return value will be &gt;= 0 if
  1098      *         and only if the key is found.
  1099      * @throws IllegalArgumentException
  1100      *         if {@code fromIndex > toIndex}
  1101      * @throws ArrayIndexOutOfBoundsException
  1102      *         if {@code fromIndex < 0 or toIndex > a.length}
  1103      * @since 1.6
  1104      */
  1105     public static int binarySearch(char[] a, int fromIndex, int toIndex,
  1106                                    char key) {
  1107         rangeCheck(a.length, fromIndex, toIndex);
  1108         return binarySearch0(a, fromIndex, toIndex, key);
  1109     }
  1110 
  1111     // Like public version, but without range checks.
  1112     private static int binarySearch0(char[] a, int fromIndex, int toIndex,
  1113                                      char key) {
  1114         int low = fromIndex;
  1115         int high = toIndex - 1;
  1116 
  1117         while (low <= high) {
  1118             int mid = (low + high) >>> 1;
  1119             char midVal = a[mid];
  1120 
  1121             if (midVal < key)
  1122                 low = mid + 1;
  1123             else if (midVal > key)
  1124                 high = mid - 1;
  1125             else
  1126                 return mid; // key found
  1127         }
  1128         return -(low + 1);  // key not found.
  1129     }
  1130 
  1131     /**
  1132      * Searches the specified array of bytes for the specified value using the
  1133      * binary search algorithm.  The array must be sorted (as
  1134      * by the {@link #sort(byte[])} method) prior to making this call.  If it
  1135      * is not sorted, the results are undefined.  If the array contains
  1136      * multiple elements with the specified value, there is no guarantee which
  1137      * one will be found.
  1138      *
  1139      * @param a the array to be searched
  1140      * @param key the value to be searched for
  1141      * @return index of the search key, if it is contained in the array;
  1142      *         otherwise, <tt>(-(<i>insertion point</i>) - 1)</tt>.  The
  1143      *         <i>insertion point</i> is defined as the point at which the
  1144      *         key would be inserted into the array: the index of the first
  1145      *         element greater than the key, or <tt>a.length</tt> if all
  1146      *         elements in the array are less than the specified key.  Note
  1147      *         that this guarantees that the return value will be &gt;= 0 if
  1148      *         and only if the key is found.
  1149      */
  1150     public static int binarySearch(byte[] a, byte key) {
  1151         return binarySearch0(a, 0, a.length, key);
  1152     }
  1153 
  1154     /**
  1155      * Searches a range of
  1156      * the specified array of bytes for the specified value using the
  1157      * binary search algorithm.
  1158      * The range must be sorted (as
  1159      * by the {@link #sort(byte[], int, int)} method)
  1160      * prior to making this call.  If it
  1161      * is not sorted, the results are undefined.  If the range contains
  1162      * multiple elements with the specified value, there is no guarantee which
  1163      * one will be found.
  1164      *
  1165      * @param a the array to be searched
  1166      * @param fromIndex the index of the first element (inclusive) to be
  1167      *          searched
  1168      * @param toIndex the index of the last element (exclusive) to be searched
  1169      * @param key the value to be searched for
  1170      * @return index of the search key, if it is contained in the array
  1171      *         within the specified range;
  1172      *         otherwise, <tt>(-(<i>insertion point</i>) - 1)</tt>.  The
  1173      *         <i>insertion point</i> is defined as the point at which the
  1174      *         key would be inserted into the array: the index of the first
  1175      *         element in the range greater than the key,
  1176      *         or <tt>toIndex</tt> if all
  1177      *         elements in the range are less than the specified key.  Note
  1178      *         that this guarantees that the return value will be &gt;= 0 if
  1179      *         and only if the key is found.
  1180      * @throws IllegalArgumentException
  1181      *         if {@code fromIndex > toIndex}
  1182      * @throws ArrayIndexOutOfBoundsException
  1183      *         if {@code fromIndex < 0 or toIndex > a.length}
  1184      * @since 1.6
  1185      */
  1186     public static int binarySearch(byte[] a, int fromIndex, int toIndex,
  1187                                    byte key) {
  1188         rangeCheck(a.length, fromIndex, toIndex);
  1189         return binarySearch0(a, fromIndex, toIndex, key);
  1190     }
  1191 
  1192     // Like public version, but without range checks.
  1193     private static int binarySearch0(byte[] a, int fromIndex, int toIndex,
  1194                                      byte key) {
  1195         int low = fromIndex;
  1196         int high = toIndex - 1;
  1197 
  1198         while (low <= high) {
  1199             int mid = (low + high) >>> 1;
  1200             byte midVal = a[mid];
  1201 
  1202             if (midVal < key)
  1203                 low = mid + 1;
  1204             else if (midVal > key)
  1205                 high = mid - 1;
  1206             else
  1207                 return mid; // key found
  1208         }
  1209         return -(low + 1);  // key not found.
  1210     }
  1211 
  1212     /**
  1213      * Searches the specified array of doubles for the specified value using
  1214      * the binary search algorithm.  The array must be sorted
  1215      * (as by the {@link #sort(double[])} method) prior to making this call.
  1216      * If it is not sorted, the results are undefined.  If the array contains
  1217      * multiple elements with the specified value, there is no guarantee which
  1218      * one will be found.  This method considers all NaN values to be
  1219      * equivalent and equal.
  1220      *
  1221      * @param a the array to be searched
  1222      * @param key the value to be searched for
  1223      * @return index of the search key, if it is contained in the array;
  1224      *         otherwise, <tt>(-(<i>insertion point</i>) - 1)</tt>.  The
  1225      *         <i>insertion point</i> is defined as the point at which the
  1226      *         key would be inserted into the array: the index of the first
  1227      *         element greater than the key, or <tt>a.length</tt> if all
  1228      *         elements in the array are less than the specified key.  Note
  1229      *         that this guarantees that the return value will be &gt;= 0 if
  1230      *         and only if the key is found.
  1231      */
  1232     public static int binarySearch(double[] a, double key) {
  1233         return binarySearch0(a, 0, a.length, key);
  1234     }
  1235 
  1236     /**
  1237      * Searches a range of
  1238      * the specified array of doubles for the specified value using
  1239      * the binary search algorithm.
  1240      * The range must be sorted
  1241      * (as by the {@link #sort(double[], int, int)} method)
  1242      * prior to making this call.
  1243      * If it is not sorted, the results are undefined.  If the range contains
  1244      * multiple elements with the specified value, there is no guarantee which
  1245      * one will be found.  This method considers all NaN values to be
  1246      * equivalent and equal.
  1247      *
  1248      * @param a the array to be searched
  1249      * @param fromIndex the index of the first element (inclusive) to be
  1250      *          searched
  1251      * @param toIndex the index of the last element (exclusive) to be searched
  1252      * @param key the value to be searched for
  1253      * @return index of the search key, if it is contained in the array
  1254      *         within the specified range;
  1255      *         otherwise, <tt>(-(<i>insertion point</i>) - 1)</tt>.  The
  1256      *         <i>insertion point</i> is defined as the point at which the
  1257      *         key would be inserted into the array: the index of the first
  1258      *         element in the range greater than the key,
  1259      *         or <tt>toIndex</tt> if all
  1260      *         elements in the range are less than the specified key.  Note
  1261      *         that this guarantees that the return value will be &gt;= 0 if
  1262      *         and only if the key is found.
  1263      * @throws IllegalArgumentException
  1264      *         if {@code fromIndex > toIndex}
  1265      * @throws ArrayIndexOutOfBoundsException
  1266      *         if {@code fromIndex < 0 or toIndex > a.length}
  1267      * @since 1.6
  1268      */
  1269     public static int binarySearch(double[] a, int fromIndex, int toIndex,
  1270                                    double key) {
  1271         rangeCheck(a.length, fromIndex, toIndex);
  1272         return binarySearch0(a, fromIndex, toIndex, key);
  1273     }
  1274 
  1275     // Like public version, but without range checks.
  1276     private static int binarySearch0(double[] a, int fromIndex, int toIndex,
  1277                                      double key) {
  1278         int low = fromIndex;
  1279         int high = toIndex - 1;
  1280 
  1281         while (low <= high) {
  1282             int mid = (low + high) >>> 1;
  1283             double midVal = a[mid];
  1284 
  1285             if (midVal < key)
  1286                 low = mid + 1;  // Neither val is NaN, thisVal is smaller
  1287             else if (midVal > key)
  1288                 high = mid - 1; // Neither val is NaN, thisVal is larger
  1289             else {
  1290                 long midBits = Double.doubleToLongBits(midVal);
  1291                 long keyBits = Double.doubleToLongBits(key);
  1292                 if (midBits == keyBits)     // Values are equal
  1293                     return mid;             // Key found
  1294                 else if (midBits < keyBits) // (-0.0, 0.0) or (!NaN, NaN)
  1295                     low = mid + 1;
  1296                 else                        // (0.0, -0.0) or (NaN, !NaN)
  1297                     high = mid - 1;
  1298             }
  1299         }
  1300         return -(low + 1);  // key not found.
  1301     }
  1302 
  1303     /**
  1304      * Searches the specified array of floats for the specified value using
  1305      * the binary search algorithm. The array must be sorted
  1306      * (as by the {@link #sort(float[])} method) prior to making this call. If
  1307      * it is not sorted, the results are undefined. If the array contains
  1308      * multiple elements with the specified value, there is no guarantee which
  1309      * one will be found. This method considers all NaN values to be
  1310      * equivalent and equal.
  1311      *
  1312      * @param a the array to be searched
  1313      * @param key the value to be searched for
  1314      * @return index of the search key, if it is contained in the array;
  1315      *         otherwise, <tt>(-(<i>insertion point</i>) - 1)</tt>. The
  1316      *         <i>insertion point</i> is defined as the point at which the
  1317      *         key would be inserted into the array: the index of the first
  1318      *         element greater than the key, or <tt>a.length</tt> if all
  1319      *         elements in the array are less than the specified key. Note
  1320      *         that this guarantees that the return value will be &gt;= 0 if
  1321      *         and only if the key is found.
  1322      */
  1323     public static int binarySearch(float[] a, float key) {
  1324         return binarySearch0(a, 0, a.length, key);
  1325     }
  1326 
  1327     /**
  1328      * Searches a range of
  1329      * the specified array of floats for the specified value using
  1330      * the binary search algorithm.
  1331      * The range must be sorted
  1332      * (as by the {@link #sort(float[], int, int)} method)
  1333      * prior to making this call. If
  1334      * it is not sorted, the results are undefined. If the range contains
  1335      * multiple elements with the specified value, there is no guarantee which
  1336      * one will be found. This method considers all NaN values to be
  1337      * equivalent and equal.
  1338      *
  1339      * @param a the array to be searched
  1340      * @param fromIndex the index of the first element (inclusive) to be
  1341      *          searched
  1342      * @param toIndex the index of the last element (exclusive) to be searched
  1343      * @param key the value to be searched for
  1344      * @return index of the search key, if it is contained in the array
  1345      *         within the specified range;
  1346      *         otherwise, <tt>(-(<i>insertion point</i>) - 1)</tt>. The
  1347      *         <i>insertion point</i> is defined as the point at which the
  1348      *         key would be inserted into the array: the index of the first
  1349      *         element in the range greater than the key,
  1350      *         or <tt>toIndex</tt> if all
  1351      *         elements in the range are less than the specified key. Note
  1352      *         that this guarantees that the return value will be &gt;= 0 if
  1353      *         and only if the key is found.
  1354      * @throws IllegalArgumentException
  1355      *         if {@code fromIndex > toIndex}
  1356      * @throws ArrayIndexOutOfBoundsException
  1357      *         if {@code fromIndex < 0 or toIndex > a.length}
  1358      * @since 1.6
  1359      */
  1360     public static int binarySearch(float[] a, int fromIndex, int toIndex,
  1361                                    float key) {
  1362         rangeCheck(a.length, fromIndex, toIndex);
  1363         return binarySearch0(a, fromIndex, toIndex, key);
  1364     }
  1365 
  1366     // Like public version, but without range checks.
  1367     private static int binarySearch0(float[] a, int fromIndex, int toIndex,
  1368                                      float key) {
  1369         int low = fromIndex;
  1370         int high = toIndex - 1;
  1371 
  1372         while (low <= high) {
  1373             int mid = (low + high) >>> 1;
  1374             float midVal = a[mid];
  1375 
  1376             if (midVal < key)
  1377                 low = mid + 1;  // Neither val is NaN, thisVal is smaller
  1378             else if (midVal > key)
  1379                 high = mid - 1; // Neither val is NaN, thisVal is larger
  1380             else {
  1381                 int midBits = Float.floatToIntBits(midVal);
  1382                 int keyBits = Float.floatToIntBits(key);
  1383                 if (midBits == keyBits)     // Values are equal
  1384                     return mid;             // Key found
  1385                 else if (midBits < keyBits) // (-0.0, 0.0) or (!NaN, NaN)
  1386                     low = mid + 1;
  1387                 else                        // (0.0, -0.0) or (NaN, !NaN)
  1388                     high = mid - 1;
  1389             }
  1390         }
  1391         return -(low + 1);  // key not found.
  1392     }
  1393 
  1394     /**
  1395      * Searches the specified array for the specified object using the binary
  1396      * search algorithm. The array must be sorted into ascending order
  1397      * according to the
  1398      * {@linkplain Comparable natural ordering}
  1399      * of its elements (as by the
  1400      * {@link #sort(Object[])} method) prior to making this call.
  1401      * If it is not sorted, the results are undefined.
  1402      * (If the array contains elements that are not mutually comparable (for
  1403      * example, strings and integers), it <i>cannot</i> be sorted according
  1404      * to the natural ordering of its elements, hence results are undefined.)
  1405      * If the array contains multiple
  1406      * elements equal to the specified object, there is no guarantee which
  1407      * one will be found.
  1408      *
  1409      * @param a the array to be searched
  1410      * @param key the value to be searched for
  1411      * @return index of the search key, if it is contained in the array;
  1412      *         otherwise, <tt>(-(<i>insertion point</i>) - 1)</tt>.  The
  1413      *         <i>insertion point</i> is defined as the point at which the
  1414      *         key would be inserted into the array: the index of the first
  1415      *         element greater than the key, or <tt>a.length</tt> if all
  1416      *         elements in the array are less than the specified key.  Note
  1417      *         that this guarantees that the return value will be &gt;= 0 if
  1418      *         and only if the key is found.
  1419      * @throws ClassCastException if the search key is not comparable to the
  1420      *         elements of the array.
  1421      */
  1422     public static int binarySearch(Object[] a, Object key) {
  1423         return binarySearch0(a, 0, a.length, key);
  1424     }
  1425 
  1426     /**
  1427      * Searches a range of
  1428      * the specified array for the specified object using the binary
  1429      * search algorithm.
  1430      * The range must be sorted into ascending order
  1431      * according to the
  1432      * {@linkplain Comparable natural ordering}
  1433      * of its elements (as by the
  1434      * {@link #sort(Object[], int, int)} method) prior to making this
  1435      * call.  If it is not sorted, the results are undefined.
  1436      * (If the range contains elements that are not mutually comparable (for
  1437      * example, strings and integers), it <i>cannot</i> be sorted according
  1438      * to the natural ordering of its elements, hence results are undefined.)
  1439      * If the range contains multiple
  1440      * elements equal to the specified object, there is no guarantee which
  1441      * one will be found.
  1442      *
  1443      * @param a the array to be searched
  1444      * @param fromIndex the index of the first element (inclusive) to be
  1445      *          searched
  1446      * @param toIndex the index of the last element (exclusive) to be searched
  1447      * @param key the value to be searched for
  1448      * @return index of the search key, if it is contained in the array
  1449      *         within the specified range;
  1450      *         otherwise, <tt>(-(<i>insertion point</i>) - 1)</tt>.  The
  1451      *         <i>insertion point</i> is defined as the point at which the
  1452      *         key would be inserted into the array: the index of the first
  1453      *         element in the range greater than the key,
  1454      *         or <tt>toIndex</tt> if all
  1455      *         elements in the range are less than the specified key.  Note
  1456      *         that this guarantees that the return value will be &gt;= 0 if
  1457      *         and only if the key is found.
  1458      * @throws ClassCastException if the search key is not comparable to the
  1459      *         elements of the array within the specified range.
  1460      * @throws IllegalArgumentException
  1461      *         if {@code fromIndex > toIndex}
  1462      * @throws ArrayIndexOutOfBoundsException
  1463      *         if {@code fromIndex < 0 or toIndex > a.length}
  1464      * @since 1.6
  1465      */
  1466     public static int binarySearch(Object[] a, int fromIndex, int toIndex,
  1467                                    Object key) {
  1468         rangeCheck(a.length, fromIndex, toIndex);
  1469         return binarySearch0(a, fromIndex, toIndex, key);
  1470     }
  1471 
  1472     // Like public version, but without range checks.
  1473     private static int binarySearch0(Object[] a, int fromIndex, int toIndex,
  1474                                      Object key) {
  1475         int low = fromIndex;
  1476         int high = toIndex - 1;
  1477 
  1478         while (low <= high) {
  1479             int mid = (low + high) >>> 1;
  1480             Comparable midVal = (Comparable)a[mid];
  1481             int cmp = midVal.compareTo(key);
  1482 
  1483             if (cmp < 0)
  1484                 low = mid + 1;
  1485             else if (cmp > 0)
  1486                 high = mid - 1;
  1487             else
  1488                 return mid; // key found
  1489         }
  1490         return -(low + 1);  // key not found.
  1491     }
  1492 
  1493     /**
  1494      * Searches the specified array for the specified object using the binary
  1495      * search algorithm.  The array must be sorted into ascending order
  1496      * according to the specified comparator (as by the
  1497      * {@link #sort(Object[], Comparator) sort(T[], Comparator)}
  1498      * method) prior to making this call.  If it is
  1499      * not sorted, the results are undefined.
  1500      * If the array contains multiple
  1501      * elements equal to the specified object, there is no guarantee which one
  1502      * will be found.
  1503      *
  1504      * @param a the array to be searched
  1505      * @param key the value to be searched for
  1506      * @param c the comparator by which the array is ordered.  A
  1507      *        <tt>null</tt> value indicates that the elements'
  1508      *        {@linkplain Comparable natural ordering} should be used.
  1509      * @return index of the search key, if it is contained in the array;
  1510      *         otherwise, <tt>(-(<i>insertion point</i>) - 1)</tt>.  The
  1511      *         <i>insertion point</i> is defined as the point at which the
  1512      *         key would be inserted into the array: the index of the first
  1513      *         element greater than the key, or <tt>a.length</tt> if all
  1514      *         elements in the array are less than the specified key.  Note
  1515      *         that this guarantees that the return value will be &gt;= 0 if
  1516      *         and only if the key is found.
  1517      * @throws ClassCastException if the array contains elements that are not
  1518      *         <i>mutually comparable</i> using the specified comparator,
  1519      *         or the search key is not comparable to the
  1520      *         elements of the array using this comparator.
  1521      */
  1522     public static <T> int binarySearch(T[] a, T key, Comparator<? super T> c) {
  1523         return binarySearch0(a, 0, a.length, key, c);
  1524     }
  1525 
  1526     /**
  1527      * Searches a range of
  1528      * the specified array for the specified object using the binary
  1529      * search algorithm.
  1530      * The range must be sorted into ascending order
  1531      * according to the specified comparator (as by the
  1532      * {@link #sort(Object[], int, int, Comparator)
  1533      * sort(T[], int, int, Comparator)}
  1534      * method) prior to making this call.
  1535      * If it is not sorted, the results are undefined.
  1536      * If the range contains multiple elements equal to the specified object,
  1537      * there is no guarantee which one will be found.
  1538      *
  1539      * @param a the array to be searched
  1540      * @param fromIndex the index of the first element (inclusive) to be
  1541      *          searched
  1542      * @param toIndex the index of the last element (exclusive) to be searched
  1543      * @param key the value to be searched for
  1544      * @param c the comparator by which the array is ordered.  A
  1545      *        <tt>null</tt> value indicates that the elements'
  1546      *        {@linkplain Comparable natural ordering} should be used.
  1547      * @return index of the search key, if it is contained in the array
  1548      *         within the specified range;
  1549      *         otherwise, <tt>(-(<i>insertion point</i>) - 1)</tt>.  The
  1550      *         <i>insertion point</i> is defined as the point at which the
  1551      *         key would be inserted into the array: the index of the first
  1552      *         element in the range greater than the key,
  1553      *         or <tt>toIndex</tt> if all
  1554      *         elements in the range are less than the specified key.  Note
  1555      *         that this guarantees that the return value will be &gt;= 0 if
  1556      *         and only if the key is found.
  1557      * @throws ClassCastException if the range contains elements that are not
  1558      *         <i>mutually comparable</i> using the specified comparator,
  1559      *         or the search key is not comparable to the
  1560      *         elements in the range using this comparator.
  1561      * @throws IllegalArgumentException
  1562      *         if {@code fromIndex > toIndex}
  1563      * @throws ArrayIndexOutOfBoundsException
  1564      *         if {@code fromIndex < 0 or toIndex > a.length}
  1565      * @since 1.6
  1566      */
  1567     public static <T> int binarySearch(T[] a, int fromIndex, int toIndex,
  1568                                        T key, Comparator<? super T> c) {
  1569         rangeCheck(a.length, fromIndex, toIndex);
  1570         return binarySearch0(a, fromIndex, toIndex, key, c);
  1571     }
  1572 
  1573     // Like public version, but without range checks.
  1574     private static <T> int binarySearch0(T[] a, int fromIndex, int toIndex,
  1575                                          T key, Comparator<? super T> c) {
  1576         if (c == null) {
  1577             return binarySearch0(a, fromIndex, toIndex, key);
  1578         }
  1579         int low = fromIndex;
  1580         int high = toIndex - 1;
  1581 
  1582         while (low <= high) {
  1583             int mid = (low + high) >>> 1;
  1584             T midVal = a[mid];
  1585             int cmp = c.compare(midVal, key);
  1586             if (cmp < 0)
  1587                 low = mid + 1;
  1588             else if (cmp > 0)
  1589                 high = mid - 1;
  1590             else
  1591                 return mid; // key found
  1592         }
  1593         return -(low + 1);  // key not found.
  1594     }
  1595 
  1596     // Equality Testing
  1597 
  1598     /**
  1599      * Returns <tt>true</tt> if the two specified arrays of longs are
  1600      * <i>equal</i> to one another.  Two arrays are considered equal if both
  1601      * arrays contain the same number of elements, and all corresponding pairs
  1602      * of elements in the two arrays are equal.  In other words, two arrays
  1603      * are equal if they contain the same elements in the same order.  Also,
  1604      * two array references are considered equal if both are <tt>null</tt>.<p>
  1605      *
  1606      * @param a one array to be tested for equality
  1607      * @param a2 the other array to be tested for equality
  1608      * @return <tt>true</tt> if the two arrays are equal
  1609      */
  1610     public static boolean equals(long[] a, long[] a2) {
  1611         if (a==a2)
  1612             return true;
  1613         if (a==null || a2==null)
  1614             return false;
  1615 
  1616         int length = a.length;
  1617         if (a2.length != length)
  1618             return false;
  1619 
  1620         for (int i=0; i<length; i++)
  1621             if (a[i] != a2[i])
  1622                 return false;
  1623 
  1624         return true;
  1625     }
  1626 
  1627     /**
  1628      * Returns <tt>true</tt> if the two specified arrays of ints are
  1629      * <i>equal</i> to one another.  Two arrays are considered equal if both
  1630      * arrays contain the same number of elements, and all corresponding pairs
  1631      * of elements in the two arrays are equal.  In other words, two arrays
  1632      * are equal if they contain the same elements in the same order.  Also,
  1633      * two array references are considered equal if both are <tt>null</tt>.<p>
  1634      *
  1635      * @param a one array to be tested for equality
  1636      * @param a2 the other array to be tested for equality
  1637      * @return <tt>true</tt> if the two arrays are equal
  1638      */
  1639     public static boolean equals(int[] a, int[] a2) {
  1640         if (a==a2)
  1641             return true;
  1642         if (a==null || a2==null)
  1643             return false;
  1644 
  1645         int length = a.length;
  1646         if (a2.length != length)
  1647             return false;
  1648 
  1649         for (int i=0; i<length; i++)
  1650             if (a[i] != a2[i])
  1651                 return false;
  1652 
  1653         return true;
  1654     }
  1655 
  1656     /**
  1657      * Returns <tt>true</tt> if the two specified arrays of shorts are
  1658      * <i>equal</i> to one another.  Two arrays are considered equal if both
  1659      * arrays contain the same number of elements, and all corresponding pairs
  1660      * of elements in the two arrays are equal.  In other words, two arrays
  1661      * are equal if they contain the same elements in the same order.  Also,
  1662      * two array references are considered equal if both are <tt>null</tt>.<p>
  1663      *
  1664      * @param a one array to be tested for equality
  1665      * @param a2 the other array to be tested for equality
  1666      * @return <tt>true</tt> if the two arrays are equal
  1667      */
  1668     public static boolean equals(short[] a, short a2[]) {
  1669         if (a==a2)
  1670             return true;
  1671         if (a==null || a2==null)
  1672             return false;
  1673 
  1674         int length = a.length;
  1675         if (a2.length != length)
  1676             return false;
  1677 
  1678         for (int i=0; i<length; i++)
  1679             if (a[i] != a2[i])
  1680                 return false;
  1681 
  1682         return true;
  1683     }
  1684 
  1685     /**
  1686      * Returns <tt>true</tt> if the two specified arrays of chars are
  1687      * <i>equal</i> to one another.  Two arrays are considered equal if both
  1688      * arrays contain the same number of elements, and all corresponding pairs
  1689      * of elements in the two arrays are equal.  In other words, two arrays
  1690      * are equal if they contain the same elements in the same order.  Also,
  1691      * two array references are considered equal if both are <tt>null</tt>.<p>
  1692      *
  1693      * @param a one array to be tested for equality
  1694      * @param a2 the other array to be tested for equality
  1695      * @return <tt>true</tt> if the two arrays are equal
  1696      */
  1697     public static boolean equals(char[] a, char[] a2) {
  1698         if (a==a2)
  1699             return true;
  1700         if (a==null || a2==null)
  1701             return false;
  1702 
  1703         int length = a.length;
  1704         if (a2.length != length)
  1705             return false;
  1706 
  1707         for (int i=0; i<length; i++)
  1708             if (a[i] != a2[i])
  1709                 return false;
  1710 
  1711         return true;
  1712     }
  1713 
  1714     /**
  1715      * Returns <tt>true</tt> if the two specified arrays of bytes are
  1716      * <i>equal</i> to one another.  Two arrays are considered equal if both
  1717      * arrays contain the same number of elements, and all corresponding pairs
  1718      * of elements in the two arrays are equal.  In other words, two arrays
  1719      * are equal if they contain the same elements in the same order.  Also,
  1720      * two array references are considered equal if both are <tt>null</tt>.<p>
  1721      *
  1722      * @param a one array to be tested for equality
  1723      * @param a2 the other array to be tested for equality
  1724      * @return <tt>true</tt> if the two arrays are equal
  1725      */
  1726     public static boolean equals(byte[] a, byte[] a2) {
  1727         if (a==a2)
  1728             return true;
  1729         if (a==null || a2==null)
  1730             return false;
  1731 
  1732         int length = a.length;
  1733         if (a2.length != length)
  1734             return false;
  1735 
  1736         for (int i=0; i<length; i++)
  1737             if (a[i] != a2[i])
  1738                 return false;
  1739 
  1740         return true;
  1741     }
  1742 
  1743     /**
  1744      * Returns <tt>true</tt> if the two specified arrays of booleans are
  1745      * <i>equal</i> to one another.  Two arrays are considered equal if both
  1746      * arrays contain the same number of elements, and all corresponding pairs
  1747      * of elements in the two arrays are equal.  In other words, two arrays
  1748      * are equal if they contain the same elements in the same order.  Also,
  1749      * two array references are considered equal if both are <tt>null</tt>.<p>
  1750      *
  1751      * @param a one array to be tested for equality
  1752      * @param a2 the other array to be tested for equality
  1753      * @return <tt>true</tt> if the two arrays are equal
  1754      */
  1755     public static boolean equals(boolean[] a, boolean[] a2) {
  1756         if (a==a2)
  1757             return true;
  1758         if (a==null || a2==null)
  1759             return false;
  1760 
  1761         int length = a.length;
  1762         if (a2.length != length)
  1763             return false;
  1764 
  1765         for (int i=0; i<length; i++)
  1766             if (a[i] != a2[i])
  1767                 return false;
  1768 
  1769         return true;
  1770     }
  1771 
  1772     /**
  1773      * Returns <tt>true</tt> if the two specified arrays of doubles are
  1774      * <i>equal</i> to one another.  Two arrays are considered equal if both
  1775      * arrays contain the same number of elements, and all corresponding pairs
  1776      * of elements in the two arrays are equal.  In other words, two arrays
  1777      * are equal if they contain the same elements in the same order.  Also,
  1778      * two array references are considered equal if both are <tt>null</tt>.<p>
  1779      *
  1780      * Two doubles <tt>d1</tt> and <tt>d2</tt> are considered equal if:
  1781      * <pre>    <tt>new Double(d1).equals(new Double(d2))</tt></pre>
  1782      * (Unlike the <tt>==</tt> operator, this method considers
  1783      * <tt>NaN</tt> equals to itself, and 0.0d unequal to -0.0d.)
  1784      *
  1785      * @param a one array to be tested for equality
  1786      * @param a2 the other array to be tested for equality
  1787      * @return <tt>true</tt> if the two arrays are equal
  1788      * @see Double#equals(Object)
  1789      */
  1790     public static boolean equals(double[] a, double[] a2) {
  1791         if (a==a2)
  1792             return true;
  1793         if (a==null || a2==null)
  1794             return false;
  1795 
  1796         int length = a.length;
  1797         if (a2.length != length)
  1798             return false;
  1799 
  1800         for (int i=0; i<length; i++)
  1801             if (Double.doubleToLongBits(a[i])!=Double.doubleToLongBits(a2[i]))
  1802                 return false;
  1803 
  1804         return true;
  1805     }
  1806 
  1807     /**
  1808      * Returns <tt>true</tt> if the two specified arrays of floats are
  1809      * <i>equal</i> to one another.  Two arrays are considered equal if both
  1810      * arrays contain the same number of elements, and all corresponding pairs
  1811      * of elements in the two arrays are equal.  In other words, two arrays
  1812      * are equal if they contain the same elements in the same order.  Also,
  1813      * two array references are considered equal if both are <tt>null</tt>.<p>
  1814      *
  1815      * Two floats <tt>f1</tt> and <tt>f2</tt> are considered equal if:
  1816      * <pre>    <tt>new Float(f1).equals(new Float(f2))</tt></pre>
  1817      * (Unlike the <tt>==</tt> operator, this method considers
  1818      * <tt>NaN</tt> equals to itself, and 0.0f unequal to -0.0f.)
  1819      *
  1820      * @param a one array to be tested for equality
  1821      * @param a2 the other array to be tested for equality
  1822      * @return <tt>true</tt> if the two arrays are equal
  1823      * @see Float#equals(Object)
  1824      */
  1825     public static boolean equals(float[] a, float[] a2) {
  1826         if (a==a2)
  1827             return true;
  1828         if (a==null || a2==null)
  1829             return false;
  1830 
  1831         int length = a.length;
  1832         if (a2.length != length)
  1833             return false;
  1834 
  1835         for (int i=0; i<length; i++)
  1836             if (Float.floatToIntBits(a[i])!=Float.floatToIntBits(a2[i]))
  1837                 return false;
  1838 
  1839         return true;
  1840     }
  1841 
  1842     /**
  1843      * Returns <tt>true</tt> if the two specified arrays of Objects are
  1844      * <i>equal</i> to one another.  The two arrays are considered equal if
  1845      * both arrays contain the same number of elements, and all corresponding
  1846      * pairs of elements in the two arrays are equal.  Two objects <tt>e1</tt>
  1847      * and <tt>e2</tt> are considered <i>equal</i> if <tt>(e1==null ? e2==null
  1848      * : e1.equals(e2))</tt>.  In other words, the two arrays are equal if
  1849      * they contain the same elements in the same order.  Also, two array
  1850      * references are considered equal if both are <tt>null</tt>.<p>
  1851      *
  1852      * @param a one array to be tested for equality
  1853      * @param a2 the other array to be tested for equality
  1854      * @return <tt>true</tt> if the two arrays are equal
  1855      */
  1856     public static boolean equals(Object[] a, Object[] a2) {
  1857         if (a==a2)
  1858             return true;
  1859         if (a==null || a2==null)
  1860             return false;
  1861 
  1862         int length = a.length;
  1863         if (a2.length != length)
  1864             return false;
  1865 
  1866         for (int i=0; i<length; i++) {
  1867             Object o1 = a[i];
  1868             Object o2 = a2[i];
  1869             if (!(o1==null ? o2==null : o1.equals(o2)))
  1870                 return false;
  1871         }
  1872 
  1873         return true;
  1874     }
  1875 
  1876     // Filling
  1877 
  1878     /**
  1879      * Assigns the specified long value to each element of the specified array
  1880      * of longs.
  1881      *
  1882      * @param a the array to be filled
  1883      * @param val the value to be stored in all elements of the array
  1884      */
  1885     public static void fill(long[] a, long val) {
  1886         for (int i = 0, len = a.length; i < len; i++)
  1887             a[i] = val;
  1888     }
  1889 
  1890     /**
  1891      * Assigns the specified long value to each element of the specified
  1892      * range of the specified array of longs.  The range to be filled
  1893      * extends from index <tt>fromIndex</tt>, inclusive, to index
  1894      * <tt>toIndex</tt>, exclusive.  (If <tt>fromIndex==toIndex</tt>, the
  1895      * range to be filled is empty.)
  1896      *
  1897      * @param a the array to be filled
  1898      * @param fromIndex the index of the first element (inclusive) to be
  1899      *        filled with the specified value
  1900      * @param toIndex the index of the last element (exclusive) to be
  1901      *        filled with the specified value
  1902      * @param val the value to be stored in all elements of the array
  1903      * @throws IllegalArgumentException if <tt>fromIndex &gt; toIndex</tt>
  1904      * @throws ArrayIndexOutOfBoundsException if <tt>fromIndex &lt; 0</tt> or
  1905      *         <tt>toIndex &gt; a.length</tt>
  1906      */
  1907     public static void fill(long[] a, int fromIndex, int toIndex, long val) {
  1908         rangeCheck(a.length, fromIndex, toIndex);
  1909         for (int i = fromIndex; i < toIndex; i++)
  1910             a[i] = val;
  1911     }
  1912 
  1913     /**
  1914      * Assigns the specified int value to each element of the specified array
  1915      * of ints.
  1916      *
  1917      * @param a the array to be filled
  1918      * @param val the value to be stored in all elements of the array
  1919      */
  1920     public static void fill(int[] a, int val) {
  1921         for (int i = 0, len = a.length; i < len; i++)
  1922             a[i] = val;
  1923     }
  1924 
  1925     /**
  1926      * Assigns the specified int value to each element of the specified
  1927      * range of the specified array of ints.  The range to be filled
  1928      * extends from index <tt>fromIndex</tt>, inclusive, to index
  1929      * <tt>toIndex</tt>, exclusive.  (If <tt>fromIndex==toIndex</tt>, the
  1930      * range to be filled is empty.)
  1931      *
  1932      * @param a the array to be filled
  1933      * @param fromIndex the index of the first element (inclusive) to be
  1934      *        filled with the specified value
  1935      * @param toIndex the index of the last element (exclusive) to be
  1936      *        filled with the specified value
  1937      * @param val the value to be stored in all elements of the array
  1938      * @throws IllegalArgumentException if <tt>fromIndex &gt; toIndex</tt>
  1939      * @throws ArrayIndexOutOfBoundsException if <tt>fromIndex &lt; 0</tt> or
  1940      *         <tt>toIndex &gt; a.length</tt>
  1941      */
  1942     public static void fill(int[] a, int fromIndex, int toIndex, int val) {
  1943         rangeCheck(a.length, fromIndex, toIndex);
  1944         for (int i = fromIndex; i < toIndex; i++)
  1945             a[i] = val;
  1946     }
  1947 
  1948     /**
  1949      * Assigns the specified short value to each element of the specified array
  1950      * of shorts.
  1951      *
  1952      * @param a the array to be filled
  1953      * @param val the value to be stored in all elements of the array
  1954      */
  1955     public static void fill(short[] a, short val) {
  1956         for (int i = 0, len = a.length; i < len; i++)
  1957             a[i] = val;
  1958     }
  1959 
  1960     /**
  1961      * Assigns the specified short value to each element of the specified
  1962      * range of the specified array of shorts.  The range to be filled
  1963      * extends from index <tt>fromIndex</tt>, inclusive, to index
  1964      * <tt>toIndex</tt>, exclusive.  (If <tt>fromIndex==toIndex</tt>, the
  1965      * range to be filled is empty.)
  1966      *
  1967      * @param a the array to be filled
  1968      * @param fromIndex the index of the first element (inclusive) to be
  1969      *        filled with the specified value
  1970      * @param toIndex the index of the last element (exclusive) to be
  1971      *        filled with the specified value
  1972      * @param val the value to be stored in all elements of the array
  1973      * @throws IllegalArgumentException if <tt>fromIndex &gt; toIndex</tt>
  1974      * @throws ArrayIndexOutOfBoundsException if <tt>fromIndex &lt; 0</tt> or
  1975      *         <tt>toIndex &gt; a.length</tt>
  1976      */
  1977     public static void fill(short[] a, int fromIndex, int toIndex, short val) {
  1978         rangeCheck(a.length, fromIndex, toIndex);
  1979         for (int i = fromIndex; i < toIndex; i++)
  1980             a[i] = val;
  1981     }
  1982 
  1983     /**
  1984      * Assigns the specified char value to each element of the specified array
  1985      * of chars.
  1986      *
  1987      * @param a the array to be filled
  1988      * @param val the value to be stored in all elements of the array
  1989      */
  1990     public static void fill(char[] a, char val) {
  1991         for (int i = 0, len = a.length; i < len; i++)
  1992             a[i] = val;
  1993     }
  1994 
  1995     /**
  1996      * Assigns the specified char value to each element of the specified
  1997      * range of the specified array of chars.  The range to be filled
  1998      * extends from index <tt>fromIndex</tt>, inclusive, to index
  1999      * <tt>toIndex</tt>, exclusive.  (If <tt>fromIndex==toIndex</tt>, the
  2000      * range to be filled is empty.)
  2001      *
  2002      * @param a the array to be filled
  2003      * @param fromIndex the index of the first element (inclusive) to be
  2004      *        filled with the specified value
  2005      * @param toIndex the index of the last element (exclusive) to be
  2006      *        filled with the specified value
  2007      * @param val the value to be stored in all elements of the array
  2008      * @throws IllegalArgumentException if <tt>fromIndex &gt; toIndex</tt>
  2009      * @throws ArrayIndexOutOfBoundsException if <tt>fromIndex &lt; 0</tt> or
  2010      *         <tt>toIndex &gt; a.length</tt>
  2011      */
  2012     public static void fill(char[] a, int fromIndex, int toIndex, char val) {
  2013         rangeCheck(a.length, fromIndex, toIndex);
  2014         for (int i = fromIndex; i < toIndex; i++)
  2015             a[i] = val;
  2016     }
  2017 
  2018     /**
  2019      * Assigns the specified byte value to each element of the specified array
  2020      * of bytes.
  2021      *
  2022      * @param a the array to be filled
  2023      * @param val the value to be stored in all elements of the array
  2024      */
  2025     public static void fill(byte[] a, byte val) {
  2026         for (int i = 0, len = a.length; i < len; i++)
  2027             a[i] = val;
  2028     }
  2029 
  2030     /**
  2031      * Assigns the specified byte value to each element of the specified
  2032      * range of the specified array of bytes.  The range to be filled
  2033      * extends from index <tt>fromIndex</tt>, inclusive, to index
  2034      * <tt>toIndex</tt>, exclusive.  (If <tt>fromIndex==toIndex</tt>, the
  2035      * range to be filled is empty.)
  2036      *
  2037      * @param a the array to be filled
  2038      * @param fromIndex the index of the first element (inclusive) to be
  2039      *        filled with the specified value
  2040      * @param toIndex the index of the last element (exclusive) to be
  2041      *        filled with the specified value
  2042      * @param val the value to be stored in all elements of the array
  2043      * @throws IllegalArgumentException if <tt>fromIndex &gt; toIndex</tt>
  2044      * @throws ArrayIndexOutOfBoundsException if <tt>fromIndex &lt; 0</tt> or
  2045      *         <tt>toIndex &gt; a.length</tt>
  2046      */
  2047     public static void fill(byte[] a, int fromIndex, int toIndex, byte val) {
  2048         rangeCheck(a.length, fromIndex, toIndex);
  2049         for (int i = fromIndex; i < toIndex; i++)
  2050             a[i] = val;
  2051     }
  2052 
  2053     /**
  2054      * Assigns the specified boolean value to each element of the specified
  2055      * array of booleans.
  2056      *
  2057      * @param a the array to be filled
  2058      * @param val the value to be stored in all elements of the array
  2059      */
  2060     public static void fill(boolean[] a, boolean val) {
  2061         for (int i = 0, len = a.length; i < len; i++)
  2062             a[i] = val;
  2063     }
  2064 
  2065     /**
  2066      * Assigns the specified boolean value to each element of the specified
  2067      * range of the specified array of booleans.  The range to be filled
  2068      * extends from index <tt>fromIndex</tt>, inclusive, to index
  2069      * <tt>toIndex</tt>, exclusive.  (If <tt>fromIndex==toIndex</tt>, the
  2070      * range to be filled is empty.)
  2071      *
  2072      * @param a the array to be filled
  2073      * @param fromIndex the index of the first element (inclusive) to be
  2074      *        filled with the specified value
  2075      * @param toIndex the index of the last element (exclusive) to be
  2076      *        filled with the specified value
  2077      * @param val the value to be stored in all elements of the array
  2078      * @throws IllegalArgumentException if <tt>fromIndex &gt; toIndex</tt>
  2079      * @throws ArrayIndexOutOfBoundsException if <tt>fromIndex &lt; 0</tt> or
  2080      *         <tt>toIndex &gt; a.length</tt>
  2081      */
  2082     public static void fill(boolean[] a, int fromIndex, int toIndex,
  2083                             boolean val) {
  2084         rangeCheck(a.length, fromIndex, toIndex);
  2085         for (int i = fromIndex; i < toIndex; i++)
  2086             a[i] = val;
  2087     }
  2088 
  2089     /**
  2090      * Assigns the specified double value to each element of the specified
  2091      * array of doubles.
  2092      *
  2093      * @param a the array to be filled
  2094      * @param val the value to be stored in all elements of the array
  2095      */
  2096     public static void fill(double[] a, double val) {
  2097         for (int i = 0, len = a.length; i < len; i++)
  2098             a[i] = val;
  2099     }
  2100 
  2101     /**
  2102      * Assigns the specified double value to each element of the specified
  2103      * range of the specified array of doubles.  The range to be filled
  2104      * extends from index <tt>fromIndex</tt>, inclusive, to index
  2105      * <tt>toIndex</tt>, exclusive.  (If <tt>fromIndex==toIndex</tt>, the
  2106      * range to be filled is empty.)
  2107      *
  2108      * @param a the array to be filled
  2109      * @param fromIndex the index of the first element (inclusive) to be
  2110      *        filled with the specified value
  2111      * @param toIndex the index of the last element (exclusive) to be
  2112      *        filled with the specified value
  2113      * @param val the value to be stored in all elements of the array
  2114      * @throws IllegalArgumentException if <tt>fromIndex &gt; toIndex</tt>
  2115      * @throws ArrayIndexOutOfBoundsException if <tt>fromIndex &lt; 0</tt> or
  2116      *         <tt>toIndex &gt; a.length</tt>
  2117      */
  2118     public static void fill(double[] a, int fromIndex, int toIndex,double val){
  2119         rangeCheck(a.length, fromIndex, toIndex);
  2120         for (int i = fromIndex; i < toIndex; i++)
  2121             a[i] = val;
  2122     }
  2123 
  2124     /**
  2125      * Assigns the specified float value to each element of the specified array
  2126      * of floats.
  2127      *
  2128      * @param a the array to be filled
  2129      * @param val the value to be stored in all elements of the array
  2130      */
  2131     public static void fill(float[] a, float val) {
  2132         for (int i = 0, len = a.length; i < len; i++)
  2133             a[i] = val;
  2134     }
  2135 
  2136     /**
  2137      * Assigns the specified float value to each element of the specified
  2138      * range of the specified array of floats.  The range to be filled
  2139      * extends from index <tt>fromIndex</tt>, inclusive, to index
  2140      * <tt>toIndex</tt>, exclusive.  (If <tt>fromIndex==toIndex</tt>, the
  2141      * range to be filled is empty.)
  2142      *
  2143      * @param a the array to be filled
  2144      * @param fromIndex the index of the first element (inclusive) to be
  2145      *        filled with the specified value
  2146      * @param toIndex the index of the last element (exclusive) to be
  2147      *        filled with the specified value
  2148      * @param val the value to be stored in all elements of the array
  2149      * @throws IllegalArgumentException if <tt>fromIndex &gt; toIndex</tt>
  2150      * @throws ArrayIndexOutOfBoundsException if <tt>fromIndex &lt; 0</tt> or
  2151      *         <tt>toIndex &gt; a.length</tt>
  2152      */
  2153     public static void fill(float[] a, int fromIndex, int toIndex, float val) {
  2154         rangeCheck(a.length, fromIndex, toIndex);
  2155         for (int i = fromIndex; i < toIndex; i++)
  2156             a[i] = val;
  2157     }
  2158 
  2159     /**
  2160      * Assigns the specified Object reference to each element of the specified
  2161      * array of Objects.
  2162      *
  2163      * @param a the array to be filled
  2164      * @param val the value to be stored in all elements of the array
  2165      * @throws ArrayStoreException if the specified value is not of a
  2166      *         runtime type that can be stored in the specified array
  2167      */
  2168     public static void fill(Object[] a, Object val) {
  2169         for (int i = 0, len = a.length; i < len; i++)
  2170             a[i] = val;
  2171     }
  2172 
  2173     /**
  2174      * Assigns the specified Object reference to each element of the specified
  2175      * range of the specified array of Objects.  The range to be filled
  2176      * extends from index <tt>fromIndex</tt>, inclusive, to index
  2177      * <tt>toIndex</tt>, exclusive.  (If <tt>fromIndex==toIndex</tt>, the
  2178      * range to be filled is empty.)
  2179      *
  2180      * @param a the array to be filled
  2181      * @param fromIndex the index of the first element (inclusive) to be
  2182      *        filled with the specified value
  2183      * @param toIndex the index of the last element (exclusive) to be
  2184      *        filled with the specified value
  2185      * @param val the value to be stored in all elements of the array
  2186      * @throws IllegalArgumentException if <tt>fromIndex &gt; toIndex</tt>
  2187      * @throws ArrayIndexOutOfBoundsException if <tt>fromIndex &lt; 0</tt> or
  2188      *         <tt>toIndex &gt; a.length</tt>
  2189      * @throws ArrayStoreException if the specified value is not of a
  2190      *         runtime type that can be stored in the specified array
  2191      */
  2192     public static void fill(Object[] a, int fromIndex, int toIndex, Object val) {
  2193         rangeCheck(a.length, fromIndex, toIndex);
  2194         for (int i = fromIndex; i < toIndex; i++)
  2195             a[i] = val;
  2196     }
  2197 
  2198     // Cloning
  2199 
  2200     /**
  2201      * Copies the specified array, truncating or padding with nulls (if necessary)
  2202      * so the copy has the specified length.  For all indices that are
  2203      * valid in both the original array and the copy, the two arrays will
  2204      * contain identical values.  For any indices that are valid in the
  2205      * copy but not the original, the copy will contain <tt>null</tt>.
  2206      * Such indices will exist if and only if the specified length
  2207      * is greater than that of the original array.
  2208      * The resulting array is of exactly the same class as the original array.
  2209      *
  2210      * @param original the array to be copied
  2211      * @param newLength the length of the copy to be returned
  2212      * @return a copy of the original array, truncated or padded with nulls
  2213      *     to obtain the specified length
  2214      * @throws NegativeArraySizeException if <tt>newLength</tt> is negative
  2215      * @throws NullPointerException if <tt>original</tt> is null
  2216      * @since 1.6
  2217      */
  2218     public static <T> T[] copyOf(T[] original, int newLength) {
  2219         return (T[]) copyOf(original, newLength, original.getClass());
  2220     }
  2221 
  2222     /**
  2223      * Copies the specified array, truncating or padding with nulls (if necessary)
  2224      * so the copy has the specified length.  For all indices that are
  2225      * valid in both the original array and the copy, the two arrays will
  2226      * contain identical values.  For any indices that are valid in the
  2227      * copy but not the original, the copy will contain <tt>null</tt>.
  2228      * Such indices will exist if and only if the specified length
  2229      * is greater than that of the original array.
  2230      * The resulting array is of the class <tt>newType</tt>.
  2231      *
  2232      * @param original the array to be copied
  2233      * @param newLength the length of the copy to be returned
  2234      * @param newType the class of the copy to be returned
  2235      * @return a copy of the original array, truncated or padded with nulls
  2236      *     to obtain the specified length
  2237      * @throws NegativeArraySizeException if <tt>newLength</tt> is negative
  2238      * @throws NullPointerException if <tt>original</tt> is null
  2239      * @throws ArrayStoreException if an element copied from
  2240      *     <tt>original</tt> is not of a runtime type that can be stored in
  2241      *     an array of class <tt>newType</tt>
  2242      * @since 1.6
  2243      */
  2244     public static <T,U> T[] copyOf(U[] original, int newLength, Class<? extends T[]> newType) {
  2245         T[] copy = ((Object)newType == (Object)Object[].class)
  2246             ? (T[]) new Object[newLength]
  2247             : (T[]) Array.newInstance(newType.getComponentType(), newLength);
  2248         System.arraycopy(original, 0, copy, 0,
  2249                          Math.min(original.length, newLength));
  2250         return copy;
  2251     }
  2252 
  2253     /**
  2254      * Copies the specified array, truncating or padding with zeros (if necessary)
  2255      * so the copy has the specified length.  For all indices that are
  2256      * valid in both the original array and the copy, the two arrays will
  2257      * contain identical values.  For any indices that are valid in the
  2258      * copy but not the original, the copy will contain <tt>(byte)0</tt>.
  2259      * Such indices will exist if and only if the specified length
  2260      * is greater than that of the original array.
  2261      *
  2262      * @param original the array to be copied
  2263      * @param newLength the length of the copy to be returned
  2264      * @return a copy of the original array, truncated or padded with zeros
  2265      *     to obtain the specified length
  2266      * @throws NegativeArraySizeException if <tt>newLength</tt> is negative
  2267      * @throws NullPointerException if <tt>original</tt> is null
  2268      * @since 1.6
  2269      */
  2270     public static byte[] copyOf(byte[] original, int newLength) {
  2271         byte[] copy = new byte[newLength];
  2272         System.arraycopy(original, 0, copy, 0,
  2273                          Math.min(original.length, newLength));
  2274         return copy;
  2275     }
  2276 
  2277     /**
  2278      * Copies the specified array, truncating or padding with zeros (if necessary)
  2279      * so the copy has the specified length.  For all indices that are
  2280      * valid in both the original array and the copy, the two arrays will
  2281      * contain identical values.  For any indices that are valid in the
  2282      * copy but not the original, the copy will contain <tt>(short)0</tt>.
  2283      * Such indices will exist if and only if the specified length
  2284      * is greater than that of the original array.
  2285      *
  2286      * @param original the array to be copied
  2287      * @param newLength the length of the copy to be returned
  2288      * @return a copy of the original array, truncated or padded with zeros
  2289      *     to obtain the specified length
  2290      * @throws NegativeArraySizeException if <tt>newLength</tt> is negative
  2291      * @throws NullPointerException if <tt>original</tt> is null
  2292      * @since 1.6
  2293      */
  2294     public static short[] copyOf(short[] original, int newLength) {
  2295         short[] copy = new short[newLength];
  2296         System.arraycopy(original, 0, copy, 0,
  2297                          Math.min(original.length, newLength));
  2298         return copy;
  2299     }
  2300 
  2301     /**
  2302      * Copies the specified array, truncating or padding with zeros (if necessary)
  2303      * so the copy has the specified length.  For all indices that are
  2304      * valid in both the original array and the copy, the two arrays will
  2305      * contain identical values.  For any indices that are valid in the
  2306      * copy but not the original, the copy will contain <tt>0</tt>.
  2307      * Such indices will exist if and only if the specified length
  2308      * is greater than that of the original array.
  2309      *
  2310      * @param original the array to be copied
  2311      * @param newLength the length of the copy to be returned
  2312      * @return a copy of the original array, truncated or padded with zeros
  2313      *     to obtain the specified length
  2314      * @throws NegativeArraySizeException if <tt>newLength</tt> is negative
  2315      * @throws NullPointerException if <tt>original</tt> is null
  2316      * @since 1.6
  2317      */
  2318     public static int[] copyOf(int[] original, int newLength) {
  2319         int[] copy = new int[newLength];
  2320         System.arraycopy(original, 0, copy, 0,
  2321                          Math.min(original.length, newLength));
  2322         return copy;
  2323     }
  2324 
  2325     /**
  2326      * Copies the specified array, truncating or padding with zeros (if necessary)
  2327      * so the copy has the specified length.  For all indices that are
  2328      * valid in both the original array and the copy, the two arrays will
  2329      * contain identical values.  For any indices that are valid in the
  2330      * copy but not the original, the copy will contain <tt>0L</tt>.
  2331      * Such indices will exist if and only if the specified length
  2332      * is greater than that of the original array.
  2333      *
  2334      * @param original the array to be copied
  2335      * @param newLength the length of the copy to be returned
  2336      * @return a copy of the original array, truncated or padded with zeros
  2337      *     to obtain the specified length
  2338      * @throws NegativeArraySizeException if <tt>newLength</tt> is negative
  2339      * @throws NullPointerException if <tt>original</tt> is null
  2340      * @since 1.6
  2341      */
  2342     public static long[] copyOf(long[] original, int newLength) {
  2343         long[] copy = new long[newLength];
  2344         System.arraycopy(original, 0, copy, 0,
  2345                          Math.min(original.length, newLength));
  2346         return copy;
  2347     }
  2348 
  2349     /**
  2350      * Copies the specified array, truncating or padding with null characters (if necessary)
  2351      * so the copy has the specified length.  For all indices that are valid
  2352      * in both the original array and the copy, the two arrays will contain
  2353      * identical values.  For any indices that are valid in the copy but not
  2354      * the original, the copy will contain <tt>'\\u000'</tt>.  Such indices
  2355      * will exist if and only if the specified length is greater than that of
  2356      * the original array.
  2357      *
  2358      * @param original the array to be copied
  2359      * @param newLength the length of the copy to be returned
  2360      * @return a copy of the original array, truncated or padded with null characters
  2361      *     to obtain the specified length
  2362      * @throws NegativeArraySizeException if <tt>newLength</tt> is negative
  2363      * @throws NullPointerException if <tt>original</tt> is null
  2364      * @since 1.6
  2365      */
  2366     public static char[] copyOf(char[] original, int newLength) {
  2367         char[] copy = new char[newLength];
  2368         System.arraycopy(original, 0, copy, 0,
  2369                          Math.min(original.length, newLength));
  2370         return copy;
  2371     }
  2372 
  2373     /**
  2374      * Copies the specified array, truncating or padding with zeros (if necessary)
  2375      * so the copy has the specified length.  For all indices that are
  2376      * valid in both the original array and the copy, the two arrays will
  2377      * contain identical values.  For any indices that are valid in the
  2378      * copy but not the original, the copy will contain <tt>0f</tt>.
  2379      * Such indices will exist if and only if the specified length
  2380      * is greater than that of the original array.
  2381      *
  2382      * @param original the array to be copied
  2383      * @param newLength the length of the copy to be returned
  2384      * @return a copy of the original array, truncated or padded with zeros
  2385      *     to obtain the specified length
  2386      * @throws NegativeArraySizeException if <tt>newLength</tt> is negative
  2387      * @throws NullPointerException if <tt>original</tt> is null
  2388      * @since 1.6
  2389      */
  2390     public static float[] copyOf(float[] original, int newLength) {
  2391         float[] copy = new float[newLength];
  2392         System.arraycopy(original, 0, copy, 0,
  2393                          Math.min(original.length, newLength));
  2394         return copy;
  2395     }
  2396 
  2397     /**
  2398      * Copies the specified array, truncating or padding with zeros (if necessary)
  2399      * so the copy has the specified length.  For all indices that are
  2400      * valid in both the original array and the copy, the two arrays will
  2401      * contain identical values.  For any indices that are valid in the
  2402      * copy but not the original, the copy will contain <tt>0d</tt>.
  2403      * Such indices will exist if and only if the specified length
  2404      * is greater than that of the original array.
  2405      *
  2406      * @param original the array to be copied
  2407      * @param newLength the length of the copy to be returned
  2408      * @return a copy of the original array, truncated or padded with zeros
  2409      *     to obtain the specified length
  2410      * @throws NegativeArraySizeException if <tt>newLength</tt> is negative
  2411      * @throws NullPointerException if <tt>original</tt> is null
  2412      * @since 1.6
  2413      */
  2414     public static double[] copyOf(double[] original, int newLength) {
  2415         double[] copy = new double[newLength];
  2416         System.arraycopy(original, 0, copy, 0,
  2417                          Math.min(original.length, newLength));
  2418         return copy;
  2419     }
  2420 
  2421     /**
  2422      * Copies the specified array, truncating or padding with <tt>false</tt> (if necessary)
  2423      * so the copy has the specified length.  For all indices that are
  2424      * valid in both the original array and the copy, the two arrays will
  2425      * contain identical values.  For any indices that are valid in the
  2426      * copy but not the original, the copy will contain <tt>false</tt>.
  2427      * Such indices will exist if and only if the specified length
  2428      * is greater than that of the original array.
  2429      *
  2430      * @param original the array to be copied
  2431      * @param newLength the length of the copy to be returned
  2432      * @return a copy of the original array, truncated or padded with false elements
  2433      *     to obtain the specified length
  2434      * @throws NegativeArraySizeException if <tt>newLength</tt> is negative
  2435      * @throws NullPointerException if <tt>original</tt> is null
  2436      * @since 1.6
  2437      */
  2438     public static boolean[] copyOf(boolean[] original, int newLength) {
  2439         boolean[] copy = new boolean[newLength];
  2440         System.arraycopy(original, 0, copy, 0,
  2441                          Math.min(original.length, newLength));
  2442         return copy;
  2443     }
  2444 
  2445     /**
  2446      * Copies the specified range of the specified array into a new array.
  2447      * The initial index of the range (<tt>from</tt>) must lie between zero
  2448      * and <tt>original.length</tt>, inclusive.  The value at
  2449      * <tt>original[from]</tt> is placed into the initial element of the copy
  2450      * (unless <tt>from == original.length</tt> or <tt>from == to</tt>).
  2451      * Values from subsequent elements in the original array are placed into
  2452      * subsequent elements in the copy.  The final index of the range
  2453      * (<tt>to</tt>), which must be greater than or equal to <tt>from</tt>,
  2454      * may be greater than <tt>original.length</tt>, in which case
  2455      * <tt>null</tt> is placed in all elements of the copy whose index is
  2456      * greater than or equal to <tt>original.length - from</tt>.  The length
  2457      * of the returned array will be <tt>to - from</tt>.
  2458      * <p>
  2459      * The resulting array is of exactly the same class as the original array.
  2460      *
  2461      * @param original the array from which a range is to be copied
  2462      * @param from the initial index of the range to be copied, inclusive
  2463      * @param to the final index of the range to be copied, exclusive.
  2464      *     (This index may lie outside the array.)
  2465      * @return a new array containing the specified range from the original array,
  2466      *     truncated or padded with nulls to obtain the required length
  2467      * @throws ArrayIndexOutOfBoundsException if {@code from < 0}
  2468      *     or {@code from > original.length}
  2469      * @throws IllegalArgumentException if <tt>from &gt; to</tt>
  2470      * @throws NullPointerException if <tt>original</tt> is null
  2471      * @since 1.6
  2472      */
  2473     public static <T> T[] copyOfRange(T[] original, int from, int to) {
  2474         return copyOfRange(original, from, to, (Class<T[]>) original.getClass());
  2475     }
  2476 
  2477     /**
  2478      * Copies the specified range of the specified array into a new array.
  2479      * The initial index of the range (<tt>from</tt>) must lie between zero
  2480      * and <tt>original.length</tt>, inclusive.  The value at
  2481      * <tt>original[from]</tt> is placed into the initial element of the copy
  2482      * (unless <tt>from == original.length</tt> or <tt>from == to</tt>).
  2483      * Values from subsequent elements in the original array are placed into
  2484      * subsequent elements in the copy.  The final index of the range
  2485      * (<tt>to</tt>), which must be greater than or equal to <tt>from</tt>,
  2486      * may be greater than <tt>original.length</tt>, in which case
  2487      * <tt>null</tt> is placed in all elements of the copy whose index is
  2488      * greater than or equal to <tt>original.length - from</tt>.  The length
  2489      * of the returned array will be <tt>to - from</tt>.
  2490      * The resulting array is of the class <tt>newType</tt>.
  2491      *
  2492      * @param original the array from which a range is to be copied
  2493      * @param from the initial index of the range to be copied, inclusive
  2494      * @param to the final index of the range to be copied, exclusive.
  2495      *     (This index may lie outside the array.)
  2496      * @param newType the class of the copy to be returned
  2497      * @return a new array containing the specified range from the original array,
  2498      *     truncated or padded with nulls to obtain the required length
  2499      * @throws ArrayIndexOutOfBoundsException if {@code from < 0}
  2500      *     or {@code from > original.length}
  2501      * @throws IllegalArgumentException if <tt>from &gt; to</tt>
  2502      * @throws NullPointerException if <tt>original</tt> is null
  2503      * @throws ArrayStoreException if an element copied from
  2504      *     <tt>original</tt> is not of a runtime type that can be stored in
  2505      *     an array of class <tt>newType</tt>.
  2506      * @since 1.6
  2507      */
  2508     public static <T,U> T[] copyOfRange(U[] original, int from, int to, Class<? extends T[]> newType) {
  2509         int newLength = to - from;
  2510         if (newLength < 0)
  2511             throw new IllegalArgumentException(from + " > " + to);
  2512         T[] copy = ((Object)newType == (Object)Object[].class)
  2513             ? (T[]) new Object[newLength]
  2514             : (T[]) Array.newInstance(newType.getComponentType(), newLength);
  2515         System.arraycopy(original, from, copy, 0,
  2516                          Math.min(original.length - from, newLength));
  2517         return copy;
  2518     }
  2519 
  2520     /**
  2521      * Copies the specified range of the specified array into a new array.
  2522      * The initial index of the range (<tt>from</tt>) must lie between zero
  2523      * and <tt>original.length</tt>, inclusive.  The value at
  2524      * <tt>original[from]</tt> is placed into the initial element of the copy
  2525      * (unless <tt>from == original.length</tt> or <tt>from == to</tt>).
  2526      * Values from subsequent elements in the original array are placed into
  2527      * subsequent elements in the copy.  The final index of the range
  2528      * (<tt>to</tt>), which must be greater than or equal to <tt>from</tt>,
  2529      * may be greater than <tt>original.length</tt>, in which case
  2530      * <tt>(byte)0</tt> is placed in all elements of the copy whose index is
  2531      * greater than or equal to <tt>original.length - from</tt>.  The length
  2532      * of the returned array will be <tt>to - from</tt>.
  2533      *
  2534      * @param original the array from which a range is to be copied
  2535      * @param from the initial index of the range to be copied, inclusive
  2536      * @param to the final index of the range to be copied, exclusive.
  2537      *     (This index may lie outside the array.)
  2538      * @return a new array containing the specified range from the original array,
  2539      *     truncated or padded with zeros to obtain the required length
  2540      * @throws ArrayIndexOutOfBoundsException if {@code from < 0}
  2541      *     or {@code from > original.length}
  2542      * @throws IllegalArgumentException if <tt>from &gt; to</tt>
  2543      * @throws NullPointerException if <tt>original</tt> is null
  2544      * @since 1.6
  2545      */
  2546     public static byte[] copyOfRange(byte[] original, int from, int to) {
  2547         int newLength = to - from;
  2548         if (newLength < 0)
  2549             throw new IllegalArgumentException(from + " > " + to);
  2550         byte[] copy = new byte[newLength];
  2551         System.arraycopy(original, from, copy, 0,
  2552                          Math.min(original.length - from, newLength));
  2553         return copy;
  2554     }
  2555 
  2556     /**
  2557      * Copies the specified range of the specified array into a new array.
  2558      * The initial index of the range (<tt>from</tt>) must lie between zero
  2559      * and <tt>original.length</tt>, inclusive.  The value at
  2560      * <tt>original[from]</tt> is placed into the initial element of the copy
  2561      * (unless <tt>from == original.length</tt> or <tt>from == to</tt>).
  2562      * Values from subsequent elements in the original array are placed into
  2563      * subsequent elements in the copy.  The final index of the range
  2564      * (<tt>to</tt>), which must be greater than or equal to <tt>from</tt>,
  2565      * may be greater than <tt>original.length</tt>, in which case
  2566      * <tt>(short)0</tt> is placed in all elements of the copy whose index is
  2567      * greater than or equal to <tt>original.length - from</tt>.  The length
  2568      * of the returned array will be <tt>to - from</tt>.
  2569      *
  2570      * @param original the array from which a range is to be copied
  2571      * @param from the initial index of the range to be copied, inclusive
  2572      * @param to the final index of the range to be copied, exclusive.
  2573      *     (This index may lie outside the array.)
  2574      * @return a new array containing the specified range from the original array,
  2575      *     truncated or padded with zeros to obtain the required length
  2576      * @throws ArrayIndexOutOfBoundsException if {@code from < 0}
  2577      *     or {@code from > original.length}
  2578      * @throws IllegalArgumentException if <tt>from &gt; to</tt>
  2579      * @throws NullPointerException if <tt>original</tt> is null
  2580      * @since 1.6
  2581      */
  2582     public static short[] copyOfRange(short[] original, int from, int to) {
  2583         int newLength = to - from;
  2584         if (newLength < 0)
  2585             throw new IllegalArgumentException(from + " > " + to);
  2586         short[] copy = new short[newLength];
  2587         System.arraycopy(original, from, copy, 0,
  2588                          Math.min(original.length - from, newLength));
  2589         return copy;
  2590     }
  2591 
  2592     /**
  2593      * Copies the specified range of the specified array into a new array.
  2594      * The initial index of the range (<tt>from</tt>) must lie between zero
  2595      * and <tt>original.length</tt>, inclusive.  The value at
  2596      * <tt>original[from]</tt> is placed into the initial element of the copy
  2597      * (unless <tt>from == original.length</tt> or <tt>from == to</tt>).
  2598      * Values from subsequent elements in the original array are placed into
  2599      * subsequent elements in the copy.  The final index of the range
  2600      * (<tt>to</tt>), which must be greater than or equal to <tt>from</tt>,
  2601      * may be greater than <tt>original.length</tt>, in which case
  2602      * <tt>0</tt> is placed in all elements of the copy whose index is
  2603      * greater than or equal to <tt>original.length - from</tt>.  The length
  2604      * of the returned array will be <tt>to - from</tt>.
  2605      *
  2606      * @param original the array from which a range is to be copied
  2607      * @param from the initial index of the range to be copied, inclusive
  2608      * @param to the final index of the range to be copied, exclusive.
  2609      *     (This index may lie outside the array.)
  2610      * @return a new array containing the specified range from the original array,
  2611      *     truncated or padded with zeros to obtain the required length
  2612      * @throws ArrayIndexOutOfBoundsException if {@code from < 0}
  2613      *     or {@code from > original.length}
  2614      * @throws IllegalArgumentException if <tt>from &gt; to</tt>
  2615      * @throws NullPointerException if <tt>original</tt> is null
  2616      * @since 1.6
  2617      */
  2618     public static int[] copyOfRange(int[] original, int from, int to) {
  2619         int newLength = to - from;
  2620         if (newLength < 0)
  2621             throw new IllegalArgumentException(from + " > " + to);
  2622         int[] copy = new int[newLength];
  2623         System.arraycopy(original, from, copy, 0,
  2624                          Math.min(original.length - from, newLength));
  2625         return copy;
  2626     }
  2627 
  2628     /**
  2629      * Copies the specified range of the specified array into a new array.
  2630      * The initial index of the range (<tt>from</tt>) must lie between zero
  2631      * and <tt>original.length</tt>, inclusive.  The value at
  2632      * <tt>original[from]</tt> is placed into the initial element of the copy
  2633      * (unless <tt>from == original.length</tt> or <tt>from == to</tt>).
  2634      * Values from subsequent elements in the original array are placed into
  2635      * subsequent elements in the copy.  The final index of the range
  2636      * (<tt>to</tt>), which must be greater than or equal to <tt>from</tt>,
  2637      * may be greater than <tt>original.length</tt>, in which case
  2638      * <tt>0L</tt> is placed in all elements of the copy whose index is
  2639      * greater than or equal to <tt>original.length - from</tt>.  The length
  2640      * of the returned array will be <tt>to - from</tt>.
  2641      *
  2642      * @param original the array from which a range is to be copied
  2643      * @param from the initial index of the range to be copied, inclusive
  2644      * @param to the final index of the range to be copied, exclusive.
  2645      *     (This index may lie outside the array.)
  2646      * @return a new array containing the specified range from the original array,
  2647      *     truncated or padded with zeros to obtain the required length
  2648      * @throws ArrayIndexOutOfBoundsException if {@code from < 0}
  2649      *     or {@code from > original.length}
  2650      * @throws IllegalArgumentException if <tt>from &gt; to</tt>
  2651      * @throws NullPointerException if <tt>original</tt> is null
  2652      * @since 1.6
  2653      */
  2654     public static long[] copyOfRange(long[] original, int from, int to) {
  2655         int newLength = to - from;
  2656         if (newLength < 0)
  2657             throw new IllegalArgumentException(from + " > " + to);
  2658         long[] copy = new long[newLength];
  2659         System.arraycopy(original, from, copy, 0,
  2660                          Math.min(original.length - from, newLength));
  2661         return copy;
  2662     }
  2663 
  2664     /**
  2665      * Copies the specified range of the specified array into a new array.
  2666      * The initial index of the range (<tt>from</tt>) must lie between zero
  2667      * and <tt>original.length</tt>, inclusive.  The value at
  2668      * <tt>original[from]</tt> is placed into the initial element of the copy
  2669      * (unless <tt>from == original.length</tt> or <tt>from == to</tt>).
  2670      * Values from subsequent elements in the original array are placed into
  2671      * subsequent elements in the copy.  The final index of the range
  2672      * (<tt>to</tt>), which must be greater than or equal to <tt>from</tt>,
  2673      * may be greater than <tt>original.length</tt>, in which case
  2674      * <tt>'\\u000'</tt> is placed in all elements of the copy whose index is
  2675      * greater than or equal to <tt>original.length - from</tt>.  The length
  2676      * of the returned array will be <tt>to - from</tt>.
  2677      *
  2678      * @param original the array from which a range is to be copied
  2679      * @param from the initial index of the range to be copied, inclusive
  2680      * @param to the final index of the range to be copied, exclusive.
  2681      *     (This index may lie outside the array.)
  2682      * @return a new array containing the specified range from the original array,
  2683      *     truncated or padded with null characters to obtain the required length
  2684      * @throws ArrayIndexOutOfBoundsException if {@code from < 0}
  2685      *     or {@code from > original.length}
  2686      * @throws IllegalArgumentException if <tt>from &gt; to</tt>
  2687      * @throws NullPointerException if <tt>original</tt> is null
  2688      * @since 1.6
  2689      */
  2690     public static char[] copyOfRange(char[] original, int from, int to) {
  2691         int newLength = to - from;
  2692         if (newLength < 0)
  2693             throw new IllegalArgumentException(from + " > " + to);
  2694         char[] copy = new char[newLength];
  2695         System.arraycopy(original, from, copy, 0,
  2696                          Math.min(original.length - from, newLength));
  2697         return copy;
  2698     }
  2699 
  2700     /**
  2701      * Copies the specified range of the specified array into a new array.
  2702      * The initial index of the range (<tt>from</tt>) must lie between zero
  2703      * and <tt>original.length</tt>, inclusive.  The value at
  2704      * <tt>original[from]</tt> is placed into the initial element of the copy
  2705      * (unless <tt>from == original.length</tt> or <tt>from == to</tt>).
  2706      * Values from subsequent elements in the original array are placed into
  2707      * subsequent elements in the copy.  The final index of the range
  2708      * (<tt>to</tt>), which must be greater than or equal to <tt>from</tt>,
  2709      * may be greater than <tt>original.length</tt>, in which case
  2710      * <tt>0f</tt> is placed in all elements of the copy whose index is
  2711      * greater than or equal to <tt>original.length - from</tt>.  The length
  2712      * of the returned array will be <tt>to - from</tt>.
  2713      *
  2714      * @param original the array from which a range is to be copied
  2715      * @param from the initial index of the range to be copied, inclusive
  2716      * @param to the final index of the range to be copied, exclusive.
  2717      *     (This index may lie outside the array.)
  2718      * @return a new array containing the specified range from the original array,
  2719      *     truncated or padded with zeros to obtain the required length
  2720      * @throws ArrayIndexOutOfBoundsException if {@code from < 0}
  2721      *     or {@code from > original.length}
  2722      * @throws IllegalArgumentException if <tt>from &gt; to</tt>
  2723      * @throws NullPointerException if <tt>original</tt> is null
  2724      * @since 1.6
  2725      */
  2726     public static float[] copyOfRange(float[] original, int from, int to) {
  2727         int newLength = to - from;
  2728         if (newLength < 0)
  2729             throw new IllegalArgumentException(from + " > " + to);
  2730         float[] copy = new float[newLength];
  2731         System.arraycopy(original, from, copy, 0,
  2732                          Math.min(original.length - from, newLength));
  2733         return copy;
  2734     }
  2735 
  2736     /**
  2737      * Copies the specified range of the specified array into a new array.
  2738      * The initial index of the range (<tt>from</tt>) must lie between zero
  2739      * and <tt>original.length</tt>, inclusive.  The value at
  2740      * <tt>original[from]</tt> is placed into the initial element of the copy
  2741      * (unless <tt>from == original.length</tt> or <tt>from == to</tt>).
  2742      * Values from subsequent elements in the original array are placed into
  2743      * subsequent elements in the copy.  The final index of the range
  2744      * (<tt>to</tt>), which must be greater than or equal to <tt>from</tt>,
  2745      * may be greater than <tt>original.length</tt>, in which case
  2746      * <tt>0d</tt> is placed in all elements of the copy whose index is
  2747      * greater than or equal to <tt>original.length - from</tt>.  The length
  2748      * of the returned array will be <tt>to - from</tt>.
  2749      *
  2750      * @param original the array from which a range is to be copied
  2751      * @param from the initial index of the range to be copied, inclusive
  2752      * @param to the final index of the range to be copied, exclusive.
  2753      *     (This index may lie outside the array.)
  2754      * @return a new array containing the specified range from the original array,
  2755      *     truncated or padded with zeros to obtain the required length
  2756      * @throws ArrayIndexOutOfBoundsException if {@code from < 0}
  2757      *     or {@code from > original.length}
  2758      * @throws IllegalArgumentException if <tt>from &gt; to</tt>
  2759      * @throws NullPointerException if <tt>original</tt> is null
  2760      * @since 1.6
  2761      */
  2762     public static double[] copyOfRange(double[] original, int from, int to) {
  2763         int newLength = to - from;
  2764         if (newLength < 0)
  2765             throw new IllegalArgumentException(from + " > " + to);
  2766         double[] copy = new double[newLength];
  2767         System.arraycopy(original, from, copy, 0,
  2768                          Math.min(original.length - from, newLength));
  2769         return copy;
  2770     }
  2771 
  2772     /**
  2773      * Copies the specified range of the specified array into a new array.
  2774      * The initial index of the range (<tt>from</tt>) must lie between zero
  2775      * and <tt>original.length</tt>, inclusive.  The value at
  2776      * <tt>original[from]</tt> is placed into the initial element of the copy
  2777      * (unless <tt>from == original.length</tt> or <tt>from == to</tt>).
  2778      * Values from subsequent elements in the original array are placed into
  2779      * subsequent elements in the copy.  The final index of the range
  2780      * (<tt>to</tt>), which must be greater than or equal to <tt>from</tt>,
  2781      * may be greater than <tt>original.length</tt>, in which case
  2782      * <tt>false</tt> is placed in all elements of the copy whose index is
  2783      * greater than or equal to <tt>original.length - from</tt>.  The length
  2784      * of the returned array will be <tt>to - from</tt>.
  2785      *
  2786      * @param original the array from which a range is to be copied
  2787      * @param from the initial index of the range to be copied, inclusive
  2788      * @param to the final index of the range to be copied, exclusive.
  2789      *     (This index may lie outside the array.)
  2790      * @return a new array containing the specified range from the original array,
  2791      *     truncated or padded with false elements to obtain the required length
  2792      * @throws ArrayIndexOutOfBoundsException if {@code from < 0}
  2793      *     or {@code from > original.length}
  2794      * @throws IllegalArgumentException if <tt>from &gt; to</tt>
  2795      * @throws NullPointerException if <tt>original</tt> is null
  2796      * @since 1.6
  2797      */
  2798     public static boolean[] copyOfRange(boolean[] original, int from, int to) {
  2799         int newLength = to - from;
  2800         if (newLength < 0)
  2801             throw new IllegalArgumentException(from + " > " + to);
  2802         boolean[] copy = new boolean[newLength];
  2803         System.arraycopy(original, from, copy, 0,
  2804                          Math.min(original.length - from, newLength));
  2805         return copy;
  2806     }
  2807 
  2808     // Misc
  2809 
  2810     /**
  2811      * Returns a fixed-size list backed by the specified array.  (Changes to
  2812      * the returned list "write through" to the array.)  This method acts
  2813      * as bridge between array-based and collection-based APIs, in
  2814      * combination with {@link Collection#toArray}.  The returned list is
  2815      * serializable and implements {@link RandomAccess}.
  2816      *
  2817      * <p>This method also provides a convenient way to create a fixed-size
  2818      * list initialized to contain several elements:
  2819      * <pre>
  2820      *     List&lt;String&gt; stooges = Arrays.asList("Larry", "Moe", "Curly");
  2821      * </pre>
  2822      *
  2823      * @param a the array by which the list will be backed
  2824      * @return a list view of the specified array
  2825      */
  2826     @SafeVarargs
  2827     public static <T> List<T> asList(T... a) {
  2828         return new ArrayList<>(a);
  2829     }
  2830 
  2831     /**
  2832      * @serial include
  2833      */
  2834     private static class ArrayList<E> extends AbstractList<E>
  2835         implements RandomAccess, java.io.Serializable
  2836     {
  2837         private static final long serialVersionUID = -2764017481108945198L;
  2838         private final E[] a;
  2839 
  2840         ArrayList(E[] array) {
  2841             if (array==null)
  2842                 throw new NullPointerException();
  2843             a = array;
  2844         }
  2845 
  2846         public int size() {
  2847             return a.length;
  2848         }
  2849 
  2850         public Object[] toArray() {
  2851             return a.clone();
  2852         }
  2853 
  2854         public <T> T[] toArray(T[] a) {
  2855             int size = size();
  2856             if (a.length < size)
  2857                 return Arrays.copyOf(this.a, size,
  2858                                      (Class<? extends T[]>) a.getClass());
  2859             System.arraycopy(this.a, 0, a, 0, size);
  2860             if (a.length > size)
  2861                 a[size] = null;
  2862             return a;
  2863         }
  2864 
  2865         public E get(int index) {
  2866             return a[index];
  2867         }
  2868 
  2869         public E set(int index, E element) {
  2870             E oldValue = a[index];
  2871             a[index] = element;
  2872             return oldValue;
  2873         }
  2874 
  2875         public int indexOf(Object o) {
  2876             if (o==null) {
  2877                 for (int i=0; i<a.length; i++)
  2878                     if (a[i]==null)
  2879                         return i;
  2880             } else {
  2881                 for (int i=0; i<a.length; i++)
  2882                     if (o.equals(a[i]))
  2883                         return i;
  2884             }
  2885             return -1;
  2886         }
  2887 
  2888         public boolean contains(Object o) {
  2889             return indexOf(o) != -1;
  2890         }
  2891     }
  2892 
  2893     /**
  2894      * Returns a hash code based on the contents of the specified array.
  2895      * For any two <tt>long</tt> arrays <tt>a</tt> and <tt>b</tt>
  2896      * such that <tt>Arrays.equals(a, b)</tt>, it is also the case that
  2897      * <tt>Arrays.hashCode(a) == Arrays.hashCode(b)</tt>.
  2898      *
  2899      * <p>The value returned by this method is the same value that would be
  2900      * obtained by invoking the {@link List#hashCode() <tt>hashCode</tt>}
  2901      * method on a {@link List} containing a sequence of {@link Long}
  2902      * instances representing the elements of <tt>a</tt> in the same order.
  2903      * If <tt>a</tt> is <tt>null</tt>, this method returns 0.
  2904      *
  2905      * @param a the array whose hash value to compute
  2906      * @return a content-based hash code for <tt>a</tt>
  2907      * @since 1.5
  2908      */
  2909     public static int hashCode(long a[]) {
  2910         if (a == null)
  2911             return 0;
  2912 
  2913         int result = 1;
  2914         for (long element : a) {
  2915             int elementHash = (int)(element ^ (element >>> 32));
  2916             result = 31 * result + elementHash;
  2917         }
  2918 
  2919         return result;
  2920     }
  2921 
  2922     /**
  2923      * Returns a hash code based on the contents of the specified array.
  2924      * For any two non-null <tt>int</tt> arrays <tt>a</tt> and <tt>b</tt>
  2925      * such that <tt>Arrays.equals(a, b)</tt>, it is also the case that
  2926      * <tt>Arrays.hashCode(a) == Arrays.hashCode(b)</tt>.
  2927      *
  2928      * <p>The value returned by this method is the same value that would be
  2929      * obtained by invoking the {@link List#hashCode() <tt>hashCode</tt>}
  2930      * method on a {@link List} containing a sequence of {@link Integer}
  2931      * instances representing the elements of <tt>a</tt> in the same order.
  2932      * If <tt>a</tt> is <tt>null</tt>, this method returns 0.
  2933      *
  2934      * @param a the array whose hash value to compute
  2935      * @return a content-based hash code for <tt>a</tt>
  2936      * @since 1.5
  2937      */
  2938     public static int hashCode(int a[]) {
  2939         if (a == null)
  2940             return 0;
  2941 
  2942         int result = 1;
  2943         for (int element : a)
  2944             result = 31 * result + element;
  2945 
  2946         return result;
  2947     }
  2948 
  2949     /**
  2950      * Returns a hash code based on the contents of the specified array.
  2951      * For any two <tt>short</tt> arrays <tt>a</tt> and <tt>b</tt>
  2952      * such that <tt>Arrays.equals(a, b)</tt>, it is also the case that
  2953      * <tt>Arrays.hashCode(a) == Arrays.hashCode(b)</tt>.
  2954      *
  2955      * <p>The value returned by this method is the same value that would be
  2956      * obtained by invoking the {@link List#hashCode() <tt>hashCode</tt>}
  2957      * method on a {@link List} containing a sequence of {@link Short}
  2958      * instances representing the elements of <tt>a</tt> in the same order.
  2959      * If <tt>a</tt> is <tt>null</tt>, this method returns 0.
  2960      *
  2961      * @param a the array whose hash value to compute
  2962      * @return a content-based hash code for <tt>a</tt>
  2963      * @since 1.5
  2964      */
  2965     public static int hashCode(short a[]) {
  2966         if (a == null)
  2967             return 0;
  2968 
  2969         int result = 1;
  2970         for (short element : a)
  2971             result = 31 * result + element;
  2972 
  2973         return result;
  2974     }
  2975 
  2976     /**
  2977      * Returns a hash code based on the contents of the specified array.
  2978      * For any two <tt>char</tt> arrays <tt>a</tt> and <tt>b</tt>
  2979      * such that <tt>Arrays.equals(a, b)</tt>, it is also the case that
  2980      * <tt>Arrays.hashCode(a) == Arrays.hashCode(b)</tt>.
  2981      *
  2982      * <p>The value returned by this method is the same value that would be
  2983      * obtained by invoking the {@link List#hashCode() <tt>hashCode</tt>}
  2984      * method on a {@link List} containing a sequence of {@link Character}
  2985      * instances representing the elements of <tt>a</tt> in the same order.
  2986      * If <tt>a</tt> is <tt>null</tt>, this method returns 0.
  2987      *
  2988      * @param a the array whose hash value to compute
  2989      * @return a content-based hash code for <tt>a</tt>
  2990      * @since 1.5
  2991      */
  2992     public static int hashCode(char a[]) {
  2993         if (a == null)
  2994             return 0;
  2995 
  2996         int result = 1;
  2997         for (char element : a)
  2998             result = 31 * result + element;
  2999 
  3000         return result;
  3001     }
  3002 
  3003     /**
  3004      * Returns a hash code based on the contents of the specified array.
  3005      * For any two <tt>byte</tt> arrays <tt>a</tt> and <tt>b</tt>
  3006      * such that <tt>Arrays.equals(a, b)</tt>, it is also the case that
  3007      * <tt>Arrays.hashCode(a) == Arrays.hashCode(b)</tt>.
  3008      *
  3009      * <p>The value returned by this method is the same value that would be
  3010      * obtained by invoking the {@link List#hashCode() <tt>hashCode</tt>}
  3011      * method on a {@link List} containing a sequence of {@link Byte}
  3012      * instances representing the elements of <tt>a</tt> in the same order.
  3013      * If <tt>a</tt> is <tt>null</tt>, this method returns 0.
  3014      *
  3015      * @param a the array whose hash value to compute
  3016      * @return a content-based hash code for <tt>a</tt>
  3017      * @since 1.5
  3018      */
  3019     public static int hashCode(byte a[]) {
  3020         if (a == null)
  3021             return 0;
  3022 
  3023         int result = 1;
  3024         for (byte element : a)
  3025             result = 31 * result + element;
  3026 
  3027         return result;
  3028     }
  3029 
  3030     /**
  3031      * Returns a hash code based on the contents of the specified array.
  3032      * For any two <tt>boolean</tt> arrays <tt>a</tt> and <tt>b</tt>
  3033      * such that <tt>Arrays.equals(a, b)</tt>, it is also the case that
  3034      * <tt>Arrays.hashCode(a) == Arrays.hashCode(b)</tt>.
  3035      *
  3036      * <p>The value returned by this method is the same value that would be
  3037      * obtained by invoking the {@link List#hashCode() <tt>hashCode</tt>}
  3038      * method on a {@link List} containing a sequence of {@link Boolean}
  3039      * instances representing the elements of <tt>a</tt> in the same order.
  3040      * If <tt>a</tt> is <tt>null</tt>, this method returns 0.
  3041      *
  3042      * @param a the array whose hash value to compute
  3043      * @return a content-based hash code for <tt>a</tt>
  3044      * @since 1.5
  3045      */
  3046     public static int hashCode(boolean a[]) {
  3047         if (a == null)
  3048             return 0;
  3049 
  3050         int result = 1;
  3051         for (boolean element : a)
  3052             result = 31 * result + (element ? 1231 : 1237);
  3053 
  3054         return result;
  3055     }
  3056 
  3057     /**
  3058      * Returns a hash code based on the contents of the specified array.
  3059      * For any two <tt>float</tt> arrays <tt>a</tt> and <tt>b</tt>
  3060      * such that <tt>Arrays.equals(a, b)</tt>, it is also the case that
  3061      * <tt>Arrays.hashCode(a) == Arrays.hashCode(b)</tt>.
  3062      *
  3063      * <p>The value returned by this method is the same value that would be
  3064      * obtained by invoking the {@link List#hashCode() <tt>hashCode</tt>}
  3065      * method on a {@link List} containing a sequence of {@link Float}
  3066      * instances representing the elements of <tt>a</tt> in the same order.
  3067      * If <tt>a</tt> is <tt>null</tt>, this method returns 0.
  3068      *
  3069      * @param a the array whose hash value to compute
  3070      * @return a content-based hash code for <tt>a</tt>
  3071      * @since 1.5
  3072      */
  3073     public static int hashCode(float a[]) {
  3074         if (a == null)
  3075             return 0;
  3076 
  3077         int result = 1;
  3078         for (float element : a)
  3079             result = 31 * result + Float.floatToIntBits(element);
  3080 
  3081         return result;
  3082     }
  3083 
  3084     /**
  3085      * Returns a hash code based on the contents of the specified array.
  3086      * For any two <tt>double</tt> arrays <tt>a</tt> and <tt>b</tt>
  3087      * such that <tt>Arrays.equals(a, b)</tt>, it is also the case that
  3088      * <tt>Arrays.hashCode(a) == Arrays.hashCode(b)</tt>.
  3089      *
  3090      * <p>The value returned by this method is the same value that would be
  3091      * obtained by invoking the {@link List#hashCode() <tt>hashCode</tt>}
  3092      * method on a {@link List} containing a sequence of {@link Double}
  3093      * instances representing the elements of <tt>a</tt> in the same order.
  3094      * If <tt>a</tt> is <tt>null</tt>, this method returns 0.
  3095      *
  3096      * @param a the array whose hash value to compute
  3097      * @return a content-based hash code for <tt>a</tt>
  3098      * @since 1.5
  3099      */
  3100     public static int hashCode(double a[]) {
  3101         if (a == null)
  3102             return 0;
  3103 
  3104         int result = 1;
  3105         for (double element : a) {
  3106             long bits = Double.doubleToLongBits(element);
  3107             result = 31 * result + (int)(bits ^ (bits >>> 32));
  3108         }
  3109         return result;
  3110     }
  3111 
  3112     /**
  3113      * Returns a hash code based on the contents of the specified array.  If
  3114      * the array contains other arrays as elements, the hash code is based on
  3115      * their identities rather than their contents.  It is therefore
  3116      * acceptable to invoke this method on an array that contains itself as an
  3117      * element,  either directly or indirectly through one or more levels of
  3118      * arrays.
  3119      *
  3120      * <p>For any two arrays <tt>a</tt> and <tt>b</tt> such that
  3121      * <tt>Arrays.equals(a, b)</tt>, it is also the case that
  3122      * <tt>Arrays.hashCode(a) == Arrays.hashCode(b)</tt>.
  3123      *
  3124      * <p>The value returned by this method is equal to the value that would
  3125      * be returned by <tt>Arrays.asList(a).hashCode()</tt>, unless <tt>a</tt>
  3126      * is <tt>null</tt>, in which case <tt>0</tt> is returned.
  3127      *
  3128      * @param a the array whose content-based hash code to compute
  3129      * @return a content-based hash code for <tt>a</tt>
  3130      * @see #deepHashCode(Object[])
  3131      * @since 1.5
  3132      */
  3133     public static int hashCode(Object a[]) {
  3134         if (a == null)
  3135             return 0;
  3136 
  3137         int result = 1;
  3138 
  3139         for (Object element : a)
  3140             result = 31 * result + (element == null ? 0 : element.hashCode());
  3141 
  3142         return result;
  3143     }
  3144 
  3145     /**
  3146      * Returns a hash code based on the "deep contents" of the specified
  3147      * array.  If the array contains other arrays as elements, the
  3148      * hash code is based on their contents and so on, ad infinitum.
  3149      * It is therefore unacceptable to invoke this method on an array that
  3150      * contains itself as an element, either directly or indirectly through
  3151      * one or more levels of arrays.  The behavior of such an invocation is
  3152      * undefined.
  3153      *
  3154      * <p>For any two arrays <tt>a</tt> and <tt>b</tt> such that
  3155      * <tt>Arrays.deepEquals(a, b)</tt>, it is also the case that
  3156      * <tt>Arrays.deepHashCode(a) == Arrays.deepHashCode(b)</tt>.
  3157      *
  3158      * <p>The computation of the value returned by this method is similar to
  3159      * that of the value returned by {@link List#hashCode()} on a list
  3160      * containing the same elements as <tt>a</tt> in the same order, with one
  3161      * difference: If an element <tt>e</tt> of <tt>a</tt> is itself an array,
  3162      * its hash code is computed not by calling <tt>e.hashCode()</tt>, but as
  3163      * by calling the appropriate overloading of <tt>Arrays.hashCode(e)</tt>
  3164      * if <tt>e</tt> is an array of a primitive type, or as by calling
  3165      * <tt>Arrays.deepHashCode(e)</tt> recursively if <tt>e</tt> is an array
  3166      * of a reference type.  If <tt>a</tt> is <tt>null</tt>, this method
  3167      * returns 0.
  3168      *
  3169      * @param a the array whose deep-content-based hash code to compute
  3170      * @return a deep-content-based hash code for <tt>a</tt>
  3171      * @see #hashCode(Object[])
  3172      * @since 1.5
  3173      */
  3174     public static int deepHashCode(Object a[]) {
  3175         if (a == null)
  3176             return 0;
  3177 
  3178         int result = 1;
  3179 
  3180         for (Object element : a) {
  3181             int elementHash = 0;
  3182             if (element instanceof Object[])
  3183                 elementHash = deepHashCode((Object[]) element);
  3184             else if (element instanceof byte[])
  3185                 elementHash = hashCode((byte[]) element);
  3186             else if (element instanceof short[])
  3187                 elementHash = hashCode((short[]) element);
  3188             else if (element instanceof int[])
  3189                 elementHash = hashCode((int[]) element);
  3190             else if (element instanceof long[])
  3191                 elementHash = hashCode((long[]) element);
  3192             else if (element instanceof char[])
  3193                 elementHash = hashCode((char[]) element);
  3194             else if (element instanceof float[])
  3195                 elementHash = hashCode((float[]) element);
  3196             else if (element instanceof double[])
  3197                 elementHash = hashCode((double[]) element);
  3198             else if (element instanceof boolean[])
  3199                 elementHash = hashCode((boolean[]) element);
  3200             else if (element != null)
  3201                 elementHash = element.hashCode();
  3202 
  3203             result = 31 * result + elementHash;
  3204         }
  3205 
  3206         return result;
  3207     }
  3208 
  3209     /**
  3210      * Returns <tt>true</tt> if the two specified arrays are <i>deeply
  3211      * equal</i> to one another.  Unlike the {@link #equals(Object[],Object[])}
  3212      * method, this method is appropriate for use with nested arrays of
  3213      * arbitrary depth.
  3214      *
  3215      * <p>Two array references are considered deeply equal if both
  3216      * are <tt>null</tt>, or if they refer to arrays that contain the same
  3217      * number of elements and all corresponding pairs of elements in the two
  3218      * arrays are deeply equal.
  3219      *
  3220      * <p>Two possibly <tt>null</tt> elements <tt>e1</tt> and <tt>e2</tt> are
  3221      * deeply equal if any of the following conditions hold:
  3222      * <ul>
  3223      *    <li> <tt>e1</tt> and <tt>e2</tt> are both arrays of object reference
  3224      *         types, and <tt>Arrays.deepEquals(e1, e2) would return true</tt>
  3225      *    <li> <tt>e1</tt> and <tt>e2</tt> are arrays of the same primitive
  3226      *         type, and the appropriate overloading of
  3227      *         <tt>Arrays.equals(e1, e2)</tt> would return true.
  3228      *    <li> <tt>e1 == e2</tt>
  3229      *    <li> <tt>e1.equals(e2)</tt> would return true.
  3230      * </ul>
  3231      * Note that this definition permits <tt>null</tt> elements at any depth.
  3232      *
  3233      * <p>If either of the specified arrays contain themselves as elements
  3234      * either directly or indirectly through one or more levels of arrays,
  3235      * the behavior of this method is undefined.
  3236      *
  3237      * @param a1 one array to be tested for equality
  3238      * @param a2 the other array to be tested for equality
  3239      * @return <tt>true</tt> if the two arrays are equal
  3240      * @see #equals(Object[],Object[])
  3241      * @see Objects#deepEquals(Object, Object)
  3242      * @since 1.5
  3243      */
  3244     public static boolean deepEquals(Object[] a1, Object[] a2) {
  3245         if (a1 == a2)
  3246             return true;
  3247         if (a1 == null || a2==null)
  3248             return false;
  3249         int length = a1.length;
  3250         if (a2.length != length)
  3251             return false;
  3252 
  3253         for (int i = 0; i < length; i++) {
  3254             Object e1 = a1[i];
  3255             Object e2 = a2[i];
  3256 
  3257             if (e1 == e2)
  3258                 continue;
  3259             if (e1 == null)
  3260                 return false;
  3261 
  3262             // Figure out whether the two elements are equal
  3263             boolean eq = deepEquals0(e1, e2);
  3264 
  3265             if (!eq)
  3266                 return false;
  3267         }
  3268         return true;
  3269     }
  3270 
  3271     static boolean deepEquals0(Object e1, Object e2) {
  3272         assert e1 != null;
  3273         boolean eq;
  3274         if (e1 instanceof Object[] && e2 instanceof Object[])
  3275             eq = deepEquals ((Object[]) e1, (Object[]) e2);
  3276         else if (e1 instanceof byte[] && e2 instanceof byte[])
  3277             eq = equals((byte[]) e1, (byte[]) e2);
  3278         else if (e1 instanceof short[] && e2 instanceof short[])
  3279             eq = equals((short[]) e1, (short[]) e2);
  3280         else if (e1 instanceof int[] && e2 instanceof int[])
  3281             eq = equals((int[]) e1, (int[]) e2);
  3282         else if (e1 instanceof long[] && e2 instanceof long[])
  3283             eq = equals((long[]) e1, (long[]) e2);
  3284         else if (e1 instanceof char[] && e2 instanceof char[])
  3285             eq = equals((char[]) e1, (char[]) e2);
  3286         else if (e1 instanceof float[] && e2 instanceof float[])
  3287             eq = equals((float[]) e1, (float[]) e2);
  3288         else if (e1 instanceof double[] && e2 instanceof double[])
  3289             eq = equals((double[]) e1, (double[]) e2);
  3290         else if (e1 instanceof boolean[] && e2 instanceof boolean[])
  3291             eq = equals((boolean[]) e1, (boolean[]) e2);
  3292         else
  3293             eq = e1.equals(e2);
  3294         return eq;
  3295     }
  3296 
  3297     /**
  3298      * Returns a string representation of the contents of the specified array.
  3299      * The string representation consists of a list of the array's elements,
  3300      * enclosed in square brackets (<tt>"[]"</tt>).  Adjacent elements are
  3301      * separated by the characters <tt>", "</tt> (a comma followed by a
  3302      * space).  Elements are converted to strings as by
  3303      * <tt>String.valueOf(long)</tt>.  Returns <tt>"null"</tt> if <tt>a</tt>
  3304      * is <tt>null</tt>.
  3305      *
  3306      * @param a the array whose string representation to return
  3307      * @return a string representation of <tt>a</tt>
  3308      * @since 1.5
  3309      */
  3310     public static String toString(long[] a) {
  3311         if (a == null)
  3312             return "null";
  3313         int iMax = a.length - 1;
  3314         if (iMax == -1)
  3315             return "[]";
  3316 
  3317         StringBuilder b = new StringBuilder();
  3318         b.append('[');
  3319         for (int i = 0; ; i++) {
  3320             b.append(a[i]);
  3321             if (i == iMax)
  3322                 return b.append(']').toString();
  3323             b.append(", ");
  3324         }
  3325     }
  3326 
  3327     /**
  3328      * Returns a string representation of the contents of the specified array.
  3329      * The string representation consists of a list of the array's elements,
  3330      * enclosed in square brackets (<tt>"[]"</tt>).  Adjacent elements are
  3331      * separated by the characters <tt>", "</tt> (a comma followed by a
  3332      * space).  Elements are converted to strings as by
  3333      * <tt>String.valueOf(int)</tt>.  Returns <tt>"null"</tt> if <tt>a</tt> is
  3334      * <tt>null</tt>.
  3335      *
  3336      * @param a the array whose string representation to return
  3337      * @return a string representation of <tt>a</tt>
  3338      * @since 1.5
  3339      */
  3340     public static String toString(int[] a) {
  3341         if (a == null)
  3342             return "null";
  3343         int iMax = a.length - 1;
  3344         if (iMax == -1)
  3345             return "[]";
  3346 
  3347         StringBuilder b = new StringBuilder();
  3348         b.append('[');
  3349         for (int i = 0; ; i++) {
  3350             b.append(a[i]);
  3351             if (i == iMax)
  3352                 return b.append(']').toString();
  3353             b.append(", ");
  3354         }
  3355     }
  3356 
  3357     /**
  3358      * Returns a string representation of the contents of the specified array.
  3359      * The string representation consists of a list of the array's elements,
  3360      * enclosed in square brackets (<tt>"[]"</tt>).  Adjacent elements are
  3361      * separated by the characters <tt>", "</tt> (a comma followed by a
  3362      * space).  Elements are converted to strings as by
  3363      * <tt>String.valueOf(short)</tt>.  Returns <tt>"null"</tt> if <tt>a</tt>
  3364      * is <tt>null</tt>.
  3365      *
  3366      * @param a the array whose string representation to return
  3367      * @return a string representation of <tt>a</tt>
  3368      * @since 1.5
  3369      */
  3370     public static String toString(short[] a) {
  3371         if (a == null)
  3372             return "null";
  3373         int iMax = a.length - 1;
  3374         if (iMax == -1)
  3375             return "[]";
  3376 
  3377         StringBuilder b = new StringBuilder();
  3378         b.append('[');
  3379         for (int i = 0; ; i++) {
  3380             b.append(a[i]);
  3381             if (i == iMax)
  3382                 return b.append(']').toString();
  3383             b.append(", ");
  3384         }
  3385     }
  3386 
  3387     /**
  3388      * Returns a string representation of the contents of the specified array.
  3389      * The string representation consists of a list of the array's elements,
  3390      * enclosed in square brackets (<tt>"[]"</tt>).  Adjacent elements are
  3391      * separated by the characters <tt>", "</tt> (a comma followed by a
  3392      * space).  Elements are converted to strings as by
  3393      * <tt>String.valueOf(char)</tt>.  Returns <tt>"null"</tt> if <tt>a</tt>
  3394      * is <tt>null</tt>.
  3395      *
  3396      * @param a the array whose string representation to return
  3397      * @return a string representation of <tt>a</tt>
  3398      * @since 1.5
  3399      */
  3400     public static String toString(char[] a) {
  3401         if (a == null)
  3402             return "null";
  3403         int iMax = a.length - 1;
  3404         if (iMax == -1)
  3405             return "[]";
  3406 
  3407         StringBuilder b = new StringBuilder();
  3408         b.append('[');
  3409         for (int i = 0; ; i++) {
  3410             b.append(a[i]);
  3411             if (i == iMax)
  3412                 return b.append(']').toString();
  3413             b.append(", ");
  3414         }
  3415     }
  3416 
  3417     /**
  3418      * Returns a string representation of the contents of the specified array.
  3419      * The string representation consists of a list of the array's elements,
  3420      * enclosed in square brackets (<tt>"[]"</tt>).  Adjacent elements
  3421      * are separated by the characters <tt>", "</tt> (a comma followed
  3422      * by a space).  Elements are converted to strings as by
  3423      * <tt>String.valueOf(byte)</tt>.  Returns <tt>"null"</tt> if
  3424      * <tt>a</tt> is <tt>null</tt>.
  3425      *
  3426      * @param a the array whose string representation to return
  3427      * @return a string representation of <tt>a</tt>
  3428      * @since 1.5
  3429      */
  3430     public static String toString(byte[] a) {
  3431         if (a == null)
  3432             return "null";
  3433         int iMax = a.length - 1;
  3434         if (iMax == -1)
  3435             return "[]";
  3436 
  3437         StringBuilder b = new StringBuilder();
  3438         b.append('[');
  3439         for (int i = 0; ; i++) {
  3440             b.append(a[i]);
  3441             if (i == iMax)
  3442                 return b.append(']').toString();
  3443             b.append(", ");
  3444         }
  3445     }
  3446 
  3447     /**
  3448      * Returns a string representation of the contents of the specified array.
  3449      * The string representation consists of a list of the array's elements,
  3450      * enclosed in square brackets (<tt>"[]"</tt>).  Adjacent elements are
  3451      * separated by the characters <tt>", "</tt> (a comma followed by a
  3452      * space).  Elements are converted to strings as by
  3453      * <tt>String.valueOf(boolean)</tt>.  Returns <tt>"null"</tt> if
  3454      * <tt>a</tt> is <tt>null</tt>.
  3455      *
  3456      * @param a the array whose string representation to return
  3457      * @return a string representation of <tt>a</tt>
  3458      * @since 1.5
  3459      */
  3460     public static String toString(boolean[] a) {
  3461         if (a == null)
  3462             return "null";
  3463         int iMax = a.length - 1;
  3464         if (iMax == -1)
  3465             return "[]";
  3466 
  3467         StringBuilder b = new StringBuilder();
  3468         b.append('[');
  3469         for (int i = 0; ; i++) {
  3470             b.append(a[i]);
  3471             if (i == iMax)
  3472                 return b.append(']').toString();
  3473             b.append(", ");
  3474         }
  3475     }
  3476 
  3477     /**
  3478      * Returns a string representation of the contents of the specified array.
  3479      * The string representation consists of a list of the array's elements,
  3480      * enclosed in square brackets (<tt>"[]"</tt>).  Adjacent elements are
  3481      * separated by the characters <tt>", "</tt> (a comma followed by a
  3482      * space).  Elements are converted to strings as by
  3483      * <tt>String.valueOf(float)</tt>.  Returns <tt>"null"</tt> if <tt>a</tt>
  3484      * is <tt>null</tt>.
  3485      *
  3486      * @param a the array whose string representation to return
  3487      * @return a string representation of <tt>a</tt>
  3488      * @since 1.5
  3489      */
  3490     public static String toString(float[] a) {
  3491         if (a == null)
  3492             return "null";
  3493 
  3494         int iMax = a.length - 1;
  3495         if (iMax == -1)
  3496             return "[]";
  3497 
  3498         StringBuilder b = new StringBuilder();
  3499         b.append('[');
  3500         for (int i = 0; ; i++) {
  3501             b.append(a[i]);
  3502             if (i == iMax)
  3503                 return b.append(']').toString();
  3504             b.append(", ");
  3505         }
  3506     }
  3507 
  3508     /**
  3509      * Returns a string representation of the contents of the specified array.
  3510      * The string representation consists of a list of the array's elements,
  3511      * enclosed in square brackets (<tt>"[]"</tt>).  Adjacent elements are
  3512      * separated by the characters <tt>", "</tt> (a comma followed by a
  3513      * space).  Elements are converted to strings as by
  3514      * <tt>String.valueOf(double)</tt>.  Returns <tt>"null"</tt> if <tt>a</tt>
  3515      * is <tt>null</tt>.
  3516      *
  3517      * @param a the array whose string representation to return
  3518      * @return a string representation of <tt>a</tt>
  3519      * @since 1.5
  3520      */
  3521     public static String toString(double[] a) {
  3522         if (a == null)
  3523             return "null";
  3524         int iMax = a.length - 1;
  3525         if (iMax == -1)
  3526             return "[]";
  3527 
  3528         StringBuilder b = new StringBuilder();
  3529         b.append('[');
  3530         for (int i = 0; ; i++) {
  3531             b.append(a[i]);
  3532             if (i == iMax)
  3533                 return b.append(']').toString();
  3534             b.append(", ");
  3535         }
  3536     }
  3537 
  3538     /**
  3539      * Returns a string representation of the contents of the specified array.
  3540      * If the array contains other arrays as elements, they are converted to
  3541      * strings by the {@link Object#toString} method inherited from
  3542      * <tt>Object</tt>, which describes their <i>identities</i> rather than
  3543      * their contents.
  3544      *
  3545      * <p>The value returned by this method is equal to the value that would
  3546      * be returned by <tt>Arrays.asList(a).toString()</tt>, unless <tt>a</tt>
  3547      * is <tt>null</tt>, in which case <tt>"null"</tt> is returned.
  3548      *
  3549      * @param a the array whose string representation to return
  3550      * @return a string representation of <tt>a</tt>
  3551      * @see #deepToString(Object[])
  3552      * @since 1.5
  3553      */
  3554     public static String toString(Object[] a) {
  3555         if (a == null)
  3556             return "null";
  3557 
  3558         int iMax = a.length - 1;
  3559         if (iMax == -1)
  3560             return "[]";
  3561 
  3562         StringBuilder b = new StringBuilder();
  3563         b.append('[');
  3564         for (int i = 0; ; i++) {
  3565             b.append(String.valueOf(a[i]));
  3566             if (i == iMax)
  3567                 return b.append(']').toString();
  3568             b.append(", ");
  3569         }
  3570     }
  3571 
  3572     /**
  3573      * Returns a string representation of the "deep contents" of the specified
  3574      * array.  If the array contains other arrays as elements, the string
  3575      * representation contains their contents and so on.  This method is
  3576      * designed for converting multidimensional arrays to strings.
  3577      *
  3578      * <p>The string representation consists of a list of the array's
  3579      * elements, enclosed in square brackets (<tt>"[]"</tt>).  Adjacent
  3580      * elements are separated by the characters <tt>", "</tt> (a comma
  3581      * followed by a space).  Elements are converted to strings as by
  3582      * <tt>String.valueOf(Object)</tt>, unless they are themselves
  3583      * arrays.
  3584      *
  3585      * <p>If an element <tt>e</tt> is an array of a primitive type, it is
  3586      * converted to a string as by invoking the appropriate overloading of
  3587      * <tt>Arrays.toString(e)</tt>.  If an element <tt>e</tt> is an array of a
  3588      * reference type, it is converted to a string as by invoking
  3589      * this method recursively.
  3590      *
  3591      * <p>To avoid infinite recursion, if the specified array contains itself
  3592      * as an element, or contains an indirect reference to itself through one
  3593      * or more levels of arrays, the self-reference is converted to the string
  3594      * <tt>"[...]"</tt>.  For example, an array containing only a reference
  3595      * to itself would be rendered as <tt>"[[...]]"</tt>.
  3596      *
  3597      * <p>This method returns <tt>"null"</tt> if the specified array
  3598      * is <tt>null</tt>.
  3599      *
  3600      * @param a the array whose string representation to return
  3601      * @return a string representation of <tt>a</tt>
  3602      * @see #toString(Object[])
  3603      * @since 1.5
  3604      */
  3605     public static String deepToString(Object[] a) {
  3606         if (a == null)
  3607             return "null";
  3608 
  3609         int bufLen = 20 * a.length;
  3610         if (a.length != 0 && bufLen <= 0)
  3611             bufLen = Integer.MAX_VALUE;
  3612         StringBuilder buf = new StringBuilder(bufLen);
  3613         deepToString(a, buf, new HashSet<Object[]>());
  3614         return buf.toString();
  3615     }
  3616 
  3617     private static void deepToString(Object[] a, StringBuilder buf,
  3618                                      Set<Object[]> dejaVu) {
  3619         if (a == null) {
  3620             buf.append("null");
  3621             return;
  3622         }
  3623         int iMax = a.length - 1;
  3624         if (iMax == -1) {
  3625             buf.append("[]");
  3626             return;
  3627         }
  3628 
  3629         dejaVu.add(a);
  3630         buf.append('[');
  3631         for (int i = 0; ; i++) {
  3632 
  3633             Object element = a[i];
  3634             if (element == null) {
  3635                 buf.append("null");
  3636             } else {
  3637                 Class eClass = element.getClass();
  3638 
  3639                 if (eClass.isArray()) {
  3640                     if (eClass == byte[].class)
  3641                         buf.append(toString((byte[]) element));
  3642                     else if (eClass == short[].class)
  3643                         buf.append(toString((short[]) element));
  3644                     else if (eClass == int[].class)
  3645                         buf.append(toString((int[]) element));
  3646                     else if (eClass == long[].class)
  3647                         buf.append(toString((long[]) element));
  3648                     else if (eClass == char[].class)
  3649                         buf.append(toString((char[]) element));
  3650                     else if (eClass == float[].class)
  3651                         buf.append(toString((float[]) element));
  3652                     else if (eClass == double[].class)
  3653                         buf.append(toString((double[]) element));
  3654                     else if (eClass == boolean[].class)
  3655                         buf.append(toString((boolean[]) element));
  3656                     else { // element is an array of object references
  3657                         if (dejaVu.contains(element))
  3658                             buf.append("[...]");
  3659                         else
  3660                             deepToString((Object[])element, buf, dejaVu);
  3661                     }
  3662                 } else {  // element is non-null and not an array
  3663                     buf.append(element.toString());
  3664                 }
  3665             }
  3666             if (i == iMax)
  3667                 break;
  3668             buf.append(", ");
  3669         }
  3670         buf.append(']');
  3671         dejaVu.remove(a);
  3672     }
  3673 }