1 /*
2 * Copyright (c) 1997, 2025, 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 jdk.internal.util.ArraysSupport;
29 import jdk.internal.value.ValueClass;
30 import jdk.internal.vm.annotation.IntrinsicCandidate;
31
32 import java.io.Serializable;
33 import java.lang.reflect.Array;
34 import java.util.concurrent.ForkJoinPool;
35 import java.util.function.BinaryOperator;
36 import java.util.function.Consumer;
37 import java.util.function.DoubleBinaryOperator;
38 import java.util.function.IntBinaryOperator;
39 import java.util.function.IntFunction;
40 import java.util.function.IntToDoubleFunction;
41 import java.util.function.IntToLongFunction;
42 import java.util.function.IntUnaryOperator;
43 import java.util.function.LongBinaryOperator;
44 import java.util.function.UnaryOperator;
45 import java.util.stream.DoubleStream;
46 import java.util.stream.IntStream;
47 import java.util.stream.LongStream;
48 import java.util.stream.Stream;
49 import java.util.stream.StreamSupport;
50
51 /**
52 * This class contains various methods for manipulating arrays (such as
53 * sorting and searching). This class also contains a static factory
54 * that allows arrays to be viewed as lists.
55 *
56 * <p>The methods in this class all throw a {@code NullPointerException},
57 * if the specified array reference is null, except where noted.
58 *
59 * <p>The documentation for the methods contained in this class includes
60 * brief descriptions of the <i>implementations</i>. Such descriptions should
61 * be regarded as <i>implementation notes</i>, rather than parts of the
62 * <i>specification</i>. Implementors should feel free to substitute other
63 * algorithms, so long as the specification itself is adhered to. (For
64 * example, the algorithm used by {@code sort(Object[])} does not have to be
65 * a MergeSort, but it does have to be <i>stable</i>.)
66 *
67 * <p>This class is a member of the
68 * <a href="{@docRoot}/java.base/java/util/package-summary.html#CollectionsFramework">
69 * Java Collections Framework</a>.
70 *
71 * @author Josh Bloch
72 * @author Neal Gafter
73 * @author John Rose
74 * @since 1.2
75 */
76 public final class Arrays {
77
78 // Suppresses default constructor, ensuring non-instantiability.
79 private Arrays() {}
80
81 /*
82 * Sorting methods. Note that all public "sort" methods take the
83 * same form: performing argument checks if necessary, and then
84 * expanding arguments into those required for the internal
85 * implementation methods residing in other package-private
86 * classes (except for legacyMergeSort, included in this class).
87 */
88
89 /**
90 * Sorts the specified array into ascending numerical order.
91 *
92 * @implNote The sorting algorithm is a Dual-Pivot Quicksort
93 * by Vladimir Yaroslavskiy, Jon Bentley, and Joshua Bloch. This algorithm
94 * offers O(n log(n)) performance on all data sets, and is typically
95 * faster than traditional (one-pivot) Quicksort implementations.
96 *
97 * @param a the array to be sorted
98 */
99 public static void sort(int[] a) {
100 DualPivotQuicksort.sort(a, 0, 0, a.length);
101 }
102
103 /**
104 * Sorts the specified range of the array into ascending order. The range
105 * to be sorted extends from the index {@code fromIndex}, inclusive, to
106 * the index {@code toIndex}, exclusive. If {@code fromIndex == toIndex},
107 * the range to be sorted is empty.
108 *
109 * @implNote The sorting algorithm is a Dual-Pivot Quicksort
110 * by Vladimir Yaroslavskiy, Jon Bentley, and Joshua Bloch. This algorithm
111 * offers O(n log(n)) performance on all data sets, and is typically
112 * faster than traditional (one-pivot) Quicksort implementations.
113 *
114 * @param a the array to be sorted
115 * @param fromIndex the index of the first element, inclusive, to be sorted
116 * @param toIndex the index of the last element, exclusive, to be sorted
117 *
118 * @throws IllegalArgumentException if {@code fromIndex > toIndex}
119 * @throws ArrayIndexOutOfBoundsException
120 * if {@code fromIndex < 0} or {@code toIndex > a.length}
121 */
122 public static void sort(int[] a, int fromIndex, int toIndex) {
123 rangeCheck(a.length, fromIndex, toIndex);
124 DualPivotQuicksort.sort(a, 0, fromIndex, toIndex);
125 }
126
127 /**
128 * Sorts the specified array into ascending numerical order.
129 *
130 * @implNote The sorting algorithm is a Dual-Pivot Quicksort
131 * by Vladimir Yaroslavskiy, Jon Bentley, and Joshua Bloch. This algorithm
132 * offers O(n log(n)) performance on all data sets, and is typically
133 * faster than traditional (one-pivot) Quicksort implementations.
134 *
135 * @param a the array to be sorted
136 */
137 public static void sort(long[] a) {
138 DualPivotQuicksort.sort(a, 0, 0, a.length);
139 }
140
141 /**
142 * Sorts the specified range of the array into ascending order. The range
143 * to be sorted extends from the index {@code fromIndex}, inclusive, to
144 * the index {@code toIndex}, exclusive. If {@code fromIndex == toIndex},
145 * the range to be sorted is empty.
146 *
147 * @implNote 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 all data sets, and is typically
150 * faster than traditional (one-pivot) Quicksort implementations.
151 *
152 * @param a the array to be sorted
153 * @param fromIndex the index of the first element, inclusive, to be sorted
154 * @param toIndex the index of the last element, exclusive, to be sorted
155 *
156 * @throws IllegalArgumentException if {@code fromIndex > toIndex}
157 * @throws ArrayIndexOutOfBoundsException
158 * if {@code fromIndex < 0} or {@code toIndex > a.length}
159 */
160 public static void sort(long[] a, int fromIndex, int toIndex) {
161 rangeCheck(a.length, fromIndex, toIndex);
162 DualPivotQuicksort.sort(a, 0, fromIndex, toIndex);
163 }
164
165 /**
166 * Sorts the specified array into ascending numerical order.
167 *
168 * @implNote The sorting algorithm is a Dual-Pivot Quicksort
169 * by Vladimir Yaroslavskiy, Jon Bentley, and Joshua Bloch. This algorithm
170 * offers O(n log(n)) performance on all data sets, and is typically
171 * faster than traditional (one-pivot) Quicksort implementations.
172 *
173 * @param a the array to be sorted
174 */
175 public static void sort(short[] a) {
176 DualPivotQuicksort.sort(a, 0, a.length);
177 }
178
179 /**
180 * Sorts the specified range of the array into ascending order. The range
181 * to be sorted extends from the index {@code fromIndex}, inclusive, to
182 * the index {@code toIndex}, exclusive. If {@code fromIndex == toIndex},
183 * the range to be sorted is empty.
184 *
185 * @implNote The sorting algorithm is a Dual-Pivot Quicksort
186 * by Vladimir Yaroslavskiy, Jon Bentley, and Joshua Bloch. This algorithm
187 * offers O(n log(n)) performance on all data sets, and is typically
188 * faster than traditional (one-pivot) Quicksort implementations.
189 *
190 * @param a the array to be sorted
191 * @param fromIndex the index of the first element, inclusive, to be sorted
192 * @param toIndex the index of the last element, exclusive, to be sorted
193 *
194 * @throws IllegalArgumentException if {@code fromIndex > toIndex}
195 * @throws ArrayIndexOutOfBoundsException
196 * if {@code fromIndex < 0} or {@code toIndex > a.length}
197 */
198 public static void sort(short[] a, int fromIndex, int toIndex) {
199 rangeCheck(a.length, fromIndex, toIndex);
200 DualPivotQuicksort.sort(a, fromIndex, toIndex);
201 }
202
203 /**
204 * Sorts the specified array into ascending numerical order.
205 *
206 * @implNote The sorting algorithm is a Dual-Pivot Quicksort
207 * by Vladimir Yaroslavskiy, Jon Bentley, and Joshua Bloch. This algorithm
208 * offers O(n log(n)) performance on all data sets, and is typically
209 * faster than traditional (one-pivot) Quicksort implementations.
210 *
211 * @param a the array to be sorted
212 */
213 public static void sort(char[] a) {
214 DualPivotQuicksort.sort(a, 0, a.length);
215 }
216
217 /**
218 * Sorts the specified range of the array into ascending order. The range
219 * to be sorted extends from the index {@code fromIndex}, inclusive, to
220 * the index {@code toIndex}, exclusive. If {@code fromIndex == toIndex},
221 * the range to be sorted is empty.
222 *
223 * @implNote The sorting algorithm is a Dual-Pivot Quicksort
224 * by Vladimir Yaroslavskiy, Jon Bentley, and Joshua Bloch. This algorithm
225 * offers O(n log(n)) performance on all data sets, and is typically
226 * faster than traditional (one-pivot) Quicksort implementations.
227 *
228 * @param a the array to be sorted
229 * @param fromIndex the index of the first element, inclusive, to be sorted
230 * @param toIndex the index of the last element, exclusive, to be sorted
231 *
232 * @throws IllegalArgumentException if {@code fromIndex > toIndex}
233 * @throws ArrayIndexOutOfBoundsException
234 * if {@code fromIndex < 0} or {@code toIndex > a.length}
235 */
236 public static void sort(char[] a, int fromIndex, int toIndex) {
237 rangeCheck(a.length, fromIndex, toIndex);
238 DualPivotQuicksort.sort(a, fromIndex, toIndex);
239 }
240
241 /**
242 * Sorts the specified array into ascending numerical order.
243 *
244 * @implNote The sorting algorithm is a Dual-Pivot Quicksort
245 * by Vladimir Yaroslavskiy, Jon Bentley, and Joshua Bloch. This algorithm
246 * offers O(n log(n)) performance on all data sets, and is typically
247 * faster than traditional (one-pivot) Quicksort implementations.
248 *
249 * @param a the array to be sorted
250 */
251 public static void sort(byte[] a) {
252 DualPivotQuicksort.sort(a, 0, a.length);
253 }
254
255 /**
256 * Sorts the specified range of the array into ascending order. The range
257 * to be sorted extends from the index {@code fromIndex}, inclusive, to
258 * the index {@code toIndex}, exclusive. If {@code fromIndex == toIndex},
259 * the range to be sorted is empty.
260 *
261 * @implNote The sorting algorithm is a Dual-Pivot Quicksort
262 * by Vladimir Yaroslavskiy, Jon Bentley, and Joshua Bloch. This algorithm
263 * offers O(n log(n)) performance on all data sets, and is typically
264 * faster than traditional (one-pivot) Quicksort implementations.
265 *
266 * @param a the array to be sorted
267 * @param fromIndex the index of the first element, inclusive, to be sorted
268 * @param toIndex the index of the last element, exclusive, to be sorted
269 *
270 * @throws IllegalArgumentException if {@code fromIndex > toIndex}
271 * @throws ArrayIndexOutOfBoundsException
272 * if {@code fromIndex < 0} or {@code toIndex > a.length}
273 */
274 public static void sort(byte[] a, int fromIndex, int toIndex) {
275 rangeCheck(a.length, fromIndex, toIndex);
276 DualPivotQuicksort.sort(a, fromIndex, toIndex);
277 }
278
279 /**
280 * Sorts the specified array into ascending numerical order.
281 *
282 * <p>The {@code <} relation does not provide a total order on all float
283 * values: {@code -0.0f == 0.0f} is {@code true} and a {@code Float.NaN}
284 * value compares neither less than, greater than, nor equal to any value,
285 * even itself. This method uses the total order imposed by the method
286 * {@link Float#compareTo}: {@code -0.0f} is treated as less than value
287 * {@code 0.0f} and {@code Float.NaN} is considered greater than any
288 * other value and all {@code Float.NaN} values are considered equal.
289 *
290 * @implNote The sorting algorithm is a Dual-Pivot Quicksort
291 * by Vladimir Yaroslavskiy, Jon Bentley, and Joshua Bloch. This algorithm
292 * offers O(n log(n)) performance on all data sets, and is typically
293 * faster than traditional (one-pivot) Quicksort implementations.
294 *
295 * @param a the array to be sorted
296 */
297 public static void sort(float[] a) {
298 DualPivotQuicksort.sort(a, 0, 0, a.length);
299 }
300
301 /**
302 * Sorts the specified range of the array into ascending order. The range
303 * to be sorted extends from the index {@code fromIndex}, inclusive, to
304 * the index {@code toIndex}, exclusive. If {@code fromIndex == toIndex},
305 * the range to be sorted is empty.
306 *
307 * <p>The {@code <} relation does not provide a total order on all float
308 * values: {@code -0.0f == 0.0f} is {@code true} and a {@code Float.NaN}
309 * value compares neither less than, greater than, nor equal to any value,
310 * even itself. This method uses the total order imposed by the method
311 * {@link Float#compareTo}: {@code -0.0f} is treated as less than value
312 * {@code 0.0f} and {@code Float.NaN} is considered greater than any
313 * other value and all {@code Float.NaN} values are considered equal.
314 *
315 * @implNote The sorting algorithm is a Dual-Pivot Quicksort
316 * by Vladimir Yaroslavskiy, Jon Bentley, and Joshua Bloch. This algorithm
317 * offers O(n log(n)) performance on all data sets, and is typically
318 * faster than traditional (one-pivot) Quicksort implementations.
319 *
320 * @param a the array to be sorted
321 * @param fromIndex the index of the first element, inclusive, to be sorted
322 * @param toIndex the index of the last element, exclusive, to be sorted
323 *
324 * @throws IllegalArgumentException if {@code fromIndex > toIndex}
325 * @throws ArrayIndexOutOfBoundsException
326 * if {@code fromIndex < 0} or {@code toIndex > a.length}
327 */
328 public static void sort(float[] a, int fromIndex, int toIndex) {
329 rangeCheck(a.length, fromIndex, toIndex);
330 DualPivotQuicksort.sort(a, 0, fromIndex, toIndex);
331 }
332
333 /**
334 * Sorts the specified array into ascending numerical order.
335 *
336 * <p>The {@code <} relation does not provide a total order on all double
337 * values: {@code -0.0d == 0.0d} is {@code true} and a {@code Double.NaN}
338 * value compares neither less than, greater than, nor equal to any value,
339 * even itself. This method uses the total order imposed by the method
340 * {@link Double#compareTo}: {@code -0.0d} is treated as less than value
341 * {@code 0.0d} and {@code Double.NaN} is considered greater than any
342 * other value and all {@code Double.NaN} values are considered equal.
343 *
344 * @implNote The sorting algorithm is a Dual-Pivot Quicksort
345 * by Vladimir Yaroslavskiy, Jon Bentley, and Joshua Bloch. This algorithm
346 * offers O(n log(n)) performance on all data sets, and is typically
347 * faster than traditional (one-pivot) Quicksort implementations.
348 *
349 * @param a the array to be sorted
350 */
351 public static void sort(double[] a) {
352 DualPivotQuicksort.sort(a, 0, 0, a.length);
353 }
354
355 /**
356 * Sorts the specified range of the array into ascending order. The range
357 * to be sorted extends from the index {@code fromIndex}, inclusive, to
358 * the index {@code toIndex}, exclusive. If {@code fromIndex == toIndex},
359 * the range to be sorted is empty.
360 *
361 * <p>The {@code <} relation does not provide a total order on all double
362 * values: {@code -0.0d == 0.0d} is {@code true} and a {@code Double.NaN}
363 * value compares neither less than, greater than, nor equal to any value,
364 * even itself. This method uses the total order imposed by the method
365 * {@link Double#compareTo}: {@code -0.0d} is treated as less than value
366 * {@code 0.0d} and {@code Double.NaN} is considered greater than any
367 * other value and all {@code Double.NaN} values are considered equal.
368 *
369 * @implNote The sorting algorithm is a Dual-Pivot Quicksort
370 * by Vladimir Yaroslavskiy, Jon Bentley, and Joshua Bloch. This algorithm
371 * offers O(n log(n)) performance on all data sets, and is typically
372 * faster than traditional (one-pivot) Quicksort implementations.
373 *
374 * @param a the array to be sorted
375 * @param fromIndex the index of the first element, inclusive, to be sorted
376 * @param toIndex the index of the last element, exclusive, to be sorted
377 *
378 * @throws IllegalArgumentException if {@code fromIndex > toIndex}
379 * @throws ArrayIndexOutOfBoundsException
380 * if {@code fromIndex < 0} or {@code toIndex > a.length}
381 */
382 public static void sort(double[] a, int fromIndex, int toIndex) {
383 rangeCheck(a.length, fromIndex, toIndex);
384 DualPivotQuicksort.sort(a, 0, fromIndex, toIndex);
385 }
386
387 /**
388 * Sorts the specified array into ascending numerical order.
389 *
390 * @implNote The sorting algorithm is a Dual-Pivot Quicksort by
391 * Vladimir Yaroslavskiy, Jon Bentley and Josh Bloch. This algorithm
392 * offers O(n log(n)) performance on all data sets, and is typically
393 * faster than traditional (one-pivot) Quicksort implementations.
394 *
395 * @param a the array to be sorted
396 *
397 * @since 1.8
398 */
399 public static void parallelSort(byte[] a) {
400 DualPivotQuicksort.sort(a, 0, a.length);
401 }
402
403 /**
404 * Sorts the specified range of the array into ascending numerical order.
405 * The range to be sorted extends from the index {@code fromIndex},
406 * inclusive, to the index {@code toIndex}, exclusive. If
407 * {@code fromIndex == toIndex}, the range to be sorted is empty.
408 *
409 * @implNote The sorting algorithm is a Dual-Pivot Quicksort by
410 * Vladimir Yaroslavskiy, Jon Bentley and Josh Bloch. This algorithm
411 * offers O(n log(n)) performance on all data sets, and is typically
412 * faster than traditional (one-pivot) Quicksort implementations.
413 *
414 * @param a the array to be sorted
415 * @param fromIndex the index of the first element, inclusive, to be sorted
416 * @param toIndex the index of the last element, exclusive, to be sorted
417 *
418 * @throws IllegalArgumentException if {@code fromIndex > toIndex}
419 * @throws ArrayIndexOutOfBoundsException
420 * if {@code fromIndex < 0} or {@code toIndex > a.length}
421 *
422 * @since 1.8
423 */
424 public static void parallelSort(byte[] a, int fromIndex, int toIndex) {
425 rangeCheck(a.length, fromIndex, toIndex);
426 DualPivotQuicksort.sort(a, fromIndex, toIndex);
427 }
428
429 /**
430 * Sorts the specified array into ascending numerical order.
431 *
432 * @implNote The sorting algorithm is a Dual-Pivot Quicksort by
433 * Vladimir Yaroslavskiy, Jon Bentley and Josh Bloch. This algorithm
434 * offers O(n log(n)) performance on all data sets, and is typically
435 * faster than traditional (one-pivot) Quicksort implementations.
436 *
437 * @param a the array to be sorted
438 *
439 * @since 1.8
440 */
441 public static void parallelSort(char[] a) {
442 DualPivotQuicksort.sort(a, 0, a.length);
443 }
444
445 /**
446 * Sorts the specified range of the array into ascending numerical order.
447 * The range to be sorted extends from the index {@code fromIndex},
448 * inclusive, to the index {@code toIndex}, exclusive. If
449 * {@code fromIndex == toIndex}, the range to be sorted is empty.
450 *
451 * @implNote The sorting algorithm is a Dual-Pivot Quicksort by
452 * Vladimir Yaroslavskiy, Jon Bentley and Josh Bloch. This algorithm
453 * offers O(n log(n)) performance on all data sets, and is typically
454 * faster than traditional (one-pivot) Quicksort implementations.
455 *
456 * @param a the array to be sorted
457 * @param fromIndex the index of the first element, inclusive, to be sorted
458 * @param toIndex the index of the last element, exclusive, to be sorted
459 *
460 * @throws IllegalArgumentException if {@code fromIndex > toIndex}
461 * @throws ArrayIndexOutOfBoundsException
462 * if {@code fromIndex < 0} or {@code toIndex > a.length}
463 *
464 * @since 1.8
465 */
466 public static void parallelSort(char[] a, int fromIndex, int toIndex) {
467 rangeCheck(a.length, fromIndex, toIndex);
468 DualPivotQuicksort.sort(a, fromIndex, toIndex);
469 }
470
471 /**
472 * Sorts the specified array into ascending numerical order.
473 *
474 * @implNote The sorting algorithm is a Dual-Pivot Quicksort by
475 * Vladimir Yaroslavskiy, Jon Bentley and Josh Bloch. This algorithm
476 * offers O(n log(n)) performance on all data sets, and is typically
477 * faster than traditional (one-pivot) Quicksort implementations.
478 *
479 * @param a the array to be sorted
480 *
481 * @since 1.8
482 */
483 public static void parallelSort(short[] a) {
484 DualPivotQuicksort.sort(a, 0, a.length);
485 }
486
487 /**
488 * Sorts the specified range of the array into ascending numerical order.
489 * The range to be sorted extends from the index {@code fromIndex},
490 * inclusive, to the index {@code toIndex}, exclusive. If
491 * {@code fromIndex == toIndex}, the range to be sorted is empty.
492 *
493 * @implNote The sorting algorithm is a Dual-Pivot Quicksort by
494 * Vladimir Yaroslavskiy, Jon Bentley and Josh Bloch. This algorithm
495 * offers O(n log(n)) performance on all data sets, and is typically
496 * faster than traditional (one-pivot) Quicksort implementations.
497 *
498 * @param a the array to be sorted
499 * @param fromIndex the index of the first element, inclusive, to be sorted
500 * @param toIndex the index of the last element, exclusive, to be sorted
501 *
502 * @throws IllegalArgumentException if {@code fromIndex > toIndex}
503 * @throws ArrayIndexOutOfBoundsException
504 * if {@code fromIndex < 0} or {@code toIndex > a.length}
505 *
506 * @since 1.8
507 */
508 public static void parallelSort(short[] a, int fromIndex, int toIndex) {
509 rangeCheck(a.length, fromIndex, toIndex);
510 DualPivotQuicksort.sort(a, fromIndex, toIndex);
511 }
512
513 /**
514 * Sorts the specified array into ascending numerical order.
515 *
516 * @implNote The sorting algorithm is a Dual-Pivot Quicksort by
517 * Vladimir Yaroslavskiy, Jon Bentley and Josh Bloch. This algorithm
518 * offers O(n log(n)) performance on all data sets, and is typically
519 * faster than traditional (one-pivot) Quicksort implementations.
520 *
521 * @param a the array to be sorted
522 *
523 * @since 1.8
524 */
525 public static void parallelSort(int[] a) {
526 DualPivotQuicksort.sort(a, ForkJoinPool.getCommonPoolParallelism(), 0, a.length);
527 }
528
529 /**
530 * Sorts the specified range of the array into ascending numerical order.
531 * The range to be sorted extends from the index {@code fromIndex},
532 * inclusive, to the index {@code toIndex}, exclusive. If
533 * {@code fromIndex == toIndex}, the range to be sorted is empty.
534 *
535 * @implNote The sorting algorithm is a Dual-Pivot Quicksort by
536 * Vladimir Yaroslavskiy, Jon Bentley and Josh Bloch. This algorithm
537 * offers O(n log(n)) performance on all data sets, and is typically
538 * faster than traditional (one-pivot) Quicksort implementations.
539 *
540 * @param a the array to be sorted
541 * @param fromIndex the index of the first element, inclusive, to be sorted
542 * @param toIndex the index of the last element, exclusive, to be sorted
543 *
544 * @throws IllegalArgumentException if {@code fromIndex > toIndex}
545 * @throws ArrayIndexOutOfBoundsException
546 * if {@code fromIndex < 0} or {@code toIndex > a.length}
547 *
548 * @since 1.8
549 */
550 public static void parallelSort(int[] a, int fromIndex, int toIndex) {
551 rangeCheck(a.length, fromIndex, toIndex);
552 DualPivotQuicksort.sort(a, ForkJoinPool.getCommonPoolParallelism(), fromIndex, toIndex);
553 }
554
555 /**
556 * Sorts the specified array into ascending numerical order.
557 *
558 * @implNote The sorting algorithm is a Dual-Pivot Quicksort by
559 * Vladimir Yaroslavskiy, Jon Bentley and Josh Bloch. This algorithm
560 * offers O(n log(n)) performance on all data sets, and is typically
561 * faster than traditional (one-pivot) Quicksort implementations.
562 *
563 * @param a the array to be sorted
564 *
565 * @since 1.8
566 */
567 public static void parallelSort(long[] a) {
568 DualPivotQuicksort.sort(a, ForkJoinPool.getCommonPoolParallelism(), 0, a.length);
569 }
570
571 /**
572 * Sorts the specified range of the array into ascending numerical order.
573 * The range to be sorted extends from the index {@code fromIndex},
574 * inclusive, to the index {@code toIndex}, exclusive. If
575 * {@code fromIndex == toIndex}, the range to be sorted is empty.
576 *
577 * @implNote The sorting algorithm is a Dual-Pivot Quicksort by
578 * Vladimir Yaroslavskiy, Jon Bentley and Josh Bloch. This algorithm
579 * offers O(n log(n)) performance on all data sets, and is typically
580 * faster than traditional (one-pivot) Quicksort implementations.
581 *
582 * @param a the array to be sorted
583 * @param fromIndex the index of the first element, inclusive, to be sorted
584 * @param toIndex the index of the last element, exclusive, to be sorted
585 *
586 * @throws IllegalArgumentException if {@code fromIndex > toIndex}
587 * @throws ArrayIndexOutOfBoundsException
588 * if {@code fromIndex < 0} or {@code toIndex > a.length}
589 *
590 * @since 1.8
591 */
592 public static void parallelSort(long[] a, int fromIndex, int toIndex) {
593 rangeCheck(a.length, fromIndex, toIndex);
594 DualPivotQuicksort.sort(a, ForkJoinPool.getCommonPoolParallelism(), fromIndex, toIndex);
595 }
596
597 /**
598 * Sorts the specified array into ascending numerical order.
599 *
600 * <p>The {@code <} relation does not provide a total order on all float
601 * values: {@code -0.0f == 0.0f} is {@code true} and a {@code Float.NaN}
602 * value compares neither less than, greater than, nor equal to any value,
603 * even itself. This method uses the total order imposed by the method
604 * {@link Float#compareTo}: {@code -0.0f} is treated as less than value
605 * {@code 0.0f} and {@code Float.NaN} is considered greater than any
606 * other value and all {@code Float.NaN} values are considered equal.
607 *
608 * @implNote The sorting algorithm is a Dual-Pivot Quicksort by
609 * Vladimir Yaroslavskiy, Jon Bentley and Josh Bloch. This algorithm
610 * offers O(n log(n)) performance on all data sets, and is typically
611 * faster than traditional (one-pivot) Quicksort implementations.
612 *
613 * @param a the array to be sorted
614 *
615 * @since 1.8
616 */
617 public static void parallelSort(float[] a) {
618 DualPivotQuicksort.sort(a, ForkJoinPool.getCommonPoolParallelism(), 0, a.length);
619 }
620
621 /**
622 * Sorts the specified range of the array into ascending numerical order.
623 * The range to be sorted extends from the index {@code fromIndex},
624 * inclusive, to the index {@code toIndex}, exclusive. If
625 * {@code fromIndex == toIndex}, the range to be sorted is empty.
626 *
627 * <p>The {@code <} relation does not provide a total order on all float
628 * values: {@code -0.0f == 0.0f} is {@code true} and a {@code Float.NaN}
629 * value compares neither less than, greater than, nor equal to any value,
630 * even itself. This method uses the total order imposed by the method
631 * {@link Float#compareTo}: {@code -0.0f} is treated as less than value
632 * {@code 0.0f} and {@code Float.NaN} is considered greater than any
633 * other value and all {@code Float.NaN} values are considered equal.
634 *
635 * @implNote The sorting algorithm is a Dual-Pivot Quicksort by
636 * Vladimir Yaroslavskiy, Jon Bentley and Josh Bloch. This algorithm
637 * offers O(n log(n)) performance on all data sets, and is typically
638 * faster than traditional (one-pivot) Quicksort implementations.
639 *
640 * @param a the array to be sorted
641 * @param fromIndex the index of the first element, inclusive, to be sorted
642 * @param toIndex the index of the last element, exclusive, to be sorted
643 *
644 * @throws IllegalArgumentException if {@code fromIndex > toIndex}
645 * @throws ArrayIndexOutOfBoundsException
646 * if {@code fromIndex < 0} or {@code toIndex > a.length}
647 *
648 * @since 1.8
649 */
650 public static void parallelSort(float[] a, int fromIndex, int toIndex) {
651 rangeCheck(a.length, fromIndex, toIndex);
652 DualPivotQuicksort.sort(a, ForkJoinPool.getCommonPoolParallelism(), fromIndex, toIndex);
653 }
654
655 /**
656 * Sorts the specified array into ascending numerical order.
657 *
658 * <p>The {@code <} relation does not provide a total order on all double
659 * values: {@code -0.0d == 0.0d} is {@code true} and a {@code Double.NaN}
660 * value compares neither less than, greater than, nor equal to any value,
661 * even itself. This method uses the total order imposed by the method
662 * {@link Double#compareTo}: {@code -0.0d} is treated as less than value
663 * {@code 0.0d} and {@code Double.NaN} is considered greater than any
664 * other value and all {@code Double.NaN} values are considered equal.
665 *
666 * @implNote The sorting algorithm is a Dual-Pivot Quicksort by
667 * Vladimir Yaroslavskiy, Jon Bentley and Josh Bloch. This algorithm
668 * offers O(n log(n)) performance on all data sets, and is typically
669 * faster than traditional (one-pivot) Quicksort implementations.
670 *
671 * @param a the array to be sorted
672 *
673 * @since 1.8
674 */
675 public static void parallelSort(double[] a) {
676 DualPivotQuicksort.sort(a, ForkJoinPool.getCommonPoolParallelism(), 0, a.length);
677 }
678
679 /**
680 * Sorts the specified range of the array into ascending numerical order.
681 * The range to be sorted extends from the index {@code fromIndex},
682 * inclusive, to the index {@code toIndex}, exclusive. If
683 * {@code fromIndex == toIndex}, the range to be sorted is empty.
684 *
685 * <p>The {@code <} relation does not provide a total order on all double
686 * values: {@code -0.0d == 0.0d} is {@code true} and a {@code Double.NaN}
687 * value compares neither less than, greater than, nor equal to any value,
688 * even itself. This method uses the total order imposed by the method
689 * {@link Double#compareTo}: {@code -0.0d} is treated as less than value
690 * {@code 0.0d} and {@code Double.NaN} is considered greater than any
691 * other value and all {@code Double.NaN} values are considered equal.
692 *
693 * @implNote The sorting algorithm is a Dual-Pivot Quicksort by
694 * Vladimir Yaroslavskiy, Jon Bentley and Josh Bloch. This algorithm
695 * offers O(n log(n)) performance on all data sets, and is typically
696 * faster than traditional (one-pivot) Quicksort implementations.
697 *
698 * @param a the array to be sorted
699 * @param fromIndex the index of the first element, inclusive, to be sorted
700 * @param toIndex the index of the last element, exclusive, to be sorted
701 *
702 * @throws IllegalArgumentException if {@code fromIndex > toIndex}
703 * @throws ArrayIndexOutOfBoundsException
704 * if {@code fromIndex < 0} or {@code toIndex > a.length}
705 *
706 * @since 1.8
707 */
708 public static void parallelSort(double[] a, int fromIndex, int toIndex) {
709 rangeCheck(a.length, fromIndex, toIndex);
710 DualPivotQuicksort.sort(a, ForkJoinPool.getCommonPoolParallelism(), fromIndex, toIndex);
711 }
712
713 /**
714 * Checks that {@code fromIndex} and {@code toIndex} are in
715 * the range and throws an exception if they aren't.
716 */
717 static void rangeCheck(int arrayLength, int fromIndex, int toIndex) {
718 if (fromIndex > toIndex) {
719 throw new IllegalArgumentException(
720 "fromIndex(" + fromIndex + ") > toIndex(" + toIndex + ")");
721 }
722 if (fromIndex < 0) {
723 throw new ArrayIndexOutOfBoundsException(fromIndex);
724 }
725 if (toIndex > arrayLength) {
726 throw new ArrayIndexOutOfBoundsException(toIndex);
727 }
728 }
729
730 /**
731 * A comparator that implements the natural ordering of a group of
732 * mutually comparable elements. May be used when a supplied
733 * comparator is null. To simplify code-sharing within underlying
734 * implementations, the compare method only declares type Object
735 * for its second argument.
736 *
737 * Arrays class implementor's note: It is an empirical matter
738 * whether ComparableTimSort offers any performance benefit over
739 * TimSort used with this comparator. If not, you are better off
740 * deleting or bypassing ComparableTimSort. There is currently no
741 * empirical case for separating them for parallel sorting, so all
742 * public Object parallelSort methods use the same comparator
743 * based implementation.
744 */
745 static final class NaturalOrder implements Comparator<Object> {
746 @SuppressWarnings("unchecked")
747 public int compare(Object first, Object second) {
748 return ((Comparable<Object>)first).compareTo(second);
749 }
750 static final NaturalOrder INSTANCE = new NaturalOrder();
751 }
752
753 /**
754 * The minimum array length below which a parallel sorting
755 * algorithm will not further partition the sorting task. Using
756 * smaller sizes typically results in memory contention across
757 * tasks that makes parallel speedups unlikely.
758 */
759 private static final int MIN_ARRAY_SORT_GRAN = 1 << 13;
760
761 /**
762 * Sorts the specified array of objects into ascending order, according
763 * to the {@linkplain Comparable natural ordering} of its elements.
764 * All elements in the array must implement the {@link Comparable}
765 * interface. Furthermore, all elements in the array must be
766 * <i>mutually comparable</i> (that is, {@code e1.compareTo(e2)} must
767 * not throw a {@code ClassCastException} for any elements {@code e1}
768 * and {@code e2} in the array).
769 *
770 * <p>This sort is guaranteed to be <i>stable</i>: equal elements will
771 * not be reordered as a result of the sort.
772 *
773 * @implNote The sorting algorithm is a parallel sort-merge that breaks the
774 * array into sub-arrays that are themselves sorted and then merged. When
775 * the sub-array length reaches a minimum granularity, the sub-array is
776 * sorted using the appropriate {@link Arrays#sort(Object[]) Arrays.sort}
777 * method. If the length of the specified array is less than the minimum
778 * granularity, then it is sorted using the appropriate {@link
779 * Arrays#sort(Object[]) Arrays.sort} method. The algorithm requires a
780 * working space no greater than the size of the original array. The
781 * {@link ForkJoinPool#commonPool() ForkJoin common pool} is used to
782 * execute any parallel tasks.
783 *
784 * @param <T> the class of the objects to be sorted
785 * @param a the array to be sorted
786 *
787 * @throws ClassCastException if the array contains elements that are not
788 * <i>mutually comparable</i> (for example, strings and integers)
789 * @throws IllegalArgumentException (optional) if the natural
790 * ordering of the array elements is found to violate the
791 * {@link Comparable} contract
792 *
793 * @since 1.8
794 */
795 @SuppressWarnings("unchecked")
796 public static <T extends Comparable<? super T>> void parallelSort(T[] a) {
797 int n = a.length, p, g;
798 if (n <= MIN_ARRAY_SORT_GRAN ||
799 (p = ForkJoinPool.getCommonPoolParallelism()) == 1)
800 TimSort.sort(a, 0, n, NaturalOrder.INSTANCE, null, 0, 0);
801 else
802 new ArraysParallelSortHelpers.FJObject.Sorter<>
803 (null, a,
804 (T[])Array.newInstance(a.getClass().getComponentType(), n),
805 0, n, 0, ((g = n / (p << 2)) <= MIN_ARRAY_SORT_GRAN) ?
806 MIN_ARRAY_SORT_GRAN : g, NaturalOrder.INSTANCE).invoke();
807 }
808
809 /**
810 * Sorts the specified range of the specified array of objects into
811 * ascending order, according to the
812 * {@linkplain Comparable natural ordering} of its
813 * elements. The range to be sorted extends from index
814 * {@code fromIndex}, inclusive, to index {@code toIndex}, exclusive.
815 * (If {@code fromIndex==toIndex}, the range to be sorted is empty.) All
816 * elements in this range must implement the {@link Comparable}
817 * interface. Furthermore, all elements in this range must be <i>mutually
818 * comparable</i> (that is, {@code e1.compareTo(e2)} must not throw a
819 * {@code ClassCastException} for any elements {@code e1} and
820 * {@code e2} in the array).
821 *
822 * <p>This sort is guaranteed to be <i>stable</i>: equal elements will
823 * not be reordered as a result of the sort.
824 *
825 * @implNote The sorting algorithm is a parallel sort-merge that breaks the
826 * array into sub-arrays that are themselves sorted and then merged. When
827 * the sub-array length reaches a minimum granularity, the sub-array is
828 * sorted using the appropriate {@link Arrays#sort(Object[]) Arrays.sort}
829 * method. If the length of the specified array is less than the minimum
830 * granularity, then it is sorted using the appropriate {@link
831 * Arrays#sort(Object[]) Arrays.sort} method. The algorithm requires a working
832 * space no greater than the size of the specified range of the original
833 * array. The {@link ForkJoinPool#commonPool() ForkJoin common pool} is
834 * used to execute any parallel tasks.
835 *
836 * @param <T> the class of the objects to be sorted
837 * @param a the array to be sorted
838 * @param fromIndex the index of the first element (inclusive) to be
839 * sorted
840 * @param toIndex the index of the last element (exclusive) to be sorted
841 * @throws IllegalArgumentException if {@code fromIndex > toIndex} or
842 * (optional) if the natural ordering of the array elements is
843 * found to violate the {@link Comparable} contract
844 * @throws ArrayIndexOutOfBoundsException if {@code fromIndex < 0} or
845 * {@code toIndex > a.length}
846 * @throws ClassCastException if the array contains elements that are
847 * not <i>mutually comparable</i> (for example, strings and
848 * integers).
849 *
850 * @since 1.8
851 */
852 @SuppressWarnings("unchecked")
853 public static <T extends Comparable<? super T>>
854 void parallelSort(T[] a, int fromIndex, int toIndex) {
855 rangeCheck(a.length, fromIndex, toIndex);
856 int n = toIndex - fromIndex, p, g;
857 if (n <= MIN_ARRAY_SORT_GRAN ||
858 (p = ForkJoinPool.getCommonPoolParallelism()) == 1)
859 TimSort.sort(a, fromIndex, toIndex, NaturalOrder.INSTANCE, null, 0, 0);
860 else
861 new ArraysParallelSortHelpers.FJObject.Sorter<>
862 (null, a,
863 (T[])Array.newInstance(a.getClass().getComponentType(), n),
864 fromIndex, n, 0, ((g = n / (p << 2)) <= MIN_ARRAY_SORT_GRAN) ?
865 MIN_ARRAY_SORT_GRAN : g, NaturalOrder.INSTANCE).invoke();
866 }
867
868 /**
869 * Sorts the specified array of objects according to the order induced by
870 * the specified comparator. All elements in the array must be
871 * <i>mutually comparable</i> by the specified comparator (that is,
872 * {@code c.compare(e1, e2)} must not throw a {@code ClassCastException}
873 * for any elements {@code e1} and {@code e2} in the array).
874 *
875 * <p>This sort is guaranteed to be <i>stable</i>: equal elements will
876 * not be reordered as a result of the sort.
877 *
878 * @implNote The sorting algorithm is a parallel sort-merge that breaks the
879 * array into sub-arrays that are themselves sorted and then merged. When
880 * the sub-array length reaches a minimum granularity, the sub-array is
881 * sorted using the appropriate {@link Arrays#sort(Object[]) Arrays.sort}
882 * method. If the length of the specified array is less than the minimum
883 * granularity, then it is sorted using the appropriate {@link
884 * Arrays#sort(Object[]) Arrays.sort} method. The algorithm requires a
885 * working space no greater than the size of the original array. The
886 * {@link ForkJoinPool#commonPool() ForkJoin common pool} is used to
887 * execute any parallel tasks.
888 *
889 * @param <T> the class of the objects to be sorted
890 * @param a the array to be sorted
891 * @param cmp the comparator to determine the order of the array. A
892 * {@code null} value indicates that the elements'
893 * {@linkplain Comparable natural ordering} should be used.
894 * @throws ClassCastException if the array contains elements that are
895 * not <i>mutually comparable</i> using the specified comparator
896 * @throws IllegalArgumentException (optional) if the comparator is
897 * found to violate the {@link java.util.Comparator} contract
898 *
899 * @since 1.8
900 */
901 @SuppressWarnings("unchecked")
902 public static <T> void parallelSort(T[] a, Comparator<? super T> cmp) {
903 if (cmp == null)
904 cmp = NaturalOrder.INSTANCE;
905 int n = a.length, p, g;
906 if (n <= MIN_ARRAY_SORT_GRAN ||
907 (p = ForkJoinPool.getCommonPoolParallelism()) == 1)
908 TimSort.sort(a, 0, n, cmp, null, 0, 0);
909 else
910 new ArraysParallelSortHelpers.FJObject.Sorter<>
911 (null, a,
912 (T[])Array.newInstance(a.getClass().getComponentType(), n),
913 0, n, 0, ((g = n / (p << 2)) <= MIN_ARRAY_SORT_GRAN) ?
914 MIN_ARRAY_SORT_GRAN : g, cmp).invoke();
915 }
916
917 /**
918 * Sorts the specified range of the specified array of objects according
919 * to the order induced by the specified comparator. The range to be
920 * sorted extends from index {@code fromIndex}, inclusive, to index
921 * {@code toIndex}, exclusive. (If {@code fromIndex==toIndex}, the
922 * range to be sorted is empty.) All elements in the range must be
923 * <i>mutually comparable</i> by the specified comparator (that is,
924 * {@code c.compare(e1, e2)} must not throw a {@code ClassCastException}
925 * for any elements {@code e1} and {@code e2} in the range).
926 *
927 * <p>This sort is guaranteed to be <i>stable</i>: equal elements will
928 * not be reordered as a result of the sort.
929 *
930 * @implNote The sorting algorithm is a parallel sort-merge that breaks the
931 * array into sub-arrays that are themselves sorted and then merged. When
932 * the sub-array length reaches a minimum granularity, the sub-array is
933 * sorted using the appropriate {@link Arrays#sort(Object[]) Arrays.sort}
934 * method. If the length of the specified array is less than the minimum
935 * granularity, then it is sorted using the appropriate {@link
936 * Arrays#sort(Object[]) Arrays.sort} method. The algorithm requires a working
937 * space no greater than the size of the specified range of the original
938 * array. The {@link ForkJoinPool#commonPool() ForkJoin common pool} is
939 * used to execute any parallel tasks.
940 *
941 * @param <T> the class of the objects to be sorted
942 * @param a the array to be sorted
943 * @param fromIndex the index of the first element (inclusive) to be
944 * sorted
945 * @param toIndex the index of the last element (exclusive) to be sorted
946 * @param cmp the comparator to determine the order of the array. A
947 * {@code null} value indicates that the elements'
948 * {@linkplain Comparable natural ordering} should be used.
949 * @throws IllegalArgumentException if {@code fromIndex > toIndex} or
950 * (optional) if the natural ordering of the array elements is
951 * found to violate the {@link Comparable} contract
952 * @throws ArrayIndexOutOfBoundsException if {@code fromIndex < 0} or
953 * {@code toIndex > a.length}
954 * @throws ClassCastException if the array contains elements that are
955 * not <i>mutually comparable</i> (for example, strings and
956 * integers).
957 *
958 * @since 1.8
959 */
960 @SuppressWarnings("unchecked")
961 public static <T> void parallelSort(T[] a, int fromIndex, int toIndex,
962 Comparator<? super T> cmp) {
963 rangeCheck(a.length, fromIndex, toIndex);
964 if (cmp == null)
965 cmp = NaturalOrder.INSTANCE;
966 int n = toIndex - fromIndex, p, g;
967 if (n <= MIN_ARRAY_SORT_GRAN ||
968 (p = ForkJoinPool.getCommonPoolParallelism()) == 1)
969 TimSort.sort(a, fromIndex, toIndex, cmp, null, 0, 0);
970 else
971 new ArraysParallelSortHelpers.FJObject.Sorter<>
972 (null, a,
973 (T[])Array.newInstance(a.getClass().getComponentType(), n),
974 fromIndex, n, 0, ((g = n / (p << 2)) <= MIN_ARRAY_SORT_GRAN) ?
975 MIN_ARRAY_SORT_GRAN : g, cmp).invoke();
976 }
977
978 /*
979 * Sorting of complex type arrays.
980 */
981
982 /**
983 * Old merge sort implementation can be selected (for
984 * compatibility with broken comparators) using a system property.
985 * Cannot be a static boolean in the enclosing class due to
986 * circular dependencies. To be removed in a future release.
987 */
988 static final class LegacyMergeSort {
989 private static final boolean userRequested =
990 Boolean.getBoolean("java.util.Arrays.useLegacyMergeSort");
991 }
992
993 /**
994 * Sorts the specified array of objects into ascending order, according
995 * to the {@linkplain Comparable natural ordering} of its elements.
996 * All elements in the array must implement the {@link Comparable}
997 * interface. Furthermore, all elements in the array must be
998 * <i>mutually comparable</i> (that is, {@code e1.compareTo(e2)} must
999 * not throw a {@code ClassCastException} for any elements {@code e1}
1000 * and {@code e2} in the array).
1001 *
1002 * <p>This sort is guaranteed to be <i>stable</i>: equal elements will
1003 * not be reordered as a result of the sort.
1004 *
1005 * <p>Implementation note: This implementation is a stable, adaptive,
1006 * iterative mergesort that requires far fewer than n lg(n) comparisons
1007 * when the input array is partially sorted, while offering the
1008 * performance of a traditional mergesort when the input array is
1009 * randomly ordered. If the input array is nearly sorted, the
1010 * implementation requires approximately n comparisons. Temporary
1011 * storage requirements vary from a small constant for nearly sorted
1012 * input arrays to n/2 object references for randomly ordered input
1013 * arrays.
1014 *
1015 * <p>The implementation takes equal advantage of ascending and
1016 * descending order in its input array, and can take advantage of
1017 * ascending and descending order in different parts of the same
1018 * input array. It is well-suited to merging two or more sorted arrays:
1019 * simply concatenate the arrays and sort the resulting array.
1020 *
1021 * <p>The implementation was adapted from Tim Peters's list sort for Python
1022 * (<a href="http://svn.python.org/projects/python/trunk/Objects/listsort.txt">
1023 * TimSort</a>). It uses techniques from Peter McIlroy's "Optimistic
1024 * Sorting and Information Theoretic Complexity", in Proceedings of the
1025 * Fourth Annual ACM-SIAM Symposium on Discrete Algorithms, pp 467-474,
1026 * January 1993.
1027 *
1028 * @param a the array to be sorted
1029 * @throws ClassCastException if the array contains elements that are not
1030 * <i>mutually comparable</i> (for example, strings and integers)
1031 * @throws IllegalArgumentException (optional) if the natural
1032 * ordering of the array elements is found to violate the
1033 * {@link Comparable} contract
1034 */
1035 public static void sort(Object[] a) {
1036 if (LegacyMergeSort.userRequested)
1037 legacyMergeSort(a);
1038 else
1039 ComparableTimSort.sort(a, 0, a.length, null, 0, 0);
1040 }
1041
1042 /** To be removed in a future release. */
1043 private static void legacyMergeSort(Object[] a) {
1044 Object[] aux = a.clone();
1045 mergeSort(aux, a, 0, a.length, 0);
1046 }
1047
1048 /**
1049 * Sorts the specified range of the specified array of objects into
1050 * ascending order, according to the
1051 * {@linkplain Comparable natural ordering} of its
1052 * elements. The range to be sorted extends from index
1053 * {@code fromIndex}, inclusive, to index {@code toIndex}, exclusive.
1054 * (If {@code fromIndex==toIndex}, the range to be sorted is empty.) All
1055 * elements in this range must implement the {@link Comparable}
1056 * interface. Furthermore, all elements in this range must be <i>mutually
1057 * comparable</i> (that is, {@code e1.compareTo(e2)} must not throw a
1058 * {@code ClassCastException} for any elements {@code e1} and
1059 * {@code e2} in the array).
1060 *
1061 * <p>This sort is guaranteed to be <i>stable</i>: equal elements will
1062 * not be reordered as a result of the sort.
1063 *
1064 * <p>Implementation note: This implementation is a stable, adaptive,
1065 * iterative mergesort that requires far fewer than n lg(n) comparisons
1066 * when the input array is partially sorted, while offering the
1067 * performance of a traditional mergesort when the input array is
1068 * randomly ordered. If the input array is nearly sorted, the
1069 * implementation requires approximately n comparisons. Temporary
1070 * storage requirements vary from a small constant for nearly sorted
1071 * input arrays to n/2 object references for randomly ordered input
1072 * arrays.
1073 *
1074 * <p>The implementation takes equal advantage of ascending and
1075 * descending order in its input array, and can take advantage of
1076 * ascending and descending order in different parts of the same
1077 * input array. It is well-suited to merging two or more sorted arrays:
1078 * simply concatenate the arrays and sort the resulting array.
1079 *
1080 * <p>The implementation was adapted from Tim Peters's list sort for Python
1081 * (<a href="http://svn.python.org/projects/python/trunk/Objects/listsort.txt">
1082 * TimSort</a>). It uses techniques from Peter McIlroy's "Optimistic
1083 * Sorting and Information Theoretic Complexity", in Proceedings of the
1084 * Fourth Annual ACM-SIAM Symposium on Discrete Algorithms, pp 467-474,
1085 * January 1993.
1086 *
1087 * @param a the array to be sorted
1088 * @param fromIndex the index of the first element (inclusive) to be
1089 * sorted
1090 * @param toIndex the index of the last element (exclusive) to be sorted
1091 * @throws IllegalArgumentException if {@code fromIndex > toIndex} or
1092 * (optional) if the natural ordering of the array elements is
1093 * found to violate the {@link Comparable} contract
1094 * @throws ArrayIndexOutOfBoundsException if {@code fromIndex < 0} or
1095 * {@code toIndex > a.length}
1096 * @throws ClassCastException if the array contains elements that are
1097 * not <i>mutually comparable</i> (for example, strings and
1098 * integers).
1099 */
1100 public static void sort(Object[] a, int fromIndex, int toIndex) {
1101 rangeCheck(a.length, fromIndex, toIndex);
1102 if (LegacyMergeSort.userRequested)
1103 legacyMergeSort(a, fromIndex, toIndex);
1104 else
1105 ComparableTimSort.sort(a, fromIndex, toIndex, null, 0, 0);
1106 }
1107
1108 /** To be removed in a future release. */
1109 private static void legacyMergeSort(Object[] a,
1110 int fromIndex, int toIndex) {
1111 Object[] aux = copyOfRange(a, fromIndex, toIndex);
1112 mergeSort(aux, a, fromIndex, toIndex, -fromIndex);
1113 }
1114
1115 /**
1116 * Tuning parameter: list size at or below which insertion sort will be
1117 * used in preference to mergesort.
1118 * To be removed in a future release.
1119 */
1120 private static final int INSERTIONSORT_THRESHOLD = 7;
1121
1122 /**
1123 * Src is the source array that starts at index 0
1124 * Dest is the (possibly larger) array destination with a possible offset
1125 * low is the index in dest to start sorting
1126 * high is the end index in dest to end sorting
1127 * off is the offset to generate corresponding low, high in src
1128 * To be removed in a future release.
1129 */
1130 @SuppressWarnings("unchecked")
1131 private static void mergeSort(Object[] src,
1132 Object[] dest,
1133 int low,
1134 int high,
1135 int off) {
1136 int length = high - low;
1137
1138 // Insertion sort on smallest arrays
1139 if (length < INSERTIONSORT_THRESHOLD) {
1140 for (int i=low; i<high; i++)
1141 for (int j=i; j>low &&
1142 ((Comparable) dest[j-1]).compareTo(dest[j])>0; j--)
1143 swap(dest, j, j-1);
1144 return;
1145 }
1146
1147 // Recursively sort halves of dest into src
1148 int destLow = low;
1149 int destHigh = high;
1150 low += off;
1151 high += off;
1152 int mid = (low + high) >>> 1;
1153 mergeSort(dest, src, low, mid, -off);
1154 mergeSort(dest, src, mid, high, -off);
1155
1156 // If list is already sorted, just copy from src to dest. This is an
1157 // optimization that results in faster sorts for nearly ordered lists.
1158 if (((Comparable)src[mid-1]).compareTo(src[mid]) <= 0) {
1159 System.arraycopy(src, low, dest, destLow, length);
1160 return;
1161 }
1162
1163 // Merge sorted halves (now in src) into dest
1164 for(int i = destLow, p = low, q = mid; i < destHigh; i++) {
1165 if (q >= high || p < mid && ((Comparable)src[p]).compareTo(src[q])<=0)
1166 dest[i] = src[p++];
1167 else
1168 dest[i] = src[q++];
1169 }
1170 }
1171
1172 /**
1173 * Swaps x[a] with x[b].
1174 */
1175 private static void swap(Object[] x, int a, int b) {
1176 Object t = x[a];
1177 x[a] = x[b];
1178 x[b] = t;
1179 }
1180
1181 /**
1182 * Sorts the specified array of objects according to the order induced by
1183 * the specified comparator. All elements in the array must be
1184 * <i>mutually comparable</i> by the specified comparator (that is,
1185 * {@code c.compare(e1, e2)} must not throw a {@code ClassCastException}
1186 * for any elements {@code e1} and {@code e2} in the array).
1187 *
1188 * <p>This sort is guaranteed to be <i>stable</i>: equal elements will
1189 * not be reordered as a result of the sort.
1190 *
1191 * <p>Implementation note: This implementation is a stable, adaptive,
1192 * iterative mergesort that requires far fewer than n lg(n) comparisons
1193 * when the input array is partially sorted, while offering the
1194 * performance of a traditional mergesort when the input array is
1195 * randomly ordered. If the input array is nearly sorted, the
1196 * implementation requires approximately n comparisons. Temporary
1197 * storage requirements vary from a small constant for nearly sorted
1198 * input arrays to n/2 object references for randomly ordered input
1199 * arrays.
1200 *
1201 * <p>The implementation takes equal advantage of ascending and
1202 * descending order in its input array, and can take advantage of
1203 * ascending and descending order in different parts of the same
1204 * input array. It is well-suited to merging two or more sorted arrays:
1205 * simply concatenate the arrays and sort the resulting array.
1206 *
1207 * <p>The implementation was adapted from Tim Peters's list sort for Python
1208 * (<a href="http://svn.python.org/projects/python/trunk/Objects/listsort.txt">
1209 * TimSort</a>). It uses techniques from Peter McIlroy's "Optimistic
1210 * Sorting and Information Theoretic Complexity", in Proceedings of the
1211 * Fourth Annual ACM-SIAM Symposium on Discrete Algorithms, pp 467-474,
1212 * January 1993.
1213 *
1214 * @param <T> the class of the objects to be sorted
1215 * @param a the array to be sorted
1216 * @param c the comparator to determine the order of the array. A
1217 * {@code null} value indicates that the elements'
1218 * {@linkplain Comparable natural ordering} should be used.
1219 * @throws ClassCastException if the array contains elements that are
1220 * not <i>mutually comparable</i> using the specified comparator
1221 * @throws IllegalArgumentException (optional) if the comparator is
1222 * found to violate the {@link Comparator} contract
1223 */
1224 public static <T> void sort(T[] a, Comparator<? super T> c) {
1225 if (c == null) {
1226 sort(a);
1227 } else {
1228 if (LegacyMergeSort.userRequested)
1229 legacyMergeSort(a, c);
1230 else
1231 TimSort.sort(a, 0, a.length, c, null, 0, 0);
1232 }
1233 }
1234
1235 /** To be removed in a future release. */
1236 private static <T> void legacyMergeSort(T[] a, Comparator<? super T> c) {
1237 T[] aux = a.clone();
1238 if (c==null)
1239 mergeSort(aux, a, 0, a.length, 0);
1240 else
1241 mergeSort(aux, a, 0, a.length, 0, c);
1242 }
1243
1244 /**
1245 * Sorts the specified range of the specified array of objects according
1246 * to the order induced by the specified comparator. The range to be
1247 * sorted extends from index {@code fromIndex}, inclusive, to index
1248 * {@code toIndex}, exclusive. (If {@code fromIndex==toIndex}, the
1249 * range to be sorted is empty.) All elements in the range must be
1250 * <i>mutually comparable</i> by the specified comparator (that is,
1251 * {@code c.compare(e1, e2)} must not throw a {@code ClassCastException}
1252 * for any elements {@code e1} and {@code e2} in the range).
1253 *
1254 * <p>This sort is guaranteed to be <i>stable</i>: equal elements will
1255 * not be reordered as a result of the sort.
1256 *
1257 * <p>Implementation note: This implementation is a stable, adaptive,
1258 * iterative mergesort that requires far fewer than n lg(n) comparisons
1259 * when the input array is partially sorted, while offering the
1260 * performance of a traditional mergesort when the input array is
1261 * randomly ordered. If the input array is nearly sorted, the
1262 * implementation requires approximately n comparisons. Temporary
1263 * storage requirements vary from a small constant for nearly sorted
1264 * input arrays to n/2 object references for randomly ordered input
1265 * arrays.
1266 *
1267 * <p>The implementation takes equal advantage of ascending and
1268 * descending order in its input array, and can take advantage of
1269 * ascending and descending order in different parts of the same
1270 * input array. It is well-suited to merging two or more sorted arrays:
1271 * simply concatenate the arrays and sort the resulting array.
1272 *
1273 * <p>The implementation was adapted from Tim Peters's list sort for Python
1274 * (<a href="http://svn.python.org/projects/python/trunk/Objects/listsort.txt">
1275 * TimSort</a>). It uses techniques from Peter McIlroy's "Optimistic
1276 * Sorting and Information Theoretic Complexity", in Proceedings of the
1277 * Fourth Annual ACM-SIAM Symposium on Discrete Algorithms, pp 467-474,
1278 * January 1993.
1279 *
1280 * @param <T> the class of the objects to be sorted
1281 * @param a the array to be sorted
1282 * @param fromIndex the index of the first element (inclusive) to be
1283 * sorted
1284 * @param toIndex the index of the last element (exclusive) to be sorted
1285 * @param c the comparator to determine the order of the array. A
1286 * {@code null} value indicates that the elements'
1287 * {@linkplain Comparable natural ordering} should be used.
1288 * @throws ClassCastException if the array contains elements that are not
1289 * <i>mutually comparable</i> using the specified comparator.
1290 * @throws IllegalArgumentException if {@code fromIndex > toIndex} or
1291 * (optional) if the comparator is found to violate the
1292 * {@link Comparator} contract
1293 * @throws ArrayIndexOutOfBoundsException if {@code fromIndex < 0} or
1294 * {@code toIndex > a.length}
1295 */
1296 public static <T> void sort(T[] a, int fromIndex, int toIndex,
1297 Comparator<? super T> c) {
1298 if (c == null) {
1299 sort(a, fromIndex, toIndex);
1300 } else {
1301 rangeCheck(a.length, fromIndex, toIndex);
1302 if (LegacyMergeSort.userRequested)
1303 legacyMergeSort(a, fromIndex, toIndex, c);
1304 else
1305 TimSort.sort(a, fromIndex, toIndex, c, null, 0, 0);
1306 }
1307 }
1308
1309 /** To be removed in a future release. */
1310 private static <T> void legacyMergeSort(T[] a, int fromIndex, int toIndex,
1311 Comparator<? super T> c) {
1312 T[] aux = copyOfRange(a, fromIndex, toIndex);
1313 if (c==null)
1314 mergeSort(aux, a, fromIndex, toIndex, -fromIndex);
1315 else
1316 mergeSort(aux, a, fromIndex, toIndex, -fromIndex, c);
1317 }
1318
1319 /**
1320 * Src is the source array that starts at index 0
1321 * Dest is the (possibly larger) array destination with a possible offset
1322 * low is the index in dest to start sorting
1323 * high is the end index in dest to end sorting
1324 * off is the offset into src corresponding to low in dest
1325 * To be removed in a future release.
1326 */
1327 @SuppressWarnings({"rawtypes", "unchecked"})
1328 private static void mergeSort(Object[] src,
1329 Object[] dest,
1330 int low, int high, int off,
1331 Comparator c) {
1332 int length = high - low;
1333
1334 // Insertion sort on smallest arrays
1335 if (length < INSERTIONSORT_THRESHOLD) {
1336 for (int i=low; i<high; i++)
1337 for (int j=i; j>low && c.compare(dest[j-1], dest[j])>0; j--)
1338 swap(dest, j, j-1);
1339 return;
1340 }
1341
1342 // Recursively sort halves of dest into src
1343 int destLow = low;
1344 int destHigh = high;
1345 low += off;
1346 high += off;
1347 int mid = (low + high) >>> 1;
1348 mergeSort(dest, src, low, mid, -off, c);
1349 mergeSort(dest, src, mid, high, -off, c);
1350
1351 // If list is already sorted, just copy from src to dest. This is an
1352 // optimization that results in faster sorts for nearly ordered lists.
1353 if (c.compare(src[mid-1], src[mid]) <= 0) {
1354 System.arraycopy(src, low, dest, destLow, length);
1355 return;
1356 }
1357
1358 // Merge sorted halves (now in src) into dest
1359 for(int i = destLow, p = low, q = mid; i < destHigh; i++) {
1360 if (q >= high || p < mid && c.compare(src[p], src[q]) <= 0)
1361 dest[i] = src[p++];
1362 else
1363 dest[i] = src[q++];
1364 }
1365 }
1366
1367 // Parallel prefix
1368
1369 /**
1370 * Cumulates, in parallel, each element of the given array in place,
1371 * using the supplied function. For example if the array initially
1372 * holds {@code [2, 1, 0, 3]} and the operation performs addition,
1373 * then upon return the array holds {@code [2, 3, 3, 6]}.
1374 * Parallel prefix computation is usually more efficient than
1375 * sequential loops for large arrays.
1376 *
1377 * @param <T> the class of the objects in the array
1378 * @param array the array, which is modified in-place by this method
1379 * @param op a side-effect-free, associative function to perform the
1380 * cumulation
1381 * @throws NullPointerException if the specified array or function is null
1382 * @since 1.8
1383 */
1384 public static <T> void parallelPrefix(T[] array, BinaryOperator<T> op) {
1385 Objects.requireNonNull(op);
1386 if (array.length > 0)
1387 new ArrayPrefixHelpers.CumulateTask<>
1388 (null, op, array, 0, array.length).invoke();
1389 }
1390
1391 /**
1392 * Performs {@link #parallelPrefix(Object[], BinaryOperator)}
1393 * for the given subrange of the array.
1394 *
1395 * @param <T> the class of the objects in the array
1396 * @param array the array
1397 * @param fromIndex the index of the first element, inclusive
1398 * @param toIndex the index of the last element, exclusive
1399 * @param op a side-effect-free, associative function to perform the
1400 * cumulation
1401 * @throws IllegalArgumentException if {@code fromIndex > toIndex}
1402 * @throws ArrayIndexOutOfBoundsException
1403 * if {@code fromIndex < 0} or {@code toIndex > array.length}
1404 * @throws NullPointerException if the specified array or function is null
1405 * @since 1.8
1406 */
1407 public static <T> void parallelPrefix(T[] array, int fromIndex,
1408 int toIndex, BinaryOperator<T> op) {
1409 Objects.requireNonNull(op);
1410 rangeCheck(array.length, fromIndex, toIndex);
1411 if (fromIndex < toIndex)
1412 new ArrayPrefixHelpers.CumulateTask<>
1413 (null, op, array, fromIndex, toIndex).invoke();
1414 }
1415
1416 /**
1417 * Cumulates, in parallel, each element of the given array in place,
1418 * using the supplied function. For example if the array initially
1419 * holds {@code [2, 1, 0, 3]} and the operation performs addition,
1420 * then upon return the array holds {@code [2, 3, 3, 6]}.
1421 * Parallel prefix computation is usually more efficient than
1422 * sequential loops for large arrays.
1423 *
1424 * @param array the array, which is modified in-place by this method
1425 * @param op a side-effect-free, associative function to perform the
1426 * cumulation
1427 * @throws NullPointerException if the specified array or function is null
1428 * @since 1.8
1429 */
1430 public static void parallelPrefix(long[] array, LongBinaryOperator op) {
1431 Objects.requireNonNull(op);
1432 if (array.length > 0)
1433 new ArrayPrefixHelpers.LongCumulateTask
1434 (null, op, array, 0, array.length).invoke();
1435 }
1436
1437 /**
1438 * Performs {@link #parallelPrefix(long[], LongBinaryOperator)}
1439 * for the given subrange of the array.
1440 *
1441 * @param array the array
1442 * @param fromIndex the index of the first element, inclusive
1443 * @param toIndex the index of the last element, exclusive
1444 * @param op a side-effect-free, associative function to perform the
1445 * cumulation
1446 * @throws IllegalArgumentException if {@code fromIndex > toIndex}
1447 * @throws ArrayIndexOutOfBoundsException
1448 * if {@code fromIndex < 0} or {@code toIndex > array.length}
1449 * @throws NullPointerException if the specified array or function is null
1450 * @since 1.8
1451 */
1452 public static void parallelPrefix(long[] array, int fromIndex,
1453 int toIndex, LongBinaryOperator op) {
1454 Objects.requireNonNull(op);
1455 rangeCheck(array.length, fromIndex, toIndex);
1456 if (fromIndex < toIndex)
1457 new ArrayPrefixHelpers.LongCumulateTask
1458 (null, op, array, fromIndex, toIndex).invoke();
1459 }
1460
1461 /**
1462 * Cumulates, in parallel, each element of the given array in place,
1463 * using the supplied function. For example if the array initially
1464 * holds {@code [2.0, 1.0, 0.0, 3.0]} and the operation performs addition,
1465 * then upon return the array holds {@code [2.0, 3.0, 3.0, 6.0]}.
1466 * Parallel prefix computation is usually more efficient than
1467 * sequential loops for large arrays.
1468 *
1469 * <p> Because floating-point operations may not be strictly associative,
1470 * the returned result may not be identical to the value that would be
1471 * obtained if the operation was performed sequentially.
1472 *
1473 * @param array the array, which is modified in-place by this method
1474 * @param op a side-effect-free function to perform the cumulation
1475 * @throws NullPointerException if the specified array or function is null
1476 * @since 1.8
1477 */
1478 public static void parallelPrefix(double[] array, DoubleBinaryOperator op) {
1479 Objects.requireNonNull(op);
1480 if (array.length > 0)
1481 new ArrayPrefixHelpers.DoubleCumulateTask
1482 (null, op, array, 0, array.length).invoke();
1483 }
1484
1485 /**
1486 * Performs {@link #parallelPrefix(double[], DoubleBinaryOperator)}
1487 * for the given subrange of the array.
1488 *
1489 * @param array the array
1490 * @param fromIndex the index of the first element, inclusive
1491 * @param toIndex the index of the last element, exclusive
1492 * @param op a side-effect-free, associative function to perform the
1493 * cumulation
1494 * @throws IllegalArgumentException if {@code fromIndex > toIndex}
1495 * @throws ArrayIndexOutOfBoundsException
1496 * if {@code fromIndex < 0} or {@code toIndex > array.length}
1497 * @throws NullPointerException if the specified array or function is null
1498 * @since 1.8
1499 */
1500 public static void parallelPrefix(double[] array, int fromIndex,
1501 int toIndex, DoubleBinaryOperator op) {
1502 Objects.requireNonNull(op);
1503 rangeCheck(array.length, fromIndex, toIndex);
1504 if (fromIndex < toIndex)
1505 new ArrayPrefixHelpers.DoubleCumulateTask
1506 (null, op, array, fromIndex, toIndex).invoke();
1507 }
1508
1509 /**
1510 * Cumulates, in parallel, each element of the given array in place,
1511 * using the supplied function. For example if the array initially
1512 * holds {@code [2, 1, 0, 3]} and the operation performs addition,
1513 * then upon return the array holds {@code [2, 3, 3, 6]}.
1514 * Parallel prefix computation is usually more efficient than
1515 * sequential loops for large arrays.
1516 *
1517 * @param array the array, which is modified in-place by this method
1518 * @param op a side-effect-free, associative function to perform the
1519 * cumulation
1520 * @throws NullPointerException if the specified array or function is null
1521 * @since 1.8
1522 */
1523 public static void parallelPrefix(int[] array, IntBinaryOperator op) {
1524 Objects.requireNonNull(op);
1525 if (array.length > 0)
1526 new ArrayPrefixHelpers.IntCumulateTask
1527 (null, op, array, 0, array.length).invoke();
1528 }
1529
1530 /**
1531 * Performs {@link #parallelPrefix(int[], IntBinaryOperator)}
1532 * for the given subrange of the array.
1533 *
1534 * @param array the array
1535 * @param fromIndex the index of the first element, inclusive
1536 * @param toIndex the index of the last element, exclusive
1537 * @param op a side-effect-free, associative function to perform the
1538 * cumulation
1539 * @throws IllegalArgumentException if {@code fromIndex > toIndex}
1540 * @throws ArrayIndexOutOfBoundsException
1541 * if {@code fromIndex < 0} or {@code toIndex > array.length}
1542 * @throws NullPointerException if the specified array or function is null
1543 * @since 1.8
1544 */
1545 public static void parallelPrefix(int[] array, int fromIndex,
1546 int toIndex, IntBinaryOperator op) {
1547 Objects.requireNonNull(op);
1548 rangeCheck(array.length, fromIndex, toIndex);
1549 if (fromIndex < toIndex)
1550 new ArrayPrefixHelpers.IntCumulateTask
1551 (null, op, array, fromIndex, toIndex).invoke();
1552 }
1553
1554 // Searching
1555
1556 /**
1557 * Searches the specified array of longs for the specified value using the
1558 * binary search algorithm. The array must be sorted (as
1559 * by the {@link #sort(long[])} method) prior to making this call. If it
1560 * is not sorted, the results are undefined. If the array contains
1561 * multiple elements with the specified value, there is no guarantee which
1562 * one will be found.
1563 *
1564 * @param a the array to be searched
1565 * @param key the value to be searched for
1566 * @return index of the search key, if it is contained in the array;
1567 * otherwise, <code>(-(<i>insertion point</i>) - 1)</code>. The
1568 * <i>insertion point</i> is defined as the point at which the
1569 * key would be inserted into the array: the index of the first
1570 * element greater than the key, or {@code a.length} if all
1571 * elements in the array are less than the specified key. Note
1572 * that this guarantees that the return value will be >= 0 if
1573 * and only if the key is found.
1574 */
1575 public static int binarySearch(long[] a, long key) {
1576 return binarySearch0(a, 0, a.length, key);
1577 }
1578
1579 /**
1580 * Searches a range of
1581 * the specified array of longs for the specified value using the
1582 * binary search algorithm.
1583 * The range must be sorted (as
1584 * by the {@link #sort(long[], int, int)} method)
1585 * prior to making this call. If it
1586 * is not sorted, the results are undefined. If the range contains
1587 * multiple elements with the specified value, there is no guarantee which
1588 * one will be found.
1589 *
1590 * @param a the array to be searched
1591 * @param fromIndex the index of the first element (inclusive) to be
1592 * searched
1593 * @param toIndex the index of the last element (exclusive) to be searched
1594 * @param key the value to be searched for
1595 * @return index of the search key, if it is contained in the array
1596 * within the specified range;
1597 * otherwise, <code>(-(<i>insertion point</i>) - 1)</code>. The
1598 * <i>insertion point</i> is defined as the point at which the
1599 * key would be inserted into the array: the index of the first
1600 * element in the range greater than the key,
1601 * or {@code toIndex} if all
1602 * elements in the range are less than the specified key. Note
1603 * that this guarantees that the return value will be >= 0 if
1604 * and only if the key is found.
1605 * @throws IllegalArgumentException
1606 * if {@code fromIndex > toIndex}
1607 * @throws ArrayIndexOutOfBoundsException
1608 * if {@code fromIndex < 0 or toIndex > a.length}
1609 * @since 1.6
1610 */
1611 public static int binarySearch(long[] a, int fromIndex, int toIndex,
1612 long key) {
1613 rangeCheck(a.length, fromIndex, toIndex);
1614 return binarySearch0(a, fromIndex, toIndex, key);
1615 }
1616
1617 // Like public version, but without range checks.
1618 private static int binarySearch0(long[] a, int fromIndex, int toIndex,
1619 long key) {
1620 int low = fromIndex;
1621 int high = toIndex - 1;
1622
1623 while (low <= high) {
1624 int mid = (low + high) >>> 1;
1625 long midVal = a[mid];
1626
1627 if (midVal < key)
1628 low = mid + 1;
1629 else if (midVal > key)
1630 high = mid - 1;
1631 else
1632 return mid; // key found
1633 }
1634 return -(low + 1); // key not found.
1635 }
1636
1637 /**
1638 * Searches the specified array of ints for the specified value using the
1639 * binary search algorithm. The array must be sorted (as
1640 * by the {@link #sort(int[])} method) prior to making this call. If it
1641 * is not sorted, the results are undefined. If the array contains
1642 * multiple elements with the specified value, there is no guarantee which
1643 * one will be found.
1644 *
1645 * @param a the array to be searched
1646 * @param key the value to be searched for
1647 * @return index of the search key, if it is contained in the array;
1648 * otherwise, <code>(-(<i>insertion point</i>) - 1)</code>. The
1649 * <i>insertion point</i> is defined as the point at which the
1650 * key would be inserted into the array: the index of the first
1651 * element greater than the key, or {@code a.length} if all
1652 * elements in the array are less than the specified key. Note
1653 * that this guarantees that the return value will be >= 0 if
1654 * and only if the key is found.
1655 */
1656 public static int binarySearch(int[] a, int key) {
1657 return binarySearch0(a, 0, a.length, key);
1658 }
1659
1660 /**
1661 * Searches a range of
1662 * the specified array of ints for the specified value using the
1663 * binary search algorithm.
1664 * The range must be sorted (as
1665 * by the {@link #sort(int[], int, int)} method)
1666 * prior to making this call. If it
1667 * is not sorted, the results are undefined. If the range contains
1668 * multiple elements with the specified value, there is no guarantee which
1669 * one will be found.
1670 *
1671 * @param a the array to be searched
1672 * @param fromIndex the index of the first element (inclusive) to be
1673 * searched
1674 * @param toIndex the index of the last element (exclusive) to be searched
1675 * @param key the value to be searched for
1676 * @return index of the search key, if it is contained in the array
1677 * within the specified range;
1678 * otherwise, <code>(-(<i>insertion point</i>) - 1)</code>. The
1679 * <i>insertion point</i> is defined as the point at which the
1680 * key would be inserted into the array: the index of the first
1681 * element in the range greater than the key,
1682 * or {@code toIndex} if all
1683 * elements in the range are less than the specified key. Note
1684 * that this guarantees that the return value will be >= 0 if
1685 * and only if the key is found.
1686 * @throws IllegalArgumentException
1687 * if {@code fromIndex > toIndex}
1688 * @throws ArrayIndexOutOfBoundsException
1689 * if {@code fromIndex < 0 or toIndex > a.length}
1690 * @since 1.6
1691 */
1692 public static int binarySearch(int[] a, int fromIndex, int toIndex,
1693 int key) {
1694 rangeCheck(a.length, fromIndex, toIndex);
1695 return binarySearch0(a, fromIndex, toIndex, key);
1696 }
1697
1698 // Like public version, but without range checks.
1699 private static int binarySearch0(int[] a, int fromIndex, int toIndex,
1700 int key) {
1701 int low = fromIndex;
1702 int high = toIndex - 1;
1703
1704 while (low <= high) {
1705 int mid = (low + high) >>> 1;
1706 int midVal = a[mid];
1707
1708 if (midVal < key)
1709 low = mid + 1;
1710 else if (midVal > key)
1711 high = mid - 1;
1712 else
1713 return mid; // key found
1714 }
1715 return -(low + 1); // key not found.
1716 }
1717
1718 /**
1719 * Searches the specified array of shorts for the specified value using
1720 * the binary search algorithm. The array must be sorted
1721 * (as by the {@link #sort(short[])} method) prior to making this call. If
1722 * it is not sorted, the results are undefined. If the array contains
1723 * multiple elements with the specified value, there is no guarantee which
1724 * one will be found.
1725 *
1726 * @param a the array to be searched
1727 * @param key the value to be searched for
1728 * @return index of the search key, if it is contained in the array;
1729 * otherwise, <code>(-(<i>insertion point</i>) - 1)</code>. The
1730 * <i>insertion point</i> is defined as the point at which the
1731 * key would be inserted into the array: the index of the first
1732 * element greater than the key, or {@code a.length} if all
1733 * elements in the array are less than the specified key. Note
1734 * that this guarantees that the return value will be >= 0 if
1735 * and only if the key is found.
1736 */
1737 public static int binarySearch(short[] a, short key) {
1738 return binarySearch0(a, 0, a.length, key);
1739 }
1740
1741 /**
1742 * Searches a range of
1743 * the specified array of shorts for the specified value using
1744 * the binary search algorithm.
1745 * The range must be sorted
1746 * (as by the {@link #sort(short[], int, int)} method)
1747 * prior to making this call. If
1748 * it is not sorted, the results are undefined. If the range contains
1749 * multiple elements with the specified value, there is no guarantee which
1750 * one will be found.
1751 *
1752 * @param a the array to be searched
1753 * @param fromIndex the index of the first element (inclusive) to be
1754 * searched
1755 * @param toIndex the index of the last element (exclusive) to be searched
1756 * @param key the value to be searched for
1757 * @return index of the search key, if it is contained in the array
1758 * within the specified range;
1759 * otherwise, <code>(-(<i>insertion point</i>) - 1)</code>. The
1760 * <i>insertion point</i> is defined as the point at which the
1761 * key would be inserted into the array: the index of the first
1762 * element in the range greater than the key,
1763 * or {@code toIndex} if all
1764 * elements in the range are less than the specified key. Note
1765 * that this guarantees that the return value will be >= 0 if
1766 * and only if the key is found.
1767 * @throws IllegalArgumentException
1768 * if {@code fromIndex > toIndex}
1769 * @throws ArrayIndexOutOfBoundsException
1770 * if {@code fromIndex < 0 or toIndex > a.length}
1771 * @since 1.6
1772 */
1773 public static int binarySearch(short[] a, int fromIndex, int toIndex,
1774 short key) {
1775 rangeCheck(a.length, fromIndex, toIndex);
1776 return binarySearch0(a, fromIndex, toIndex, key);
1777 }
1778
1779 // Like public version, but without range checks.
1780 private static int binarySearch0(short[] a, int fromIndex, int toIndex,
1781 short key) {
1782 int low = fromIndex;
1783 int high = toIndex - 1;
1784
1785 while (low <= high) {
1786 int mid = (low + high) >>> 1;
1787 short midVal = a[mid];
1788
1789 if (midVal < key)
1790 low = mid + 1;
1791 else if (midVal > key)
1792 high = mid - 1;
1793 else
1794 return mid; // key found
1795 }
1796 return -(low + 1); // key not found.
1797 }
1798
1799 /**
1800 * Searches the specified array of chars for the specified value using the
1801 * binary search algorithm. The array must be sorted (as
1802 * by the {@link #sort(char[])} method) prior to making this call. If it
1803 * is not sorted, the results are undefined. If the array contains
1804 * multiple elements with the specified value, there is no guarantee which
1805 * one will be found.
1806 *
1807 * @param a the array to be searched
1808 * @param key the value to be searched for
1809 * @return index of the search key, if it is contained in the array;
1810 * otherwise, <code>(-(<i>insertion point</i>) - 1)</code>. The
1811 * <i>insertion point</i> is defined as the point at which the
1812 * key would be inserted into the array: the index of the first
1813 * element greater than the key, or {@code a.length} if all
1814 * elements in the array are less than the specified key. Note
1815 * that this guarantees that the return value will be >= 0 if
1816 * and only if the key is found.
1817 */
1818 public static int binarySearch(char[] a, char key) {
1819 return binarySearch0(a, 0, a.length, key);
1820 }
1821
1822 /**
1823 * Searches a range of
1824 * the specified array of chars for the specified value using the
1825 * binary search algorithm.
1826 * The range must be sorted (as
1827 * by the {@link #sort(char[], int, int)} method)
1828 * prior to making this call. If it
1829 * is not sorted, the results are undefined. If the range contains
1830 * multiple elements with the specified value, there is no guarantee which
1831 * one will be found.
1832 *
1833 * @param a the array to be searched
1834 * @param fromIndex the index of the first element (inclusive) to be
1835 * searched
1836 * @param toIndex the index of the last element (exclusive) to be searched
1837 * @param key the value to be searched for
1838 * @return index of the search key, if it is contained in the array
1839 * within the specified range;
1840 * otherwise, <code>(-(<i>insertion point</i>) - 1)</code>. The
1841 * <i>insertion point</i> is defined as the point at which the
1842 * key would be inserted into the array: the index of the first
1843 * element in the range greater than the key,
1844 * or {@code toIndex} if all
1845 * elements in the range are less than the specified key. Note
1846 * that this guarantees that the return value will be >= 0 if
1847 * and only if the key is found.
1848 * @throws IllegalArgumentException
1849 * if {@code fromIndex > toIndex}
1850 * @throws ArrayIndexOutOfBoundsException
1851 * if {@code fromIndex < 0 or toIndex > a.length}
1852 * @since 1.6
1853 */
1854 public static int binarySearch(char[] a, int fromIndex, int toIndex,
1855 char key) {
1856 rangeCheck(a.length, fromIndex, toIndex);
1857 return binarySearch0(a, fromIndex, toIndex, key);
1858 }
1859
1860 // Like public version, but without range checks.
1861 private static int binarySearch0(char[] a, int fromIndex, int toIndex,
1862 char key) {
1863 int low = fromIndex;
1864 int high = toIndex - 1;
1865
1866 while (low <= high) {
1867 int mid = (low + high) >>> 1;
1868 char midVal = a[mid];
1869
1870 if (midVal < key)
1871 low = mid + 1;
1872 else if (midVal > key)
1873 high = mid - 1;
1874 else
1875 return mid; // key found
1876 }
1877 return -(low + 1); // key not found.
1878 }
1879
1880 /**
1881 * Searches the specified array of bytes for the specified value using the
1882 * binary search algorithm. The array must be sorted (as
1883 * by the {@link #sort(byte[])} method) prior to making this call. If it
1884 * is not sorted, the results are undefined. If the array contains
1885 * multiple elements with the specified value, there is no guarantee which
1886 * one will be found.
1887 *
1888 * @param a the array to be searched
1889 * @param key the value to be searched for
1890 * @return index of the search key, if it is contained in the array;
1891 * otherwise, <code>(-(<i>insertion point</i>) - 1)</code>. The
1892 * <i>insertion point</i> is defined as the point at which the
1893 * key would be inserted into the array: the index of the first
1894 * element greater than the key, or {@code a.length} if all
1895 * elements in the array are less than the specified key. Note
1896 * that this guarantees that the return value will be >= 0 if
1897 * and only if the key is found.
1898 */
1899 public static int binarySearch(byte[] a, byte key) {
1900 return binarySearch0(a, 0, a.length, key);
1901 }
1902
1903 /**
1904 * Searches a range of
1905 * the specified array of bytes for the specified value using the
1906 * binary search algorithm.
1907 * The range must be sorted (as
1908 * by the {@link #sort(byte[], int, int)} method)
1909 * prior to making this call. If it
1910 * is not sorted, the results are undefined. If the range contains
1911 * multiple elements with the specified value, there is no guarantee which
1912 * one will be found.
1913 *
1914 * @param a the array to be searched
1915 * @param fromIndex the index of the first element (inclusive) to be
1916 * searched
1917 * @param toIndex the index of the last element (exclusive) to be searched
1918 * @param key the value to be searched for
1919 * @return index of the search key, if it is contained in the array
1920 * within the specified range;
1921 * otherwise, <code>(-(<i>insertion point</i>) - 1)</code>. The
1922 * <i>insertion point</i> is defined as the point at which the
1923 * key would be inserted into the array: the index of the first
1924 * element in the range greater than the key,
1925 * or {@code toIndex} if all
1926 * elements in the range are less than the specified key. Note
1927 * that this guarantees that the return value will be >= 0 if
1928 * and only if the key is found.
1929 * @throws IllegalArgumentException
1930 * if {@code fromIndex > toIndex}
1931 * @throws ArrayIndexOutOfBoundsException
1932 * if {@code fromIndex < 0 or toIndex > a.length}
1933 * @since 1.6
1934 */
1935 public static int binarySearch(byte[] a, int fromIndex, int toIndex,
1936 byte key) {
1937 rangeCheck(a.length, fromIndex, toIndex);
1938 return binarySearch0(a, fromIndex, toIndex, key);
1939 }
1940
1941 // Like public version, but without range checks.
1942 private static int binarySearch0(byte[] a, int fromIndex, int toIndex,
1943 byte key) {
1944 int low = fromIndex;
1945 int high = toIndex - 1;
1946
1947 while (low <= high) {
1948 int mid = (low + high) >>> 1;
1949 byte midVal = a[mid];
1950
1951 if (midVal < key)
1952 low = mid + 1;
1953 else if (midVal > key)
1954 high = mid - 1;
1955 else
1956 return mid; // key found
1957 }
1958 return -(low + 1); // key not found.
1959 }
1960
1961 /**
1962 * Searches the specified array of doubles for the specified value using
1963 * the binary search algorithm. The array must be sorted
1964 * (as by the {@link #sort(double[])} method) prior to making this call.
1965 * If it is not sorted, the results are undefined. If the array contains
1966 * multiple elements with the specified value, there is no guarantee which
1967 * one will be found. This method considers all NaN values to be
1968 * equivalent and equal.
1969 *
1970 * @param a the array to be searched
1971 * @param key the value to be searched for
1972 * @return index of the search key, if it is contained in the array;
1973 * otherwise, <code>(-(<i>insertion point</i>) - 1)</code>. The
1974 * <i>insertion point</i> is defined as the point at which the
1975 * key would be inserted into the array: the index of the first
1976 * element greater than the key, or {@code a.length} if all
1977 * elements in the array are less than the specified key. Note
1978 * that this guarantees that the return value will be >= 0 if
1979 * and only if the key is found.
1980 */
1981 public static int binarySearch(double[] a, double key) {
1982 return binarySearch0(a, 0, a.length, key);
1983 }
1984
1985 /**
1986 * Searches a range of
1987 * the specified array of doubles for the specified value using
1988 * the binary search algorithm.
1989 * The range must be sorted
1990 * (as by the {@link #sort(double[], int, int)} method)
1991 * prior to making this call.
1992 * If it is not sorted, the results are undefined. If the range contains
1993 * multiple elements with the specified value, there is no guarantee which
1994 * one will be found. This method considers all NaN values to be
1995 * equivalent and equal.
1996 *
1997 * @param a the array to be searched
1998 * @param fromIndex the index of the first element (inclusive) to be
1999 * searched
2000 * @param toIndex the index of the last element (exclusive) to be searched
2001 * @param key the value to be searched for
2002 * @return index of the search key, if it is contained in the array
2003 * within the specified range;
2004 * otherwise, <code>(-(<i>insertion point</i>) - 1)</code>. The
2005 * <i>insertion point</i> is defined as the point at which the
2006 * key would be inserted into the array: the index of the first
2007 * element in the range greater than the key,
2008 * or {@code toIndex} if all
2009 * elements in the range are less than the specified key. Note
2010 * that this guarantees that the return value will be >= 0 if
2011 * and only if the key is found.
2012 * @throws IllegalArgumentException
2013 * if {@code fromIndex > toIndex}
2014 * @throws ArrayIndexOutOfBoundsException
2015 * if {@code fromIndex < 0 or toIndex > a.length}
2016 * @since 1.6
2017 */
2018 public static int binarySearch(double[] a, int fromIndex, int toIndex,
2019 double key) {
2020 rangeCheck(a.length, fromIndex, toIndex);
2021 return binarySearch0(a, fromIndex, toIndex, key);
2022 }
2023
2024 // Like public version, but without range checks.
2025 private static int binarySearch0(double[] a, int fromIndex, int toIndex,
2026 double key) {
2027 int low = fromIndex;
2028 int high = toIndex - 1;
2029
2030 while (low <= high) {
2031 int mid = (low + high) >>> 1;
2032 double midVal = a[mid];
2033
2034 if (midVal < key)
2035 low = mid + 1; // Neither val is NaN, thisVal is smaller
2036 else if (midVal > key)
2037 high = mid - 1; // Neither val is NaN, thisVal is larger
2038 else {
2039 long midBits = Double.doubleToLongBits(midVal);
2040 long keyBits = Double.doubleToLongBits(key);
2041 if (midBits == keyBits) // Values are equal
2042 return mid; // Key found
2043 else if (midBits < keyBits) // (-0.0, 0.0) or (!NaN, NaN)
2044 low = mid + 1;
2045 else // (0.0, -0.0) or (NaN, !NaN)
2046 high = mid - 1;
2047 }
2048 }
2049 return -(low + 1); // key not found.
2050 }
2051
2052 /**
2053 * Searches the specified array of floats for the specified value using
2054 * the binary search algorithm. The array must be sorted
2055 * (as by the {@link #sort(float[])} method) prior to making this call. If
2056 * it is not sorted, the results are undefined. If the array contains
2057 * multiple elements with the specified value, there is no guarantee which
2058 * one will be found. This method considers all NaN values to be
2059 * equivalent and equal.
2060 *
2061 * @param a the array to be searched
2062 * @param key the value to be searched for
2063 * @return index of the search key, if it is contained in the array;
2064 * otherwise, <code>(-(<i>insertion point</i>) - 1)</code>. The
2065 * <i>insertion point</i> is defined as the point at which the
2066 * key would be inserted into the array: the index of the first
2067 * element greater than the key, or {@code a.length} if all
2068 * elements in the array are less than the specified key. Note
2069 * that this guarantees that the return value will be >= 0 if
2070 * and only if the key is found.
2071 */
2072 public static int binarySearch(float[] a, float key) {
2073 return binarySearch0(a, 0, a.length, key);
2074 }
2075
2076 /**
2077 * Searches a range of
2078 * the specified array of floats for the specified value using
2079 * the binary search algorithm.
2080 * The range must be sorted
2081 * (as by the {@link #sort(float[], int, int)} method)
2082 * prior to making this call. If
2083 * it is not sorted, the results are undefined. If the range contains
2084 * multiple elements with the specified value, there is no guarantee which
2085 * one will be found. This method considers all NaN values to be
2086 * equivalent and equal.
2087 *
2088 * @param a the array to be searched
2089 * @param fromIndex the index of the first element (inclusive) to be
2090 * searched
2091 * @param toIndex the index of the last element (exclusive) to be searched
2092 * @param key the value to be searched for
2093 * @return index of the search key, if it is contained in the array
2094 * within the specified range;
2095 * otherwise, <code>(-(<i>insertion point</i>) - 1)</code>. The
2096 * <i>insertion point</i> is defined as the point at which the
2097 * key would be inserted into the array: the index of the first
2098 * element in the range greater than the key,
2099 * or {@code toIndex} if all
2100 * elements in the range are less than the specified key. Note
2101 * that this guarantees that the return value will be >= 0 if
2102 * and only if the key is found.
2103 * @throws IllegalArgumentException
2104 * if {@code fromIndex > toIndex}
2105 * @throws ArrayIndexOutOfBoundsException
2106 * if {@code fromIndex < 0 or toIndex > a.length}
2107 * @since 1.6
2108 */
2109 public static int binarySearch(float[] a, int fromIndex, int toIndex,
2110 float key) {
2111 rangeCheck(a.length, fromIndex, toIndex);
2112 return binarySearch0(a, fromIndex, toIndex, key);
2113 }
2114
2115 // Like public version, but without range checks.
2116 private static int binarySearch0(float[] a, int fromIndex, int toIndex,
2117 float key) {
2118 int low = fromIndex;
2119 int high = toIndex - 1;
2120
2121 while (low <= high) {
2122 int mid = (low + high) >>> 1;
2123 float midVal = a[mid];
2124
2125 if (midVal < key)
2126 low = mid + 1; // Neither val is NaN, thisVal is smaller
2127 else if (midVal > key)
2128 high = mid - 1; // Neither val is NaN, thisVal is larger
2129 else {
2130 int midBits = Float.floatToIntBits(midVal);
2131 int keyBits = Float.floatToIntBits(key);
2132 if (midBits == keyBits) // Values are equal
2133 return mid; // Key found
2134 else if (midBits < keyBits) // (-0.0, 0.0) or (!NaN, NaN)
2135 low = mid + 1;
2136 else // (0.0, -0.0) or (NaN, !NaN)
2137 high = mid - 1;
2138 }
2139 }
2140 return -(low + 1); // key not found.
2141 }
2142
2143 /**
2144 * Searches the specified array for the specified object using the binary
2145 * search algorithm. The array must be sorted into ascending order
2146 * according to the
2147 * {@linkplain Comparable natural ordering}
2148 * of its elements (as by the
2149 * {@link #sort(Object[])} method) prior to making this call.
2150 * If it is not sorted, the results are undefined.
2151 * (If the array contains elements that are not mutually comparable (for
2152 * example, strings and integers), it <i>cannot</i> be sorted according
2153 * to the natural ordering of its elements, hence results are undefined.)
2154 * If the array contains multiple
2155 * elements equal to the specified object, there is no guarantee which
2156 * one will be found.
2157 *
2158 * @param a the array to be searched
2159 * @param key the value to be searched for
2160 * @return index of the search key, if it is contained in the array;
2161 * otherwise, <code>(-(<i>insertion point</i>) - 1)</code>. The
2162 * <i>insertion point</i> is defined as the point at which the
2163 * key would be inserted into the array: the index of the first
2164 * element greater than the key, or {@code a.length} if all
2165 * elements in the array are less than the specified key. Note
2166 * that this guarantees that the return value will be >= 0 if
2167 * and only if the key is found.
2168 * @throws ClassCastException if the search key is not comparable to the
2169 * elements of the array.
2170 */
2171 public static int binarySearch(Object[] a, Object key) {
2172 return binarySearch0(a, 0, a.length, key);
2173 }
2174
2175 /**
2176 * Searches a range of
2177 * the specified array for the specified object using the binary
2178 * search algorithm.
2179 * The range must be sorted into ascending order
2180 * according to the
2181 * {@linkplain Comparable natural ordering}
2182 * of its elements (as by the
2183 * {@link #sort(Object[], int, int)} method) prior to making this
2184 * call. If it is not sorted, the results are undefined.
2185 * (If the range contains elements that are not mutually comparable (for
2186 * example, strings and integers), it <i>cannot</i> be sorted according
2187 * to the natural ordering of its elements, hence results are undefined.)
2188 * If the range contains multiple
2189 * elements equal to the specified object, there is no guarantee which
2190 * one will be found.
2191 *
2192 * @param a the array to be searched
2193 * @param fromIndex the index of the first element (inclusive) to be
2194 * searched
2195 * @param toIndex the index of the last element (exclusive) to be searched
2196 * @param key the value to be searched for
2197 * @return index of the search key, if it is contained in the array
2198 * within the specified range;
2199 * otherwise, <code>(-(<i>insertion point</i>) - 1)</code>. The
2200 * <i>insertion point</i> is defined as the point at which the
2201 * key would be inserted into the array: the index of the first
2202 * element in the range greater than the key,
2203 * or {@code toIndex} if all
2204 * elements in the range are less than the specified key. Note
2205 * that this guarantees that the return value will be >= 0 if
2206 * and only if the key is found.
2207 * @throws ClassCastException if the search key is not comparable to the
2208 * elements of the array within the specified range.
2209 * @throws IllegalArgumentException
2210 * if {@code fromIndex > toIndex}
2211 * @throws ArrayIndexOutOfBoundsException
2212 * if {@code fromIndex < 0 or toIndex > a.length}
2213 * @since 1.6
2214 */
2215 public static int binarySearch(Object[] a, int fromIndex, int toIndex,
2216 Object key) {
2217 rangeCheck(a.length, fromIndex, toIndex);
2218 return binarySearch0(a, fromIndex, toIndex, key);
2219 }
2220
2221 // Like public version, but without range checks.
2222 private static int binarySearch0(Object[] a, int fromIndex, int toIndex,
2223 Object key) {
2224 int low = fromIndex;
2225 int high = toIndex - 1;
2226
2227 while (low <= high) {
2228 int mid = (low + high) >>> 1;
2229 @SuppressWarnings("rawtypes")
2230 Comparable midVal = (Comparable)a[mid];
2231 @SuppressWarnings("unchecked")
2232 int cmp = midVal.compareTo(key);
2233
2234 if (cmp < 0)
2235 low = mid + 1;
2236 else if (cmp > 0)
2237 high = mid - 1;
2238 else
2239 return mid; // key found
2240 }
2241 return -(low + 1); // key not found.
2242 }
2243
2244 /**
2245 * Searches the specified array for the specified object using the binary
2246 * search algorithm. The array must be sorted into ascending order
2247 * according to the specified comparator (as by the
2248 * {@link #sort(Object[], Comparator) sort(T[], Comparator)}
2249 * method) prior to making this call. If it is
2250 * not sorted, the results are undefined.
2251 * If the array contains multiple
2252 * elements equal to the specified object, there is no guarantee which one
2253 * will be found.
2254 *
2255 * @param <T> the class of the objects in the array
2256 * @param a the array to be searched
2257 * @param key the value to be searched for
2258 * @param c the comparator by which the array is ordered. A
2259 * {@code null} value indicates that the elements'
2260 * {@linkplain Comparable natural ordering} should be used.
2261 * @return index of the search key, if it is contained in the array;
2262 * otherwise, <code>(-(<i>insertion point</i>) - 1)</code>. The
2263 * <i>insertion point</i> is defined as the point at which the
2264 * key would be inserted into the array: the index of the first
2265 * element greater than the key, or {@code a.length} if all
2266 * elements in the array are less than the specified key. Note
2267 * that this guarantees that the return value will be >= 0 if
2268 * and only if the key is found.
2269 * @throws ClassCastException if the array contains elements that are not
2270 * <i>mutually comparable</i> using the specified comparator,
2271 * or the search key is not comparable to the
2272 * elements of the array using this comparator.
2273 */
2274 public static <T> int binarySearch(T[] a, T key, Comparator<? super T> c) {
2275 return binarySearch0(a, 0, a.length, key, c);
2276 }
2277
2278 /**
2279 * Searches a range of
2280 * the specified array for the specified object using the binary
2281 * search algorithm.
2282 * The range must be sorted into ascending order
2283 * according to the specified comparator (as by the
2284 * {@link #sort(Object[], int, int, Comparator)
2285 * sort(T[], int, int, Comparator)}
2286 * method) prior to making this call.
2287 * If it is not sorted, the results are undefined.
2288 * If the range contains multiple elements equal to the specified object,
2289 * there is no guarantee which one will be found.
2290 *
2291 * @param <T> the class of the objects in the array
2292 * @param a the array to be searched
2293 * @param fromIndex the index of the first element (inclusive) to be
2294 * searched
2295 * @param toIndex the index of the last element (exclusive) to be searched
2296 * @param key the value to be searched for
2297 * @param c the comparator by which the array is ordered. A
2298 * {@code null} value indicates that the elements'
2299 * {@linkplain Comparable natural ordering} should be used.
2300 * @return index of the search key, if it is contained in the array
2301 * within the specified range;
2302 * otherwise, <code>(-(<i>insertion point</i>) - 1)</code>. The
2303 * <i>insertion point</i> is defined as the point at which the
2304 * key would be inserted into the array: the index of the first
2305 * element in the range greater than the key,
2306 * or {@code toIndex} if all
2307 * elements in the range are less than the specified key. Note
2308 * that this guarantees that the return value will be >= 0 if
2309 * and only if the key is found.
2310 * @throws ClassCastException if the range contains elements that are not
2311 * <i>mutually comparable</i> using the specified comparator,
2312 * or the search key is not comparable to the
2313 * elements in the range using this comparator.
2314 * @throws IllegalArgumentException
2315 * if {@code fromIndex > toIndex}
2316 * @throws ArrayIndexOutOfBoundsException
2317 * if {@code fromIndex < 0 or toIndex > a.length}
2318 * @since 1.6
2319 */
2320 public static <T> int binarySearch(T[] a, int fromIndex, int toIndex,
2321 T key, Comparator<? super T> c) {
2322 rangeCheck(a.length, fromIndex, toIndex);
2323 return binarySearch0(a, fromIndex, toIndex, key, c);
2324 }
2325
2326 // Like public version, but without range checks.
2327 private static <T> int binarySearch0(T[] a, int fromIndex, int toIndex,
2328 T key, Comparator<? super T> c) {
2329 if (c == null) {
2330 return binarySearch0(a, fromIndex, toIndex, key);
2331 }
2332 int low = fromIndex;
2333 int high = toIndex - 1;
2334
2335 while (low <= high) {
2336 int mid = (low + high) >>> 1;
2337 T midVal = a[mid];
2338 int cmp = c.compare(midVal, key);
2339 if (cmp < 0)
2340 low = mid + 1;
2341 else if (cmp > 0)
2342 high = mid - 1;
2343 else
2344 return mid; // key found
2345 }
2346 return -(low + 1); // key not found.
2347 }
2348
2349 // Equality Testing
2350
2351 /**
2352 * Returns {@code true} if the two specified arrays of longs are
2353 * <i>equal</i> to one another. Two arrays are considered equal if both
2354 * arrays contain the same number of elements, and all corresponding pairs
2355 * of elements in the two arrays are equal. In other words, two arrays
2356 * are equal if they contain the same elements in the same order. Also,
2357 * two array references are considered equal if both are {@code null}.
2358 *
2359 * @param a one array to be tested for equality
2360 * @param a2 the other array to be tested for equality
2361 * @return {@code true} if the two arrays are equal
2362 */
2363 public static boolean equals(long[] a, long[] a2) {
2364 if (a==a2)
2365 return true;
2366 if (a==null || a2==null)
2367 return false;
2368
2369 int length = a.length;
2370 if (a2.length != length)
2371 return false;
2372
2373 return ArraysSupport.mismatch(a, a2, length) < 0;
2374 }
2375
2376 /**
2377 * Returns true if the two specified arrays of longs, over the specified
2378 * ranges, are <i>equal</i> to one another.
2379 *
2380 * <p>Two arrays are considered equal if the number of elements covered by
2381 * each range is the same, and all corresponding pairs of elements over the
2382 * specified ranges in the two arrays are equal. In other words, two arrays
2383 * are equal if they contain, over the specified ranges, the same elements
2384 * in the same order.
2385 *
2386 * @param a the first array to be tested for equality
2387 * @param aFromIndex the index (inclusive) of the first element in the
2388 * first array to be tested
2389 * @param aToIndex the index (exclusive) of the last element in the
2390 * first array to be tested
2391 * @param b the second array to be tested for equality
2392 * @param bFromIndex the index (inclusive) of the first element in the
2393 * second array to be tested
2394 * @param bToIndex the index (exclusive) of the last element in the
2395 * second array to be tested
2396 * @return {@code true} if the two arrays, over the specified ranges, are
2397 * equal
2398 * @throws IllegalArgumentException
2399 * if {@code aFromIndex > aToIndex} or
2400 * if {@code bFromIndex > bToIndex}
2401 * @throws ArrayIndexOutOfBoundsException
2402 * if {@code aFromIndex < 0 or aToIndex > a.length} or
2403 * if {@code bFromIndex < 0 or bToIndex > b.length}
2404 * @throws NullPointerException
2405 * if either array is {@code null}
2406 * @since 9
2407 */
2408 public static boolean equals(long[] a, int aFromIndex, int aToIndex,
2409 long[] b, int bFromIndex, int bToIndex) {
2410 rangeCheck(a.length, aFromIndex, aToIndex);
2411 rangeCheck(b.length, bFromIndex, bToIndex);
2412
2413 int aLength = aToIndex - aFromIndex;
2414 int bLength = bToIndex - bFromIndex;
2415 if (aLength != bLength)
2416 return false;
2417
2418 return ArraysSupport.mismatch(a, aFromIndex,
2419 b, bFromIndex,
2420 aLength) < 0;
2421 }
2422
2423 /**
2424 * Returns {@code true} if the two specified arrays of ints are
2425 * <i>equal</i> to one another. Two arrays are considered equal if both
2426 * arrays contain the same number of elements, and all corresponding pairs
2427 * of elements in the two arrays are equal. In other words, two arrays
2428 * are equal if they contain the same elements in the same order. Also,
2429 * two array references are considered equal if both are {@code null}.
2430 *
2431 * @param a one array to be tested for equality
2432 * @param a2 the other array to be tested for equality
2433 * @return {@code true} if the two arrays are equal
2434 */
2435 public static boolean equals(int[] a, int[] a2) {
2436 if (a==a2)
2437 return true;
2438 if (a==null || a2==null)
2439 return false;
2440
2441 int length = a.length;
2442 if (a2.length != length)
2443 return false;
2444
2445 return ArraysSupport.mismatch(a, a2, length) < 0;
2446 }
2447
2448 /**
2449 * Returns true if the two specified arrays of ints, over the specified
2450 * ranges, are <i>equal</i> to one another.
2451 *
2452 * <p>Two arrays are considered equal if the number of elements covered by
2453 * each range is the same, and all corresponding pairs of elements over the
2454 * specified ranges in the two arrays are equal. In other words, two arrays
2455 * are equal if they contain, over the specified ranges, the same elements
2456 * in the same order.
2457 *
2458 * @param a the first array to be tested for equality
2459 * @param aFromIndex the index (inclusive) of the first element in the
2460 * first array to be tested
2461 * @param aToIndex the index (exclusive) of the last element in the
2462 * first array to be tested
2463 * @param b the second array to be tested for equality
2464 * @param bFromIndex the index (inclusive) of the first element in the
2465 * second array to be tested
2466 * @param bToIndex the index (exclusive) of the last element in the
2467 * second array to be tested
2468 * @return {@code true} if the two arrays, over the specified ranges, are
2469 * equal
2470 * @throws IllegalArgumentException
2471 * if {@code aFromIndex > aToIndex} or
2472 * if {@code bFromIndex > bToIndex}
2473 * @throws ArrayIndexOutOfBoundsException
2474 * if {@code aFromIndex < 0 or aToIndex > a.length} or
2475 * if {@code bFromIndex < 0 or bToIndex > b.length}
2476 * @throws NullPointerException
2477 * if either array is {@code null}
2478 * @since 9
2479 */
2480 public static boolean equals(int[] a, int aFromIndex, int aToIndex,
2481 int[] b, int bFromIndex, int bToIndex) {
2482 rangeCheck(a.length, aFromIndex, aToIndex);
2483 rangeCheck(b.length, bFromIndex, bToIndex);
2484
2485 int aLength = aToIndex - aFromIndex;
2486 int bLength = bToIndex - bFromIndex;
2487 if (aLength != bLength)
2488 return false;
2489
2490 return ArraysSupport.mismatch(a, aFromIndex,
2491 b, bFromIndex,
2492 aLength) < 0;
2493 }
2494
2495 /**
2496 * Returns {@code true} if the two specified arrays of shorts are
2497 * <i>equal</i> to one another. Two arrays are considered equal if both
2498 * arrays contain the same number of elements, and all corresponding pairs
2499 * of elements in the two arrays are equal. In other words, two arrays
2500 * are equal if they contain the same elements in the same order. Also,
2501 * two array references are considered equal if both are {@code null}.
2502 *
2503 * @param a one array to be tested for equality
2504 * @param a2 the other array to be tested for equality
2505 * @return {@code true} if the two arrays are equal
2506 */
2507 public static boolean equals(short[] a, short[] a2) {
2508 if (a==a2)
2509 return true;
2510 if (a==null || a2==null)
2511 return false;
2512
2513 int length = a.length;
2514 if (a2.length != length)
2515 return false;
2516
2517 return ArraysSupport.mismatch(a, a2, length) < 0;
2518 }
2519
2520 /**
2521 * Returns true if the two specified arrays of shorts, over the specified
2522 * ranges, are <i>equal</i> to one another.
2523 *
2524 * <p>Two arrays are considered equal if the number of elements covered by
2525 * each range is the same, and all corresponding pairs of elements over the
2526 * specified ranges in the two arrays are equal. In other words, two arrays
2527 * are equal if they contain, over the specified ranges, the same elements
2528 * in the same order.
2529 *
2530 * @param a the first array to be tested for equality
2531 * @param aFromIndex the index (inclusive) of the first element in the
2532 * first array to be tested
2533 * @param aToIndex the index (exclusive) of the last element in the
2534 * first array to be tested
2535 * @param b the second array to be tested for equality
2536 * @param bFromIndex the index (inclusive) of the first element in the
2537 * second array to be tested
2538 * @param bToIndex the index (exclusive) of the last element in the
2539 * second array to be tested
2540 * @return {@code true} if the two arrays, over the specified ranges, are
2541 * equal
2542 * @throws IllegalArgumentException
2543 * if {@code aFromIndex > aToIndex} or
2544 * if {@code bFromIndex > bToIndex}
2545 * @throws ArrayIndexOutOfBoundsException
2546 * if {@code aFromIndex < 0 or aToIndex > a.length} or
2547 * if {@code bFromIndex < 0 or bToIndex > b.length}
2548 * @throws NullPointerException
2549 * if either array is {@code null}
2550 * @since 9
2551 */
2552 public static boolean equals(short[] a, int aFromIndex, int aToIndex,
2553 short[] b, int bFromIndex, int bToIndex) {
2554 rangeCheck(a.length, aFromIndex, aToIndex);
2555 rangeCheck(b.length, bFromIndex, bToIndex);
2556
2557 int aLength = aToIndex - aFromIndex;
2558 int bLength = bToIndex - bFromIndex;
2559 if (aLength != bLength)
2560 return false;
2561
2562 return ArraysSupport.mismatch(a, aFromIndex,
2563 b, bFromIndex,
2564 aLength) < 0;
2565 }
2566
2567 /**
2568 * Returns {@code true} if the two specified arrays of chars are
2569 * <i>equal</i> to one another. Two arrays are considered equal if both
2570 * arrays contain the same number of elements, and all corresponding pairs
2571 * of elements in the two arrays are equal. In other words, two arrays
2572 * are equal if they contain the same elements in the same order. Also,
2573 * two array references are considered equal if both are {@code null}.
2574 *
2575 * @param a one array to be tested for equality
2576 * @param a2 the other array to be tested for equality
2577 * @return {@code true} if the two arrays are equal
2578 */
2579 @IntrinsicCandidate
2580 public static boolean equals(char[] a, char[] a2) {
2581 if (a==a2)
2582 return true;
2583 if (a==null || a2==null)
2584 return false;
2585
2586 int length = a.length;
2587 if (a2.length != length)
2588 return false;
2589
2590 return ArraysSupport.mismatch(a, a2, length) < 0;
2591 }
2592
2593 /**
2594 * Returns true if the two specified arrays of chars, over the specified
2595 * ranges, are <i>equal</i> to one another.
2596 *
2597 * <p>Two arrays are considered equal if the number of elements covered by
2598 * each range is the same, and all corresponding pairs of elements over the
2599 * specified ranges in the two arrays are equal. In other words, two arrays
2600 * are equal if they contain, over the specified ranges, the same elements
2601 * in the same order.
2602 *
2603 * @param a the first array to be tested for equality
2604 * @param aFromIndex the index (inclusive) of the first element in the
2605 * first array to be tested
2606 * @param aToIndex the index (exclusive) of the last element in the
2607 * first array to be tested
2608 * @param b the second array to be tested for equality
2609 * @param bFromIndex the index (inclusive) of the first element in the
2610 * second array to be tested
2611 * @param bToIndex the index (exclusive) of the last element in the
2612 * second array to be tested
2613 * @return {@code true} if the two arrays, over the specified ranges, are
2614 * equal
2615 * @throws IllegalArgumentException
2616 * if {@code aFromIndex > aToIndex} or
2617 * if {@code bFromIndex > bToIndex}
2618 * @throws ArrayIndexOutOfBoundsException
2619 * if {@code aFromIndex < 0 or aToIndex > a.length} or
2620 * if {@code bFromIndex < 0 or bToIndex > b.length}
2621 * @throws NullPointerException
2622 * if either array is {@code null}
2623 * @since 9
2624 */
2625 public static boolean equals(char[] a, int aFromIndex, int aToIndex,
2626 char[] b, int bFromIndex, int bToIndex) {
2627 rangeCheck(a.length, aFromIndex, aToIndex);
2628 rangeCheck(b.length, bFromIndex, bToIndex);
2629
2630 int aLength = aToIndex - aFromIndex;
2631 int bLength = bToIndex - bFromIndex;
2632 if (aLength != bLength)
2633 return false;
2634
2635 return ArraysSupport.mismatch(a, aFromIndex,
2636 b, bFromIndex,
2637 aLength) < 0;
2638 }
2639
2640 /**
2641 * Returns {@code true} if the two specified arrays of bytes are
2642 * <i>equal</i> to one another. Two arrays are considered equal if both
2643 * arrays contain the same number of elements, and all corresponding pairs
2644 * of elements in the two arrays are equal. In other words, two arrays
2645 * are equal if they contain the same elements in the same order. Also,
2646 * two array references are considered equal if both are {@code null}.
2647 *
2648 * @param a one array to be tested for equality
2649 * @param a2 the other array to be tested for equality
2650 * @return {@code true} if the two arrays are equal
2651 */
2652 @IntrinsicCandidate
2653 public static boolean equals(byte[] a, byte[] a2) {
2654 if (a==a2)
2655 return true;
2656 if (a==null || a2==null)
2657 return false;
2658
2659 int length = a.length;
2660 if (a2.length != length)
2661 return false;
2662
2663 return ArraysSupport.mismatch(a, a2, length) < 0;
2664 }
2665
2666 /**
2667 * Returns true if the two specified arrays of bytes, over the specified
2668 * ranges, are <i>equal</i> to one another.
2669 *
2670 * <p>Two arrays are considered equal if the number of elements covered by
2671 * each range is the same, and all corresponding pairs of elements over the
2672 * specified ranges in the two arrays are equal. In other words, two arrays
2673 * are equal if they contain, over the specified ranges, the same elements
2674 * in the same order.
2675 *
2676 * @param a the first array to be tested for equality
2677 * @param aFromIndex the index (inclusive) of the first element in the
2678 * first array to be tested
2679 * @param aToIndex the index (exclusive) of the last element in the
2680 * first array to be tested
2681 * @param b the second array to be tested for equality
2682 * @param bFromIndex the index (inclusive) of the first element in the
2683 * second array to be tested
2684 * @param bToIndex the index (exclusive) of the last element in the
2685 * second array to be tested
2686 * @return {@code true} if the two arrays, over the specified ranges, are
2687 * equal
2688 * @throws IllegalArgumentException
2689 * if {@code aFromIndex > aToIndex} or
2690 * if {@code bFromIndex > bToIndex}
2691 * @throws ArrayIndexOutOfBoundsException
2692 * if {@code aFromIndex < 0 or aToIndex > a.length} or
2693 * if {@code bFromIndex < 0 or bToIndex > b.length}
2694 * @throws NullPointerException
2695 * if either array is {@code null}
2696 * @since 9
2697 */
2698 public static boolean equals(byte[] a, int aFromIndex, int aToIndex,
2699 byte[] b, int bFromIndex, int bToIndex) {
2700 rangeCheck(a.length, aFromIndex, aToIndex);
2701 rangeCheck(b.length, bFromIndex, bToIndex);
2702
2703 int aLength = aToIndex - aFromIndex;
2704 int bLength = bToIndex - bFromIndex;
2705 if (aLength != bLength)
2706 return false;
2707
2708 return ArraysSupport.mismatch(a, aFromIndex,
2709 b, bFromIndex,
2710 aLength) < 0;
2711 }
2712
2713 /**
2714 * Returns {@code true} if the two specified arrays of booleans are
2715 * <i>equal</i> to one another. Two arrays are considered equal if both
2716 * arrays contain the same number of elements, and all corresponding pairs
2717 * of elements in the two arrays are equal. In other words, two arrays
2718 * are equal if they contain the same elements in the same order. Also,
2719 * two array references are considered equal if both are {@code null}.
2720 *
2721 * @param a one array to be tested for equality
2722 * @param a2 the other array to be tested for equality
2723 * @return {@code true} if the two arrays are equal
2724 */
2725 public static boolean equals(boolean[] a, boolean[] a2) {
2726 if (a==a2)
2727 return true;
2728 if (a==null || a2==null)
2729 return false;
2730
2731 int length = a.length;
2732 if (a2.length != length)
2733 return false;
2734
2735 return ArraysSupport.mismatch(a, a2, length) < 0;
2736 }
2737
2738 /**
2739 * Returns true if the two specified arrays of booleans, over the specified
2740 * ranges, are <i>equal</i> to one another.
2741 *
2742 * <p>Two arrays are considered equal if the number of elements covered by
2743 * each range is the same, and all corresponding pairs of elements over the
2744 * specified ranges in the two arrays are equal. In other words, two arrays
2745 * are equal if they contain, over the specified ranges, the same elements
2746 * in the same order.
2747 *
2748 * @param a the first array to be tested for equality
2749 * @param aFromIndex the index (inclusive) of the first element in the
2750 * first array to be tested
2751 * @param aToIndex the index (exclusive) of the last element in the
2752 * first array to be tested
2753 * @param b the second array to be tested for equality
2754 * @param bFromIndex the index (inclusive) of the first element in the
2755 * second array to be tested
2756 * @param bToIndex the index (exclusive) of the last element in the
2757 * second array to be tested
2758 * @return {@code true} if the two arrays, over the specified ranges, are
2759 * equal
2760 * @throws IllegalArgumentException
2761 * if {@code aFromIndex > aToIndex} or
2762 * if {@code bFromIndex > bToIndex}
2763 * @throws ArrayIndexOutOfBoundsException
2764 * if {@code aFromIndex < 0 or aToIndex > a.length} or
2765 * if {@code bFromIndex < 0 or bToIndex > b.length}
2766 * @throws NullPointerException
2767 * if either array is {@code null}
2768 * @since 9
2769 */
2770 public static boolean equals(boolean[] a, int aFromIndex, int aToIndex,
2771 boolean[] b, int bFromIndex, int bToIndex) {
2772 rangeCheck(a.length, aFromIndex, aToIndex);
2773 rangeCheck(b.length, bFromIndex, bToIndex);
2774
2775 int aLength = aToIndex - aFromIndex;
2776 int bLength = bToIndex - bFromIndex;
2777 if (aLength != bLength)
2778 return false;
2779
2780 return ArraysSupport.mismatch(a, aFromIndex,
2781 b, bFromIndex,
2782 aLength) < 0;
2783 }
2784
2785 /**
2786 * Returns {@code true} if the two specified arrays of doubles are
2787 * <i>equal</i> to one another. Two arrays are considered equal if both
2788 * arrays contain the same number of elements, and all corresponding pairs
2789 * of elements in the two arrays are equal. In other words, two arrays
2790 * are equal if they contain the same elements in the same order. Also,
2791 * two array references are considered equal if both are {@code null}.
2792 *
2793 * Two doubles {@code d1} and {@code d2} are considered equal if:
2794 * <pre> {@code Double.valueOf(d1).equals(Double.valueOf(d2))}</pre>
2795 * (Unlike the {@code ==} operator, this method considers
2796 * {@code NaN} equal to itself, and 0.0d unequal to -0.0d.)
2797 *
2798 * @param a one array to be tested for equality
2799 * @param a2 the other array to be tested for equality
2800 * @return {@code true} if the two arrays are equal
2801 * @see Double#equals(Object)
2802 */
2803 public static boolean equals(double[] a, double[] a2) {
2804 if (a==a2)
2805 return true;
2806 if (a==null || a2==null)
2807 return false;
2808
2809 int length = a.length;
2810 if (a2.length != length)
2811 return false;
2812
2813 return ArraysSupport.mismatch(a, a2, length) < 0;
2814 }
2815
2816 /**
2817 * Returns true if the two specified arrays of doubles, over the specified
2818 * ranges, are <i>equal</i> to one another.
2819 *
2820 * <p>Two arrays are considered equal if the number of elements covered by
2821 * each range is the same, and all corresponding pairs of elements over the
2822 * specified ranges in the two arrays are equal. In other words, two arrays
2823 * are equal if they contain, over the specified ranges, the same elements
2824 * in the same order.
2825 *
2826 * <p>Two doubles {@code d1} and {@code d2} are considered equal if:
2827 * <pre> {@code Double.valueOf(d1).equals(Double.valueOf(d2))}</pre>
2828 * (Unlike the {@code ==} operator, this method considers
2829 * {@code NaN} equal to itself, and 0.0d unequal to -0.0d.)
2830 *
2831 * @param a the first array to be tested for equality
2832 * @param aFromIndex the index (inclusive) of the first element in the
2833 * first array to be tested
2834 * @param aToIndex the index (exclusive) of the last element in the
2835 * first array to be tested
2836 * @param b the second array to be tested for equality
2837 * @param bFromIndex the index (inclusive) of the first element in the
2838 * second array to be tested
2839 * @param bToIndex the index (exclusive) of the last element in the
2840 * second array to be tested
2841 * @return {@code true} if the two arrays, over the specified ranges, are
2842 * equal
2843 * @throws IllegalArgumentException
2844 * if {@code aFromIndex > aToIndex} or
2845 * if {@code bFromIndex > bToIndex}
2846 * @throws ArrayIndexOutOfBoundsException
2847 * if {@code aFromIndex < 0 or aToIndex > a.length} or
2848 * if {@code bFromIndex < 0 or bToIndex > b.length}
2849 * @throws NullPointerException
2850 * if either array is {@code null}
2851 * @see Double#equals(Object)
2852 * @since 9
2853 */
2854 public static boolean equals(double[] a, int aFromIndex, int aToIndex,
2855 double[] b, int bFromIndex, int bToIndex) {
2856 rangeCheck(a.length, aFromIndex, aToIndex);
2857 rangeCheck(b.length, bFromIndex, bToIndex);
2858
2859 int aLength = aToIndex - aFromIndex;
2860 int bLength = bToIndex - bFromIndex;
2861 if (aLength != bLength)
2862 return false;
2863
2864 return ArraysSupport.mismatch(a, aFromIndex,
2865 b, bFromIndex, aLength) < 0;
2866 }
2867
2868 /**
2869 * Returns {@code true} if the two specified arrays of floats are
2870 * <i>equal</i> to one another. Two arrays are considered equal if both
2871 * arrays contain the same number of elements, and all corresponding pairs
2872 * of elements in the two arrays are equal. In other words, two arrays
2873 * are equal if they contain the same elements in the same order. Also,
2874 * two array references are considered equal if both are {@code null}.
2875 *
2876 * Two floats {@code f1} and {@code f2} are considered equal if:
2877 * <pre> {@code Float.valueOf(f1).equals(Float.valueOf(f2))}</pre>
2878 * (Unlike the {@code ==} operator, this method considers
2879 * {@code NaN} equal to itself, and 0.0f unequal to -0.0f.)
2880 *
2881 * @param a one array to be tested for equality
2882 * @param a2 the other array to be tested for equality
2883 * @return {@code true} if the two arrays are equal
2884 * @see Float#equals(Object)
2885 */
2886 public static boolean equals(float[] a, float[] a2) {
2887 if (a==a2)
2888 return true;
2889 if (a==null || a2==null)
2890 return false;
2891
2892 int length = a.length;
2893 if (a2.length != length)
2894 return false;
2895
2896 return ArraysSupport.mismatch(a, a2, length) < 0;
2897 }
2898
2899 /**
2900 * Returns true if the two specified arrays of floats, over the specified
2901 * ranges, are <i>equal</i> to one another.
2902 *
2903 * <p>Two arrays are considered equal if the number of elements covered by
2904 * each range is the same, and all corresponding pairs of elements over the
2905 * specified ranges in the two arrays are equal. In other words, two arrays
2906 * are equal if they contain, over the specified ranges, the same elements
2907 * in the same order.
2908 *
2909 * <p>Two floats {@code f1} and {@code f2} are considered equal if:
2910 * <pre> {@code Float.valueOf(f1).equals(Float.valueOf(f2))}</pre>
2911 * (Unlike the {@code ==} operator, this method considers
2912 * {@code NaN} equal to itself, and 0.0f unequal to -0.0f.)
2913 *
2914 * @param a the first array to be tested for equality
2915 * @param aFromIndex the index (inclusive) of the first element in the
2916 * first array to be tested
2917 * @param aToIndex the index (exclusive) of the last element in the
2918 * first array to be tested
2919 * @param b the second array to be tested for equality
2920 * @param bFromIndex the index (inclusive) of the first element in the
2921 * second array to be tested
2922 * @param bToIndex the index (exclusive) of the last element in the
2923 * second array to be tested
2924 * @return {@code true} if the two arrays, over the specified ranges, are
2925 * equal
2926 * @throws IllegalArgumentException
2927 * if {@code aFromIndex > aToIndex} or
2928 * if {@code bFromIndex > bToIndex}
2929 * @throws ArrayIndexOutOfBoundsException
2930 * if {@code aFromIndex < 0 or aToIndex > a.length} or
2931 * if {@code bFromIndex < 0 or bToIndex > b.length}
2932 * @throws NullPointerException
2933 * if either array is {@code null}
2934 * @see Float#equals(Object)
2935 * @since 9
2936 */
2937 public static boolean equals(float[] a, int aFromIndex, int aToIndex,
2938 float[] b, int bFromIndex, int bToIndex) {
2939 rangeCheck(a.length, aFromIndex, aToIndex);
2940 rangeCheck(b.length, bFromIndex, bToIndex);
2941
2942 int aLength = aToIndex - aFromIndex;
2943 int bLength = bToIndex - bFromIndex;
2944 if (aLength != bLength)
2945 return false;
2946
2947 return ArraysSupport.mismatch(a, aFromIndex,
2948 b, bFromIndex, aLength) < 0;
2949 }
2950
2951 /**
2952 * Returns {@code true} if the two specified arrays of Objects are
2953 * <i>equal</i> to one another. The two arrays are considered equal if
2954 * both arrays contain the same number of elements, and all corresponding
2955 * pairs of elements in the two arrays are equal. Two objects {@code e1}
2956 * and {@code e2} are considered <i>equal</i> if
2957 * {@code Objects.equals(e1, e2)}.
2958 * In other words, the two arrays are equal if
2959 * they contain the same elements in the same order. Also, two array
2960 * references are considered equal if both are {@code null}.
2961 *
2962 * @param a one array to be tested for equality
2963 * @param a2 the other array to be tested for equality
2964 * @return {@code true} if the two arrays are equal
2965 */
2966 public static boolean equals(Object[] a, Object[] a2) {
2967 if (a==a2)
2968 return true;
2969 if (a==null || a2==null)
2970 return false;
2971
2972 int length = a.length;
2973 if (a2.length != length)
2974 return false;
2975
2976 for (int i=0; i<length; i++) {
2977 if (!Objects.equals(a[i], a2[i]))
2978 return false;
2979 }
2980
2981 return true;
2982 }
2983
2984 /**
2985 * Returns true if the two specified arrays of Objects, over the specified
2986 * ranges, are <i>equal</i> to one another.
2987 *
2988 * <p>Two arrays are considered equal if the number of elements covered by
2989 * each range is the same, and all corresponding pairs of elements over the
2990 * specified ranges in the two arrays are equal. In other words, two arrays
2991 * are equal if they contain, over the specified ranges, the same elements
2992 * in the same order.
2993 *
2994 * <p>Two objects {@code e1} and {@code e2} are considered <i>equal</i> if
2995 * {@code Objects.equals(e1, e2)}.
2996 *
2997 * @param a the first array to be tested for equality
2998 * @param aFromIndex the index (inclusive) of the first element in the
2999 * first array to be tested
3000 * @param aToIndex the index (exclusive) of the last element in the
3001 * first array to be tested
3002 * @param b the second array to be tested for equality
3003 * @param bFromIndex the index (inclusive) of the first element in the
3004 * second array to be tested
3005 * @param bToIndex the index (exclusive) of the last element in the
3006 * second array to be tested
3007 * @return {@code true} if the two arrays, over the specified ranges, are
3008 * equal
3009 * @throws IllegalArgumentException
3010 * if {@code aFromIndex > aToIndex} or
3011 * if {@code bFromIndex > bToIndex}
3012 * @throws ArrayIndexOutOfBoundsException
3013 * if {@code aFromIndex < 0 or aToIndex > a.length} or
3014 * if {@code bFromIndex < 0 or bToIndex > b.length}
3015 * @throws NullPointerException
3016 * if either array is {@code null}
3017 * @since 9
3018 */
3019 public static boolean equals(Object[] a, int aFromIndex, int aToIndex,
3020 Object[] b, int bFromIndex, int bToIndex) {
3021 rangeCheck(a.length, aFromIndex, aToIndex);
3022 rangeCheck(b.length, bFromIndex, bToIndex);
3023
3024 int aLength = aToIndex - aFromIndex;
3025 int bLength = bToIndex - bFromIndex;
3026 if (aLength != bLength)
3027 return false;
3028
3029 for (int i = 0; i < aLength; i++) {
3030 if (!Objects.equals(a[aFromIndex++], b[bFromIndex++]))
3031 return false;
3032 }
3033
3034 return true;
3035 }
3036
3037 /**
3038 * Returns {@code true} if the two specified arrays of Objects are
3039 * <i>equal</i> to one another.
3040 *
3041 * <p>Two arrays are considered equal if both arrays contain the same number
3042 * of elements, and all corresponding pairs of elements in the two arrays
3043 * are equal. In other words, the two arrays are equal if they contain the
3044 * same elements in the same order. Also, two array references are
3045 * considered equal if both are {@code null}.
3046 *
3047 * <p>Two objects {@code e1} and {@code e2} are considered <i>equal</i> if,
3048 * given the specified comparator, {@code cmp.compare(e1, e2) == 0}.
3049 *
3050 * @param a one array to be tested for equality
3051 * @param a2 the other array to be tested for equality
3052 * @param cmp the comparator to compare array elements
3053 * @param <T> the type of array elements
3054 * @return {@code true} if the two arrays are equal
3055 * @throws NullPointerException if the comparator is {@code null}
3056 * @since 9
3057 */
3058 public static <T> boolean equals(T[] a, T[] a2, Comparator<? super T> cmp) {
3059 Objects.requireNonNull(cmp);
3060 if (a==a2)
3061 return true;
3062 if (a==null || a2==null)
3063 return false;
3064
3065 int length = a.length;
3066 if (a2.length != length)
3067 return false;
3068
3069 for (int i=0; i<length; i++) {
3070 if (cmp.compare(a[i], a2[i]) != 0)
3071 return false;
3072 }
3073
3074 return true;
3075 }
3076
3077 /**
3078 * Returns true if the two specified arrays of Objects, over the specified
3079 * ranges, are <i>equal</i> to one another.
3080 *
3081 * <p>Two arrays are considered equal if the number of elements covered by
3082 * each range is the same, and all corresponding pairs of elements over the
3083 * specified ranges in the two arrays are equal. In other words, two arrays
3084 * are equal if they contain, over the specified ranges, the same elements
3085 * in the same order.
3086 *
3087 * <p>Two objects {@code e1} and {@code e2} are considered <i>equal</i> if,
3088 * given the specified comparator, {@code cmp.compare(e1, e2) == 0}.
3089 *
3090 * @param a the first array to be tested for equality
3091 * @param aFromIndex the index (inclusive) of the first element in the
3092 * first array to be tested
3093 * @param aToIndex the index (exclusive) of the last element in the
3094 * first array to be tested
3095 * @param b the second array to be tested for equality
3096 * @param bFromIndex the index (inclusive) of the first element in the
3097 * second array to be tested
3098 * @param bToIndex the index (exclusive) of the last element in the
3099 * second array to be tested
3100 * @param cmp the comparator to compare array elements
3101 * @param <T> the type of array elements
3102 * @return {@code true} if the two arrays, over the specified ranges, are
3103 * equal
3104 * @throws IllegalArgumentException
3105 * if {@code aFromIndex > aToIndex} or
3106 * if {@code bFromIndex > bToIndex}
3107 * @throws ArrayIndexOutOfBoundsException
3108 * if {@code aFromIndex < 0 or aToIndex > a.length} or
3109 * if {@code bFromIndex < 0 or bToIndex > b.length}
3110 * @throws NullPointerException
3111 * if either array or the comparator is {@code null}
3112 * @since 9
3113 */
3114 public static <T> boolean equals(T[] a, int aFromIndex, int aToIndex,
3115 T[] b, int bFromIndex, int bToIndex,
3116 Comparator<? super T> cmp) {
3117 Objects.requireNonNull(cmp);
3118 rangeCheck(a.length, aFromIndex, aToIndex);
3119 rangeCheck(b.length, bFromIndex, bToIndex);
3120
3121 int aLength = aToIndex - aFromIndex;
3122 int bLength = bToIndex - bFromIndex;
3123 if (aLength != bLength)
3124 return false;
3125
3126 for (int i = 0; i < aLength; i++) {
3127 if (cmp.compare(a[aFromIndex++], b[bFromIndex++]) != 0)
3128 return false;
3129 }
3130
3131 return true;
3132 }
3133
3134 // Filling
3135
3136 /**
3137 * Assigns the specified long value to each element of the specified array
3138 * of longs.
3139 *
3140 * @param a the array to be filled
3141 * @param val the value to be stored in all elements of the array
3142 */
3143 public static void fill(long[] a, long val) {
3144 for (int i = 0, len = a.length; i < len; i++)
3145 a[i] = val;
3146 }
3147
3148 /**
3149 * Assigns the specified long value to each element of the specified
3150 * range of the specified array of longs. The range to be filled
3151 * extends from index {@code fromIndex}, inclusive, to index
3152 * {@code toIndex}, exclusive. (If {@code fromIndex==toIndex}, the
3153 * range to be filled is empty.)
3154 *
3155 * @param a the array to be filled
3156 * @param fromIndex the index of the first element (inclusive) to be
3157 * filled with the specified value
3158 * @param toIndex the index of the last element (exclusive) to be
3159 * filled with the specified value
3160 * @param val the value to be stored in all elements of the array
3161 * @throws IllegalArgumentException if {@code fromIndex > toIndex}
3162 * @throws ArrayIndexOutOfBoundsException if {@code fromIndex < 0} or
3163 * {@code toIndex > a.length}
3164 */
3165 public static void fill(long[] a, int fromIndex, int toIndex, long val) {
3166 rangeCheck(a.length, fromIndex, toIndex);
3167 for (int i = fromIndex; i < toIndex; i++)
3168 a[i] = val;
3169 }
3170
3171 /**
3172 * Assigns the specified int value to each element of the specified array
3173 * of ints.
3174 *
3175 * @param a the array to be filled
3176 * @param val the value to be stored in all elements of the array
3177 */
3178 public static void fill(int[] a, int val) {
3179 for (int i = 0, len = a.length; i < len; i++)
3180 a[i] = val;
3181 }
3182
3183 /**
3184 * Assigns the specified int value to each element of the specified
3185 * range of the specified array of ints. The range to be filled
3186 * extends from index {@code fromIndex}, inclusive, to index
3187 * {@code toIndex}, exclusive. (If {@code fromIndex==toIndex}, the
3188 * range to be filled is empty.)
3189 *
3190 * @param a the array to be filled
3191 * @param fromIndex the index of the first element (inclusive) to be
3192 * filled with the specified value
3193 * @param toIndex the index of the last element (exclusive) to be
3194 * filled with the specified value
3195 * @param val the value to be stored in all elements of the array
3196 * @throws IllegalArgumentException if {@code fromIndex > toIndex}
3197 * @throws ArrayIndexOutOfBoundsException if {@code fromIndex < 0} or
3198 * {@code toIndex > a.length}
3199 */
3200 public static void fill(int[] a, int fromIndex, int toIndex, int val) {
3201 rangeCheck(a.length, fromIndex, toIndex);
3202 for (int i = fromIndex; i < toIndex; i++)
3203 a[i] = val;
3204 }
3205
3206 /**
3207 * Assigns the specified short value to each element of the specified array
3208 * of shorts.
3209 *
3210 * @param a the array to be filled
3211 * @param val the value to be stored in all elements of the array
3212 */
3213 public static void fill(short[] a, short val) {
3214 for (int i = 0, len = a.length; i < len; i++)
3215 a[i] = val;
3216 }
3217
3218 /**
3219 * Assigns the specified short value to each element of the specified
3220 * range of the specified array of shorts. The range to be filled
3221 * extends from index {@code fromIndex}, inclusive, to index
3222 * {@code toIndex}, exclusive. (If {@code fromIndex==toIndex}, the
3223 * range to be filled is empty.)
3224 *
3225 * @param a the array to be filled
3226 * @param fromIndex the index of the first element (inclusive) to be
3227 * filled with the specified value
3228 * @param toIndex the index of the last element (exclusive) to be
3229 * filled with the specified value
3230 * @param val the value to be stored in all elements of the array
3231 * @throws IllegalArgumentException if {@code fromIndex > toIndex}
3232 * @throws ArrayIndexOutOfBoundsException if {@code fromIndex < 0} or
3233 * {@code toIndex > a.length}
3234 */
3235 public static void fill(short[] a, int fromIndex, int toIndex, short val) {
3236 rangeCheck(a.length, fromIndex, toIndex);
3237 for (int i = fromIndex; i < toIndex; i++)
3238 a[i] = val;
3239 }
3240
3241 /**
3242 * Assigns the specified char value to each element of the specified array
3243 * of chars.
3244 *
3245 * @param a the array to be filled
3246 * @param val the value to be stored in all elements of the array
3247 */
3248 public static void fill(char[] a, char val) {
3249 for (int i = 0, len = a.length; i < len; i++)
3250 a[i] = val;
3251 }
3252
3253 /**
3254 * Assigns the specified char value to each element of the specified
3255 * range of the specified array of chars. The range to be filled
3256 * extends from index {@code fromIndex}, inclusive, to index
3257 * {@code toIndex}, exclusive. (If {@code fromIndex==toIndex}, the
3258 * range to be filled is empty.)
3259 *
3260 * @param a the array to be filled
3261 * @param fromIndex the index of the first element (inclusive) to be
3262 * filled with the specified value
3263 * @param toIndex the index of the last element (exclusive) to be
3264 * filled with the specified value
3265 * @param val the value to be stored in all elements of the array
3266 * @throws IllegalArgumentException if {@code fromIndex > toIndex}
3267 * @throws ArrayIndexOutOfBoundsException if {@code fromIndex < 0} or
3268 * {@code toIndex > a.length}
3269 */
3270 public static void fill(char[] a, int fromIndex, int toIndex, char val) {
3271 rangeCheck(a.length, fromIndex, toIndex);
3272 for (int i = fromIndex; i < toIndex; i++)
3273 a[i] = val;
3274 }
3275
3276 /**
3277 * Assigns the specified byte value to each element of the specified array
3278 * of bytes.
3279 *
3280 * @param a the array to be filled
3281 * @param val the value to be stored in all elements of the array
3282 */
3283 public static void fill(byte[] a, byte val) {
3284 for (int i = 0, len = a.length; i < len; i++)
3285 a[i] = val;
3286 }
3287
3288 /**
3289 * Assigns the specified byte value to each element of the specified
3290 * range of the specified array of bytes. The range to be filled
3291 * extends from index {@code fromIndex}, inclusive, to index
3292 * {@code toIndex}, exclusive. (If {@code fromIndex==toIndex}, the
3293 * range to be filled is empty.)
3294 *
3295 * @param a the array to be filled
3296 * @param fromIndex the index of the first element (inclusive) to be
3297 * filled with the specified value
3298 * @param toIndex the index of the last element (exclusive) to be
3299 * filled with the specified value
3300 * @param val the value to be stored in all elements of the array
3301 * @throws IllegalArgumentException if {@code fromIndex > toIndex}
3302 * @throws ArrayIndexOutOfBoundsException if {@code fromIndex < 0} or
3303 * {@code toIndex > a.length}
3304 */
3305 public static void fill(byte[] a, int fromIndex, int toIndex, byte val) {
3306 rangeCheck(a.length, fromIndex, toIndex);
3307 for (int i = fromIndex; i < toIndex; i++)
3308 a[i] = val;
3309 }
3310
3311 /**
3312 * Assigns the specified boolean value to each element of the specified
3313 * array of booleans.
3314 *
3315 * @param a the array to be filled
3316 * @param val the value to be stored in all elements of the array
3317 */
3318 public static void fill(boolean[] a, boolean val) {
3319 for (int i = 0, len = a.length; i < len; i++)
3320 a[i] = val;
3321 }
3322
3323 /**
3324 * Assigns the specified boolean value to each element of the specified
3325 * range of the specified array of booleans. The range to be filled
3326 * extends from index {@code fromIndex}, inclusive, to index
3327 * {@code toIndex}, exclusive. (If {@code fromIndex==toIndex}, the
3328 * range to be filled is empty.)
3329 *
3330 * @param a the array to be filled
3331 * @param fromIndex the index of the first element (inclusive) to be
3332 * filled with the specified value
3333 * @param toIndex the index of the last element (exclusive) to be
3334 * filled with the specified value
3335 * @param val the value to be stored in all elements of the array
3336 * @throws IllegalArgumentException if {@code fromIndex > toIndex}
3337 * @throws ArrayIndexOutOfBoundsException if {@code fromIndex < 0} or
3338 * {@code toIndex > a.length}
3339 */
3340 public static void fill(boolean[] a, int fromIndex, int toIndex,
3341 boolean val) {
3342 rangeCheck(a.length, fromIndex, toIndex);
3343 for (int i = fromIndex; i < toIndex; i++)
3344 a[i] = val;
3345 }
3346
3347 /**
3348 * Assigns the specified double value to each element of the specified
3349 * array of doubles.
3350 *
3351 * @param a the array to be filled
3352 * @param val the value to be stored in all elements of the array
3353 */
3354 public static void fill(double[] a, double val) {
3355 for (int i = 0, len = a.length; i < len; i++)
3356 a[i] = val;
3357 }
3358
3359 /**
3360 * Assigns the specified double value to each element of the specified
3361 * range of the specified array of doubles. The range to be filled
3362 * extends from index {@code fromIndex}, inclusive, to index
3363 * {@code toIndex}, exclusive. (If {@code fromIndex==toIndex}, the
3364 * range to be filled is empty.)
3365 *
3366 * @param a the array to be filled
3367 * @param fromIndex the index of the first element (inclusive) to be
3368 * filled with the specified value
3369 * @param toIndex the index of the last element (exclusive) to be
3370 * filled with the specified value
3371 * @param val the value to be stored in all elements of the array
3372 * @throws IllegalArgumentException if {@code fromIndex > toIndex}
3373 * @throws ArrayIndexOutOfBoundsException if {@code fromIndex < 0} or
3374 * {@code toIndex > a.length}
3375 */
3376 public static void fill(double[] a, int fromIndex, int toIndex,double val){
3377 rangeCheck(a.length, fromIndex, toIndex);
3378 for (int i = fromIndex; i < toIndex; i++)
3379 a[i] = val;
3380 }
3381
3382 /**
3383 * Assigns the specified float value to each element of the specified array
3384 * of floats.
3385 *
3386 * @param a the array to be filled
3387 * @param val the value to be stored in all elements of the array
3388 */
3389 public static void fill(float[] a, float val) {
3390 for (int i = 0, len = a.length; i < len; i++)
3391 a[i] = val;
3392 }
3393
3394 /**
3395 * Assigns the specified float value to each element of the specified
3396 * range of the specified array of floats. The range to be filled
3397 * extends from index {@code fromIndex}, inclusive, to index
3398 * {@code toIndex}, exclusive. (If {@code fromIndex==toIndex}, the
3399 * range to be filled is empty.)
3400 *
3401 * @param a the array to be filled
3402 * @param fromIndex the index of the first element (inclusive) to be
3403 * filled with the specified value
3404 * @param toIndex the index of the last element (exclusive) to be
3405 * filled with the specified value
3406 * @param val the value to be stored in all elements of the array
3407 * @throws IllegalArgumentException if {@code fromIndex > toIndex}
3408 * @throws ArrayIndexOutOfBoundsException if {@code fromIndex < 0} or
3409 * {@code toIndex > a.length}
3410 */
3411 public static void fill(float[] a, int fromIndex, int toIndex, float val) {
3412 rangeCheck(a.length, fromIndex, toIndex);
3413 for (int i = fromIndex; i < toIndex; i++)
3414 a[i] = val;
3415 }
3416
3417 /**
3418 * Assigns the specified Object reference to each element of the specified
3419 * array of Objects.
3420 *
3421 * @param a the array to be filled
3422 * @param val the value to be stored in all elements of the array
3423 * @throws ArrayStoreException if the specified value is not of a
3424 * runtime type that can be stored in the specified array
3425 */
3426 public static void fill(Object[] a, Object val) {
3427 for (int i = 0, len = a.length; i < len; i++)
3428 a[i] = val;
3429 }
3430
3431 /**
3432 * Assigns the specified Object reference to each element of the specified
3433 * range of the specified array of Objects. The range to be filled
3434 * extends from index {@code fromIndex}, inclusive, to index
3435 * {@code toIndex}, exclusive. (If {@code fromIndex==toIndex}, the
3436 * range to be filled is empty.)
3437 *
3438 * @param a the array to be filled
3439 * @param fromIndex the index of the first element (inclusive) to be
3440 * filled with the specified value
3441 * @param toIndex the index of the last element (exclusive) to be
3442 * filled with the specified value
3443 * @param val the value to be stored in all elements of the array
3444 * @throws IllegalArgumentException if {@code fromIndex > toIndex}
3445 * @throws ArrayIndexOutOfBoundsException if {@code fromIndex < 0} or
3446 * {@code toIndex > a.length}
3447 * @throws ArrayStoreException if the specified value is not of a
3448 * runtime type that can be stored in the specified array
3449 */
3450 public static void fill(Object[] a, int fromIndex, int toIndex, Object val) {
3451 rangeCheck(a.length, fromIndex, toIndex);
3452 for (int i = fromIndex; i < toIndex; i++)
3453 a[i] = val;
3454 }
3455
3456 // Cloning
3457
3458 /**
3459 * Copies the specified array, truncating or padding with nulls (if necessary)
3460 * so the copy has the specified length. For all indices that are
3461 * valid in both the original array and the copy, the two arrays will
3462 * contain identical values. For any indices that are valid in the
3463 * copy but not the original, the copy will contain {@code null}.
3464 * Such indices will exist if and only if the specified length
3465 * is greater than that of the original array.
3466 * The resulting array is of exactly the same class as the original array.
3467 *
3468 * @param <T> the class of the objects in the array
3469 * @param original the array to be copied
3470 * @param newLength the length of the copy to be returned
3471 * @return a copy of the original array, truncated or padded with nulls
3472 * to obtain the specified length
3473 * @throws NegativeArraySizeException if {@code newLength} is negative
3474 * @throws NullPointerException if {@code original} is null
3475 * @since 1.6
3476 */
3477 @SuppressWarnings("unchecked")
3478 public static <T> T[] copyOf(T[] original, int newLength) {
3479 return (T[]) copyOf(original, newLength, original.getClass());
3480 }
3481
3482 /**
3483 * Copies the specified array, truncating or padding with nulls (if necessary)
3484 * so the copy has the specified length. For all indices that are
3485 * valid in both the original array and the copy, the two arrays will
3486 * contain identical values. For any indices that are valid in the
3487 * copy but not the original, the copy will contain {@code null}.
3488 * Such indices will exist if and only if the specified length
3489 * is greater than that of the original array.
3490 * The resulting array is of the class {@code newType}.
3491 *
3492 * @param <T> the class of the objects in the returned array
3493 * @param <U> the class of the objects in the original array
3494 * @param original the array to be copied
3495 * @param newLength the length of the copy to be returned
3496 * @param newType the class of the copy to be returned
3497 * @return a copy of the original array, truncated or padded with nulls
3498 * to obtain the specified length
3499 * @throws NegativeArraySizeException if {@code newLength} is negative
3500 * @throws NullPointerException if {@code original} is null
3501 * @throws ArrayStoreException if an element copied from
3502 * {@code original} is not of a runtime type that can be stored in
3503 * an array of class {@code newType}
3504 * @since 1.6
3505 */
3506 @IntrinsicCandidate
3507 public static <T,U> T[] copyOf(U[] original, int newLength, Class<? extends T[]> newType) {
3508 Class<?> componentType = newType.getComponentType();
3509 Object tmp = null;
3510 if (original.getClass() == newType && ValueClass.isConcreteValueClass(componentType)) {
3511 tmp = ValueClass.copyOfSpecialArray((Object[])original, 0, newLength);
3512 } else {
3513 tmp = ((Object)newType == (Object)Object[].class)
3514 ? new Object[newLength]
3515 : Array.newInstance(componentType, newLength);
3516 System.arraycopy(original, 0, tmp, 0,
3517 Math.min(original.length, newLength));
3518 }
3519 @SuppressWarnings("unchecked")
3520 T[] copy = (T[])tmp;
3521 return copy;
3522 }
3523
3524 /**
3525 * Copies the specified array, truncating or padding with zeros (if necessary)
3526 * so the copy has the specified length. For all indices that are
3527 * valid in both the original array and the copy, the two arrays will
3528 * contain identical values. For any indices that are valid in the
3529 * copy but not the original, the copy will contain {@code (byte)0}.
3530 * Such indices will exist if and only if the specified length
3531 * is greater than that of the original array.
3532 *
3533 * @param original the array to be copied
3534 * @param newLength the length of the copy to be returned
3535 * @return a copy of the original array, truncated or padded with zeros
3536 * to obtain the specified length
3537 * @throws NegativeArraySizeException if {@code newLength} is negative
3538 * @throws NullPointerException if {@code original} is null
3539 * @since 1.6
3540 */
3541 public static byte[] copyOf(byte[] original, int newLength) {
3542 if (newLength == original.length) {
3543 return original.clone();
3544 }
3545 byte[] copy = new byte[newLength];
3546 System.arraycopy(original, 0, copy, 0,
3547 Math.min(original.length, newLength));
3548 return copy;
3549 }
3550
3551 /**
3552 * Copies the specified array, truncating or padding with zeros (if necessary)
3553 * so the copy has the specified length. For all indices that are
3554 * valid in both the original array and the copy, the two arrays will
3555 * contain identical values. For any indices that are valid in the
3556 * copy but not the original, the copy will contain {@code (short)0}.
3557 * Such indices will exist if and only if the specified length
3558 * is greater than that of the original array.
3559 *
3560 * @param original the array to be copied
3561 * @param newLength the length of the copy to be returned
3562 * @return a copy of the original array, truncated or padded with zeros
3563 * to obtain the specified length
3564 * @throws NegativeArraySizeException if {@code newLength} is negative
3565 * @throws NullPointerException if {@code original} is null
3566 * @since 1.6
3567 */
3568 public static short[] copyOf(short[] original, int newLength) {
3569 if (newLength == original.length) {
3570 return original.clone();
3571 }
3572 short[] copy = new short[newLength];
3573 System.arraycopy(original, 0, copy, 0,
3574 Math.min(original.length, newLength));
3575 return copy;
3576 }
3577
3578 /**
3579 * Copies the specified array, truncating or padding with zeros (if necessary)
3580 * so the copy has the specified length. For all indices that are
3581 * valid in both the original array and the copy, the two arrays will
3582 * contain identical values. For any indices that are valid in the
3583 * copy but not the original, the copy will contain {@code 0}.
3584 * Such indices will exist if and only if the specified length
3585 * is greater than that of the original array.
3586 *
3587 * @param original the array to be copied
3588 * @param newLength the length of the copy to be returned
3589 * @return a copy of the original array, truncated or padded with zeros
3590 * to obtain the specified length
3591 * @throws NegativeArraySizeException if {@code newLength} is negative
3592 * @throws NullPointerException if {@code original} is null
3593 * @since 1.6
3594 */
3595 public static int[] copyOf(int[] original, int newLength) {
3596 if (newLength == original.length) {
3597 return original.clone();
3598 }
3599 int[] copy = new int[newLength];
3600 System.arraycopy(original, 0, copy, 0,
3601 Math.min(original.length, newLength));
3602 return copy;
3603 }
3604
3605
3606 /**
3607 * Copies the specified array, truncating or padding with zeros (if necessary)
3608 * so the copy has the specified length. For all indices that are
3609 * valid in both the original array and the copy, the two arrays will
3610 * contain identical values. For any indices that are valid in the
3611 * copy but not the original, the copy will contain {@code 0L}.
3612 * Such indices will exist if and only if the specified length
3613 * is greater than that of the original array.
3614 *
3615 * @param original the array to be copied
3616 * @param newLength the length of the copy to be returned
3617 * @return a copy of the original array, truncated or padded with zeros
3618 * to obtain the specified length
3619 * @throws NegativeArraySizeException if {@code newLength} is negative
3620 * @throws NullPointerException if {@code original} is null
3621 * @since 1.6
3622 */
3623 public static long[] copyOf(long[] original, int newLength) {
3624 if (newLength == original.length) {
3625 return original.clone();
3626 }
3627 long[] copy = new long[newLength];
3628 System.arraycopy(original, 0, copy, 0,
3629 Math.min(original.length, newLength));
3630 return copy;
3631 }
3632
3633 /**
3634 * Copies the specified array, truncating or padding with null characters (if necessary)
3635 * so the copy has the specified length. For all indices that are valid
3636 * in both the original array and the copy, the two arrays will contain
3637 * identical values. For any indices that are valid in the copy but not
3638 * the original, the copy will contain {@code '\u005cu0000'}. Such indices
3639 * will exist if and only if the specified length is greater than that of
3640 * the original array.
3641 *
3642 * @param original the array to be copied
3643 * @param newLength the length of the copy to be returned
3644 * @return a copy of the original array, truncated or padded with null characters
3645 * to obtain the specified length
3646 * @throws NegativeArraySizeException if {@code newLength} is negative
3647 * @throws NullPointerException if {@code original} is null
3648 * @since 1.6
3649 */
3650 public static char[] copyOf(char[] original, int newLength) {
3651 if (newLength == original.length) {
3652 return original.clone();
3653 }
3654 char[] copy = new char[newLength];
3655 System.arraycopy(original, 0, copy, 0,
3656 Math.min(original.length, newLength));
3657 return copy;
3658 }
3659
3660 /**
3661 * Copies the specified array, truncating or padding with zeros (if necessary)
3662 * so the copy has the specified length. For all indices that are
3663 * valid in both the original array and the copy, the two arrays will
3664 * contain identical values. For any indices that are valid in the
3665 * copy but not the original, the copy will contain {@code 0f}.
3666 * Such indices will exist if and only if the specified length
3667 * is greater than that of the original array.
3668 *
3669 * @param original the array to be copied
3670 * @param newLength the length of the copy to be returned
3671 * @return a copy of the original array, truncated or padded with zeros
3672 * to obtain the specified length
3673 * @throws NegativeArraySizeException if {@code newLength} is negative
3674 * @throws NullPointerException if {@code original} is null
3675 * @since 1.6
3676 */
3677 public static float[] copyOf(float[] original, int newLength) {
3678 if (newLength == original.length) {
3679 return original.clone();
3680 }
3681 float[] copy = new float[newLength];
3682 System.arraycopy(original, 0, copy, 0,
3683 Math.min(original.length, newLength));
3684 return copy;
3685 }
3686
3687 /**
3688 * Copies the specified array, truncating or padding with zeros (if necessary)
3689 * so the copy has the specified length. For all indices that are
3690 * valid in both the original array and the copy, the two arrays will
3691 * contain identical values. For any indices that are valid in the
3692 * copy but not the original, the copy will contain {@code 0d}.
3693 * Such indices will exist if and only if the specified length
3694 * is greater than that of the original array.
3695 *
3696 * @param original the array to be copied
3697 * @param newLength the length of the copy to be returned
3698 * @return a copy of the original array, truncated or padded with zeros
3699 * to obtain the specified length
3700 * @throws NegativeArraySizeException if {@code newLength} is negative
3701 * @throws NullPointerException if {@code original} is null
3702 * @since 1.6
3703 */
3704 public static double[] copyOf(double[] original, int newLength) {
3705 if (newLength == original.length) {
3706 return original.clone();
3707 }
3708 double[] copy = new double[newLength];
3709 System.arraycopy(original, 0, copy, 0,
3710 Math.min(original.length, newLength));
3711 return copy;
3712 }
3713
3714 /**
3715 * Copies the specified array, truncating or padding with {@code false} (if necessary)
3716 * so the copy has the specified length. For all indices that are
3717 * valid in both the original array and the copy, the two arrays will
3718 * contain identical values. For any indices that are valid in the
3719 * copy but not the original, the copy will contain {@code false}.
3720 * Such indices will exist if and only if the specified length
3721 * is greater than that of the original array.
3722 *
3723 * @param original the array to be copied
3724 * @param newLength the length of the copy to be returned
3725 * @return a copy of the original array, truncated or padded with false elements
3726 * to obtain the specified length
3727 * @throws NegativeArraySizeException if {@code newLength} is negative
3728 * @throws NullPointerException if {@code original} is null
3729 * @since 1.6
3730 */
3731 public static boolean[] copyOf(boolean[] original, int newLength) {
3732 if (newLength == original.length) {
3733 return original.clone();
3734 }
3735 boolean[] copy = new boolean[newLength];
3736 System.arraycopy(original, 0, copy, 0,
3737 Math.min(original.length, newLength));
3738 return copy;
3739 }
3740
3741 /**
3742 * Copies the specified range of the specified array into a new array.
3743 * The initial index of the range ({@code from}) must lie between zero
3744 * and {@code original.length}, inclusive. The value at
3745 * {@code original[from]} is placed into the initial element of the copy
3746 * (unless {@code from == original.length} or {@code from == to}).
3747 * Values from subsequent elements in the original array are placed into
3748 * subsequent elements in the copy. The final index of the range
3749 * ({@code to}), which must be greater than or equal to {@code from},
3750 * may be greater than {@code original.length}, in which case
3751 * {@code null} is placed in all elements of the copy whose index is
3752 * greater than or equal to {@code original.length - from}. The length
3753 * of the returned array will be {@code to - from}.
3754 * <p>
3755 * The resulting array is of exactly the same class as the original array.
3756 *
3757 * @param <T> the class of the objects in the array
3758 * @param original the array from which a range is to be copied
3759 * @param from the initial index of the range to be copied, inclusive
3760 * @param to the final index of the range to be copied, exclusive.
3761 * (This index may lie outside the array.)
3762 * @return a new array containing the specified range from the original array,
3763 * truncated or padded with nulls to obtain the required length
3764 * @throws ArrayIndexOutOfBoundsException if {@code from < 0}
3765 * or {@code from > original.length}
3766 * @throws IllegalArgumentException if {@code from > to}
3767 * @throws NullPointerException if {@code original} is null
3768 * @since 1.6
3769 */
3770 @SuppressWarnings("unchecked")
3771 public static <T> T[] copyOfRange(T[] original, int from, int to) {
3772 return copyOfRange(original, from, to, (Class<? extends T[]>) original.getClass());
3773 }
3774
3775 /**
3776 * Copies the specified range of the specified array into a new array.
3777 * The initial index of the range ({@code from}) must lie between zero
3778 * and {@code original.length}, inclusive. The value at
3779 * {@code original[from]} is placed into the initial element of the copy
3780 * (unless {@code from == original.length} or {@code from == to}).
3781 * Values from subsequent elements in the original array are placed into
3782 * subsequent elements in the copy. The final index of the range
3783 * ({@code to}), which must be greater than or equal to {@code from},
3784 * may be greater than {@code original.length}, in which case
3785 * {@code null} is placed in all elements of the copy whose index is
3786 * greater than or equal to {@code original.length - from}. The length
3787 * of the returned array will be {@code to - from}.
3788 * The resulting array is of the class {@code newType}.
3789 *
3790 * @param <T> the class of the objects in the returned array
3791 * @param <U> the class of the objects in the original array
3792 * @param original the array from which a range is to be copied
3793 * @param from the initial index of the range to be copied, inclusive
3794 * @param to the final index of the range to be copied, exclusive.
3795 * (This index may lie outside the array.)
3796 * @param newType the class of the copy to be returned
3797 * @return a new array containing the specified range from the original array,
3798 * truncated or padded with nulls to obtain the required length
3799 * @throws ArrayIndexOutOfBoundsException if {@code from < 0}
3800 * or {@code from > original.length}
3801 * @throws IllegalArgumentException if {@code from > to}
3802 * @throws NullPointerException if {@code original} is null
3803 * @throws ArrayStoreException if an element copied from
3804 * {@code original} is not of a runtime type that can be stored in
3805 * an array of class {@code newType}.
3806 * @since 1.6
3807 */
3808 @IntrinsicCandidate
3809 public static <T,U> T[] copyOfRange(U[] original, int from, int to, Class<? extends T[]> newType) {
3810 int newLength = to - from;
3811 if (newLength < 0) {
3812 throw new IllegalArgumentException(from + " > " + to);
3813 }
3814 Class<?> componentType = newType.getComponentType();
3815 Object tmp = null;
3816 if (original.getClass() == newType && ValueClass.isConcreteValueClass(componentType)) {
3817 tmp = ValueClass.copyOfSpecialArray((Object[])original, from, to);
3818 } else {
3819 tmp = ((Object)newType == (Object)Object[].class)
3820 ? new Object[newLength]
3821 : Array.newInstance(componentType, newLength);
3822 System.arraycopy(original, from, tmp, 0,
3823 Math.min(original.length - from, newLength));
3824 }
3825 @SuppressWarnings("unchecked")
3826 T[] copy = (T[])tmp;
3827 return copy;
3828 }
3829
3830 /**
3831 * Copies the specified range of the specified array into a new array.
3832 * The initial index of the range ({@code from}) must lie between zero
3833 * and {@code original.length}, inclusive. The value at
3834 * {@code original[from]} is placed into the initial element of the copy
3835 * (unless {@code from == original.length} or {@code from == to}).
3836 * Values from subsequent elements in the original array are placed into
3837 * subsequent elements in the copy. The final index of the range
3838 * ({@code to}), which must be greater than or equal to {@code from},
3839 * may be greater than {@code original.length}, in which case
3840 * {@code (byte)0} is placed in all elements of the copy whose index is
3841 * greater than or equal to {@code original.length - from}. The length
3842 * of the returned array will be {@code to - from}.
3843 *
3844 * @param original the array from which a range is to be copied
3845 * @param from the initial index of the range to be copied, inclusive
3846 * @param to the final index of the range to be copied, exclusive.
3847 * (This index may lie outside the array.)
3848 * @return a new array containing the specified range from the original array,
3849 * truncated or padded with zeros to obtain the required length
3850 * @throws ArrayIndexOutOfBoundsException if {@code from < 0}
3851 * or {@code from > original.length}
3852 * @throws IllegalArgumentException if {@code from > to}
3853 * @throws NullPointerException if {@code original} is null
3854 * @since 1.6
3855 */
3856 public static byte[] copyOfRange(byte[] original, int from, int to) {
3857 if (from == 0 && to == original.length) {
3858 return original.clone();
3859 }
3860 int newLength = to - from;
3861 if (newLength < 0) {
3862 throw new IllegalArgumentException(from + " > " + to);
3863 }
3864 byte[] copy = new byte[newLength];
3865 System.arraycopy(original, from, copy, 0,
3866 Math.min(original.length - from, newLength));
3867 return copy;
3868 }
3869
3870 /**
3871 * Copies the specified range of the specified array into a new array.
3872 * The initial index of the range ({@code from}) must lie between zero
3873 * and {@code original.length}, inclusive. The value at
3874 * {@code original[from]} is placed into the initial element of the copy
3875 * (unless {@code from == original.length} or {@code from == to}).
3876 * Values from subsequent elements in the original array are placed into
3877 * subsequent elements in the copy. The final index of the range
3878 * ({@code to}), which must be greater than or equal to {@code from},
3879 * may be greater than {@code original.length}, in which case
3880 * {@code (short)0} is placed in all elements of the copy whose index is
3881 * greater than or equal to {@code original.length - from}. The length
3882 * of the returned array will be {@code to - from}.
3883 *
3884 * @param original the array from which a range is to be copied
3885 * @param from the initial index of the range to be copied, inclusive
3886 * @param to the final index of the range to be copied, exclusive.
3887 * (This index may lie outside the array.)
3888 * @return a new array containing the specified range from the original array,
3889 * truncated or padded with zeros to obtain the required length
3890 * @throws ArrayIndexOutOfBoundsException if {@code from < 0}
3891 * or {@code from > original.length}
3892 * @throws IllegalArgumentException if {@code from > to}
3893 * @throws NullPointerException if {@code original} is null
3894 * @since 1.6
3895 */
3896 public static short[] copyOfRange(short[] original, int from, int to) {
3897 if (from == 0 && to == original.length) {
3898 return original.clone();
3899 }
3900 int newLength = to - from;
3901 if (newLength < 0) {
3902 throw new IllegalArgumentException(from + " > " + to);
3903 }
3904 short[] copy = new short[newLength];
3905 System.arraycopy(original, from, copy, 0,
3906 Math.min(original.length - from, newLength));
3907 return copy;
3908 }
3909
3910 /**
3911 * Copies the specified range of the specified array into a new array.
3912 * The initial index of the range ({@code from}) must lie between zero
3913 * and {@code original.length}, inclusive. The value at
3914 * {@code original[from]} is placed into the initial element of the copy
3915 * (unless {@code from == original.length} or {@code from == to}).
3916 * Values from subsequent elements in the original array are placed into
3917 * subsequent elements in the copy. The final index of the range
3918 * ({@code to}), which must be greater than or equal to {@code from},
3919 * may be greater than {@code original.length}, in which case
3920 * {@code 0} is placed in all elements of the copy whose index is
3921 * greater than or equal to {@code original.length - from}. The length
3922 * of the returned array will be {@code to - from}.
3923 *
3924 * @param original the array from which a range is to be copied
3925 * @param from the initial index of the range to be copied, inclusive
3926 * @param to the final index of the range to be copied, exclusive.
3927 * (This index may lie outside the array.)
3928 * @return a new array containing the specified range from the original array,
3929 * truncated or padded with zeros to obtain the required length
3930 * @throws ArrayIndexOutOfBoundsException if {@code from < 0}
3931 * or {@code from > original.length}
3932 * @throws IllegalArgumentException if {@code from > to}
3933 * @throws NullPointerException if {@code original} is null
3934 * @since 1.6
3935 */
3936 public static int[] copyOfRange(int[] original, int from, int to) {
3937 if (from == 0 && to == original.length) {
3938 return original.clone();
3939 }
3940 int newLength = to - from;
3941 if (newLength < 0) {
3942 throw new IllegalArgumentException(from + " > " + to);
3943 }
3944 int[] copy = new int[newLength];
3945 System.arraycopy(original, from, copy, 0,
3946 Math.min(original.length - from, newLength));
3947 return copy;
3948 }
3949
3950 /**
3951 * Copies the specified range of the specified array into a new array.
3952 * The initial index of the range ({@code from}) must lie between zero
3953 * and {@code original.length}, inclusive. The value at
3954 * {@code original[from]} is placed into the initial element of the copy
3955 * (unless {@code from == original.length} or {@code from == to}).
3956 * Values from subsequent elements in the original array are placed into
3957 * subsequent elements in the copy. The final index of the range
3958 * ({@code to}), which must be greater than or equal to {@code from},
3959 * may be greater than {@code original.length}, in which case
3960 * {@code 0L} is placed in all elements of the copy whose index is
3961 * greater than or equal to {@code original.length - from}. The length
3962 * of the returned array will be {@code to - from}.
3963 *
3964 * @param original the array from which a range is to be copied
3965 * @param from the initial index of the range to be copied, inclusive
3966 * @param to the final index of the range to be copied, exclusive.
3967 * (This index may lie outside the array.)
3968 * @return a new array containing the specified range from the original array,
3969 * truncated or padded with zeros to obtain the required length
3970 * @throws ArrayIndexOutOfBoundsException if {@code from < 0}
3971 * or {@code from > original.length}
3972 * @throws IllegalArgumentException if {@code from > to}
3973 * @throws NullPointerException if {@code original} is null
3974 * @since 1.6
3975 */
3976 public static long[] copyOfRange(long[] original, int from, int to) {
3977 if (from == 0 && to == original.length) {
3978 return original.clone();
3979 }
3980 int newLength = to - from;
3981 if (newLength < 0) {
3982 throw new IllegalArgumentException(from + " > " + to);
3983 }
3984 long[] copy = new long[newLength];
3985 System.arraycopy(original, from, copy, 0,
3986 Math.min(original.length - from, newLength));
3987 return copy;
3988 }
3989
3990 /**
3991 * Copies the specified range of the specified array into a new array.
3992 * The initial index of the range ({@code from}) must lie between zero
3993 * and {@code original.length}, inclusive. The value at
3994 * {@code original[from]} is placed into the initial element of the copy
3995 * (unless {@code from == original.length} or {@code from == to}).
3996 * Values from subsequent elements in the original array are placed into
3997 * subsequent elements in the copy. The final index of the range
3998 * ({@code to}), which must be greater than or equal to {@code from},
3999 * may be greater than {@code original.length}, in which case
4000 * {@code '\u005cu0000'} is placed in all elements of the copy whose index is
4001 * greater than or equal to {@code original.length - from}. The length
4002 * of the returned array will be {@code to - from}.
4003 *
4004 * @param original the array from which a range is to be copied
4005 * @param from the initial index of the range to be copied, inclusive
4006 * @param to the final index of the range to be copied, exclusive.
4007 * (This index may lie outside the array.)
4008 * @return a new array containing the specified range from the original array,
4009 * truncated or padded with null characters to obtain the required length
4010 * @throws ArrayIndexOutOfBoundsException if {@code from < 0}
4011 * or {@code from > original.length}
4012 * @throws IllegalArgumentException if {@code from > to}
4013 * @throws NullPointerException if {@code original} is null
4014 * @since 1.6
4015 */
4016 public static char[] copyOfRange(char[] original, int from, int to) {
4017 if (from == 0 && to == original.length) {
4018 return original.clone();
4019 }
4020 int newLength = to - from;
4021 if (newLength < 0) {
4022 throw new IllegalArgumentException(from + " > " + to);
4023 }
4024 char[] copy = new char[newLength];
4025 System.arraycopy(original, from, copy, 0,
4026 Math.min(original.length - from, newLength));
4027 return copy;
4028 }
4029
4030 /**
4031 * Copies the specified range of the specified array into a new array.
4032 * The initial index of the range ({@code from}) must lie between zero
4033 * and {@code original.length}, inclusive. The value at
4034 * {@code original[from]} is placed into the initial element of the copy
4035 * (unless {@code from == original.length} or {@code from == to}).
4036 * Values from subsequent elements in the original array are placed into
4037 * subsequent elements in the copy. The final index of the range
4038 * ({@code to}), which must be greater than or equal to {@code from},
4039 * may be greater than {@code original.length}, in which case
4040 * {@code 0f} is placed in all elements of the copy whose index is
4041 * greater than or equal to {@code original.length - from}. The length
4042 * of the returned array will be {@code to - from}.
4043 *
4044 * @param original the array from which a range is to be copied
4045 * @param from the initial index of the range to be copied, inclusive
4046 * @param to the final index of the range to be copied, exclusive.
4047 * (This index may lie outside the array.)
4048 * @return a new array containing the specified range from the original array,
4049 * truncated or padded with zeros to obtain the required length
4050 * @throws ArrayIndexOutOfBoundsException if {@code from < 0}
4051 * or {@code from > original.length}
4052 * @throws IllegalArgumentException if {@code from > to}
4053 * @throws NullPointerException if {@code original} is null
4054 * @since 1.6
4055 */
4056 public static float[] copyOfRange(float[] original, int from, int to) {
4057 if (from == 0 && to == original.length) {
4058 return original.clone();
4059 }
4060 int newLength = to - from;
4061 if (newLength < 0) {
4062 throw new IllegalArgumentException(from + " > " + to);
4063 }
4064 float[] copy = new float[newLength];
4065 System.arraycopy(original, from, copy, 0,
4066 Math.min(original.length - from, newLength));
4067 return copy;
4068 }
4069
4070 /**
4071 * Copies the specified range of the specified array into a new array.
4072 * The initial index of the range ({@code from}) must lie between zero
4073 * and {@code original.length}, inclusive. The value at
4074 * {@code original[from]} is placed into the initial element of the copy
4075 * (unless {@code from == original.length} or {@code from == to}).
4076 * Values from subsequent elements in the original array are placed into
4077 * subsequent elements in the copy. The final index of the range
4078 * ({@code to}), which must be greater than or equal to {@code from},
4079 * may be greater than {@code original.length}, in which case
4080 * {@code 0d} is placed in all elements of the copy whose index is
4081 * greater than or equal to {@code original.length - from}. The length
4082 * of the returned array will be {@code to - from}.
4083 *
4084 * @param original the array from which a range is to be copied
4085 * @param from the initial index of the range to be copied, inclusive
4086 * @param to the final index of the range to be copied, exclusive.
4087 * (This index may lie outside the array.)
4088 * @return a new array containing the specified range from the original array,
4089 * truncated or padded with zeros to obtain the required length
4090 * @throws ArrayIndexOutOfBoundsException if {@code from < 0}
4091 * or {@code from > original.length}
4092 * @throws IllegalArgumentException if {@code from > to}
4093 * @throws NullPointerException if {@code original} is null
4094 * @since 1.6
4095 */
4096 public static double[] copyOfRange(double[] original, int from, int to) {
4097 if (from == 0 && to == original.length) {
4098 return original.clone();
4099 }
4100 int newLength = to - from;
4101 if (newLength < 0) {
4102 throw new IllegalArgumentException(from + " > " + to);
4103 }
4104 double[] copy = new double[newLength];
4105 System.arraycopy(original, from, copy, 0,
4106 Math.min(original.length - from, newLength));
4107 return copy;
4108 }
4109
4110 /**
4111 * Copies the specified range of the specified array into a new array.
4112 * The initial index of the range ({@code from}) must lie between zero
4113 * and {@code original.length}, inclusive. The value at
4114 * {@code original[from]} is placed into the initial element of the copy
4115 * (unless {@code from == original.length} or {@code from == to}).
4116 * Values from subsequent elements in the original array are placed into
4117 * subsequent elements in the copy. The final index of the range
4118 * ({@code to}), which must be greater than or equal to {@code from},
4119 * may be greater than {@code original.length}, in which case
4120 * {@code false} is placed in all elements of the copy whose index is
4121 * greater than or equal to {@code original.length - from}. The length
4122 * of the returned array will be {@code to - from}.
4123 *
4124 * @param original the array from which a range is to be copied
4125 * @param from the initial index of the range to be copied, inclusive
4126 * @param to the final index of the range to be copied, exclusive.
4127 * (This index may lie outside the array.)
4128 * @return a new array containing the specified range from the original array,
4129 * truncated or padded with false elements to obtain the required length
4130 * @throws ArrayIndexOutOfBoundsException if {@code from < 0}
4131 * or {@code from > original.length}
4132 * @throws IllegalArgumentException if {@code from > to}
4133 * @throws NullPointerException if {@code original} is null
4134 * @since 1.6
4135 */
4136 public static boolean[] copyOfRange(boolean[] original, int from, int to) {
4137 if (from == 0 && to == original.length) {
4138 return original.clone();
4139 }
4140 int newLength = to - from;
4141 if (newLength < 0) {
4142 throw new IllegalArgumentException(from + " > " + to);
4143 }
4144 boolean[] copy = new boolean[newLength];
4145 System.arraycopy(original, from, copy, 0,
4146 Math.min(original.length - from, newLength));
4147 return copy;
4148 }
4149
4150 // Misc
4151
4152 /**
4153 * Returns a fixed-size list backed by the specified array. Changes made to
4154 * the array will be visible in the returned list, and changes made to the
4155 * list will be visible in the array. The returned list is
4156 * {@link Serializable} and implements {@link RandomAccess}.
4157 *
4158 * <p>The returned list implements the optional {@code Collection} methods, except
4159 * those that would change the size of the returned list. Those methods leave
4160 * the list unchanged and throw {@link UnsupportedOperationException}.
4161 *
4162 * <p>If the specified array's actual component type differs from the type
4163 * parameter T, this can result in operations on the returned list throwing an
4164 * {@code ArrayStoreException}.
4165 *
4166 * @apiNote
4167 * This method acts as bridge between array-based and collection-based
4168 * APIs, in combination with {@link Collection#toArray}.
4169 *
4170 * <p>This method provides a way to wrap an existing array:
4171 * <pre>{@code
4172 * Integer[] numbers = ...
4173 * ...
4174 * List<Integer> values = Arrays.asList(numbers);
4175 * }</pre>
4176 *
4177 * <p>This method also provides a convenient way to create a fixed-size
4178 * list initialized to contain several elements:
4179 * <pre>{@code
4180 * List<String> stooges = Arrays.asList("Larry", "Moe", "Curly");
4181 * }</pre>
4182 *
4183 * <p><em>The list returned by this method is modifiable.</em>
4184 * To create an unmodifiable list, use
4185 * {@link Collections#unmodifiableList Collections.unmodifiableList}
4186 * or <a href="List.html#unmodifiable">Unmodifiable Lists</a>.
4187 *
4188 * @param <T> the class of the objects in the array
4189 * @param a the array by which the list will be backed
4190 * @return a list view of the specified array
4191 * @throws NullPointerException if the specified array is {@code null}
4192 */
4193 @SafeVarargs
4194 @SuppressWarnings("varargs")
4195 public static <T> List<T> asList(T... a) {
4196 return new ArrayList<>(a);
4197 }
4198
4199 /**
4200 * @serial include
4201 */
4202 private static class ArrayList<E> extends AbstractList<E>
4203 implements RandomAccess, java.io.Serializable
4204 {
4205 @java.io.Serial
4206 private static final long serialVersionUID = -2764017481108945198L;
4207 /** @serial */
4208 @SuppressWarnings("serial") // Conditionally serializable
4209 private final E[] a;
4210
4211 ArrayList(E[] array) {
4212 a = Objects.requireNonNull(array);
4213 }
4214
4215 @Override
4216 public int size() {
4217 return a.length;
4218 }
4219
4220 @Override
4221 public Object[] toArray() {
4222 return Arrays.copyOf(a, a.length, Object[].class);
4223 }
4224
4225 @Override
4226 @SuppressWarnings("unchecked")
4227 public <T> T[] toArray(T[] a) {
4228 int size = size();
4229 if (a.length < size)
4230 return Arrays.copyOf(this.a, size,
4231 (Class<? extends T[]>) a.getClass());
4232 System.arraycopy(this.a, 0, a, 0, size);
4233 if (a.length > size)
4234 a[size] = null;
4235 return a;
4236 }
4237
4238 @Override
4239 public E get(int index) {
4240 return a[index];
4241 }
4242
4243 @Override
4244 public E set(int index, E element) {
4245 E oldValue = a[index];
4246 a[index] = element;
4247 return oldValue;
4248 }
4249
4250 @Override
4251 public int indexOf(Object o) {
4252 E[] a = this.a;
4253 if (o == null) {
4254 for (int i = 0; i < a.length; i++)
4255 if (a[i] == null)
4256 return i;
4257 } else {
4258 for (int i = 0; i < a.length; i++)
4259 if (o.equals(a[i]))
4260 return i;
4261 }
4262 return -1;
4263 }
4264
4265 @Override
4266 public boolean contains(Object o) {
4267 return indexOf(o) >= 0;
4268 }
4269
4270 @Override
4271 public Spliterator<E> spliterator() {
4272 return Spliterators.spliterator(a, Spliterator.ORDERED);
4273 }
4274
4275 @Override
4276 public void forEach(Consumer<? super E> action) {
4277 Objects.requireNonNull(action);
4278 for (E e : a) {
4279 action.accept(e);
4280 }
4281 }
4282
4283 @Override
4284 public void replaceAll(UnaryOperator<E> operator) {
4285 Objects.requireNonNull(operator);
4286 E[] a = this.a;
4287 for (int i = 0; i < a.length; i++) {
4288 a[i] = operator.apply(a[i]);
4289 }
4290 }
4291
4292 @Override
4293 public void sort(Comparator<? super E> c) {
4294 Arrays.sort(a, c);
4295 }
4296
4297 @Override
4298 public Iterator<E> iterator() {
4299 return new ArrayItr<>(a);
4300 }
4301 }
4302
4303 private static class ArrayItr<E> implements Iterator<E> {
4304 private int cursor;
4305 private final E[] a;
4306
4307 ArrayItr(E[] a) {
4308 this.a = a;
4309 }
4310
4311 @Override
4312 public boolean hasNext() {
4313 return cursor < a.length;
4314 }
4315
4316 @Override
4317 public E next() {
4318 int i = cursor;
4319 if (i >= a.length) {
4320 throw new NoSuchElementException();
4321 }
4322 cursor = i + 1;
4323 return a[i];
4324 }
4325 }
4326
4327 /**
4328 * Returns a hash code based on the contents of the specified array.
4329 * For any two {@code long} arrays {@code a} and {@code b}
4330 * such that {@code Arrays.equals(a, b)}, it is also the case that
4331 * {@code Arrays.hashCode(a) == Arrays.hashCode(b)}.
4332 *
4333 * <p>The value returned by this method is the same value that would be
4334 * obtained by invoking the {@link List#hashCode() hashCode}
4335 * method on a {@link List} containing a sequence of {@link Long}
4336 * instances representing the elements of {@code a} in the same order.
4337 * If {@code a} is {@code null}, this method returns 0.
4338 *
4339 * @param a the array whose hash value to compute
4340 * @return a content-based hash code for {@code a}
4341 * @since 1.5
4342 */
4343 public static int hashCode(long[] a) {
4344 if (a == null) {
4345 return 0;
4346 }
4347 int result = 1;
4348 for (long element : a) {
4349 result = 31 * result + Long.hashCode(element);
4350 }
4351 return result;
4352 }
4353
4354 /**
4355 * Returns a hash code based on the contents of the specified array.
4356 * For any two non-null {@code int} arrays {@code a} and {@code b}
4357 * such that {@code Arrays.equals(a, b)}, it is also the case that
4358 * {@code Arrays.hashCode(a) == Arrays.hashCode(b)}.
4359 *
4360 * <p>The value returned by this method is the same value that would be
4361 * obtained by invoking the {@link List#hashCode() hashCode}
4362 * method on a {@link List} containing a sequence of {@link Integer}
4363 * instances representing the elements of {@code a} in the same order.
4364 * If {@code a} is {@code null}, this method returns 0.
4365 *
4366 * @param a the array whose hash value to compute
4367 * @return a content-based hash code for {@code a}
4368 * @since 1.5
4369 */
4370 public static int hashCode(int[] a) {
4371 if (a == null) {
4372 return 0;
4373 }
4374 return ArraysSupport.hashCode(a, 0, a.length, 1);
4375 }
4376
4377 /**
4378 * Returns a hash code based on the contents of the specified array.
4379 * For any two {@code short} arrays {@code a} and {@code b}
4380 * such that {@code Arrays.equals(a, b)}, it is also the case that
4381 * {@code Arrays.hashCode(a) == Arrays.hashCode(b)}.
4382 *
4383 * <p>The value returned by this method is the same value that would be
4384 * obtained by invoking the {@link List#hashCode() hashCode}
4385 * method on a {@link List} containing a sequence of {@link Short}
4386 * instances representing the elements of {@code a} in the same order.
4387 * If {@code a} is {@code null}, this method returns 0.
4388 *
4389 * @param a the array whose hash value to compute
4390 * @return a content-based hash code for {@code a}
4391 * @since 1.5
4392 */
4393 public static int hashCode(short[] a) {
4394 if (a == null) {
4395 return 0;
4396 }
4397 return ArraysSupport.hashCode(a, 0, a.length, 1);
4398 }
4399
4400 /**
4401 * Returns a hash code based on the contents of the specified array.
4402 * For any two {@code char} arrays {@code a} and {@code b}
4403 * such that {@code Arrays.equals(a, b)}, it is also the case that
4404 * {@code Arrays.hashCode(a) == Arrays.hashCode(b)}.
4405 *
4406 * <p>The value returned by this method is the same value that would be
4407 * obtained by invoking the {@link List#hashCode() hashCode}
4408 * method on a {@link List} containing a sequence of {@link Character}
4409 * instances representing the elements of {@code a} in the same order.
4410 * If {@code a} is {@code null}, this method returns 0.
4411 *
4412 * @param a the array whose hash value to compute
4413 * @return a content-based hash code for {@code a}
4414 * @since 1.5
4415 */
4416 public static int hashCode(char[] a) {
4417 if (a == null) {
4418 return 0;
4419 }
4420 return ArraysSupport.hashCode(a, 0, a.length, 1);
4421 }
4422
4423 /**
4424 * Returns a hash code based on the contents of the specified array.
4425 * For any two {@code byte} arrays {@code a} and {@code b}
4426 * such that {@code Arrays.equals(a, b)}, it is also the case that
4427 * {@code Arrays.hashCode(a) == Arrays.hashCode(b)}.
4428 *
4429 * <p>The value returned by this method is the same value that would be
4430 * obtained by invoking the {@link List#hashCode() hashCode}
4431 * method on a {@link List} containing a sequence of {@link Byte}
4432 * instances representing the elements of {@code a} in the same order.
4433 * If {@code a} is {@code null}, this method returns 0.
4434 *
4435 * @param a the array whose hash value to compute
4436 * @return a content-based hash code for {@code a}
4437 * @since 1.5
4438 */
4439 public static int hashCode(byte[] a) {
4440 if (a == null) {
4441 return 0;
4442 }
4443 return ArraysSupport.hashCode(a, 0, a.length, 1);
4444 }
4445
4446 /**
4447 * Returns a hash code based on the contents of the specified array.
4448 * For any two {@code boolean} arrays {@code a} and {@code b}
4449 * such that {@code Arrays.equals(a, b)}, it is also the case that
4450 * {@code Arrays.hashCode(a) == Arrays.hashCode(b)}.
4451 *
4452 * <p>The value returned by this method is the same value that would be
4453 * obtained by invoking the {@link List#hashCode() hashCode}
4454 * method on a {@link List} containing a sequence of {@link Boolean}
4455 * instances representing the elements of {@code a} in the same order.
4456 * If {@code a} is {@code null}, this method returns 0.
4457 *
4458 * @param a the array whose hash value to compute
4459 * @return a content-based hash code for {@code a}
4460 * @since 1.5
4461 */
4462 public static int hashCode(boolean[] a) {
4463 if (a == null)
4464 return 0;
4465
4466 int result = 1;
4467 for (boolean element : a)
4468 result = 31 * result + Boolean.hashCode(element);
4469
4470 return result;
4471 }
4472
4473 /**
4474 * Returns a hash code based on the contents of the specified array.
4475 * For any two {@code float} arrays {@code a} and {@code b}
4476 * such that {@code Arrays.equals(a, b)}, it is also the case that
4477 * {@code Arrays.hashCode(a) == Arrays.hashCode(b)}.
4478 *
4479 * <p>The value returned by this method is the same value that would be
4480 * obtained by invoking the {@link List#hashCode() hashCode}
4481 * method on a {@link List} containing a sequence of {@link Float}
4482 * instances representing the elements of {@code a} in the same order.
4483 * If {@code a} is {@code null}, this method returns 0.
4484 *
4485 * @param a the array whose hash value to compute
4486 * @return a content-based hash code for {@code a}
4487 * @since 1.5
4488 */
4489 public static int hashCode(float[] a) {
4490 if (a == null)
4491 return 0;
4492
4493 int result = 1;
4494 for (float element : a)
4495 result = 31 * result + Float.hashCode(element);
4496
4497 return result;
4498 }
4499
4500 /**
4501 * Returns a hash code based on the contents of the specified array.
4502 * For any two {@code double} arrays {@code a} and {@code b}
4503 * such that {@code Arrays.equals(a, b)}, it is also the case that
4504 * {@code Arrays.hashCode(a) == Arrays.hashCode(b)}.
4505 *
4506 * <p>The value returned by this method is the same value that would be
4507 * obtained by invoking the {@link List#hashCode() hashCode}
4508 * method on a {@link List} containing a sequence of {@link Double}
4509 * instances representing the elements of {@code a} in the same order.
4510 * If {@code a} is {@code null}, this method returns 0.
4511 *
4512 * @param a the array whose hash value to compute
4513 * @return a content-based hash code for {@code a}
4514 * @since 1.5
4515 */
4516 public static int hashCode(double[] a) {
4517 if (a == null)
4518 return 0;
4519
4520 int result = 1;
4521 for (double element : a) {
4522 result = 31 * result + Double.hashCode(element);
4523 }
4524 return result;
4525 }
4526
4527 /**
4528 * Returns a hash code based on the contents of the specified array. If
4529 * the array contains other arrays as elements, the hash code is based on
4530 * their identities rather than their contents. It is therefore
4531 * acceptable to invoke this method on an array that contains itself as an
4532 * element, either directly or indirectly through one or more levels of
4533 * arrays.
4534 *
4535 * <p>For any two arrays {@code a} and {@code b} such that
4536 * {@code Arrays.equals(a, b)}, it is also the case that
4537 * {@code Arrays.hashCode(a) == Arrays.hashCode(b)}.
4538 *
4539 * <p>The value returned by this method is equal to the value that would
4540 * be returned by {@code Arrays.asList(a).hashCode()}, unless {@code a}
4541 * is {@code null}, in which case {@code 0} is returned.
4542 *
4543 * @param a the array whose content-based hash code to compute
4544 * @return a content-based hash code for {@code a}
4545 * @see #deepHashCode(Object[])
4546 * @since 1.5
4547 */
4548 public static int hashCode(Object[] a) {
4549 if (a == null) {
4550 return 0;
4551 }
4552 return ArraysSupport.hashCode(a, 0, a.length, 1);
4553 }
4554
4555 /**
4556 * Returns a hash code based on the "deep contents" of the specified
4557 * array. If the array contains other arrays as elements, the
4558 * hash code is based on their contents and so on, ad infinitum.
4559 * It is therefore unacceptable to invoke this method on an array that
4560 * contains itself as an element, either directly or indirectly through
4561 * one or more levels of arrays. The behavior of such an invocation is
4562 * undefined.
4563 *
4564 * <p>For any two arrays {@code a} and {@code b} such that
4565 * {@code Arrays.deepEquals(a, b)}, it is also the case that
4566 * {@code Arrays.deepHashCode(a) == Arrays.deepHashCode(b)}.
4567 *
4568 * <p>The computation of the value returned by this method is similar to
4569 * that of the value returned by {@link List#hashCode()} on a list
4570 * containing the same elements as {@code a} in the same order, with one
4571 * difference: If an element {@code e} of {@code a} is itself an array,
4572 * its hash code is computed not by calling {@code e.hashCode()}, but as
4573 * by calling the appropriate overloading of {@code Arrays.hashCode(e)}
4574 * if {@code e} is an array of a primitive type, or as by calling
4575 * {@code Arrays.deepHashCode(e)} recursively if {@code e} is an array
4576 * of a reference type. If {@code a} is {@code null}, this method
4577 * returns 0.
4578 *
4579 * @param a the array whose deep-content-based hash code to compute
4580 * @return a deep-content-based hash code for {@code a}
4581 * @see #hashCode(Object[])
4582 * @since 1.5
4583 */
4584 public static int deepHashCode(Object[] a) {
4585 if (a == null)
4586 return 0;
4587
4588 int result = 1;
4589
4590 for (Object element : a) {
4591 final int elementHash;
4592 final Class<?> cl;
4593 if (element == null)
4594 elementHash = 0;
4595 else if ((cl = element.getClass().getComponentType()) == null)
4596 elementHash = element.hashCode();
4597 else if (element instanceof Object[])
4598 elementHash = deepHashCode((Object[]) element);
4599 else
4600 elementHash = primitiveArrayHashCode(element, cl);
4601
4602 result = 31 * result + elementHash;
4603 }
4604
4605 return result;
4606 }
4607
4608 private static int primitiveArrayHashCode(Object a, Class<?> cl) {
4609 return
4610 (cl == byte.class) ? hashCode((byte[]) a) :
4611 (cl == int.class) ? hashCode((int[]) a) :
4612 (cl == long.class) ? hashCode((long[]) a) :
4613 (cl == char.class) ? hashCode((char[]) a) :
4614 (cl == short.class) ? hashCode((short[]) a) :
4615 (cl == boolean.class) ? hashCode((boolean[]) a) :
4616 (cl == double.class) ? hashCode((double[]) a) :
4617 // If new primitive types are ever added, this method must be
4618 // expanded or we will fail here with ClassCastException.
4619 hashCode((float[]) a);
4620 }
4621
4622 /**
4623 * Returns {@code true} if the two specified arrays are <i>deeply
4624 * equal</i> to one another. Unlike the {@link #equals(Object[],Object[])}
4625 * method, this method is appropriate for use with nested arrays of
4626 * arbitrary depth.
4627 *
4628 * <p>Two array references are considered deeply equal if both
4629 * are {@code null}, or if they refer to arrays that contain the same
4630 * number of elements and all corresponding pairs of elements in the two
4631 * arrays are deeply equal.
4632 *
4633 * <p>Two possibly {@code null} elements {@code e1} and {@code e2} are
4634 * deeply equal if any of the following conditions hold:
4635 * <ul>
4636 * <li> {@code e1} and {@code e2} are both arrays of object reference
4637 * types, and {@code Arrays.deepEquals(e1, e2) would return true}
4638 * <li> {@code e1} and {@code e2} are arrays of the same primitive
4639 * type, and the appropriate overloading of
4640 * {@code Arrays.equals(e1, e2)} would return true.
4641 * <li> {@code e1 == e2}
4642 * <li> {@code e1.equals(e2)} would return true.
4643 * </ul>
4644 * Note that this definition permits {@code null} elements at any depth.
4645 *
4646 * <p>If either of the specified arrays contain themselves as elements
4647 * either directly or indirectly through one or more levels of arrays,
4648 * the behavior of this method is undefined.
4649 *
4650 * @param a1 one array to be tested for equality
4651 * @param a2 the other array to be tested for equality
4652 * @return {@code true} if the two arrays are equal
4653 * @see #equals(Object[],Object[])
4654 * @see Objects#deepEquals(Object, Object)
4655 * @since 1.5
4656 */
4657 public static boolean deepEquals(Object[] a1, Object[] a2) {
4658 if (a1 == a2)
4659 return true;
4660 if (a1 == null || a2==null)
4661 return false;
4662 int length = a1.length;
4663 if (a2.length != length)
4664 return false;
4665
4666 for (int i = 0; i < length; i++) {
4667 Object e1 = a1[i];
4668 Object e2 = a2[i];
4669
4670 if (e1 == e2)
4671 continue;
4672 if (e1 == null)
4673 return false;
4674
4675 // Figure out whether the two elements are equal
4676 boolean eq = deepEquals0(e1, e2);
4677
4678 if (!eq)
4679 return false;
4680 }
4681 return true;
4682 }
4683
4684 static boolean deepEquals0(Object e1, Object e2) {
4685 assert e1 != null;
4686 boolean eq;
4687 if (e1 instanceof Object[] && e2 instanceof Object[])
4688 eq = deepEquals ((Object[]) e1, (Object[]) e2);
4689 else if (e1 instanceof byte[] && e2 instanceof byte[])
4690 eq = equals((byte[]) e1, (byte[]) e2);
4691 else if (e1 instanceof short[] && e2 instanceof short[])
4692 eq = equals((short[]) e1, (short[]) e2);
4693 else if (e1 instanceof int[] && e2 instanceof int[])
4694 eq = equals((int[]) e1, (int[]) e2);
4695 else if (e1 instanceof long[] && e2 instanceof long[])
4696 eq = equals((long[]) e1, (long[]) e2);
4697 else if (e1 instanceof char[] && e2 instanceof char[])
4698 eq = equals((char[]) e1, (char[]) e2);
4699 else if (e1 instanceof float[] && e2 instanceof float[])
4700 eq = equals((float[]) e1, (float[]) e2);
4701 else if (e1 instanceof double[] && e2 instanceof double[])
4702 eq = equals((double[]) e1, (double[]) e2);
4703 else if (e1 instanceof boolean[] && e2 instanceof boolean[])
4704 eq = equals((boolean[]) e1, (boolean[]) e2);
4705 else
4706 eq = e1.equals(e2);
4707 return eq;
4708 }
4709
4710 /**
4711 * Returns a string representation of the contents of the specified array.
4712 * The string representation consists of a list of the array's elements,
4713 * enclosed in square brackets ({@code "[]"}). Adjacent elements are
4714 * separated by the characters {@code ", "} (a comma followed by a
4715 * space). Elements are converted to strings as by
4716 * {@code String.valueOf(long)}. Returns {@code "null"} if {@code a}
4717 * is {@code null}.
4718 *
4719 * @param a the array whose string representation to return
4720 * @return a string representation of {@code a}
4721 * @since 1.5
4722 */
4723 public static String toString(long[] a) {
4724 if (a == null)
4725 return "null";
4726 int iMax = a.length - 1;
4727 if (iMax == -1)
4728 return "[]";
4729
4730 StringBuilder b = new StringBuilder();
4731 b.append('[');
4732 for (int i = 0; ; i++) {
4733 b.append(a[i]);
4734 if (i == iMax)
4735 return b.append(']').toString();
4736 b.append(", ");
4737 }
4738 }
4739
4740 /**
4741 * Returns a string representation of the contents of the specified array.
4742 * The string representation consists of a list of the array's elements,
4743 * enclosed in square brackets ({@code "[]"}). Adjacent elements are
4744 * separated by the characters {@code ", "} (a comma followed by a
4745 * space). Elements are converted to strings as by
4746 * {@code String.valueOf(int)}. Returns {@code "null"} if {@code a} is
4747 * {@code null}.
4748 *
4749 * @param a the array whose string representation to return
4750 * @return a string representation of {@code a}
4751 * @since 1.5
4752 */
4753 public static String toString(int[] a) {
4754 if (a == null)
4755 return "null";
4756 int iMax = a.length - 1;
4757 if (iMax == -1)
4758 return "[]";
4759
4760 StringBuilder b = new StringBuilder();
4761 b.append('[');
4762 for (int i = 0; ; i++) {
4763 b.append(a[i]);
4764 if (i == iMax)
4765 return b.append(']').toString();
4766 b.append(", ");
4767 }
4768 }
4769
4770 /**
4771 * Returns a string representation of the contents of the specified array.
4772 * The string representation consists of a list of the array's elements,
4773 * enclosed in square brackets ({@code "[]"}). Adjacent elements are
4774 * separated by the characters {@code ", "} (a comma followed by a
4775 * space). Elements are converted to strings as by
4776 * {@code String.valueOf(short)}. Returns {@code "null"} if {@code a}
4777 * is {@code null}.
4778 *
4779 * @param a the array whose string representation to return
4780 * @return a string representation of {@code a}
4781 * @since 1.5
4782 */
4783 public static String toString(short[] a) {
4784 if (a == null)
4785 return "null";
4786 int iMax = a.length - 1;
4787 if (iMax == -1)
4788 return "[]";
4789
4790 StringBuilder b = new StringBuilder();
4791 b.append('[');
4792 for (int i = 0; ; i++) {
4793 b.append(a[i]);
4794 if (i == iMax)
4795 return b.append(']').toString();
4796 b.append(", ");
4797 }
4798 }
4799
4800 /**
4801 * Returns a string representation of the contents of the specified array.
4802 * The string representation consists of a list of the array's elements,
4803 * enclosed in square brackets ({@code "[]"}). Adjacent elements are
4804 * separated by the characters {@code ", "} (a comma followed by a
4805 * space). Elements are converted to strings as by
4806 * {@code String.valueOf(char)}. Returns {@code "null"} if {@code a}
4807 * is {@code null}.
4808 *
4809 * @param a the array whose string representation to return
4810 * @return a string representation of {@code a}
4811 * @since 1.5
4812 */
4813 public static String toString(char[] a) {
4814 if (a == null)
4815 return "null";
4816 int iMax = a.length - 1;
4817 if (iMax == -1)
4818 return "[]";
4819
4820 StringBuilder b = new StringBuilder();
4821 b.append('[');
4822 for (int i = 0; ; i++) {
4823 b.append(a[i]);
4824 if (i == iMax)
4825 return b.append(']').toString();
4826 b.append(", ");
4827 }
4828 }
4829
4830 /**
4831 * Returns a string representation of the contents of the specified array.
4832 * The string representation consists of a list of the array's elements,
4833 * enclosed in square brackets ({@code "[]"}). Adjacent elements
4834 * are separated by the characters {@code ", "} (a comma followed
4835 * by a space). Elements are converted to strings as by
4836 * {@code String.valueOf(byte)}. Returns {@code "null"} if
4837 * {@code a} is {@code null}.
4838 *
4839 * @param a the array whose string representation to return
4840 * @return a string representation of {@code a}
4841 * @since 1.5
4842 */
4843 public static String toString(byte[] a) {
4844 if (a == null)
4845 return "null";
4846 int iMax = a.length - 1;
4847 if (iMax == -1)
4848 return "[]";
4849
4850 StringBuilder b = new StringBuilder();
4851 b.append('[');
4852 for (int i = 0; ; i++) {
4853 b.append(a[i]);
4854 if (i == iMax)
4855 return b.append(']').toString();
4856 b.append(", ");
4857 }
4858 }
4859
4860 /**
4861 * Returns a string representation of the contents of the specified array.
4862 * The string representation consists of a list of the array's elements,
4863 * enclosed in square brackets ({@code "[]"}). Adjacent elements are
4864 * separated by the characters {@code ", "} (a comma followed by a
4865 * space). Elements are converted to strings as by
4866 * {@code String.valueOf(boolean)}. Returns {@code "null"} if
4867 * {@code a} is {@code null}.
4868 *
4869 * @param a the array whose string representation to return
4870 * @return a string representation of {@code a}
4871 * @since 1.5
4872 */
4873 public static String toString(boolean[] a) {
4874 if (a == null)
4875 return "null";
4876 int iMax = a.length - 1;
4877 if (iMax == -1)
4878 return "[]";
4879
4880 StringBuilder b = new StringBuilder();
4881 b.append('[');
4882 for (int i = 0; ; i++) {
4883 b.append(a[i]);
4884 if (i == iMax)
4885 return b.append(']').toString();
4886 b.append(", ");
4887 }
4888 }
4889
4890 /**
4891 * Returns a string representation of the contents of the specified array.
4892 * The string representation consists of a list of the array's elements,
4893 * enclosed in square brackets ({@code "[]"}). Adjacent elements are
4894 * separated by the characters {@code ", "} (a comma followed by a
4895 * space). Elements are converted to strings as by
4896 * {@code String.valueOf(float)}. Returns {@code "null"} if {@code a}
4897 * is {@code null}.
4898 *
4899 * @param a the array whose string representation to return
4900 * @return a string representation of {@code a}
4901 * @since 1.5
4902 */
4903 public static String toString(float[] a) {
4904 if (a == null)
4905 return "null";
4906
4907 int iMax = a.length - 1;
4908 if (iMax == -1)
4909 return "[]";
4910
4911 StringBuilder b = new StringBuilder();
4912 b.append('[');
4913 for (int i = 0; ; i++) {
4914 b.append(a[i]);
4915 if (i == iMax)
4916 return b.append(']').toString();
4917 b.append(", ");
4918 }
4919 }
4920
4921 /**
4922 * Returns a string representation of the contents of the specified array.
4923 * The string representation consists of a list of the array's elements,
4924 * enclosed in square brackets ({@code "[]"}). Adjacent elements are
4925 * separated by the characters {@code ", "} (a comma followed by a
4926 * space). Elements are converted to strings as by
4927 * {@code String.valueOf(double)}. Returns {@code "null"} if {@code a}
4928 * is {@code null}.
4929 *
4930 * @param a the array whose string representation to return
4931 * @return a string representation of {@code a}
4932 * @since 1.5
4933 */
4934 public static String toString(double[] a) {
4935 if (a == null)
4936 return "null";
4937 int iMax = a.length - 1;
4938 if (iMax == -1)
4939 return "[]";
4940
4941 StringBuilder b = new StringBuilder();
4942 b.append('[');
4943 for (int i = 0; ; i++) {
4944 b.append(a[i]);
4945 if (i == iMax)
4946 return b.append(']').toString();
4947 b.append(", ");
4948 }
4949 }
4950
4951 /**
4952 * Returns a string representation of the contents of the specified array.
4953 * If the array contains other arrays as elements, they are converted to
4954 * strings by the {@link Object#toString} method inherited from
4955 * {@code Object}, which describes their <i>identities</i> rather than
4956 * their contents.
4957 *
4958 * <p>The value returned by this method is equal to the value that would
4959 * be returned by {@code Arrays.asList(a).toString()}, unless {@code a}
4960 * is {@code null}, in which case {@code "null"} is returned.
4961 *
4962 * @param a the array whose string representation to return
4963 * @return a string representation of {@code a}
4964 * @see #deepToString(Object[])
4965 * @since 1.5
4966 */
4967 public static String toString(Object[] a) {
4968 if (a == null)
4969 return "null";
4970
4971 int iMax = a.length - 1;
4972 if (iMax == -1)
4973 return "[]";
4974
4975 StringBuilder b = new StringBuilder();
4976 b.append('[');
4977 for (int i = 0; ; i++) {
4978 b.append(String.valueOf(a[i]));
4979 if (i == iMax)
4980 return b.append(']').toString();
4981 b.append(", ");
4982 }
4983 }
4984
4985 /**
4986 * Returns a string representation of the "deep contents" of the specified
4987 * array. If the array contains other arrays as elements, the string
4988 * representation contains their contents and so on. This method is
4989 * designed for converting multidimensional arrays to strings.
4990 *
4991 * <p>The string representation consists of a list of the array's
4992 * elements, enclosed in square brackets ({@code "[]"}). Adjacent
4993 * elements are separated by the characters {@code ", "} (a comma
4994 * followed by a space). Elements are converted to strings as by
4995 * {@code String.valueOf(Object)}, unless they are themselves
4996 * arrays.
4997 *
4998 * <p>If an element {@code e} is an array of a primitive type, it is
4999 * converted to a string as by invoking the appropriate overloading of
5000 * {@code Arrays.toString(e)}. If an element {@code e} is an array of a
5001 * reference type, it is converted to a string as by invoking
5002 * this method recursively.
5003 *
5004 * <p>To avoid infinite recursion, if the specified array contains itself
5005 * as an element, or contains an indirect reference to itself through one
5006 * or more levels of arrays, the self-reference is converted to the string
5007 * {@code "[...]"}. For example, an array containing only a reference
5008 * to itself would be rendered as {@code "[[...]]"}.
5009 *
5010 * <p>This method returns {@code "null"} if the specified array
5011 * is {@code null}.
5012 *
5013 * @param a the array whose string representation to return
5014 * @return a string representation of {@code a}
5015 * @see #toString(Object[])
5016 * @since 1.5
5017 */
5018 public static String deepToString(Object[] a) {
5019 if (a == null)
5020 return "null";
5021
5022 int bufLen = 20 * a.length;
5023 if (a.length != 0 && bufLen <= 0)
5024 bufLen = Integer.MAX_VALUE;
5025 StringBuilder buf = new StringBuilder(bufLen);
5026 deepToString(a, buf, new HashSet<>());
5027 return buf.toString();
5028 }
5029
5030 private static void deepToString(Object[] a, StringBuilder buf,
5031 Set<Object[]> dejaVu) {
5032 if (a == null) {
5033 buf.append("null");
5034 return;
5035 }
5036 int iMax = a.length - 1;
5037 if (iMax == -1) {
5038 buf.append("[]");
5039 return;
5040 }
5041
5042 dejaVu.add(a);
5043 buf.append('[');
5044 for (int i = 0; ; i++) {
5045
5046 Object element = a[i];
5047 if (element == null) {
5048 buf.append("null");
5049 } else {
5050 Class<?> eClass = element.getClass();
5051
5052 if (eClass.isArray()) {
5053 if (eClass == byte[].class)
5054 buf.append(toString((byte[]) element));
5055 else if (eClass == short[].class)
5056 buf.append(toString((short[]) element));
5057 else if (eClass == int[].class)
5058 buf.append(toString((int[]) element));
5059 else if (eClass == long[].class)
5060 buf.append(toString((long[]) element));
5061 else if (eClass == char[].class)
5062 buf.append(toString((char[]) element));
5063 else if (eClass == float[].class)
5064 buf.append(toString((float[]) element));
5065 else if (eClass == double[].class)
5066 buf.append(toString((double[]) element));
5067 else if (eClass == boolean[].class)
5068 buf.append(toString((boolean[]) element));
5069 else { // element is an array of object references
5070 if (dejaVu.contains(element))
5071 buf.append("[...]");
5072 else
5073 deepToString((Object[])element, buf, dejaVu);
5074 }
5075 } else { // element is non-null and not an array
5076 buf.append(element.toString());
5077 }
5078 }
5079 if (i == iMax)
5080 break;
5081 buf.append(", ");
5082 }
5083 buf.append(']');
5084 dejaVu.remove(a);
5085 }
5086
5087
5088 /**
5089 * Set all elements of the specified array, using the provided
5090 * generator function to compute each element.
5091 *
5092 * <p>If the generator function throws an exception, it is relayed to
5093 * the caller and the array is left in an indeterminate state.
5094 *
5095 * @apiNote
5096 * Setting a subrange of an array, using a generator function to compute
5097 * each element, can be written as follows:
5098 * <pre>{@code
5099 * IntStream.range(startInclusive, endExclusive)
5100 * .forEach(i -> array[i] = generator.apply(i));
5101 * }</pre>
5102 *
5103 * @param <T> type of elements of the array
5104 * @param array array to be initialized
5105 * @param generator a function accepting an index and producing the desired
5106 * value for that position
5107 * @throws NullPointerException if the generator is null
5108 * @since 1.8
5109 */
5110 public static <T> void setAll(T[] array, IntFunction<? extends T> generator) {
5111 Objects.requireNonNull(generator);
5112 for (int i = 0; i < array.length; i++)
5113 array[i] = generator.apply(i);
5114 }
5115
5116 /**
5117 * Set all elements of the specified array, in parallel, using the
5118 * provided generator function to compute each element.
5119 *
5120 * <p>If the generator function throws an exception, an unchecked exception
5121 * is thrown from {@code parallelSetAll} and the array is left in an
5122 * indeterminate state.
5123 *
5124 * @apiNote
5125 * Setting a subrange of an array, in parallel, using a generator function
5126 * to compute each element, can be written as follows:
5127 * <pre>{@code
5128 * IntStream.range(startInclusive, endExclusive)
5129 * .parallel()
5130 * .forEach(i -> array[i] = generator.apply(i));
5131 * }</pre>
5132 *
5133 * @param <T> type of elements of the array
5134 * @param array array to be initialized
5135 * @param generator a function accepting an index and producing the desired
5136 * value for that position
5137 * @throws NullPointerException if the generator is null
5138 * @since 1.8
5139 */
5140 public static <T> void parallelSetAll(T[] array, IntFunction<? extends T> generator) {
5141 Objects.requireNonNull(generator);
5142 IntStream.range(0, array.length).parallel().forEach(i -> { array[i] = generator.apply(i); });
5143 }
5144
5145 /**
5146 * Set all elements of the specified array, using the provided
5147 * generator function to compute each element.
5148 *
5149 * <p>If the generator function throws an exception, it is relayed to
5150 * the caller and the array is left in an indeterminate state.
5151 *
5152 * @apiNote
5153 * Setting a subrange of an array, using a generator function to compute
5154 * each element, can be written as follows:
5155 * <pre>{@code
5156 * IntStream.range(startInclusive, endExclusive)
5157 * .forEach(i -> array[i] = generator.applyAsInt(i));
5158 * }</pre>
5159 *
5160 * @param array array to be initialized
5161 * @param generator a function accepting an index and producing the desired
5162 * value for that position
5163 * @throws NullPointerException if the generator is null
5164 * @since 1.8
5165 */
5166 public static void setAll(int[] array, IntUnaryOperator generator) {
5167 Objects.requireNonNull(generator);
5168 for (int i = 0; i < array.length; i++)
5169 array[i] = generator.applyAsInt(i);
5170 }
5171
5172 /**
5173 * Set all elements of the specified array, in parallel, using the
5174 * provided generator function to compute each element.
5175 *
5176 * <p>If the generator function throws an exception, an unchecked exception
5177 * is thrown from {@code parallelSetAll} and the array is left in an
5178 * indeterminate state.
5179 *
5180 * @apiNote
5181 * Setting a subrange of an array, in parallel, using a generator function
5182 * to compute each element, can be written as follows:
5183 * <pre>{@code
5184 * IntStream.range(startInclusive, endExclusive)
5185 * .parallel()
5186 * .forEach(i -> array[i] = generator.applyAsInt(i));
5187 * }</pre>
5188 *
5189 * @param array array to be initialized
5190 * @param generator a function accepting an index and producing the desired
5191 * value for that position
5192 * @throws NullPointerException if the generator is null
5193 * @since 1.8
5194 */
5195 public static void parallelSetAll(int[] array, IntUnaryOperator generator) {
5196 Objects.requireNonNull(generator);
5197 IntStream.range(0, array.length).parallel().forEach(i -> { array[i] = generator.applyAsInt(i); });
5198 }
5199
5200 /**
5201 * Set all elements of the specified array, using the provided
5202 * generator function to compute each element.
5203 *
5204 * <p>If the generator function throws an exception, it is relayed to
5205 * the caller and the array is left in an indeterminate state.
5206 *
5207 * @apiNote
5208 * Setting a subrange of an array, using a generator function to compute
5209 * each element, can be written as follows:
5210 * <pre>{@code
5211 * IntStream.range(startInclusive, endExclusive)
5212 * .forEach(i -> array[i] = generator.applyAsLong(i));
5213 * }</pre>
5214 *
5215 * @param array array to be initialized
5216 * @param generator a function accepting an index and producing the desired
5217 * value for that position
5218 * @throws NullPointerException if the generator is null
5219 * @since 1.8
5220 */
5221 public static void setAll(long[] array, IntToLongFunction generator) {
5222 Objects.requireNonNull(generator);
5223 for (int i = 0; i < array.length; i++)
5224 array[i] = generator.applyAsLong(i);
5225 }
5226
5227 /**
5228 * Set all elements of the specified array, in parallel, using the
5229 * provided generator function to compute each element.
5230 *
5231 * <p>If the generator function throws an exception, an unchecked exception
5232 * is thrown from {@code parallelSetAll} and the array is left in an
5233 * indeterminate state.
5234 *
5235 * @apiNote
5236 * Setting a subrange of an array, in parallel, using a generator function
5237 * to compute each element, can be written as follows:
5238 * <pre>{@code
5239 * IntStream.range(startInclusive, endExclusive)
5240 * .parallel()
5241 * .forEach(i -> array[i] = generator.applyAsLong(i));
5242 * }</pre>
5243 *
5244 * @param array array to be initialized
5245 * @param generator a function accepting an index and producing the desired
5246 * value for that position
5247 * @throws NullPointerException if the generator is null
5248 * @since 1.8
5249 */
5250 public static void parallelSetAll(long[] array, IntToLongFunction generator) {
5251 Objects.requireNonNull(generator);
5252 IntStream.range(0, array.length).parallel().forEach(i -> { array[i] = generator.applyAsLong(i); });
5253 }
5254
5255 /**
5256 * Set all elements of the specified array, using the provided
5257 * generator function to compute each element.
5258 *
5259 * <p>If the generator function throws an exception, it is relayed to
5260 * the caller and the array is left in an indeterminate state.
5261 *
5262 * @apiNote
5263 * Setting a subrange of an array, using a generator function to compute
5264 * each element, can be written as follows:
5265 * <pre>{@code
5266 * IntStream.range(startInclusive, endExclusive)
5267 * .forEach(i -> array[i] = generator.applyAsDouble(i));
5268 * }</pre>
5269 *
5270 * @param array array to be initialized
5271 * @param generator a function accepting an index and producing the desired
5272 * value for that position
5273 * @throws NullPointerException if the generator is null
5274 * @since 1.8
5275 */
5276 public static void setAll(double[] array, IntToDoubleFunction generator) {
5277 Objects.requireNonNull(generator);
5278 for (int i = 0; i < array.length; i++)
5279 array[i] = generator.applyAsDouble(i);
5280 }
5281
5282 /**
5283 * Set all elements of the specified array, in parallel, using the
5284 * provided generator function to compute each element.
5285 *
5286 * <p>If the generator function throws an exception, an unchecked exception
5287 * is thrown from {@code parallelSetAll} and the array is left in an
5288 * indeterminate state.
5289 *
5290 * @apiNote
5291 * Setting a subrange of an array, in parallel, using a generator function
5292 * to compute each element, can be written as follows:
5293 * <pre>{@code
5294 * IntStream.range(startInclusive, endExclusive)
5295 * .parallel()
5296 * .forEach(i -> array[i] = generator.applyAsDouble(i));
5297 * }</pre>
5298 *
5299 * @param array array to be initialized
5300 * @param generator a function accepting an index and producing the desired
5301 * value for that position
5302 * @throws NullPointerException if the generator is null
5303 * @since 1.8
5304 */
5305 public static void parallelSetAll(double[] array, IntToDoubleFunction generator) {
5306 Objects.requireNonNull(generator);
5307 IntStream.range(0, array.length).parallel().forEach(i -> { array[i] = generator.applyAsDouble(i); });
5308 }
5309
5310 /**
5311 * Returns a {@link Spliterator} covering all of the specified array.
5312 *
5313 * <p>The spliterator reports {@link Spliterator#SIZED},
5314 * {@link Spliterator#SUBSIZED}, {@link Spliterator#ORDERED}, and
5315 * {@link Spliterator#IMMUTABLE}.
5316 *
5317 * @param <T> type of elements
5318 * @param array the array, assumed to be unmodified during use
5319 * @return a spliterator for the array elements
5320 * @since 1.8
5321 */
5322 public static <T> Spliterator<T> spliterator(T[] array) {
5323 return Spliterators.spliterator(array,
5324 Spliterator.ORDERED | Spliterator.IMMUTABLE);
5325 }
5326
5327 /**
5328 * Returns a {@link Spliterator} covering the specified range of the
5329 * specified array.
5330 *
5331 * <p>The spliterator reports {@link Spliterator#SIZED},
5332 * {@link Spliterator#SUBSIZED}, {@link Spliterator#ORDERED}, and
5333 * {@link Spliterator#IMMUTABLE}.
5334 *
5335 * @param <T> type of elements
5336 * @param array the array, assumed to be unmodified during use
5337 * @param startInclusive the first index to cover, inclusive
5338 * @param endExclusive index immediately past the last index to cover
5339 * @return a spliterator for the array elements
5340 * @throws ArrayIndexOutOfBoundsException if {@code startInclusive} is
5341 * negative, {@code endExclusive} is less than
5342 * {@code startInclusive}, or {@code endExclusive} is greater than
5343 * the array size
5344 * @since 1.8
5345 */
5346 public static <T> Spliterator<T> spliterator(T[] array, int startInclusive, int endExclusive) {
5347 return Spliterators.spliterator(array, startInclusive, endExclusive,
5348 Spliterator.ORDERED | Spliterator.IMMUTABLE);
5349 }
5350
5351 /**
5352 * Returns a {@link Spliterator.OfInt} covering all of the specified array.
5353 *
5354 * <p>The spliterator reports {@link Spliterator#SIZED},
5355 * {@link Spliterator#SUBSIZED}, {@link Spliterator#ORDERED}, and
5356 * {@link Spliterator#IMMUTABLE}.
5357 *
5358 * @param array the array, assumed to be unmodified during use
5359 * @return a spliterator for the array elements
5360 * @since 1.8
5361 */
5362 public static Spliterator.OfInt spliterator(int[] array) {
5363 return Spliterators.spliterator(array,
5364 Spliterator.ORDERED | Spliterator.IMMUTABLE);
5365 }
5366
5367 /**
5368 * Returns a {@link Spliterator.OfInt} covering the specified range of the
5369 * specified array.
5370 *
5371 * <p>The spliterator reports {@link Spliterator#SIZED},
5372 * {@link Spliterator#SUBSIZED}, {@link Spliterator#ORDERED}, and
5373 * {@link Spliterator#IMMUTABLE}.
5374 *
5375 * @param array the array, assumed to be unmodified during use
5376 * @param startInclusive the first index to cover, inclusive
5377 * @param endExclusive index immediately past the last index to cover
5378 * @return a spliterator for the array elements
5379 * @throws ArrayIndexOutOfBoundsException if {@code startInclusive} is
5380 * negative, {@code endExclusive} is less than
5381 * {@code startInclusive}, or {@code endExclusive} is greater than
5382 * the array size
5383 * @since 1.8
5384 */
5385 public static Spliterator.OfInt spliterator(int[] array, int startInclusive, int endExclusive) {
5386 return Spliterators.spliterator(array, startInclusive, endExclusive,
5387 Spliterator.ORDERED | Spliterator.IMMUTABLE);
5388 }
5389
5390 /**
5391 * Returns a {@link Spliterator.OfLong} covering all of the specified array.
5392 *
5393 * <p>The spliterator reports {@link Spliterator#SIZED},
5394 * {@link Spliterator#SUBSIZED}, {@link Spliterator#ORDERED}, and
5395 * {@link Spliterator#IMMUTABLE}.
5396 *
5397 * @param array the array, assumed to be unmodified during use
5398 * @return the spliterator for the array elements
5399 * @since 1.8
5400 */
5401 public static Spliterator.OfLong spliterator(long[] array) {
5402 return Spliterators.spliterator(array,
5403 Spliterator.ORDERED | Spliterator.IMMUTABLE);
5404 }
5405
5406 /**
5407 * Returns a {@link Spliterator.OfLong} covering the specified range of the
5408 * specified array.
5409 *
5410 * <p>The spliterator reports {@link Spliterator#SIZED},
5411 * {@link Spliterator#SUBSIZED}, {@link Spliterator#ORDERED}, and
5412 * {@link Spliterator#IMMUTABLE}.
5413 *
5414 * @param array the array, assumed to be unmodified during use
5415 * @param startInclusive the first index to cover, inclusive
5416 * @param endExclusive index immediately past the last index to cover
5417 * @return a spliterator for the array elements
5418 * @throws ArrayIndexOutOfBoundsException if {@code startInclusive} is
5419 * negative, {@code endExclusive} is less than
5420 * {@code startInclusive}, or {@code endExclusive} is greater than
5421 * the array size
5422 * @since 1.8
5423 */
5424 public static Spliterator.OfLong spliterator(long[] array, int startInclusive, int endExclusive) {
5425 return Spliterators.spliterator(array, startInclusive, endExclusive,
5426 Spliterator.ORDERED | Spliterator.IMMUTABLE);
5427 }
5428
5429 /**
5430 * Returns a {@link Spliterator.OfDouble} covering all of the specified
5431 * array.
5432 *
5433 * <p>The spliterator reports {@link Spliterator#SIZED},
5434 * {@link Spliterator#SUBSIZED}, {@link Spliterator#ORDERED}, and
5435 * {@link Spliterator#IMMUTABLE}.
5436 *
5437 * @param array the array, assumed to be unmodified during use
5438 * @return a spliterator for the array elements
5439 * @since 1.8
5440 */
5441 public static Spliterator.OfDouble spliterator(double[] array) {
5442 return Spliterators.spliterator(array,
5443 Spliterator.ORDERED | Spliterator.IMMUTABLE);
5444 }
5445
5446 /**
5447 * Returns a {@link Spliterator.OfDouble} covering the specified range of
5448 * the specified array.
5449 *
5450 * <p>The spliterator reports {@link Spliterator#SIZED},
5451 * {@link Spliterator#SUBSIZED}, {@link Spliterator#ORDERED}, and
5452 * {@link Spliterator#IMMUTABLE}.
5453 *
5454 * @param array the array, assumed to be unmodified during use
5455 * @param startInclusive the first index to cover, inclusive
5456 * @param endExclusive index immediately past the last index to cover
5457 * @return a spliterator for the array elements
5458 * @throws ArrayIndexOutOfBoundsException if {@code startInclusive} is
5459 * negative, {@code endExclusive} is less than
5460 * {@code startInclusive}, or {@code endExclusive} is greater than
5461 * the array size
5462 * @since 1.8
5463 */
5464 public static Spliterator.OfDouble spliterator(double[] array, int startInclusive, int endExclusive) {
5465 return Spliterators.spliterator(array, startInclusive, endExclusive,
5466 Spliterator.ORDERED | Spliterator.IMMUTABLE);
5467 }
5468
5469 /**
5470 * Returns a sequential {@link Stream} with the specified array as its
5471 * source.
5472 *
5473 * @param <T> The type of the array elements
5474 * @param array The array, assumed to be unmodified during use
5475 * @return a {@code Stream} for the array
5476 * @since 1.8
5477 */
5478 public static <T> Stream<T> stream(T[] array) {
5479 return stream(array, 0, array.length);
5480 }
5481
5482 /**
5483 * Returns a sequential {@link Stream} with the specified range of the
5484 * specified array as its source.
5485 *
5486 * @param <T> the type of the array elements
5487 * @param array the array, assumed to be unmodified during use
5488 * @param startInclusive the first index to cover, inclusive
5489 * @param endExclusive index immediately past the last index to cover
5490 * @return a {@code Stream} for the array range
5491 * @throws ArrayIndexOutOfBoundsException if {@code startInclusive} is
5492 * negative, {@code endExclusive} is less than
5493 * {@code startInclusive}, or {@code endExclusive} is greater than
5494 * the array size
5495 * @since 1.8
5496 */
5497 public static <T> Stream<T> stream(T[] array, int startInclusive, int endExclusive) {
5498 return StreamSupport.stream(spliterator(array, startInclusive, endExclusive), false);
5499 }
5500
5501 /**
5502 * Returns a sequential {@link IntStream} with the specified array as its
5503 * source.
5504 *
5505 * @param array the array, assumed to be unmodified during use
5506 * @return an {@code IntStream} for the array
5507 * @since 1.8
5508 */
5509 public static IntStream stream(int[] array) {
5510 return stream(array, 0, array.length);
5511 }
5512
5513 /**
5514 * Returns a sequential {@link IntStream} with the specified range of the
5515 * specified array as its source.
5516 *
5517 * @param array the array, assumed to be unmodified during use
5518 * @param startInclusive the first index to cover, inclusive
5519 * @param endExclusive index immediately past the last index to cover
5520 * @return an {@code IntStream} for the array range
5521 * @throws ArrayIndexOutOfBoundsException if {@code startInclusive} is
5522 * negative, {@code endExclusive} is less than
5523 * {@code startInclusive}, or {@code endExclusive} is greater than
5524 * the array size
5525 * @since 1.8
5526 */
5527 public static IntStream stream(int[] array, int startInclusive, int endExclusive) {
5528 return StreamSupport.intStream(spliterator(array, startInclusive, endExclusive), false);
5529 }
5530
5531 /**
5532 * Returns a sequential {@link LongStream} with the specified array as its
5533 * source.
5534 *
5535 * @param array the array, assumed to be unmodified during use
5536 * @return a {@code LongStream} for the array
5537 * @since 1.8
5538 */
5539 public static LongStream stream(long[] array) {
5540 return stream(array, 0, array.length);
5541 }
5542
5543 /**
5544 * Returns a sequential {@link LongStream} with the specified range of the
5545 * specified array as its source.
5546 *
5547 * @param array the array, assumed to be unmodified during use
5548 * @param startInclusive the first index to cover, inclusive
5549 * @param endExclusive index immediately past the last index to cover
5550 * @return a {@code LongStream} for the array range
5551 * @throws ArrayIndexOutOfBoundsException if {@code startInclusive} is
5552 * negative, {@code endExclusive} is less than
5553 * {@code startInclusive}, or {@code endExclusive} is greater than
5554 * the array size
5555 * @since 1.8
5556 */
5557 public static LongStream stream(long[] array, int startInclusive, int endExclusive) {
5558 return StreamSupport.longStream(spliterator(array, startInclusive, endExclusive), false);
5559 }
5560
5561 /**
5562 * Returns a sequential {@link DoubleStream} with the specified array as its
5563 * source.
5564 *
5565 * @param array the array, assumed to be unmodified during use
5566 * @return a {@code DoubleStream} for the array
5567 * @since 1.8
5568 */
5569 public static DoubleStream stream(double[] array) {
5570 return stream(array, 0, array.length);
5571 }
5572
5573 /**
5574 * Returns a sequential {@link DoubleStream} with the specified range of the
5575 * specified array as its source.
5576 *
5577 * @param array the array, assumed to be unmodified during use
5578 * @param startInclusive the first index to cover, inclusive
5579 * @param endExclusive index immediately past the last index to cover
5580 * @return a {@code DoubleStream} for the array range
5581 * @throws ArrayIndexOutOfBoundsException if {@code startInclusive} is
5582 * negative, {@code endExclusive} is less than
5583 * {@code startInclusive}, or {@code endExclusive} is greater than
5584 * the array size
5585 * @since 1.8
5586 */
5587 public static DoubleStream stream(double[] array, int startInclusive, int endExclusive) {
5588 return StreamSupport.doubleStream(spliterator(array, startInclusive, endExclusive), false);
5589 }
5590
5591
5592 // Comparison methods
5593
5594 // Compare boolean
5595
5596 /**
5597 * Compares two {@code boolean} arrays lexicographically.
5598 *
5599 * <p>If the two arrays share a common prefix then the lexicographic
5600 * comparison is the result of comparing two elements, as if by
5601 * {@link Boolean#compare(boolean, boolean)}, at an index within the
5602 * respective arrays that is the prefix length.
5603 * Otherwise, one array is a proper prefix of the other and, lexicographic
5604 * comparison is the result of comparing the two array lengths.
5605 * (See {@link #mismatch(boolean[], boolean[])} for the definition of a
5606 * common and proper prefix.)
5607 *
5608 * <p>A {@code null} array reference is considered lexicographically less
5609 * than a non-{@code null} array reference. Two {@code null} array
5610 * references are considered equal.
5611 *
5612 * <p>The comparison is consistent with {@link #equals(boolean[], boolean[]) equals},
5613 * more specifically the following holds for arrays {@code a} and {@code b}:
5614 * <pre>{@code
5615 * Arrays.equals(a, b) == (Arrays.compare(a, b) == 0)
5616 * }</pre>
5617 *
5618 * @apiNote
5619 * <p>This method behaves as if (for non-{@code null} array references):
5620 * <pre>{@code
5621 * int i = Arrays.mismatch(a, b);
5622 * if (i >= 0 && i < Math.min(a.length, b.length))
5623 * return Boolean.compare(a[i], b[i]);
5624 * return a.length - b.length;
5625 * }</pre>
5626 *
5627 * @param a the first array to compare
5628 * @param b the second array to compare
5629 * @return the value {@code 0} if the first and second array are equal and
5630 * contain the same elements in the same order;
5631 * a value less than {@code 0} if the first array is
5632 * lexicographically less than the second array; and
5633 * a value greater than {@code 0} if the first array is
5634 * lexicographically greater than the second array
5635 * @since 9
5636 */
5637 public static int compare(boolean[] a, boolean[] b) {
5638 if (a == b)
5639 return 0;
5640 if (a == null || b == null)
5641 return a == null ? -1 : 1;
5642
5643 int i = ArraysSupport.mismatch(a, b,
5644 Math.min(a.length, b.length));
5645 if (i >= 0) {
5646 return Boolean.compare(a[i], b[i]);
5647 }
5648
5649 return a.length - b.length;
5650 }
5651
5652 /**
5653 * Compares two {@code boolean} arrays lexicographically over the specified
5654 * ranges.
5655 *
5656 * <p>If the two arrays, over the specified ranges, share a common prefix
5657 * then the lexicographic comparison is the result of comparing two
5658 * elements, as if by {@link Boolean#compare(boolean, boolean)}, at a
5659 * relative index within the respective arrays that is the length of the
5660 * prefix.
5661 * Otherwise, one array is a proper prefix of the other and, lexicographic
5662 * comparison is the result of comparing the two range lengths.
5663 * (See {@link #mismatch(boolean[], int, int, boolean[], int, int)} for the
5664 * definition of a common and proper prefix.)
5665 *
5666 * <p>The comparison is consistent with
5667 * {@link #equals(boolean[], int, int, boolean[], int, int) equals}, more
5668 * specifically the following holds for arrays {@code a} and {@code b} with
5669 * specified ranges [{@code aFromIndex}, {@code aToIndex}) and
5670 * [{@code bFromIndex}, {@code bToIndex}) respectively:
5671 * <pre>{@code
5672 * Arrays.equals(a, aFromIndex, aToIndex, b, bFromIndex, bToIndex) ==
5673 * (Arrays.compare(a, aFromIndex, aToIndex, b, bFromIndex, bToIndex) == 0)
5674 * }</pre>
5675 *
5676 * @apiNote
5677 * <p>This method behaves as if:
5678 * <pre>{@code
5679 * int i = Arrays.mismatch(a, aFromIndex, aToIndex,
5680 * b, bFromIndex, bToIndex);
5681 * if (i >= 0 && i < Math.min(aToIndex - aFromIndex, bToIndex - bFromIndex))
5682 * return Boolean.compare(a[aFromIndex + i], b[bFromIndex + i]);
5683 * return (aToIndex - aFromIndex) - (bToIndex - bFromIndex);
5684 * }</pre>
5685 *
5686 * @param a the first array to compare
5687 * @param aFromIndex the index (inclusive) of the first element in the
5688 * first array to be compared
5689 * @param aToIndex the index (exclusive) of the last element in the
5690 * first array to be compared
5691 * @param b the second array to compare
5692 * @param bFromIndex the index (inclusive) of the first element in the
5693 * second array to be compared
5694 * @param bToIndex the index (exclusive) of the last element in the
5695 * second array to be compared
5696 * @return the value {@code 0} if, over the specified ranges, the first and
5697 * second array are equal and contain the same elements in the same
5698 * order;
5699 * a value less than {@code 0} if, over the specified ranges, the
5700 * first array is lexicographically less than the second array; and
5701 * a value greater than {@code 0} if, over the specified ranges, the
5702 * first array is lexicographically greater than the second array
5703 * @throws IllegalArgumentException
5704 * if {@code aFromIndex > aToIndex} or
5705 * if {@code bFromIndex > bToIndex}
5706 * @throws ArrayIndexOutOfBoundsException
5707 * if {@code aFromIndex < 0 or aToIndex > a.length} or
5708 * if {@code bFromIndex < 0 or bToIndex > b.length}
5709 * @throws NullPointerException
5710 * if either array is {@code null}
5711 * @since 9
5712 */
5713 public static int compare(boolean[] a, int aFromIndex, int aToIndex,
5714 boolean[] b, int bFromIndex, int bToIndex) {
5715 rangeCheck(a.length, aFromIndex, aToIndex);
5716 rangeCheck(b.length, bFromIndex, bToIndex);
5717
5718 int aLength = aToIndex - aFromIndex;
5719 int bLength = bToIndex - bFromIndex;
5720 int i = ArraysSupport.mismatch(a, aFromIndex,
5721 b, bFromIndex,
5722 Math.min(aLength, bLength));
5723 if (i >= 0) {
5724 return Boolean.compare(a[aFromIndex + i], b[bFromIndex + i]);
5725 }
5726
5727 return aLength - bLength;
5728 }
5729
5730 // Compare byte
5731
5732 /**
5733 * Compares two {@code byte} arrays lexicographically.
5734 *
5735 * <p>If the two arrays share a common prefix then the lexicographic
5736 * comparison is the result of comparing two elements, as if by
5737 * {@link Byte#compare(byte, byte)}, at an index within the respective
5738 * arrays that is the prefix length.
5739 * Otherwise, one array is a proper prefix of the other and, lexicographic
5740 * comparison is the result of comparing the two array lengths.
5741 * (See {@link #mismatch(byte[], byte[])} for the definition of a common and
5742 * proper prefix.)
5743 *
5744 * <p>A {@code null} array reference is considered lexicographically less
5745 * than a non-{@code null} array reference. Two {@code null} array
5746 * references are considered equal.
5747 *
5748 * <p>The comparison is consistent with {@link #equals(byte[], byte[]) equals},
5749 * more specifically the following holds for arrays {@code a} and {@code b}:
5750 * <pre>{@code
5751 * Arrays.equals(a, b) == (Arrays.compare(a, b) == 0)
5752 * }</pre>
5753 *
5754 * @apiNote
5755 * <p>This method behaves as if (for non-{@code null} array references):
5756 * <pre>{@code
5757 * int i = Arrays.mismatch(a, b);
5758 * if (i >= 0 && i < Math.min(a.length, b.length))
5759 * return Byte.compare(a[i], b[i]);
5760 * return a.length - b.length;
5761 * }</pre>
5762 *
5763 * @param a the first array to compare
5764 * @param b the second array to compare
5765 * @return the value {@code 0} if the first and second array are equal and
5766 * contain the same elements in the same order;
5767 * a value less than {@code 0} if the first array is
5768 * lexicographically less than the second array; and
5769 * a value greater than {@code 0} if the first array is
5770 * lexicographically greater than the second array
5771 * @since 9
5772 */
5773 public static int compare(byte[] a, byte[] b) {
5774 if (a == b)
5775 return 0;
5776 if (a == null || b == null)
5777 return a == null ? -1 : 1;
5778
5779 int i = ArraysSupport.mismatch(a, b,
5780 Math.min(a.length, b.length));
5781 if (i >= 0) {
5782 return Byte.compare(a[i], b[i]);
5783 }
5784
5785 return a.length - b.length;
5786 }
5787
5788 /**
5789 * Compares two {@code byte} arrays lexicographically over the specified
5790 * ranges.
5791 *
5792 * <p>If the two arrays, over the specified ranges, share a common prefix
5793 * then the lexicographic comparison is the result of comparing two
5794 * elements, as if by {@link Byte#compare(byte, byte)}, at a relative index
5795 * within the respective arrays that is the length of the prefix.
5796 * Otherwise, one array is a proper prefix of the other and, lexicographic
5797 * comparison is the result of comparing the two range lengths.
5798 * (See {@link #mismatch(byte[], int, int, byte[], int, int)} for the
5799 * definition of a common and proper prefix.)
5800 *
5801 * <p>The comparison is consistent with
5802 * {@link #equals(byte[], int, int, byte[], int, int) equals}, more
5803 * specifically the following holds for arrays {@code a} and {@code b} with
5804 * specified ranges [{@code aFromIndex}, {@code aToIndex}) and
5805 * [{@code bFromIndex}, {@code bToIndex}) respectively:
5806 * <pre>{@code
5807 * Arrays.equals(a, aFromIndex, aToIndex, b, bFromIndex, bToIndex) ==
5808 * (Arrays.compare(a, aFromIndex, aToIndex, b, bFromIndex, bToIndex) == 0)
5809 * }</pre>
5810 *
5811 * @apiNote
5812 * <p>This method behaves as if:
5813 * <pre>{@code
5814 * int i = Arrays.mismatch(a, aFromIndex, aToIndex,
5815 * b, bFromIndex, bToIndex);
5816 * if (i >= 0 && i < Math.min(aToIndex - aFromIndex, bToIndex - bFromIndex))
5817 * return Byte.compare(a[aFromIndex + i], b[bFromIndex + i]);
5818 * return (aToIndex - aFromIndex) - (bToIndex - bFromIndex);
5819 * }</pre>
5820 *
5821 * @param a the first array to compare
5822 * @param aFromIndex the index (inclusive) of the first element in the
5823 * first array to be compared
5824 * @param aToIndex the index (exclusive) of the last element in the
5825 * first array to be compared
5826 * @param b the second array to compare
5827 * @param bFromIndex the index (inclusive) of the first element in the
5828 * second array to be compared
5829 * @param bToIndex the index (exclusive) of the last element in the
5830 * second array to be compared
5831 * @return the value {@code 0} if, over the specified ranges, the first and
5832 * second array are equal and contain the same elements in the same
5833 * order;
5834 * a value less than {@code 0} if, over the specified ranges, the
5835 * first array is lexicographically less than the second array; and
5836 * a value greater than {@code 0} if, over the specified ranges, the
5837 * first array is lexicographically greater than the second array
5838 * @throws IllegalArgumentException
5839 * if {@code aFromIndex > aToIndex} or
5840 * if {@code bFromIndex > bToIndex}
5841 * @throws ArrayIndexOutOfBoundsException
5842 * if {@code aFromIndex < 0 or aToIndex > a.length} or
5843 * if {@code bFromIndex < 0 or bToIndex > b.length}
5844 * @throws NullPointerException
5845 * if either array is {@code null}
5846 * @since 9
5847 */
5848 public static int compare(byte[] a, int aFromIndex, int aToIndex,
5849 byte[] b, int bFromIndex, int bToIndex) {
5850 rangeCheck(a.length, aFromIndex, aToIndex);
5851 rangeCheck(b.length, bFromIndex, bToIndex);
5852
5853 int aLength = aToIndex - aFromIndex;
5854 int bLength = bToIndex - bFromIndex;
5855 int i = ArraysSupport.mismatch(a, aFromIndex,
5856 b, bFromIndex,
5857 Math.min(aLength, bLength));
5858 if (i >= 0) {
5859 return Byte.compare(a[aFromIndex + i], b[bFromIndex + i]);
5860 }
5861
5862 return aLength - bLength;
5863 }
5864
5865 /**
5866 * Compares two {@code byte} arrays lexicographically, numerically treating
5867 * elements as unsigned.
5868 *
5869 * <p>If the two arrays share a common prefix then the lexicographic
5870 * comparison is the result of comparing two elements, as if by
5871 * {@link Byte#compareUnsigned(byte, byte)}, at an index within the
5872 * respective arrays that is the prefix length.
5873 * Otherwise, one array is a proper prefix of the other and, lexicographic
5874 * comparison is the result of comparing the two array lengths.
5875 * (See {@link #mismatch(byte[], byte[])} for the definition of a common
5876 * and proper prefix.)
5877 *
5878 * <p>A {@code null} array reference is considered lexicographically less
5879 * than a non-{@code null} array reference. Two {@code null} array
5880 * references are considered equal.
5881 *
5882 * @apiNote
5883 * <p>This method behaves as if (for non-{@code null} array references):
5884 * <pre>{@code
5885 * int i = Arrays.mismatch(a, b);
5886 * if (i >= 0 && i < Math.min(a.length, b.length))
5887 * return Byte.compareUnsigned(a[i], b[i]);
5888 * return a.length - b.length;
5889 * }</pre>
5890 *
5891 * @param a the first array to compare
5892 * @param b the second array to compare
5893 * @return the value {@code 0} if the first and second array are
5894 * equal and contain the same elements in the same order;
5895 * a value less than {@code 0} if the first array is
5896 * lexicographically less than the second array; and
5897 * a value greater than {@code 0} if the first array is
5898 * lexicographically greater than the second array
5899 * @since 9
5900 */
5901 public static int compareUnsigned(byte[] a, byte[] b) {
5902 if (a == b)
5903 return 0;
5904 if (a == null || b == null)
5905 return a == null ? -1 : 1;
5906
5907 int i = ArraysSupport.mismatch(a, b,
5908 Math.min(a.length, b.length));
5909 if (i >= 0) {
5910 return Byte.compareUnsigned(a[i], b[i]);
5911 }
5912
5913 return a.length - b.length;
5914 }
5915
5916
5917 /**
5918 * Compares two {@code byte} arrays lexicographically over the specified
5919 * ranges, numerically treating elements as unsigned.
5920 *
5921 * <p>If the two arrays, over the specified ranges, share a common prefix
5922 * then the lexicographic comparison is the result of comparing two
5923 * elements, as if by {@link Byte#compareUnsigned(byte, byte)}, at a
5924 * relative index within the respective arrays that is the length of the
5925 * prefix.
5926 * Otherwise, one array is a proper prefix of the other and, lexicographic
5927 * comparison is the result of comparing the two range lengths.
5928 * (See {@link #mismatch(byte[], int, int, byte[], int, int)} for the
5929 * definition of a common and proper prefix.)
5930 *
5931 * @apiNote
5932 * <p>This method behaves as if:
5933 * <pre>{@code
5934 * int i = Arrays.mismatch(a, aFromIndex, aToIndex,
5935 * b, bFromIndex, bToIndex);
5936 * if (i >= 0 && i < Math.min(aToIndex - aFromIndex, bToIndex - bFromIndex))
5937 * return Byte.compareUnsigned(a[aFromIndex + i], b[bFromIndex + i]);
5938 * return (aToIndex - aFromIndex) - (bToIndex - bFromIndex);
5939 * }</pre>
5940 *
5941 * @param a the first array to compare
5942 * @param aFromIndex the index (inclusive) of the first element in the
5943 * first array to be compared
5944 * @param aToIndex the index (exclusive) of the last element in the
5945 * first array to be compared
5946 * @param b the second array to compare
5947 * @param bFromIndex the index (inclusive) of the first element in the
5948 * second array to be compared
5949 * @param bToIndex the index (exclusive) of the last element in the
5950 * second array to be compared
5951 * @return the value {@code 0} if, over the specified ranges, the first and
5952 * second array are equal and contain the same elements in the same
5953 * order;
5954 * a value less than {@code 0} if, over the specified ranges, the
5955 * first array is lexicographically less than the second array; and
5956 * a value greater than {@code 0} if, over the specified ranges, the
5957 * first array is lexicographically greater than the second array
5958 * @throws IllegalArgumentException
5959 * if {@code aFromIndex > aToIndex} or
5960 * if {@code bFromIndex > bToIndex}
5961 * @throws ArrayIndexOutOfBoundsException
5962 * if {@code aFromIndex < 0 or aToIndex > a.length} or
5963 * if {@code bFromIndex < 0 or bToIndex > b.length}
5964 * @throws NullPointerException
5965 * if either array is null
5966 * @since 9
5967 */
5968 public static int compareUnsigned(byte[] a, int aFromIndex, int aToIndex,
5969 byte[] b, int bFromIndex, int bToIndex) {
5970 rangeCheck(a.length, aFromIndex, aToIndex);
5971 rangeCheck(b.length, bFromIndex, bToIndex);
5972
5973 int aLength = aToIndex - aFromIndex;
5974 int bLength = bToIndex - bFromIndex;
5975 int i = ArraysSupport.mismatch(a, aFromIndex,
5976 b, bFromIndex,
5977 Math.min(aLength, bLength));
5978 if (i >= 0) {
5979 return Byte.compareUnsigned(a[aFromIndex + i], b[bFromIndex + i]);
5980 }
5981
5982 return aLength - bLength;
5983 }
5984
5985 // Compare short
5986
5987 /**
5988 * Compares two {@code short} arrays lexicographically.
5989 *
5990 * <p>If the two arrays share a common prefix then the lexicographic
5991 * comparison is the result of comparing two elements, as if by
5992 * {@link Short#compare(short, short)}, at an index within the respective
5993 * arrays that is the prefix length.
5994 * Otherwise, one array is a proper prefix of the other and, lexicographic
5995 * comparison is the result of comparing the two array lengths.
5996 * (See {@link #mismatch(short[], short[])} for the definition of a common
5997 * and proper prefix.)
5998 *
5999 * <p>A {@code null} array reference is considered lexicographically less
6000 * than a non-{@code null} array reference. Two {@code null} array
6001 * references are considered equal.
6002 *
6003 * <p>The comparison is consistent with {@link #equals(short[], short[]) equals},
6004 * more specifically the following holds for arrays {@code a} and {@code b}:
6005 * <pre>{@code
6006 * Arrays.equals(a, b) == (Arrays.compare(a, b) == 0)
6007 * }</pre>
6008 *
6009 * @apiNote
6010 * <p>This method behaves as if (for non-{@code null} array references):
6011 * <pre>{@code
6012 * int i = Arrays.mismatch(a, b);
6013 * if (i >= 0 && i < Math.min(a.length, b.length))
6014 * return Short.compare(a[i], b[i]);
6015 * return a.length - b.length;
6016 * }</pre>
6017 *
6018 * @param a the first array to compare
6019 * @param b the second array to compare
6020 * @return the value {@code 0} if the first and second array are equal and
6021 * contain the same elements in the same order;
6022 * a value less than {@code 0} if the first array is
6023 * lexicographically less than the second array; and
6024 * a value greater than {@code 0} if the first array is
6025 * lexicographically greater than the second array
6026 * @since 9
6027 */
6028 public static int compare(short[] a, short[] b) {
6029 if (a == b)
6030 return 0;
6031 if (a == null || b == null)
6032 return a == null ? -1 : 1;
6033
6034 int i = ArraysSupport.mismatch(a, b,
6035 Math.min(a.length, b.length));
6036 if (i >= 0) {
6037 return Short.compare(a[i], b[i]);
6038 }
6039
6040 return a.length - b.length;
6041 }
6042
6043 /**
6044 * Compares two {@code short} arrays lexicographically over the specified
6045 * ranges.
6046 *
6047 * <p>If the two arrays, over the specified ranges, share a common prefix
6048 * then the lexicographic comparison is the result of comparing two
6049 * elements, as if by {@link Short#compare(short, short)}, at a relative
6050 * index within the respective arrays that is the length of the prefix.
6051 * Otherwise, one array is a proper prefix of the other and, lexicographic
6052 * comparison is the result of comparing the two range lengths.
6053 * (See {@link #mismatch(short[], int, int, short[], int, int)} for the
6054 * definition of a common and proper prefix.)
6055 *
6056 * <p>The comparison is consistent with
6057 * {@link #equals(short[], int, int, short[], int, int) equals}, more
6058 * specifically the following holds for arrays {@code a} and {@code b} with
6059 * specified ranges [{@code aFromIndex}, {@code aToIndex}) and
6060 * [{@code bFromIndex}, {@code bToIndex}) respectively:
6061 * <pre>{@code
6062 * Arrays.equals(a, aFromIndex, aToIndex, b, bFromIndex, bToIndex) ==
6063 * (Arrays.compare(a, aFromIndex, aToIndex, b, bFromIndex, bToIndex) == 0)
6064 * }</pre>
6065 *
6066 * @apiNote
6067 * <p>This method behaves as if:
6068 * <pre>{@code
6069 * int i = Arrays.mismatch(a, aFromIndex, aToIndex,
6070 * b, bFromIndex, bToIndex);
6071 * if (i >= 0 && i < Math.min(aToIndex - aFromIndex, bToIndex - bFromIndex))
6072 * return Short.compare(a[aFromIndex + i], b[bFromIndex + i]);
6073 * return (aToIndex - aFromIndex) - (bToIndex - bFromIndex);
6074 * }</pre>
6075 *
6076 * @param a the first array to compare
6077 * @param aFromIndex the index (inclusive) of the first element in the
6078 * first array to be compared
6079 * @param aToIndex the index (exclusive) of the last element in the
6080 * first array to be compared
6081 * @param b the second array to compare
6082 * @param bFromIndex the index (inclusive) of the first element in the
6083 * second array to be compared
6084 * @param bToIndex the index (exclusive) of the last element in the
6085 * second array to be compared
6086 * @return the value {@code 0} if, over the specified ranges, the first and
6087 * second array are equal and contain the same elements in the same
6088 * order;
6089 * a value less than {@code 0} if, over the specified ranges, the
6090 * first array is lexicographically less than the second array; and
6091 * a value greater than {@code 0} if, over the specified ranges, the
6092 * first array is lexicographically greater than the second array
6093 * @throws IllegalArgumentException
6094 * if {@code aFromIndex > aToIndex} or
6095 * if {@code bFromIndex > bToIndex}
6096 * @throws ArrayIndexOutOfBoundsException
6097 * if {@code aFromIndex < 0 or aToIndex > a.length} or
6098 * if {@code bFromIndex < 0 or bToIndex > b.length}
6099 * @throws NullPointerException
6100 * if either array is {@code null}
6101 * @since 9
6102 */
6103 public static int compare(short[] a, int aFromIndex, int aToIndex,
6104 short[] b, int bFromIndex, int bToIndex) {
6105 rangeCheck(a.length, aFromIndex, aToIndex);
6106 rangeCheck(b.length, bFromIndex, bToIndex);
6107
6108 int aLength = aToIndex - aFromIndex;
6109 int bLength = bToIndex - bFromIndex;
6110 int i = ArraysSupport.mismatch(a, aFromIndex,
6111 b, bFromIndex,
6112 Math.min(aLength, bLength));
6113 if (i >= 0) {
6114 return Short.compare(a[aFromIndex + i], b[bFromIndex + i]);
6115 }
6116
6117 return aLength - bLength;
6118 }
6119
6120 /**
6121 * Compares two {@code short} arrays lexicographically, numerically treating
6122 * elements as unsigned.
6123 *
6124 * <p>If the two arrays share a common prefix then the lexicographic
6125 * comparison is the result of comparing two elements, as if by
6126 * {@link Short#compareUnsigned(short, short)}, at an index within the
6127 * respective arrays that is the prefix length.
6128 * Otherwise, one array is a proper prefix of the other and, lexicographic
6129 * comparison is the result of comparing the two array lengths.
6130 * (See {@link #mismatch(short[], short[])} for the definition of a common
6131 * and proper prefix.)
6132 *
6133 * <p>A {@code null} array reference is considered lexicographically less
6134 * than a non-{@code null} array reference. Two {@code null} array
6135 * references are considered equal.
6136 *
6137 * @apiNote
6138 * <p>This method behaves as if (for non-{@code null} array references):
6139 * <pre>{@code
6140 * int i = Arrays.mismatch(a, b);
6141 * if (i >= 0 && i < Math.min(a.length, b.length))
6142 * return Short.compareUnsigned(a[i], b[i]);
6143 * return a.length - b.length;
6144 * }</pre>
6145 *
6146 * @param a the first array to compare
6147 * @param b the second array to compare
6148 * @return the value {@code 0} if the first and second array are
6149 * equal and contain the same elements in the same order;
6150 * a value less than {@code 0} if the first array is
6151 * lexicographically less than the second array; and
6152 * a value greater than {@code 0} if the first array is
6153 * lexicographically greater than the second array
6154 * @since 9
6155 */
6156 public static int compareUnsigned(short[] a, short[] b) {
6157 if (a == b)
6158 return 0;
6159 if (a == null || b == null)
6160 return a == null ? -1 : 1;
6161
6162 int i = ArraysSupport.mismatch(a, b,
6163 Math.min(a.length, b.length));
6164 if (i >= 0) {
6165 return Short.compareUnsigned(a[i], b[i]);
6166 }
6167
6168 return a.length - b.length;
6169 }
6170
6171 /**
6172 * Compares two {@code short} arrays lexicographically over the specified
6173 * ranges, numerically treating elements as unsigned.
6174 *
6175 * <p>If the two arrays, over the specified ranges, share a common prefix
6176 * then the lexicographic comparison is the result of comparing two
6177 * elements, as if by {@link Short#compareUnsigned(short, short)}, at a
6178 * relative index within the respective arrays that is the length of the
6179 * prefix.
6180 * Otherwise, one array is a proper prefix of the other and, lexicographic
6181 * comparison is the result of comparing the two range lengths.
6182 * (See {@link #mismatch(short[], int, int, short[], int, int)} for the
6183 * definition of a common and proper prefix.)
6184 *
6185 * @apiNote
6186 * <p>This method behaves as if:
6187 * <pre>{@code
6188 * int i = Arrays.mismatch(a, aFromIndex, aToIndex,
6189 * b, bFromIndex, bToIndex);
6190 * if (i >= 0 && i < Math.min(aToIndex - aFromIndex, bToIndex - bFromIndex))
6191 * return Short.compareUnsigned(a[aFromIndex + i], b[bFromIndex + i]);
6192 * return (aToIndex - aFromIndex) - (bToIndex - bFromIndex);
6193 * }</pre>
6194 *
6195 * @param a the first array to compare
6196 * @param aFromIndex the index (inclusive) of the first element in the
6197 * first array to be compared
6198 * @param aToIndex the index (exclusive) of the last element in the
6199 * first array to be compared
6200 * @param b the second array to compare
6201 * @param bFromIndex the index (inclusive) of the first element in the
6202 * second array to be compared
6203 * @param bToIndex the index (exclusive) of the last element in the
6204 * second array to be compared
6205 * @return the value {@code 0} if, over the specified ranges, the first and
6206 * second array are equal and contain the same elements in the same
6207 * order;
6208 * a value less than {@code 0} if, over the specified ranges, the
6209 * first array is lexicographically less than the second array; and
6210 * a value greater than {@code 0} if, over the specified ranges, the
6211 * first array is lexicographically greater than the second array
6212 * @throws IllegalArgumentException
6213 * if {@code aFromIndex > aToIndex} or
6214 * if {@code bFromIndex > bToIndex}
6215 * @throws ArrayIndexOutOfBoundsException
6216 * if {@code aFromIndex < 0 or aToIndex > a.length} or
6217 * if {@code bFromIndex < 0 or bToIndex > b.length}
6218 * @throws NullPointerException
6219 * if either array is null
6220 * @since 9
6221 */
6222 public static int compareUnsigned(short[] a, int aFromIndex, int aToIndex,
6223 short[] b, int bFromIndex, int bToIndex) {
6224 rangeCheck(a.length, aFromIndex, aToIndex);
6225 rangeCheck(b.length, bFromIndex, bToIndex);
6226
6227 int aLength = aToIndex - aFromIndex;
6228 int bLength = bToIndex - bFromIndex;
6229 int i = ArraysSupport.mismatch(a, aFromIndex,
6230 b, bFromIndex,
6231 Math.min(aLength, bLength));
6232 if (i >= 0) {
6233 return Short.compareUnsigned(a[aFromIndex + i], b[bFromIndex + i]);
6234 }
6235
6236 return aLength - bLength;
6237 }
6238
6239 // Compare char
6240
6241 /**
6242 * Compares two {@code char} arrays lexicographically.
6243 *
6244 * <p>If the two arrays share a common prefix then the lexicographic
6245 * comparison is the result of comparing two elements, as if by
6246 * {@link Character#compare(char, char)}, at an index within the respective
6247 * arrays that is the prefix length.
6248 * Otherwise, one array is a proper prefix of the other and, lexicographic
6249 * comparison is the result of comparing the two array lengths.
6250 * (See {@link #mismatch(char[], char[])} for the definition of a common and
6251 * proper prefix.)
6252 *
6253 * <p>A {@code null} array reference is considered lexicographically less
6254 * than a non-{@code null} array reference. Two {@code null} array
6255 * references are considered equal.
6256 *
6257 * <p>The comparison is consistent with {@link #equals(char[], char[]) equals},
6258 * more specifically the following holds for arrays {@code a} and {@code b}:
6259 * <pre>{@code
6260 * Arrays.equals(a, b) == (Arrays.compare(a, b) == 0)
6261 * }</pre>
6262 *
6263 * @apiNote
6264 * <p>This method behaves as if (for non-{@code null} array references):
6265 * <pre>{@code
6266 * int i = Arrays.mismatch(a, b);
6267 * if (i >= 0 && i < Math.min(a.length, b.length))
6268 * return Character.compare(a[i], b[i]);
6269 * return a.length - b.length;
6270 * }</pre>
6271 *
6272 * @param a the first array to compare
6273 * @param b the second array to compare
6274 * @return the value {@code 0} if the first and second array are equal and
6275 * contain the same elements in the same order;
6276 * a value less than {@code 0} if the first array is
6277 * lexicographically less than the second array; and
6278 * a value greater than {@code 0} if the first array is
6279 * lexicographically greater than the second array
6280 * @since 9
6281 */
6282 public static int compare(char[] a, char[] b) {
6283 if (a == b)
6284 return 0;
6285 if (a == null || b == null)
6286 return a == null ? -1 : 1;
6287
6288 int i = ArraysSupport.mismatch(a, b,
6289 Math.min(a.length, b.length));
6290 if (i >= 0) {
6291 return Character.compare(a[i], b[i]);
6292 }
6293
6294 return a.length - b.length;
6295 }
6296
6297 /**
6298 * Compares two {@code char} arrays lexicographically over the specified
6299 * ranges.
6300 *
6301 * <p>If the two arrays, over the specified ranges, share a common prefix
6302 * then the lexicographic comparison is the result of comparing two
6303 * elements, as if by {@link Character#compare(char, char)}, at a relative
6304 * index within the respective arrays that is the length of the prefix.
6305 * Otherwise, one array is a proper prefix of the other and, lexicographic
6306 * comparison is the result of comparing the two range lengths.
6307 * (See {@link #mismatch(char[], int, int, char[], int, int)} for the
6308 * definition of a common and proper prefix.)
6309 *
6310 * <p>The comparison is consistent with
6311 * {@link #equals(char[], int, int, char[], int, int) equals}, more
6312 * specifically the following holds for arrays {@code a} and {@code b} with
6313 * specified ranges [{@code aFromIndex}, {@code aToIndex}) and
6314 * [{@code bFromIndex}, {@code bToIndex}) respectively:
6315 * <pre>{@code
6316 * Arrays.equals(a, aFromIndex, aToIndex, b, bFromIndex, bToIndex) ==
6317 * (Arrays.compare(a, aFromIndex, aToIndex, b, bFromIndex, bToIndex) == 0)
6318 * }</pre>
6319 *
6320 * @apiNote
6321 * <p>This method behaves as if:
6322 * <pre>{@code
6323 * int i = Arrays.mismatch(a, aFromIndex, aToIndex,
6324 * b, bFromIndex, bToIndex);
6325 * if (i >= 0 && i < Math.min(aToIndex - aFromIndex, bToIndex - bFromIndex))
6326 * return Character.compare(a[aFromIndex + i], b[bFromIndex + i]);
6327 * return (aToIndex - aFromIndex) - (bToIndex - bFromIndex);
6328 * }</pre>
6329 *
6330 * @param a the first array to compare
6331 * @param aFromIndex the index (inclusive) of the first element in the
6332 * first array to be compared
6333 * @param aToIndex the index (exclusive) of the last element in the
6334 * first array to be compared
6335 * @param b the second array to compare
6336 * @param bFromIndex the index (inclusive) of the first element in the
6337 * second array to be compared
6338 * @param bToIndex the index (exclusive) of the last element in the
6339 * second array to be compared
6340 * @return the value {@code 0} if, over the specified ranges, the first and
6341 * second array are equal and contain the same elements in the same
6342 * order;
6343 * a value less than {@code 0} if, over the specified ranges, the
6344 * first array is lexicographically less than the second array; and
6345 * a value greater than {@code 0} if, over the specified ranges, the
6346 * first array is lexicographically greater than the second array
6347 * @throws IllegalArgumentException
6348 * if {@code aFromIndex > aToIndex} or
6349 * if {@code bFromIndex > bToIndex}
6350 * @throws ArrayIndexOutOfBoundsException
6351 * if {@code aFromIndex < 0 or aToIndex > a.length} or
6352 * if {@code bFromIndex < 0 or bToIndex > b.length}
6353 * @throws NullPointerException
6354 * if either array is {@code null}
6355 * @since 9
6356 */
6357 public static int compare(char[] a, int aFromIndex, int aToIndex,
6358 char[] b, int bFromIndex, int bToIndex) {
6359 rangeCheck(a.length, aFromIndex, aToIndex);
6360 rangeCheck(b.length, bFromIndex, bToIndex);
6361
6362 int aLength = aToIndex - aFromIndex;
6363 int bLength = bToIndex - bFromIndex;
6364 int i = ArraysSupport.mismatch(a, aFromIndex,
6365 b, bFromIndex,
6366 Math.min(aLength, bLength));
6367 if (i >= 0) {
6368 return Character.compare(a[aFromIndex + i], b[bFromIndex + i]);
6369 }
6370
6371 return aLength - bLength;
6372 }
6373
6374 // Compare int
6375
6376 /**
6377 * Compares two {@code int} arrays lexicographically.
6378 *
6379 * <p>If the two arrays share a common prefix then the lexicographic
6380 * comparison is the result of comparing two elements, as if by
6381 * {@link Integer#compare(int, int)}, at an index within the respective
6382 * arrays that is the prefix length.
6383 * Otherwise, one array is a proper prefix of the other and, lexicographic
6384 * comparison is the result of comparing the two array lengths.
6385 * (See {@link #mismatch(int[], int[])} for the definition of a common and
6386 * proper prefix.)
6387 *
6388 * <p>A {@code null} array reference is considered lexicographically less
6389 * than a non-{@code null} array reference. Two {@code null} array
6390 * references are considered equal.
6391 *
6392 * <p>The comparison is consistent with {@link #equals(int[], int[]) equals},
6393 * more specifically the following holds for arrays {@code a} and {@code b}:
6394 * <pre>{@code
6395 * Arrays.equals(a, b) == (Arrays.compare(a, b) == 0)
6396 * }</pre>
6397 *
6398 * @apiNote
6399 * <p>This method behaves as if (for non-{@code null} array references):
6400 * <pre>{@code
6401 * int i = Arrays.mismatch(a, b);
6402 * if (i >= 0 && i < Math.min(a.length, b.length))
6403 * return Integer.compare(a[i], b[i]);
6404 * return a.length - b.length;
6405 * }</pre>
6406 *
6407 * @param a the first array to compare
6408 * @param b the second array to compare
6409 * @return the value {@code 0} if the first and second array are equal and
6410 * contain the same elements in the same order;
6411 * a value less than {@code 0} if the first array is
6412 * lexicographically less than the second array; and
6413 * a value greater than {@code 0} if the first array is
6414 * lexicographically greater than the second array
6415 * @since 9
6416 */
6417 public static int compare(int[] a, int[] b) {
6418 if (a == b)
6419 return 0;
6420 if (a == null || b == null)
6421 return a == null ? -1 : 1;
6422
6423 int i = ArraysSupport.mismatch(a, b,
6424 Math.min(a.length, b.length));
6425 if (i >= 0) {
6426 return Integer.compare(a[i], b[i]);
6427 }
6428
6429 return a.length - b.length;
6430 }
6431
6432 /**
6433 * Compares two {@code int} arrays lexicographically over the specified
6434 * ranges.
6435 *
6436 * <p>If the two arrays, over the specified ranges, share a common prefix
6437 * then the lexicographic comparison is the result of comparing two
6438 * elements, as if by {@link Integer#compare(int, int)}, at a relative index
6439 * within the respective arrays that is the length of the prefix.
6440 * Otherwise, one array is a proper prefix of the other and, lexicographic
6441 * comparison is the result of comparing the two range lengths.
6442 * (See {@link #mismatch(int[], int, int, int[], int, int)} for the
6443 * definition of a common and proper prefix.)
6444 *
6445 * <p>The comparison is consistent with
6446 * {@link #equals(int[], int, int, int[], int, int) equals}, more
6447 * specifically the following holds for arrays {@code a} and {@code b} with
6448 * specified ranges [{@code aFromIndex}, {@code aToIndex}) and
6449 * [{@code bFromIndex}, {@code bToIndex}) respectively:
6450 * <pre>{@code
6451 * Arrays.equals(a, aFromIndex, aToIndex, b, bFromIndex, bToIndex) ==
6452 * (Arrays.compare(a, aFromIndex, aToIndex, b, bFromIndex, bToIndex) == 0)
6453 * }</pre>
6454 *
6455 * @apiNote
6456 * <p>This method behaves as if:
6457 * <pre>{@code
6458 * int i = Arrays.mismatch(a, aFromIndex, aToIndex,
6459 * b, bFromIndex, bToIndex);
6460 * if (i >= 0 && i < Math.min(aToIndex - aFromIndex, bToIndex - bFromIndex))
6461 * return Integer.compare(a[aFromIndex + i], b[bFromIndex + i]);
6462 * return (aToIndex - aFromIndex) - (bToIndex - bFromIndex);
6463 * }</pre>
6464 *
6465 * @param a the first array to compare
6466 * @param aFromIndex the index (inclusive) of the first element in the
6467 * first array to be compared
6468 * @param aToIndex the index (exclusive) of the last element in the
6469 * first array to be compared
6470 * @param b the second array to compare
6471 * @param bFromIndex the index (inclusive) of the first element in the
6472 * second array to be compared
6473 * @param bToIndex the index (exclusive) of the last element in the
6474 * second array to be compared
6475 * @return the value {@code 0} if, over the specified ranges, the first and
6476 * second array are equal and contain the same elements in the same
6477 * order;
6478 * a value less than {@code 0} if, over the specified ranges, the
6479 * first array is lexicographically less than the second array; and
6480 * a value greater than {@code 0} if, over the specified ranges, the
6481 * first array is lexicographically greater than the second array
6482 * @throws IllegalArgumentException
6483 * if {@code aFromIndex > aToIndex} or
6484 * if {@code bFromIndex > bToIndex}
6485 * @throws ArrayIndexOutOfBoundsException
6486 * if {@code aFromIndex < 0 or aToIndex > a.length} or
6487 * if {@code bFromIndex < 0 or bToIndex > b.length}
6488 * @throws NullPointerException
6489 * if either array is {@code null}
6490 * @since 9
6491 */
6492 public static int compare(int[] a, int aFromIndex, int aToIndex,
6493 int[] b, int bFromIndex, int bToIndex) {
6494 rangeCheck(a.length, aFromIndex, aToIndex);
6495 rangeCheck(b.length, bFromIndex, bToIndex);
6496
6497 int aLength = aToIndex - aFromIndex;
6498 int bLength = bToIndex - bFromIndex;
6499 int i = ArraysSupport.mismatch(a, aFromIndex,
6500 b, bFromIndex,
6501 Math.min(aLength, bLength));
6502 if (i >= 0) {
6503 return Integer.compare(a[aFromIndex + i], b[bFromIndex + i]);
6504 }
6505
6506 return aLength - bLength;
6507 }
6508
6509 /**
6510 * Compares two {@code int} arrays lexicographically, numerically treating
6511 * elements as unsigned.
6512 *
6513 * <p>If the two arrays share a common prefix then the lexicographic
6514 * comparison is the result of comparing two elements, as if by
6515 * {@link Integer#compareUnsigned(int, int)}, at an index within the
6516 * respective arrays that is the prefix length.
6517 * Otherwise, one array is a proper prefix of the other and, lexicographic
6518 * comparison is the result of comparing the two array lengths.
6519 * (See {@link #mismatch(int[], int[])} for the definition of a common
6520 * and proper prefix.)
6521 *
6522 * <p>A {@code null} array reference is considered lexicographically less
6523 * than a non-{@code null} array reference. Two {@code null} array
6524 * references are considered equal.
6525 *
6526 * @apiNote
6527 * <p>This method behaves as if (for non-{@code null} array references):
6528 * <pre>{@code
6529 * int i = Arrays.mismatch(a, b);
6530 * if (i >= 0 && i < Math.min(a.length, b.length))
6531 * return Integer.compareUnsigned(a[i], b[i]);
6532 * return a.length - b.length;
6533 * }</pre>
6534 *
6535 * @param a the first array to compare
6536 * @param b the second array to compare
6537 * @return the value {@code 0} if the first and second array are
6538 * equal and contain the same elements in the same order;
6539 * a value less than {@code 0} if the first array is
6540 * lexicographically less than the second array; and
6541 * a value greater than {@code 0} if the first array is
6542 * lexicographically greater than the second array
6543 * @since 9
6544 */
6545 public static int compareUnsigned(int[] a, int[] b) {
6546 if (a == b)
6547 return 0;
6548 if (a == null || b == null)
6549 return a == null ? -1 : 1;
6550
6551 int i = ArraysSupport.mismatch(a, b,
6552 Math.min(a.length, b.length));
6553 if (i >= 0) {
6554 return Integer.compareUnsigned(a[i], b[i]);
6555 }
6556
6557 return a.length - b.length;
6558 }
6559
6560 /**
6561 * Compares two {@code int} arrays lexicographically over the specified
6562 * ranges, numerically treating elements as unsigned.
6563 *
6564 * <p>If the two arrays, over the specified ranges, share a common prefix
6565 * then the lexicographic comparison is the result of comparing two
6566 * elements, as if by {@link Integer#compareUnsigned(int, int)}, at a
6567 * relative index within the respective arrays that is the length of the
6568 * prefix.
6569 * Otherwise, one array is a proper prefix of the other and, lexicographic
6570 * comparison is the result of comparing the two range lengths.
6571 * (See {@link #mismatch(int[], int, int, int[], int, int)} for the
6572 * definition of a common and proper prefix.)
6573 *
6574 * @apiNote
6575 * <p>This method behaves as if:
6576 * <pre>{@code
6577 * int i = Arrays.mismatch(a, aFromIndex, aToIndex,
6578 * b, bFromIndex, bToIndex);
6579 * if (i >= 0 && i < Math.min(aToIndex - aFromIndex, bToIndex - bFromIndex))
6580 * return Integer.compareUnsigned(a[aFromIndex + i], b[bFromIndex + i]);
6581 * return (aToIndex - aFromIndex) - (bToIndex - bFromIndex);
6582 * }</pre>
6583 *
6584 * @param a the first array to compare
6585 * @param aFromIndex the index (inclusive) of the first element in the
6586 * first array to be compared
6587 * @param aToIndex the index (exclusive) of the last element in the
6588 * first array to be compared
6589 * @param b the second array to compare
6590 * @param bFromIndex the index (inclusive) of the first element in the
6591 * second array to be compared
6592 * @param bToIndex the index (exclusive) of the last element in the
6593 * second array to be compared
6594 * @return the value {@code 0} if, over the specified ranges, the first and
6595 * second array are equal and contain the same elements in the same
6596 * order;
6597 * a value less than {@code 0} if, over the specified ranges, the
6598 * first array is lexicographically less than the second array; and
6599 * a value greater than {@code 0} if, over the specified ranges, the
6600 * first array is lexicographically greater than the second array
6601 * @throws IllegalArgumentException
6602 * if {@code aFromIndex > aToIndex} or
6603 * if {@code bFromIndex > bToIndex}
6604 * @throws ArrayIndexOutOfBoundsException
6605 * if {@code aFromIndex < 0 or aToIndex > a.length} or
6606 * if {@code bFromIndex < 0 or bToIndex > b.length}
6607 * @throws NullPointerException
6608 * if either array is null
6609 * @since 9
6610 */
6611 public static int compareUnsigned(int[] a, int aFromIndex, int aToIndex,
6612 int[] b, int bFromIndex, int bToIndex) {
6613 rangeCheck(a.length, aFromIndex, aToIndex);
6614 rangeCheck(b.length, bFromIndex, bToIndex);
6615
6616 int aLength = aToIndex - aFromIndex;
6617 int bLength = bToIndex - bFromIndex;
6618 int i = ArraysSupport.mismatch(a, aFromIndex,
6619 b, bFromIndex,
6620 Math.min(aLength, bLength));
6621 if (i >= 0) {
6622 return Integer.compareUnsigned(a[aFromIndex + i], b[bFromIndex + i]);
6623 }
6624
6625 return aLength - bLength;
6626 }
6627
6628 // Compare long
6629
6630 /**
6631 * Compares two {@code long} arrays lexicographically.
6632 *
6633 * <p>If the two arrays share a common prefix then the lexicographic
6634 * comparison is the result of comparing two elements, as if by
6635 * {@link Long#compare(long, long)}, at an index within the respective
6636 * arrays that is the prefix length.
6637 * Otherwise, one array is a proper prefix of the other and, lexicographic
6638 * comparison is the result of comparing the two array lengths.
6639 * (See {@link #mismatch(long[], long[])} for the definition of a common and
6640 * proper prefix.)
6641 *
6642 * <p>A {@code null} array reference is considered lexicographically less
6643 * than a non-{@code null} array reference. Two {@code null} array
6644 * references are considered equal.
6645 *
6646 * <p>The comparison is consistent with {@link #equals(long[], long[]) equals},
6647 * more specifically the following holds for arrays {@code a} and {@code b}:
6648 * <pre>{@code
6649 * Arrays.equals(a, b) == (Arrays.compare(a, b) == 0)
6650 * }</pre>
6651 *
6652 * @apiNote
6653 * <p>This method behaves as if (for non-{@code null} array references):
6654 * <pre>{@code
6655 * int i = Arrays.mismatch(a, b);
6656 * if (i >= 0 && i < Math.min(a.length, b.length))
6657 * return Long.compare(a[i], b[i]);
6658 * return a.length - b.length;
6659 * }</pre>
6660 *
6661 * @param a the first array to compare
6662 * @param b the second array to compare
6663 * @return the value {@code 0} if the first and second array are equal and
6664 * contain the same elements in the same order;
6665 * a value less than {@code 0} if the first array is
6666 * lexicographically less than the second array; and
6667 * a value greater than {@code 0} if the first array is
6668 * lexicographically greater than the second array
6669 * @since 9
6670 */
6671 public static int compare(long[] a, long[] b) {
6672 if (a == b)
6673 return 0;
6674 if (a == null || b == null)
6675 return a == null ? -1 : 1;
6676
6677 int i = ArraysSupport.mismatch(a, b,
6678 Math.min(a.length, b.length));
6679 if (i >= 0) {
6680 return Long.compare(a[i], b[i]);
6681 }
6682
6683 return a.length - b.length;
6684 }
6685
6686 /**
6687 * Compares two {@code long} arrays lexicographically over the specified
6688 * ranges.
6689 *
6690 * <p>If the two arrays, over the specified ranges, share a common prefix
6691 * then the lexicographic comparison is the result of comparing two
6692 * elements, as if by {@link Long#compare(long, long)}, at a relative index
6693 * within the respective arrays that is the length of the prefix.
6694 * Otherwise, one array is a proper prefix of the other and, lexicographic
6695 * comparison is the result of comparing the two range lengths.
6696 * (See {@link #mismatch(long[], int, int, long[], int, int)} for the
6697 * definition of a common and proper prefix.)
6698 *
6699 * <p>The comparison is consistent with
6700 * {@link #equals(long[], int, int, long[], int, int) equals}, more
6701 * specifically the following holds for arrays {@code a} and {@code b} with
6702 * specified ranges [{@code aFromIndex}, {@code aToIndex}) and
6703 * [{@code bFromIndex}, {@code bToIndex}) respectively:
6704 * <pre>{@code
6705 * Arrays.equals(a, aFromIndex, aToIndex, b, bFromIndex, bToIndex) ==
6706 * (Arrays.compare(a, aFromIndex, aToIndex, b, bFromIndex, bToIndex) == 0)
6707 * }</pre>
6708 *
6709 * @apiNote
6710 * <p>This method behaves as if:
6711 * <pre>{@code
6712 * int i = Arrays.mismatch(a, aFromIndex, aToIndex,
6713 * b, bFromIndex, bToIndex);
6714 * if (i >= 0 && i < Math.min(aToIndex - aFromIndex, bToIndex - bFromIndex))
6715 * return Long.compare(a[aFromIndex + i], b[bFromIndex + i]);
6716 * return (aToIndex - aFromIndex) - (bToIndex - bFromIndex);
6717 * }</pre>
6718 *
6719 * @param a the first array to compare
6720 * @param aFromIndex the index (inclusive) of the first element in the
6721 * first array to be compared
6722 * @param aToIndex the index (exclusive) of the last element in the
6723 * first array to be compared
6724 * @param b the second array to compare
6725 * @param bFromIndex the index (inclusive) of the first element in the
6726 * second array to be compared
6727 * @param bToIndex the index (exclusive) of the last element in the
6728 * second array to be compared
6729 * @return the value {@code 0} if, over the specified ranges, the first and
6730 * second array are equal and contain the same elements in the same
6731 * order;
6732 * a value less than {@code 0} if, over the specified ranges, the
6733 * first array is lexicographically less than the second array; and
6734 * a value greater than {@code 0} if, over the specified ranges, the
6735 * first array is lexicographically greater than the second array
6736 * @throws IllegalArgumentException
6737 * if {@code aFromIndex > aToIndex} or
6738 * if {@code bFromIndex > bToIndex}
6739 * @throws ArrayIndexOutOfBoundsException
6740 * if {@code aFromIndex < 0 or aToIndex > a.length} or
6741 * if {@code bFromIndex < 0 or bToIndex > b.length}
6742 * @throws NullPointerException
6743 * if either array is {@code null}
6744 * @since 9
6745 */
6746 public static int compare(long[] a, int aFromIndex, int aToIndex,
6747 long[] b, int bFromIndex, int bToIndex) {
6748 rangeCheck(a.length, aFromIndex, aToIndex);
6749 rangeCheck(b.length, bFromIndex, bToIndex);
6750
6751 int aLength = aToIndex - aFromIndex;
6752 int bLength = bToIndex - bFromIndex;
6753 int i = ArraysSupport.mismatch(a, aFromIndex,
6754 b, bFromIndex,
6755 Math.min(aLength, bLength));
6756 if (i >= 0) {
6757 return Long.compare(a[aFromIndex + i], b[bFromIndex + i]);
6758 }
6759
6760 return aLength - bLength;
6761 }
6762
6763 /**
6764 * Compares two {@code long} arrays lexicographically, numerically treating
6765 * elements as unsigned.
6766 *
6767 * <p>If the two arrays share a common prefix then the lexicographic
6768 * comparison is the result of comparing two elements, as if by
6769 * {@link Long#compareUnsigned(long, long)}, at an index within the
6770 * respective arrays that is the prefix length.
6771 * Otherwise, one array is a proper prefix of the other and, lexicographic
6772 * comparison is the result of comparing the two array lengths.
6773 * (See {@link #mismatch(long[], long[])} for the definition of a common
6774 * and proper prefix.)
6775 *
6776 * <p>A {@code null} array reference is considered lexicographically less
6777 * than a non-{@code null} array reference. Two {@code null} array
6778 * references are considered equal.
6779 *
6780 * @apiNote
6781 * <p>This method behaves as if (for non-{@code null} array references):
6782 * <pre>{@code
6783 * int i = Arrays.mismatch(a, b);
6784 * if (i >= 0 && i < Math.min(a.length, b.length))
6785 * return Long.compareUnsigned(a[i], b[i]);
6786 * return a.length - b.length;
6787 * }</pre>
6788 *
6789 * @param a the first array to compare
6790 * @param b the second array to compare
6791 * @return the value {@code 0} if the first and second array are
6792 * equal and contain the same elements in the same order;
6793 * a value less than {@code 0} if the first array is
6794 * lexicographically less than the second array; and
6795 * a value greater than {@code 0} if the first array is
6796 * lexicographically greater than the second array
6797 * @since 9
6798 */
6799 public static int compareUnsigned(long[] a, long[] b) {
6800 if (a == b)
6801 return 0;
6802 if (a == null || b == null)
6803 return a == null ? -1 : 1;
6804
6805 int i = ArraysSupport.mismatch(a, b,
6806 Math.min(a.length, b.length));
6807 if (i >= 0) {
6808 return Long.compareUnsigned(a[i], b[i]);
6809 }
6810
6811 return a.length - b.length;
6812 }
6813
6814 /**
6815 * Compares two {@code long} arrays lexicographically over the specified
6816 * ranges, numerically treating elements as unsigned.
6817 *
6818 * <p>If the two arrays, over the specified ranges, share a common prefix
6819 * then the lexicographic comparison is the result of comparing two
6820 * elements, as if by {@link Long#compareUnsigned(long, long)}, at a
6821 * relative index within the respective arrays that is the length of the
6822 * prefix.
6823 * Otherwise, one array is a proper prefix of the other and, lexicographic
6824 * comparison is the result of comparing the two range lengths.
6825 * (See {@link #mismatch(long[], int, int, long[], int, int)} for the
6826 * definition of a common and proper prefix.)
6827 *
6828 * @apiNote
6829 * <p>This method behaves as if:
6830 * <pre>{@code
6831 * int i = Arrays.mismatch(a, aFromIndex, aToIndex,
6832 * b, bFromIndex, bToIndex);
6833 * if (i >= 0 && i < Math.min(aToIndex - aFromIndex, bToIndex - bFromIndex))
6834 * return Long.compareUnsigned(a[aFromIndex + i], b[bFromIndex + i]);
6835 * return (aToIndex - aFromIndex) - (bToIndex - bFromIndex);
6836 * }</pre>
6837 *
6838 * @param a the first array to compare
6839 * @param aFromIndex the index (inclusive) of the first element in the
6840 * first array to be compared
6841 * @param aToIndex the index (exclusive) of the last element in the
6842 * first array to be compared
6843 * @param b the second array to compare
6844 * @param bFromIndex the index (inclusive) of the first element in the
6845 * second array to be compared
6846 * @param bToIndex the index (exclusive) of the last element in the
6847 * second array to be compared
6848 * @return the value {@code 0} if, over the specified ranges, the first and
6849 * second array are equal and contain the same elements in the same
6850 * order;
6851 * a value less than {@code 0} if, over the specified ranges, the
6852 * first array is lexicographically less than the second array; and
6853 * a value greater than {@code 0} if, over the specified ranges, the
6854 * first array is lexicographically greater than the second array
6855 * @throws IllegalArgumentException
6856 * if {@code aFromIndex > aToIndex} or
6857 * if {@code bFromIndex > bToIndex}
6858 * @throws ArrayIndexOutOfBoundsException
6859 * if {@code aFromIndex < 0 or aToIndex > a.length} or
6860 * if {@code bFromIndex < 0 or bToIndex > b.length}
6861 * @throws NullPointerException
6862 * if either array is null
6863 * @since 9
6864 */
6865 public static int compareUnsigned(long[] a, int aFromIndex, int aToIndex,
6866 long[] b, int bFromIndex, int bToIndex) {
6867 rangeCheck(a.length, aFromIndex, aToIndex);
6868 rangeCheck(b.length, bFromIndex, bToIndex);
6869
6870 int aLength = aToIndex - aFromIndex;
6871 int bLength = bToIndex - bFromIndex;
6872 int i = ArraysSupport.mismatch(a, aFromIndex,
6873 b, bFromIndex,
6874 Math.min(aLength, bLength));
6875 if (i >= 0) {
6876 return Long.compareUnsigned(a[aFromIndex + i], b[bFromIndex + i]);
6877 }
6878
6879 return aLength - bLength;
6880 }
6881
6882 // Compare float
6883
6884 /**
6885 * Compares two {@code float} arrays lexicographically.
6886 *
6887 * <p>If the two arrays share a common prefix then the lexicographic
6888 * comparison is the result of comparing two elements, as if by
6889 * {@link Float#compare(float, float)}, at an index within the respective
6890 * arrays that is the prefix length.
6891 * Otherwise, one array is a proper prefix of the other and, lexicographic
6892 * comparison is the result of comparing the two array lengths.
6893 * (See {@link #mismatch(float[], float[])} for the definition of a common
6894 * and proper prefix.)
6895 *
6896 * <p>A {@code null} array reference is considered lexicographically less
6897 * than a non-{@code null} array reference. Two {@code null} array
6898 * references are considered equal.
6899 *
6900 * <p>The comparison is consistent with {@link #equals(float[], float[]) equals},
6901 * more specifically the following holds for arrays {@code a} and {@code b}:
6902 * <pre>{@code
6903 * Arrays.equals(a, b) == (Arrays.compare(a, b) == 0)
6904 * }</pre>
6905 *
6906 * @apiNote
6907 * <p>This method behaves as if (for non-{@code null} array references):
6908 * <pre>{@code
6909 * int i = Arrays.mismatch(a, b);
6910 * if (i >= 0 && i < Math.min(a.length, b.length))
6911 * return Float.compare(a[i], b[i]);
6912 * return a.length - b.length;
6913 * }</pre>
6914 *
6915 * @param a the first array to compare
6916 * @param b the second array to compare
6917 * @return the value {@code 0} if the first and second array are equal and
6918 * contain the same elements in the same order;
6919 * a value less than {@code 0} if the first array is
6920 * lexicographically less than the second array; and
6921 * a value greater than {@code 0} if the first array is
6922 * lexicographically greater than the second array
6923 * @since 9
6924 */
6925 public static int compare(float[] a, float[] b) {
6926 if (a == b)
6927 return 0;
6928 if (a == null || b == null)
6929 return a == null ? -1 : 1;
6930
6931 int i = ArraysSupport.mismatch(a, b,
6932 Math.min(a.length, b.length));
6933 if (i >= 0) {
6934 return Float.compare(a[i], b[i]);
6935 }
6936
6937 return a.length - b.length;
6938 }
6939
6940 /**
6941 * Compares two {@code float} arrays lexicographically over the specified
6942 * ranges.
6943 *
6944 * <p>If the two arrays, over the specified ranges, share a common prefix
6945 * then the lexicographic comparison is the result of comparing two
6946 * elements, as if by {@link Float#compare(float, float)}, at a relative
6947 * index within the respective arrays that is the length of the prefix.
6948 * Otherwise, one array is a proper prefix of the other and, lexicographic
6949 * comparison is the result of comparing the two range lengths.
6950 * (See {@link #mismatch(float[], int, int, float[], int, int)} for the
6951 * definition of a common and proper prefix.)
6952 *
6953 * <p>The comparison is consistent with
6954 * {@link #equals(float[], int, int, float[], int, int) equals}, more
6955 * specifically the following holds for arrays {@code a} and {@code b} with
6956 * specified ranges [{@code aFromIndex}, {@code aToIndex}) and
6957 * [{@code bFromIndex}, {@code bToIndex}) respectively:
6958 * <pre>{@code
6959 * Arrays.equals(a, aFromIndex, aToIndex, b, bFromIndex, bToIndex) ==
6960 * (Arrays.compare(a, aFromIndex, aToIndex, b, bFromIndex, bToIndex) == 0)
6961 * }</pre>
6962 *
6963 * @apiNote
6964 * <p>This method behaves as if:
6965 * <pre>{@code
6966 * int i = Arrays.mismatch(a, aFromIndex, aToIndex,
6967 * b, bFromIndex, bToIndex);
6968 * if (i >= 0 && i < Math.min(aToIndex - aFromIndex, bToIndex - bFromIndex))
6969 * return Float.compare(a[aFromIndex + i], b[bFromIndex + i]);
6970 * return (aToIndex - aFromIndex) - (bToIndex - bFromIndex);
6971 * }</pre>
6972 *
6973 * @param a the first array to compare
6974 * @param aFromIndex the index (inclusive) of the first element in the
6975 * first array to be compared
6976 * @param aToIndex the index (exclusive) of the last element in the
6977 * first array to be compared
6978 * @param b the second array to compare
6979 * @param bFromIndex the index (inclusive) of the first element in the
6980 * second array to be compared
6981 * @param bToIndex the index (exclusive) of the last element in the
6982 * second array to be compared
6983 * @return the value {@code 0} if, over the specified ranges, the first and
6984 * second array are equal and contain the same elements in the same
6985 * order;
6986 * a value less than {@code 0} if, over the specified ranges, the
6987 * first array is lexicographically less than the second array; and
6988 * a value greater than {@code 0} if, over the specified ranges, the
6989 * first array is lexicographically greater than the second array
6990 * @throws IllegalArgumentException
6991 * if {@code aFromIndex > aToIndex} or
6992 * if {@code bFromIndex > bToIndex}
6993 * @throws ArrayIndexOutOfBoundsException
6994 * if {@code aFromIndex < 0 or aToIndex > a.length} or
6995 * if {@code bFromIndex < 0 or bToIndex > b.length}
6996 * @throws NullPointerException
6997 * if either array is {@code null}
6998 * @since 9
6999 */
7000 public static int compare(float[] a, int aFromIndex, int aToIndex,
7001 float[] b, int bFromIndex, int bToIndex) {
7002 rangeCheck(a.length, aFromIndex, aToIndex);
7003 rangeCheck(b.length, bFromIndex, bToIndex);
7004
7005 int aLength = aToIndex - aFromIndex;
7006 int bLength = bToIndex - bFromIndex;
7007 int i = ArraysSupport.mismatch(a, aFromIndex,
7008 b, bFromIndex,
7009 Math.min(aLength, bLength));
7010 if (i >= 0) {
7011 return Float.compare(a[aFromIndex + i], b[bFromIndex + i]);
7012 }
7013
7014 return aLength - bLength;
7015 }
7016
7017 // Compare double
7018
7019 /**
7020 * Compares two {@code double} arrays lexicographically.
7021 *
7022 * <p>If the two arrays share a common prefix then the lexicographic
7023 * comparison is the result of comparing two elements, as if by
7024 * {@link Double#compare(double, double)}, at an index within the respective
7025 * arrays that is the prefix length.
7026 * Otherwise, one array is a proper prefix of the other and, lexicographic
7027 * comparison is the result of comparing the two array lengths.
7028 * (See {@link #mismatch(double[], double[])} for the definition of a common
7029 * and proper prefix.)
7030 *
7031 * <p>A {@code null} array reference is considered lexicographically less
7032 * than a non-{@code null} array reference. Two {@code null} array
7033 * references are considered equal.
7034 *
7035 * <p>The comparison is consistent with {@link #equals(double[], double[]) equals},
7036 * more specifically the following holds for arrays {@code a} and {@code b}:
7037 * <pre>{@code
7038 * Arrays.equals(a, b) == (Arrays.compare(a, b) == 0)
7039 * }</pre>
7040 *
7041 * @apiNote
7042 * <p>This method behaves as if (for non-{@code null} array references):
7043 * <pre>{@code
7044 * int i = Arrays.mismatch(a, b);
7045 * if (i >= 0 && i < Math.min(a.length, b.length))
7046 * return Double.compare(a[i], b[i]);
7047 * return a.length - b.length;
7048 * }</pre>
7049 *
7050 * @param a the first array to compare
7051 * @param b the second array to compare
7052 * @return the value {@code 0} if the first and second array are equal and
7053 * contain the same elements in the same order;
7054 * a value less than {@code 0} if the first array is
7055 * lexicographically less than the second array; and
7056 * a value greater than {@code 0} if the first array is
7057 * lexicographically greater than the second array
7058 * @since 9
7059 */
7060 public static int compare(double[] a, double[] b) {
7061 if (a == b)
7062 return 0;
7063 if (a == null || b == null)
7064 return a == null ? -1 : 1;
7065
7066 int i = ArraysSupport.mismatch(a, b,
7067 Math.min(a.length, b.length));
7068 if (i >= 0) {
7069 return Double.compare(a[i], b[i]);
7070 }
7071
7072 return a.length - b.length;
7073 }
7074
7075 /**
7076 * Compares two {@code double} arrays lexicographically over the specified
7077 * ranges.
7078 *
7079 * <p>If the two arrays, over the specified ranges, share a common prefix
7080 * then the lexicographic comparison is the result of comparing two
7081 * elements, as if by {@link Double#compare(double, double)}, at a relative
7082 * index within the respective arrays that is the length of the prefix.
7083 * Otherwise, one array is a proper prefix of the other and, lexicographic
7084 * comparison is the result of comparing the two range lengths.
7085 * (See {@link #mismatch(double[], int, int, double[], int, int)} for the
7086 * definition of a common and proper prefix.)
7087 *
7088 * <p>The comparison is consistent with
7089 * {@link #equals(double[], int, int, double[], int, int) equals}, more
7090 * specifically the following holds for arrays {@code a} and {@code b} with
7091 * specified ranges [{@code aFromIndex}, {@code aToIndex}) and
7092 * [{@code bFromIndex}, {@code bToIndex}) respectively:
7093 * <pre>{@code
7094 * Arrays.equals(a, aFromIndex, aToIndex, b, bFromIndex, bToIndex) ==
7095 * (Arrays.compare(a, aFromIndex, aToIndex, b, bFromIndex, bToIndex) == 0)
7096 * }</pre>
7097 *
7098 * @apiNote
7099 * <p>This method behaves as if:
7100 * <pre>{@code
7101 * int i = Arrays.mismatch(a, aFromIndex, aToIndex,
7102 * b, bFromIndex, bToIndex);
7103 * if (i >= 0 && i < Math.min(aToIndex - aFromIndex, bToIndex - bFromIndex))
7104 * return Double.compare(a[aFromIndex + i], b[bFromIndex + i]);
7105 * return (aToIndex - aFromIndex) - (bToIndex - bFromIndex);
7106 * }</pre>
7107 *
7108 * @param a the first array to compare
7109 * @param aFromIndex the index (inclusive) of the first element in the
7110 * first array to be compared
7111 * @param aToIndex the index (exclusive) of the last element in the
7112 * first array to be compared
7113 * @param b the second array to compare
7114 * @param bFromIndex the index (inclusive) of the first element in the
7115 * second array to be compared
7116 * @param bToIndex the index (exclusive) of the last element in the
7117 * second array to be compared
7118 * @return the value {@code 0} if, over the specified ranges, the first and
7119 * second array are equal and contain the same elements in the same
7120 * order;
7121 * a value less than {@code 0} if, over the specified ranges, the
7122 * first array is lexicographically less than the second array; and
7123 * a value greater than {@code 0} if, over the specified ranges, the
7124 * first array is lexicographically greater than the second array
7125 * @throws IllegalArgumentException
7126 * if {@code aFromIndex > aToIndex} or
7127 * if {@code bFromIndex > bToIndex}
7128 * @throws ArrayIndexOutOfBoundsException
7129 * if {@code aFromIndex < 0 or aToIndex > a.length} or
7130 * if {@code bFromIndex < 0 or bToIndex > b.length}
7131 * @throws NullPointerException
7132 * if either array is {@code null}
7133 * @since 9
7134 */
7135 public static int compare(double[] a, int aFromIndex, int aToIndex,
7136 double[] b, int bFromIndex, int bToIndex) {
7137 rangeCheck(a.length, aFromIndex, aToIndex);
7138 rangeCheck(b.length, bFromIndex, bToIndex);
7139
7140 int aLength = aToIndex - aFromIndex;
7141 int bLength = bToIndex - bFromIndex;
7142 int i = ArraysSupport.mismatch(a, aFromIndex,
7143 b, bFromIndex,
7144 Math.min(aLength, bLength));
7145 if (i >= 0) {
7146 return Double.compare(a[aFromIndex + i], b[bFromIndex + i]);
7147 }
7148
7149 return aLength - bLength;
7150 }
7151
7152 // Compare objects
7153
7154 /**
7155 * Compares two {@code Object} arrays, within comparable elements,
7156 * lexicographically.
7157 *
7158 * <p>If the two arrays share a common prefix then the lexicographic
7159 * comparison is the result of comparing two elements of type {@code T} at
7160 * an index {@code i} within the respective arrays that is the prefix
7161 * length, as if by:
7162 * <pre>{@code
7163 * Comparator.nullsFirst(Comparator.<T>naturalOrder()).
7164 * compare(a[i], b[i])
7165 * }</pre>
7166 * Otherwise, one array is a proper prefix of the other and, lexicographic
7167 * comparison is the result of comparing the two array lengths.
7168 * (See {@link #mismatch(Object[], Object[])} for the definition of a common
7169 * and proper prefix.)
7170 *
7171 * <p>A {@code null} array reference is considered lexicographically less
7172 * than a non-{@code null} array reference. Two {@code null} array
7173 * references are considered equal.
7174 * A {@code null} array element is considered lexicographically less than a
7175 * non-{@code null} array element. Two {@code null} array elements are
7176 * considered equal.
7177 *
7178 * <p>The comparison is consistent with {@link #equals(Object[], Object[]) equals},
7179 * more specifically the following holds for arrays {@code a} and {@code b}:
7180 * <pre>{@code
7181 * Arrays.equals(a, b) == (Arrays.compare(a, b) == 0)
7182 * }</pre>
7183 *
7184 * @apiNote
7185 * <p>This method behaves as if (for non-{@code null} array references
7186 * and elements):
7187 * <pre>{@code
7188 * int i = Arrays.mismatch(a, b);
7189 * if (i >= 0 && i < Math.min(a.length, b.length))
7190 * return a[i].compareTo(b[i]);
7191 * return a.length - b.length;
7192 * }</pre>
7193 *
7194 * @param a the first array to compare
7195 * @param b the second array to compare
7196 * @param <T> the type of comparable array elements
7197 * @return the value {@code 0} if the first and second array are equal and
7198 * contain the same elements in the same order;
7199 * a value less than {@code 0} if the first array is
7200 * lexicographically less than the second array; and
7201 * a value greater than {@code 0} if the first array is
7202 * lexicographically greater than the second array
7203 * @since 9
7204 */
7205 public static <T extends Comparable<? super T>> int compare(T[] a, T[] b) {
7206 if (a == b)
7207 return 0;
7208 // A null array is less than a non-null array
7209 if (a == null || b == null)
7210 return a == null ? -1 : 1;
7211
7212 int length = Math.min(a.length, b.length);
7213 for (int i = 0; i < length; i++) {
7214 T oa = a[i];
7215 T ob = b[i];
7216 if (oa != ob) {
7217 // A null element is less than a non-null element
7218 if (oa == null || ob == null)
7219 return oa == null ? -1 : 1;
7220 int v = oa.compareTo(ob);
7221 if (v != 0) {
7222 return v;
7223 }
7224 }
7225 }
7226
7227 return a.length - b.length;
7228 }
7229
7230 /**
7231 * Compares two {@code Object} arrays lexicographically over the specified
7232 * ranges.
7233 *
7234 * <p>If the two arrays, over the specified ranges, share a common prefix
7235 * then the lexicographic comparison is the result of comparing two
7236 * elements of type {@code T} at a relative index {@code i} within the
7237 * respective arrays that is the prefix length, as if by:
7238 * <pre>{@code
7239 * Comparator.nullsFirst(Comparator.<T>naturalOrder()).
7240 * compare(a[aFromIndex + i, b[bFromIndex + i])
7241 * }</pre>
7242 * Otherwise, one array is a proper prefix of the other and, lexicographic
7243 * comparison is the result of comparing the two range lengths.
7244 * (See {@link #mismatch(Object[], int, int, Object[], int, int)} for the
7245 * definition of a common and proper prefix.)
7246 *
7247 * <p>The comparison is consistent with
7248 * {@link #equals(Object[], int, int, Object[], int, int) equals}, more
7249 * specifically the following holds for arrays {@code a} and {@code b} with
7250 * specified ranges [{@code aFromIndex}, {@code aToIndex}) and
7251 * [{@code bFromIndex}, {@code bToIndex}) respectively:
7252 * <pre>{@code
7253 * Arrays.equals(a, aFromIndex, aToIndex, b, bFromIndex, bToIndex) ==
7254 * (Arrays.compare(a, aFromIndex, aToIndex, b, bFromIndex, bToIndex) == 0)
7255 * }</pre>
7256 *
7257 * @apiNote
7258 * <p>This method behaves as if (for non-{@code null} array elements):
7259 * <pre>{@code
7260 * int i = Arrays.mismatch(a, aFromIndex, aToIndex,
7261 * b, bFromIndex, bToIndex);
7262 * if (i >= 0 && i < Math.min(aToIndex - aFromIndex, bToIndex - bFromIndex))
7263 * return a[aFromIndex + i].compareTo(b[bFromIndex + i]);
7264 * return (aToIndex - aFromIndex) - (bToIndex - bFromIndex);
7265 * }</pre>
7266 *
7267 * @param a the first array to compare
7268 * @param aFromIndex the index (inclusive) of the first element in the
7269 * first array to be compared
7270 * @param aToIndex the index (exclusive) of the last element in the
7271 * first array to be compared
7272 * @param b the second array to compare
7273 * @param bFromIndex the index (inclusive) of the first element in the
7274 * second array to be compared
7275 * @param bToIndex the index (exclusive) of the last element in the
7276 * second array to be compared
7277 * @param <T> the type of comparable array elements
7278 * @return the value {@code 0} if, over the specified ranges, the first and
7279 * second array are equal and contain the same elements in the same
7280 * order;
7281 * a value less than {@code 0} if, over the specified ranges, the
7282 * first array is lexicographically less than the second array; and
7283 * a value greater than {@code 0} if, over the specified ranges, the
7284 * first array is lexicographically greater than the second array
7285 * @throws IllegalArgumentException
7286 * if {@code aFromIndex > aToIndex} or
7287 * if {@code bFromIndex > bToIndex}
7288 * @throws ArrayIndexOutOfBoundsException
7289 * if {@code aFromIndex < 0 or aToIndex > a.length} or
7290 * if {@code bFromIndex < 0 or bToIndex > b.length}
7291 * @throws NullPointerException
7292 * if either array is {@code null}
7293 * @since 9
7294 */
7295 public static <T extends Comparable<? super T>> int compare(
7296 T[] a, int aFromIndex, int aToIndex,
7297 T[] b, int bFromIndex, int bToIndex) {
7298 rangeCheck(a.length, aFromIndex, aToIndex);
7299 rangeCheck(b.length, bFromIndex, bToIndex);
7300
7301 int aLength = aToIndex - aFromIndex;
7302 int bLength = bToIndex - bFromIndex;
7303 int length = Math.min(aLength, bLength);
7304 for (int i = 0; i < length; i++) {
7305 T oa = a[aFromIndex++];
7306 T ob = b[bFromIndex++];
7307 if (oa != ob) {
7308 if (oa == null || ob == null)
7309 return oa == null ? -1 : 1;
7310 int v = oa.compareTo(ob);
7311 if (v != 0) {
7312 return v;
7313 }
7314 }
7315 }
7316
7317 return aLength - bLength;
7318 }
7319
7320 /**
7321 * Compares two {@code Object} arrays lexicographically using a specified
7322 * comparator.
7323 *
7324 * <p>If the two arrays share a common prefix then the lexicographic
7325 * comparison is the result of comparing with the specified comparator two
7326 * elements at an index within the respective arrays that is the prefix
7327 * length.
7328 * Otherwise, one array is a proper prefix of the other and, lexicographic
7329 * comparison is the result of comparing the two array lengths.
7330 * (See {@link #mismatch(Object[], Object[])} for the definition of a common
7331 * and proper prefix.)
7332 *
7333 * <p>A {@code null} array reference is considered lexicographically less
7334 * than a non-{@code null} array reference. Two {@code null} array
7335 * references are considered equal.
7336 *
7337 * @apiNote
7338 * <p>This method behaves as if (for non-{@code null} array references):
7339 * <pre>{@code
7340 * int i = Arrays.mismatch(a, b, cmp);
7341 * if (i >= 0 && i < Math.min(a.length, b.length))
7342 * return cmp.compare(a[i], b[i]);
7343 * return a.length - b.length;
7344 * }</pre>
7345 *
7346 * @param a the first array to compare
7347 * @param b the second array to compare
7348 * @param cmp the comparator to compare array elements
7349 * @param <T> the type of array elements
7350 * @return the value {@code 0} if the first and second array are equal and
7351 * contain the same elements in the same order;
7352 * a value less than {@code 0} if the first array is
7353 * lexicographically less than the second array; and
7354 * a value greater than {@code 0} if the first array is
7355 * lexicographically greater than the second array
7356 * @throws NullPointerException if the comparator is {@code null}
7357 * @since 9
7358 */
7359 public static <T> int compare(T[] a, T[] b,
7360 Comparator<? super T> cmp) {
7361 Objects.requireNonNull(cmp);
7362 if (a == b)
7363 return 0;
7364 if (a == null || b == null)
7365 return a == null ? -1 : 1;
7366
7367 int length = Math.min(a.length, b.length);
7368 for (int i = 0; i < length; i++) {
7369 T oa = a[i];
7370 T ob = b[i];
7371 if (oa != ob) {
7372 // Null-value comparison is deferred to the comparator
7373 int v = cmp.compare(oa, ob);
7374 if (v != 0) {
7375 return v;
7376 }
7377 }
7378 }
7379
7380 return a.length - b.length;
7381 }
7382
7383 /**
7384 * Compares two {@code Object} arrays lexicographically over the specified
7385 * ranges.
7386 *
7387 * <p>If the two arrays, over the specified ranges, share a common prefix
7388 * then the lexicographic comparison is the result of comparing with the
7389 * specified comparator two elements at a relative index within the
7390 * respective arrays that is the prefix length.
7391 * Otherwise, one array is a proper prefix of the other and, lexicographic
7392 * comparison is the result of comparing the two range lengths.
7393 * (See {@link #mismatch(Object[], int, int, Object[], int, int)} for the
7394 * definition of a common and proper prefix.)
7395 *
7396 * @apiNote
7397 * <p>This method behaves as if (for non-{@code null} array elements):
7398 * <pre>{@code
7399 * int i = Arrays.mismatch(a, aFromIndex, aToIndex,
7400 * b, bFromIndex, bToIndex, cmp);
7401 * if (i >= 0 && i < Math.min(aToIndex - aFromIndex, bToIndex - bFromIndex))
7402 * return cmp.compare(a[aFromIndex + i], b[bFromIndex + i]);
7403 * return (aToIndex - aFromIndex) - (bToIndex - bFromIndex);
7404 * }</pre>
7405 *
7406 * @param a the first array to compare
7407 * @param aFromIndex the index (inclusive) of the first element in the
7408 * first array to be compared
7409 * @param aToIndex the index (exclusive) of the last element in the
7410 * first array to be compared
7411 * @param b the second array to compare
7412 * @param bFromIndex the index (inclusive) of the first element in the
7413 * second array to be compared
7414 * @param bToIndex the index (exclusive) of the last element in the
7415 * second array to be compared
7416 * @param cmp the comparator to compare array elements
7417 * @param <T> the type of array elements
7418 * @return the value {@code 0} if, over the specified ranges, the first and
7419 * second array are equal and contain the same elements in the same
7420 * order;
7421 * a value less than {@code 0} if, over the specified ranges, the
7422 * first array is lexicographically less than the second array; and
7423 * a value greater than {@code 0} if, over the specified ranges, the
7424 * first array is lexicographically greater than the second array
7425 * @throws IllegalArgumentException
7426 * if {@code aFromIndex > aToIndex} or
7427 * if {@code bFromIndex > bToIndex}
7428 * @throws ArrayIndexOutOfBoundsException
7429 * if {@code aFromIndex < 0 or aToIndex > a.length} or
7430 * if {@code bFromIndex < 0 or bToIndex > b.length}
7431 * @throws NullPointerException
7432 * if either array or the comparator is {@code null}
7433 * @since 9
7434 */
7435 public static <T> int compare(
7436 T[] a, int aFromIndex, int aToIndex,
7437 T[] b, int bFromIndex, int bToIndex,
7438 Comparator<? super T> cmp) {
7439 Objects.requireNonNull(cmp);
7440 rangeCheck(a.length, aFromIndex, aToIndex);
7441 rangeCheck(b.length, bFromIndex, bToIndex);
7442
7443 int aLength = aToIndex - aFromIndex;
7444 int bLength = bToIndex - bFromIndex;
7445 int length = Math.min(aLength, bLength);
7446 for (int i = 0; i < length; i++) {
7447 T oa = a[aFromIndex++];
7448 T ob = b[bFromIndex++];
7449 if (oa != ob) {
7450 // Null-value comparison is deferred to the comparator
7451 int v = cmp.compare(oa, ob);
7452 if (v != 0) {
7453 return v;
7454 }
7455 }
7456 }
7457
7458 return aLength - bLength;
7459 }
7460
7461
7462 // Mismatch methods
7463
7464 // Mismatch boolean
7465
7466 /**
7467 * Finds and returns the index of the first mismatch between two
7468 * {@code boolean} arrays, otherwise return -1 if no mismatch is found. The
7469 * index will be in the range of 0 (inclusive) up to the length (inclusive)
7470 * of the smaller array.
7471 *
7472 * <p>If the two arrays share a common prefix then the returned index is the
7473 * length of the common prefix and it follows that there is a mismatch
7474 * between the two elements at that index within the respective arrays.
7475 * If one array is a proper prefix of the other then the returned index is
7476 * the length of the smaller array and it follows that the index is only
7477 * valid for the larger array.
7478 * Otherwise, there is no mismatch.
7479 *
7480 * <p>Two non-{@code null} arrays, {@code a} and {@code b}, share a common
7481 * prefix of length {@code pl} if the following expression is true:
7482 * <pre>{@code
7483 * pl >= 0 &&
7484 * pl < Math.min(a.length, b.length) &&
7485 * Arrays.equals(a, 0, pl, b, 0, pl) &&
7486 * a[pl] != b[pl]
7487 * }</pre>
7488 * Note that a common prefix length of {@code 0} indicates that the first
7489 * elements from each array mismatch.
7490 *
7491 * <p>Two non-{@code null} arrays, {@code a} and {@code b}, share a proper
7492 * prefix if the following expression is true:
7493 * <pre>{@code
7494 * a.length != b.length &&
7495 * Arrays.equals(a, 0, Math.min(a.length, b.length),
7496 * b, 0, Math.min(a.length, b.length))
7497 * }</pre>
7498 *
7499 * @param a the first array to be tested for a mismatch
7500 * @param b the second array to be tested for a mismatch
7501 * @return the index of the first mismatch between the two arrays,
7502 * otherwise {@code -1}.
7503 * @throws NullPointerException
7504 * if either array is {@code null}
7505 * @since 9
7506 */
7507 public static int mismatch(boolean[] a, boolean[] b) {
7508 int length = Math.min(a.length, b.length); // Check null array refs
7509 if (a == b)
7510 return -1;
7511
7512 int i = ArraysSupport.mismatch(a, b, length);
7513 return (i < 0 && a.length != b.length) ? length : i;
7514 }
7515
7516 /**
7517 * Finds and returns the relative index of the first mismatch between two
7518 * {@code boolean} arrays over the specified ranges, otherwise return -1 if
7519 * no mismatch is found. The index will be in the range of 0 (inclusive) up
7520 * to the length (inclusive) of the smaller range.
7521 *
7522 * <p>If the two arrays, over the specified ranges, share a common prefix
7523 * then the returned relative index is the length of the common prefix and
7524 * it follows that there is a mismatch between the two elements at that
7525 * relative index within the respective arrays.
7526 * If one array is a proper prefix of the other, over the specified ranges,
7527 * then the returned relative index is the length of the smaller range and
7528 * it follows that the relative index is only valid for the array with the
7529 * larger range.
7530 * Otherwise, there is no mismatch.
7531 *
7532 * <p>Two non-{@code null} arrays, {@code a} and {@code b} with specified
7533 * ranges [{@code aFromIndex}, {@code aToIndex}) and
7534 * [{@code bFromIndex}, {@code bToIndex}) respectively, share a common
7535 * prefix of length {@code pl} if the following expression is true:
7536 * <pre>{@code
7537 * pl >= 0 &&
7538 * pl < Math.min(aToIndex - aFromIndex, bToIndex - bFromIndex) &&
7539 * Arrays.equals(a, aFromIndex, aFromIndex + pl, b, bFromIndex, bFromIndex + pl) &&
7540 * a[aFromIndex + pl] != b[bFromIndex + pl]
7541 * }</pre>
7542 * Note that a common prefix length of {@code 0} indicates that the first
7543 * elements from each array mismatch.
7544 *
7545 * <p>Two non-{@code null} arrays, {@code a} and {@code b} with specified
7546 * ranges [{@code aFromIndex}, {@code aToIndex}) and
7547 * [{@code bFromIndex}, {@code bToIndex}) respectively, share a proper
7548 * prefix if the following expression is true:
7549 * <pre>{@code
7550 * (aToIndex - aFromIndex) != (bToIndex - bFromIndex) &&
7551 * Arrays.equals(a, 0, Math.min(aToIndex - aFromIndex, bToIndex - bFromIndex),
7552 * b, 0, Math.min(aToIndex - aFromIndex, bToIndex - bFromIndex))
7553 * }</pre>
7554 *
7555 * @param a the first array to be tested for a mismatch
7556 * @param aFromIndex the index (inclusive) of the first element in the
7557 * first array to be tested
7558 * @param aToIndex the index (exclusive) of the last element in the
7559 * first array to be tested
7560 * @param b the second array to be tested for a mismatch
7561 * @param bFromIndex the index (inclusive) of the first element in the
7562 * second array to be tested
7563 * @param bToIndex the index (exclusive) of the last element in the
7564 * second array to be tested
7565 * @return the relative index of the first mismatch between the two arrays
7566 * over the specified ranges, otherwise {@code -1}.
7567 * @throws IllegalArgumentException
7568 * if {@code aFromIndex > aToIndex} or
7569 * if {@code bFromIndex > bToIndex}
7570 * @throws ArrayIndexOutOfBoundsException
7571 * if {@code aFromIndex < 0 or aToIndex > a.length} or
7572 * if {@code bFromIndex < 0 or bToIndex > b.length}
7573 * @throws NullPointerException
7574 * if either array is {@code null}
7575 * @since 9
7576 */
7577 public static int mismatch(boolean[] a, int aFromIndex, int aToIndex,
7578 boolean[] b, int bFromIndex, int bToIndex) {
7579 rangeCheck(a.length, aFromIndex, aToIndex);
7580 rangeCheck(b.length, bFromIndex, bToIndex);
7581
7582 int aLength = aToIndex - aFromIndex;
7583 int bLength = bToIndex - bFromIndex;
7584 int length = Math.min(aLength, bLength);
7585 int i = ArraysSupport.mismatch(a, aFromIndex,
7586 b, bFromIndex,
7587 length);
7588 return (i < 0 && aLength != bLength) ? length : i;
7589 }
7590
7591 // Mismatch byte
7592
7593 /**
7594 * Finds and returns the index of the first mismatch between two {@code byte}
7595 * arrays, otherwise return -1 if no mismatch is found. The index will be
7596 * in the range of 0 (inclusive) up to the length (inclusive) of the smaller
7597 * array.
7598 *
7599 * <p>If the two arrays share a common prefix then the returned index is the
7600 * length of the common prefix and it follows that there is a mismatch
7601 * between the two elements at that index within the respective arrays.
7602 * If one array is a proper prefix of the other then the returned index is
7603 * the length of the smaller array and it follows that the index is only
7604 * valid for the larger array.
7605 * Otherwise, there is no mismatch.
7606 *
7607 * <p>Two non-{@code null} arrays, {@code a} and {@code b}, share a common
7608 * prefix of length {@code pl} if the following expression is true:
7609 * <pre>{@code
7610 * pl >= 0 &&
7611 * pl < Math.min(a.length, b.length) &&
7612 * Arrays.equals(a, 0, pl, b, 0, pl) &&
7613 * a[pl] != b[pl]
7614 * }</pre>
7615 * Note that a common prefix length of {@code 0} indicates that the first
7616 * elements from each array mismatch.
7617 *
7618 * <p>Two non-{@code null} arrays, {@code a} and {@code b}, share a proper
7619 * prefix if the following expression is true:
7620 * <pre>{@code
7621 * a.length != b.length &&
7622 * Arrays.equals(a, 0, Math.min(a.length, b.length),
7623 * b, 0, Math.min(a.length, b.length))
7624 * }</pre>
7625 *
7626 * @param a the first array to be tested for a mismatch
7627 * @param b the second array to be tested for a mismatch
7628 * @return the index of the first mismatch between the two arrays,
7629 * otherwise {@code -1}.
7630 * @throws NullPointerException
7631 * if either array is {@code null}
7632 * @since 9
7633 */
7634 public static int mismatch(byte[] a, byte[] b) {
7635 int length = Math.min(a.length, b.length); // Check null array refs
7636 if (a == b)
7637 return -1;
7638
7639 int i = ArraysSupport.mismatch(a, b, length);
7640 return (i < 0 && a.length != b.length) ? length : i;
7641 }
7642
7643 /**
7644 * Finds and returns the relative index of the first mismatch between two
7645 * {@code byte} arrays over the specified ranges, otherwise return -1 if no
7646 * mismatch is found. The index will be in the range of 0 (inclusive) up to
7647 * the length (inclusive) of the smaller range.
7648 *
7649 * <p>If the two arrays, over the specified ranges, share a common prefix
7650 * then the returned relative index is the length of the common prefix and
7651 * it follows that there is a mismatch between the two elements at that
7652 * relative index within the respective arrays.
7653 * If one array is a proper prefix of the other, over the specified ranges,
7654 * then the returned relative index is the length of the smaller range and
7655 * it follows that the relative index is only valid for the array with the
7656 * larger range.
7657 * Otherwise, there is no mismatch.
7658 *
7659 * <p>Two non-{@code null} arrays, {@code a} and {@code b} with specified
7660 * ranges [{@code aFromIndex}, {@code aToIndex}) and
7661 * [{@code bFromIndex}, {@code bToIndex}) respectively, share a common
7662 * prefix of length {@code pl} if the following expression is true:
7663 * <pre>{@code
7664 * pl >= 0 &&
7665 * pl < Math.min(aToIndex - aFromIndex, bToIndex - bFromIndex) &&
7666 * Arrays.equals(a, aFromIndex, aFromIndex + pl, b, bFromIndex, bFromIndex + pl) &&
7667 * a[aFromIndex + pl] != b[bFromIndex + pl]
7668 * }</pre>
7669 * Note that a common prefix length of {@code 0} indicates that the first
7670 * elements from each array mismatch.
7671 *
7672 * <p>Two non-{@code null} arrays, {@code a} and {@code b} with specified
7673 * ranges [{@code aFromIndex}, {@code aToIndex}) and
7674 * [{@code bFromIndex}, {@code bToIndex}) respectively, share a proper
7675 * prefix if the following expression is true:
7676 * <pre>{@code
7677 * (aToIndex - aFromIndex) != (bToIndex - bFromIndex) &&
7678 * Arrays.equals(a, 0, Math.min(aToIndex - aFromIndex, bToIndex - bFromIndex),
7679 * b, 0, Math.min(aToIndex - aFromIndex, bToIndex - bFromIndex))
7680 * }</pre>
7681 *
7682 * @param a the first array to be tested for a mismatch
7683 * @param aFromIndex the index (inclusive) of the first element in the
7684 * first array to be tested
7685 * @param aToIndex the index (exclusive) of the last element in the
7686 * first array to be tested
7687 * @param b the second array to be tested for a mismatch
7688 * @param bFromIndex the index (inclusive) of the first element in the
7689 * second array to be tested
7690 * @param bToIndex the index (exclusive) of the last element in the
7691 * second array to be tested
7692 * @return the relative index of the first mismatch between the two arrays
7693 * over the specified ranges, otherwise {@code -1}.
7694 * @throws IllegalArgumentException
7695 * if {@code aFromIndex > aToIndex} or
7696 * if {@code bFromIndex > bToIndex}
7697 * @throws ArrayIndexOutOfBoundsException
7698 * if {@code aFromIndex < 0 or aToIndex > a.length} or
7699 * if {@code bFromIndex < 0 or bToIndex > b.length}
7700 * @throws NullPointerException
7701 * if either array is {@code null}
7702 * @since 9
7703 */
7704 public static int mismatch(byte[] a, int aFromIndex, int aToIndex,
7705 byte[] b, int bFromIndex, int bToIndex) {
7706 rangeCheck(a.length, aFromIndex, aToIndex);
7707 rangeCheck(b.length, bFromIndex, bToIndex);
7708
7709 int aLength = aToIndex - aFromIndex;
7710 int bLength = bToIndex - bFromIndex;
7711 int length = Math.min(aLength, bLength);
7712 int i = ArraysSupport.mismatch(a, aFromIndex,
7713 b, bFromIndex,
7714 length);
7715 return (i < 0 && aLength != bLength) ? length : i;
7716 }
7717
7718 // Mismatch char
7719
7720 /**
7721 * Finds and returns the index of the first mismatch between two {@code char}
7722 * arrays, otherwise return -1 if no mismatch is found. The index will be
7723 * in the range of 0 (inclusive) up to the length (inclusive) of the smaller
7724 * array.
7725 *
7726 * <p>If the two arrays share a common prefix then the returned index is the
7727 * length of the common prefix and it follows that there is a mismatch
7728 * between the two elements at that index within the respective arrays.
7729 * If one array is a proper prefix of the other then the returned index is
7730 * the length of the smaller array and it follows that the index is only
7731 * valid for the larger array.
7732 * Otherwise, there is no mismatch.
7733 *
7734 * <p>Two non-{@code null} arrays, {@code a} and {@code b}, share a common
7735 * prefix of length {@code pl} if the following expression is true:
7736 * <pre>{@code
7737 * pl >= 0 &&
7738 * pl < Math.min(a.length, b.length) &&
7739 * Arrays.equals(a, 0, pl, b, 0, pl) &&
7740 * a[pl] != b[pl]
7741 * }</pre>
7742 * Note that a common prefix length of {@code 0} indicates that the first
7743 * elements from each array mismatch.
7744 *
7745 * <p>Two non-{@code null} arrays, {@code a} and {@code b}, share a proper
7746 * prefix if the following expression is true:
7747 * <pre>{@code
7748 * a.length != b.length &&
7749 * Arrays.equals(a, 0, Math.min(a.length, b.length),
7750 * b, 0, Math.min(a.length, b.length))
7751 * }</pre>
7752 *
7753 * @param a the first array to be tested for a mismatch
7754 * @param b the second array to be tested for a mismatch
7755 * @return the index of the first mismatch between the two arrays,
7756 * otherwise {@code -1}.
7757 * @throws NullPointerException
7758 * if either array is {@code null}
7759 * @since 9
7760 */
7761 public static int mismatch(char[] a, char[] b) {
7762 int length = Math.min(a.length, b.length); // Check null array refs
7763 if (a == b)
7764 return -1;
7765
7766 int i = ArraysSupport.mismatch(a, b, length);
7767 return (i < 0 && a.length != b.length) ? length : i;
7768 }
7769
7770 /**
7771 * Finds and returns the relative index of the first mismatch between two
7772 * {@code char} arrays over the specified ranges, otherwise return -1 if no
7773 * mismatch is found. The index will be in the range of 0 (inclusive) up to
7774 * the length (inclusive) of the smaller range.
7775 *
7776 * <p>If the two arrays, over the specified ranges, share a common prefix
7777 * then the returned relative index is the length of the common prefix and
7778 * it follows that there is a mismatch between the two elements at that
7779 * relative index within the respective arrays.
7780 * If one array is a proper prefix of the other, over the specified ranges,
7781 * then the returned relative index is the length of the smaller range and
7782 * it follows that the relative index is only valid for the array with the
7783 * larger range.
7784 * Otherwise, there is no mismatch.
7785 *
7786 * <p>Two non-{@code null} arrays, {@code a} and {@code b} with specified
7787 * ranges [{@code aFromIndex}, {@code aToIndex}) and
7788 * [{@code bFromIndex}, {@code bToIndex}) respectively, share a common
7789 * prefix of length {@code pl} if the following expression is true:
7790 * <pre>{@code
7791 * pl >= 0 &&
7792 * pl < Math.min(aToIndex - aFromIndex, bToIndex - bFromIndex) &&
7793 * Arrays.equals(a, aFromIndex, aFromIndex + pl, b, bFromIndex, bFromIndex + pl) &&
7794 * a[aFromIndex + pl] != b[bFromIndex + pl]
7795 * }</pre>
7796 * Note that a common prefix length of {@code 0} indicates that the first
7797 * elements from each array mismatch.
7798 *
7799 * <p>Two non-{@code null} arrays, {@code a} and {@code b} with specified
7800 * ranges [{@code aFromIndex}, {@code aToIndex}) and
7801 * [{@code bFromIndex}, {@code bToIndex}) respectively, share a proper
7802 * prefix if the following expression is true:
7803 * <pre>{@code
7804 * (aToIndex - aFromIndex) != (bToIndex - bFromIndex) &&
7805 * Arrays.equals(a, 0, Math.min(aToIndex - aFromIndex, bToIndex - bFromIndex),
7806 * b, 0, Math.min(aToIndex - aFromIndex, bToIndex - bFromIndex))
7807 * }</pre>
7808 *
7809 * @param a the first array to be tested for a mismatch
7810 * @param aFromIndex the index (inclusive) of the first element in the
7811 * first array to be tested
7812 * @param aToIndex the index (exclusive) of the last element in the
7813 * first array to be tested
7814 * @param b the second array to be tested for a mismatch
7815 * @param bFromIndex the index (inclusive) of the first element in the
7816 * second array to be tested
7817 * @param bToIndex the index (exclusive) of the last element in the
7818 * second array to be tested
7819 * @return the relative index of the first mismatch between the two arrays
7820 * over the specified ranges, otherwise {@code -1}.
7821 * @throws IllegalArgumentException
7822 * if {@code aFromIndex > aToIndex} or
7823 * if {@code bFromIndex > bToIndex}
7824 * @throws ArrayIndexOutOfBoundsException
7825 * if {@code aFromIndex < 0 or aToIndex > a.length} or
7826 * if {@code bFromIndex < 0 or bToIndex > b.length}
7827 * @throws NullPointerException
7828 * if either array is {@code null}
7829 * @since 9
7830 */
7831 public static int mismatch(char[] a, int aFromIndex, int aToIndex,
7832 char[] b, int bFromIndex, int bToIndex) {
7833 rangeCheck(a.length, aFromIndex, aToIndex);
7834 rangeCheck(b.length, bFromIndex, bToIndex);
7835
7836 int aLength = aToIndex - aFromIndex;
7837 int bLength = bToIndex - bFromIndex;
7838 int length = Math.min(aLength, bLength);
7839 int i = ArraysSupport.mismatch(a, aFromIndex,
7840 b, bFromIndex,
7841 length);
7842 return (i < 0 && aLength != bLength) ? length : i;
7843 }
7844
7845 // Mismatch short
7846
7847 /**
7848 * Finds and returns the index of the first mismatch between two {@code short}
7849 * arrays, otherwise return -1 if no mismatch is found. The index will be
7850 * in the range of 0 (inclusive) up to the length (inclusive) of the smaller
7851 * array.
7852 *
7853 * <p>If the two arrays share a common prefix then the returned index is the
7854 * length of the common prefix and it follows that there is a mismatch
7855 * between the two elements at that index within the respective arrays.
7856 * If one array is a proper prefix of the other then the returned index is
7857 * the length of the smaller array and it follows that the index is only
7858 * valid for the larger array.
7859 * Otherwise, there is no mismatch.
7860 *
7861 * <p>Two non-{@code null} arrays, {@code a} and {@code b}, share a common
7862 * prefix of length {@code pl} if the following expression is true:
7863 * <pre>{@code
7864 * pl >= 0 &&
7865 * pl < Math.min(a.length, b.length) &&
7866 * Arrays.equals(a, 0, pl, b, 0, pl) &&
7867 * a[pl] != b[pl]
7868 * }</pre>
7869 * Note that a common prefix length of {@code 0} indicates that the first
7870 * elements from each array mismatch.
7871 *
7872 * <p>Two non-{@code null} arrays, {@code a} and {@code b}, share a proper
7873 * prefix if the following expression is true:
7874 * <pre>{@code
7875 * a.length != b.length &&
7876 * Arrays.equals(a, 0, Math.min(a.length, b.length),
7877 * b, 0, Math.min(a.length, b.length))
7878 * }</pre>
7879 *
7880 * @param a the first array to be tested for a mismatch
7881 * @param b the second array to be tested for a mismatch
7882 * @return the index of the first mismatch between the two arrays,
7883 * otherwise {@code -1}.
7884 * @throws NullPointerException
7885 * if either array is {@code null}
7886 * @since 9
7887 */
7888 public static int mismatch(short[] a, short[] b) {
7889 int length = Math.min(a.length, b.length); // Check null array refs
7890 if (a == b)
7891 return -1;
7892
7893 int i = ArraysSupport.mismatch(a, b, length);
7894 return (i < 0 && a.length != b.length) ? length : i;
7895 }
7896
7897 /**
7898 * Finds and returns the relative index of the first mismatch between two
7899 * {@code short} arrays over the specified ranges, otherwise return -1 if no
7900 * mismatch is found. The index will be in the range of 0 (inclusive) up to
7901 * the length (inclusive) of the smaller range.
7902 *
7903 * <p>If the two arrays, over the specified ranges, share a common prefix
7904 * then the returned relative index is the length of the common prefix and
7905 * it follows that there is a mismatch between the two elements at that
7906 * relative index within the respective arrays.
7907 * If one array is a proper prefix of the other, over the specified ranges,
7908 * then the returned relative index is the length of the smaller range and
7909 * it follows that the relative index is only valid for the array with the
7910 * larger range.
7911 * Otherwise, there is no mismatch.
7912 *
7913 * <p>Two non-{@code null} arrays, {@code a} and {@code b} with specified
7914 * ranges [{@code aFromIndex}, {@code aToIndex}) and
7915 * [{@code bFromIndex}, {@code bToIndex}) respectively, share a common
7916 * prefix of length {@code pl} if the following expression is true:
7917 * <pre>{@code
7918 * pl >= 0 &&
7919 * pl < Math.min(aToIndex - aFromIndex, bToIndex - bFromIndex) &&
7920 * Arrays.equals(a, aFromIndex, aFromIndex + pl, b, bFromIndex, bFromIndex + pl) &&
7921 * a[aFromIndex + pl] != b[bFromIndex + pl]
7922 * }</pre>
7923 * Note that a common prefix length of {@code 0} indicates that the first
7924 * elements from each array mismatch.
7925 *
7926 * <p>Two non-{@code null} arrays, {@code a} and {@code b} with specified
7927 * ranges [{@code aFromIndex}, {@code aToIndex}) and
7928 * [{@code bFromIndex}, {@code bToIndex}) respectively, share a proper
7929 * prefix if the following expression is true:
7930 * <pre>{@code
7931 * (aToIndex - aFromIndex) != (bToIndex - bFromIndex) &&
7932 * Arrays.equals(a, 0, Math.min(aToIndex - aFromIndex, bToIndex - bFromIndex),
7933 * b, 0, Math.min(aToIndex - aFromIndex, bToIndex - bFromIndex))
7934 * }</pre>
7935 *
7936 * @param a the first array to be tested for a mismatch
7937 * @param aFromIndex the index (inclusive) of the first element in the
7938 * first array to be tested
7939 * @param aToIndex the index (exclusive) of the last element in the
7940 * first array to be tested
7941 * @param b the second array to be tested for a mismatch
7942 * @param bFromIndex the index (inclusive) of the first element in the
7943 * second array to be tested
7944 * @param bToIndex the index (exclusive) of the last element in the
7945 * second array to be tested
7946 * @return the relative index of the first mismatch between the two arrays
7947 * over the specified ranges, otherwise {@code -1}.
7948 * @throws IllegalArgumentException
7949 * if {@code aFromIndex > aToIndex} or
7950 * if {@code bFromIndex > bToIndex}
7951 * @throws ArrayIndexOutOfBoundsException
7952 * if {@code aFromIndex < 0 or aToIndex > a.length} or
7953 * if {@code bFromIndex < 0 or bToIndex > b.length}
7954 * @throws NullPointerException
7955 * if either array is {@code null}
7956 * @since 9
7957 */
7958 public static int mismatch(short[] a, int aFromIndex, int aToIndex,
7959 short[] b, int bFromIndex, int bToIndex) {
7960 rangeCheck(a.length, aFromIndex, aToIndex);
7961 rangeCheck(b.length, bFromIndex, bToIndex);
7962
7963 int aLength = aToIndex - aFromIndex;
7964 int bLength = bToIndex - bFromIndex;
7965 int length = Math.min(aLength, bLength);
7966 int i = ArraysSupport.mismatch(a, aFromIndex,
7967 b, bFromIndex,
7968 length);
7969 return (i < 0 && aLength != bLength) ? length : i;
7970 }
7971
7972 // Mismatch int
7973
7974 /**
7975 * Finds and returns the index of the first mismatch between two {@code int}
7976 * arrays, otherwise return -1 if no mismatch is found. The index will be
7977 * in the range of 0 (inclusive) up to the length (inclusive) of the smaller
7978 * array.
7979 *
7980 * <p>If the two arrays share a common prefix then the returned index is the
7981 * length of the common prefix and it follows that there is a mismatch
7982 * between the two elements at that index within the respective arrays.
7983 * If one array is a proper prefix of the other then the returned index is
7984 * the length of the smaller array and it follows that the index is only
7985 * valid for the larger array.
7986 * Otherwise, there is no mismatch.
7987 *
7988 * <p>Two non-{@code null} arrays, {@code a} and {@code b}, share a common
7989 * prefix of length {@code pl} if the following expression is true:
7990 * <pre>{@code
7991 * pl >= 0 &&
7992 * pl < Math.min(a.length, b.length) &&
7993 * Arrays.equals(a, 0, pl, b, 0, pl) &&
7994 * a[pl] != b[pl]
7995 * }</pre>
7996 * Note that a common prefix length of {@code 0} indicates that the first
7997 * elements from each array mismatch.
7998 *
7999 * <p>Two non-{@code null} arrays, {@code a} and {@code b}, share a proper
8000 * prefix if the following expression is true:
8001 * <pre>{@code
8002 * a.length != b.length &&
8003 * Arrays.equals(a, 0, Math.min(a.length, b.length),
8004 * b, 0, Math.min(a.length, b.length))
8005 * }</pre>
8006 *
8007 * @param a the first array to be tested for a mismatch
8008 * @param b the second array to be tested for a mismatch
8009 * @return the index of the first mismatch between the two arrays,
8010 * otherwise {@code -1}.
8011 * @throws NullPointerException
8012 * if either array is {@code null}
8013 * @since 9
8014 */
8015 public static int mismatch(int[] a, int[] b) {
8016 int length = Math.min(a.length, b.length); // Check null array refs
8017 if (a == b)
8018 return -1;
8019
8020 int i = ArraysSupport.mismatch(a, b, length);
8021 return (i < 0 && a.length != b.length) ? length : i;
8022 }
8023
8024 /**
8025 * Finds and returns the relative index of the first mismatch between two
8026 * {@code int} arrays over the specified ranges, otherwise return -1 if no
8027 * mismatch is found. The index will be in the range of 0 (inclusive) up to
8028 * the length (inclusive) of the smaller range.
8029 *
8030 * <p>If the two arrays, over the specified ranges, share a common prefix
8031 * then the returned relative index is the length of the common prefix and
8032 * it follows that there is a mismatch between the two elements at that
8033 * relative index within the respective arrays.
8034 * If one array is a proper prefix of the other, over the specified ranges,
8035 * then the returned relative index is the length of the smaller range and
8036 * it follows that the relative index is only valid for the array with the
8037 * larger range.
8038 * Otherwise, there is no mismatch.
8039 *
8040 * <p>Two non-{@code null} arrays, {@code a} and {@code b} with specified
8041 * ranges [{@code aFromIndex}, {@code aToIndex}) and
8042 * [{@code bFromIndex}, {@code bToIndex}) respectively, share a common
8043 * prefix of length {@code pl} if the following expression is true:
8044 * <pre>{@code
8045 * pl >= 0 &&
8046 * pl < Math.min(aToIndex - aFromIndex, bToIndex - bFromIndex) &&
8047 * Arrays.equals(a, aFromIndex, aFromIndex + pl, b, bFromIndex, bFromIndex + pl) &&
8048 * a[aFromIndex + pl] != b[bFromIndex + pl]
8049 * }</pre>
8050 * Note that a common prefix length of {@code 0} indicates that the first
8051 * elements from each array mismatch.
8052 *
8053 * <p>Two non-{@code null} arrays, {@code a} and {@code b} with specified
8054 * ranges [{@code aFromIndex}, {@code aToIndex}) and
8055 * [{@code bFromIndex}, {@code bToIndex}) respectively, share a proper
8056 * prefix if the following expression is true:
8057 * <pre>{@code
8058 * (aToIndex - aFromIndex) != (bToIndex - bFromIndex) &&
8059 * Arrays.equals(a, 0, Math.min(aToIndex - aFromIndex, bToIndex - bFromIndex),
8060 * b, 0, Math.min(aToIndex - aFromIndex, bToIndex - bFromIndex))
8061 * }</pre>
8062 *
8063 * @param a the first array to be tested for a mismatch
8064 * @param aFromIndex the index (inclusive) of the first element in the
8065 * first array to be tested
8066 * @param aToIndex the index (exclusive) of the last element in the
8067 * first array to be tested
8068 * @param b the second array to be tested for a mismatch
8069 * @param bFromIndex the index (inclusive) of the first element in the
8070 * second array to be tested
8071 * @param bToIndex the index (exclusive) of the last element in the
8072 * second array to be tested
8073 * @return the relative index of the first mismatch between the two arrays
8074 * over the specified ranges, otherwise {@code -1}.
8075 * @throws IllegalArgumentException
8076 * if {@code aFromIndex > aToIndex} or
8077 * if {@code bFromIndex > bToIndex}
8078 * @throws ArrayIndexOutOfBoundsException
8079 * if {@code aFromIndex < 0 or aToIndex > a.length} or
8080 * if {@code bFromIndex < 0 or bToIndex > b.length}
8081 * @throws NullPointerException
8082 * if either array is {@code null}
8083 * @since 9
8084 */
8085 public static int mismatch(int[] a, int aFromIndex, int aToIndex,
8086 int[] b, int bFromIndex, int bToIndex) {
8087 rangeCheck(a.length, aFromIndex, aToIndex);
8088 rangeCheck(b.length, bFromIndex, bToIndex);
8089
8090 int aLength = aToIndex - aFromIndex;
8091 int bLength = bToIndex - bFromIndex;
8092 int length = Math.min(aLength, bLength);
8093 int i = ArraysSupport.mismatch(a, aFromIndex,
8094 b, bFromIndex,
8095 length);
8096 return (i < 0 && aLength != bLength) ? length : i;
8097 }
8098
8099 // Mismatch long
8100
8101 /**
8102 * Finds and returns the index of the first mismatch between two {@code long}
8103 * arrays, otherwise return -1 if no mismatch is found. The index will be
8104 * in the range of 0 (inclusive) up to the length (inclusive) of the smaller
8105 * array.
8106 *
8107 * <p>If the two arrays share a common prefix then the returned index is the
8108 * length of the common prefix and it follows that there is a mismatch
8109 * between the two elements at that index within the respective arrays.
8110 * If one array is a proper prefix of the other then the returned index is
8111 * the length of the smaller array and it follows that the index is only
8112 * valid for the larger array.
8113 * Otherwise, there is no mismatch.
8114 *
8115 * <p>Two non-{@code null} arrays, {@code a} and {@code b}, share a common
8116 * prefix of length {@code pl} if the following expression is true:
8117 * <pre>{@code
8118 * pl >= 0 &&
8119 * pl < Math.min(a.length, b.length) &&
8120 * Arrays.equals(a, 0, pl, b, 0, pl) &&
8121 * a[pl] != b[pl]
8122 * }</pre>
8123 * Note that a common prefix length of {@code 0} indicates that the first
8124 * elements from each array mismatch.
8125 *
8126 * <p>Two non-{@code null} arrays, {@code a} and {@code b}, share a proper
8127 * prefix if the following expression is true:
8128 * <pre>{@code
8129 * a.length != b.length &&
8130 * Arrays.equals(a, 0, Math.min(a.length, b.length),
8131 * b, 0, Math.min(a.length, b.length))
8132 * }</pre>
8133 *
8134 * @param a the first array to be tested for a mismatch
8135 * @param b the second array to be tested for a mismatch
8136 * @return the index of the first mismatch between the two arrays,
8137 * otherwise {@code -1}.
8138 * @throws NullPointerException
8139 * if either array is {@code null}
8140 * @since 9
8141 */
8142 public static int mismatch(long[] a, long[] b) {
8143 int length = Math.min(a.length, b.length); // Check null array refs
8144 if (a == b)
8145 return -1;
8146
8147 int i = ArraysSupport.mismatch(a, b, length);
8148 return (i < 0 && a.length != b.length) ? length : i;
8149 }
8150
8151 /**
8152 * Finds and returns the relative index of the first mismatch between two
8153 * {@code long} arrays over the specified ranges, otherwise return -1 if no
8154 * mismatch is found. The index will be in the range of 0 (inclusive) up to
8155 * the length (inclusive) of the smaller range.
8156 *
8157 * <p>If the two arrays, over the specified ranges, share a common prefix
8158 * then the returned relative index is the length of the common prefix and
8159 * it follows that there is a mismatch between the two elements at that
8160 * relative index within the respective arrays.
8161 * If one array is a proper prefix of the other, over the specified ranges,
8162 * then the returned relative index is the length of the smaller range and
8163 * it follows that the relative index is only valid for the array with the
8164 * larger range.
8165 * Otherwise, there is no mismatch.
8166 *
8167 * <p>Two non-{@code null} arrays, {@code a} and {@code b} with specified
8168 * ranges [{@code aFromIndex}, {@code aToIndex}) and
8169 * [{@code bFromIndex}, {@code bToIndex}) respectively, share a common
8170 * prefix of length {@code pl} if the following expression is true:
8171 * <pre>{@code
8172 * pl >= 0 &&
8173 * pl < Math.min(aToIndex - aFromIndex, bToIndex - bFromIndex) &&
8174 * Arrays.equals(a, aFromIndex, aFromIndex + pl, b, bFromIndex, bFromIndex + pl) &&
8175 * a[aFromIndex + pl] != b[bFromIndex + pl]
8176 * }</pre>
8177 * Note that a common prefix length of {@code 0} indicates that the first
8178 * elements from each array mismatch.
8179 *
8180 * <p>Two non-{@code null} arrays, {@code a} and {@code b} with specified
8181 * ranges [{@code aFromIndex}, {@code aToIndex}) and
8182 * [{@code bFromIndex}, {@code bToIndex}) respectively, share a proper
8183 * prefix if the following expression is true:
8184 * <pre>{@code
8185 * (aToIndex - aFromIndex) != (bToIndex - bFromIndex) &&
8186 * Arrays.equals(a, 0, Math.min(aToIndex - aFromIndex, bToIndex - bFromIndex),
8187 * b, 0, Math.min(aToIndex - aFromIndex, bToIndex - bFromIndex))
8188 * }</pre>
8189 *
8190 * @param a the first array to be tested for a mismatch
8191 * @param aFromIndex the index (inclusive) of the first element in the
8192 * first array to be tested
8193 * @param aToIndex the index (exclusive) of the last element in the
8194 * first array to be tested
8195 * @param b the second array to be tested for a mismatch
8196 * @param bFromIndex the index (inclusive) of the first element in the
8197 * second array to be tested
8198 * @param bToIndex the index (exclusive) of the last element in the
8199 * second array to be tested
8200 * @return the relative index of the first mismatch between the two arrays
8201 * over the specified ranges, otherwise {@code -1}.
8202 * @throws IllegalArgumentException
8203 * if {@code aFromIndex > aToIndex} or
8204 * if {@code bFromIndex > bToIndex}
8205 * @throws ArrayIndexOutOfBoundsException
8206 * if {@code aFromIndex < 0 or aToIndex > a.length} or
8207 * if {@code bFromIndex < 0 or bToIndex > b.length}
8208 * @throws NullPointerException
8209 * if either array is {@code null}
8210 * @since 9
8211 */
8212 public static int mismatch(long[] a, int aFromIndex, int aToIndex,
8213 long[] b, int bFromIndex, int bToIndex) {
8214 rangeCheck(a.length, aFromIndex, aToIndex);
8215 rangeCheck(b.length, bFromIndex, bToIndex);
8216
8217 int aLength = aToIndex - aFromIndex;
8218 int bLength = bToIndex - bFromIndex;
8219 int length = Math.min(aLength, bLength);
8220 int i = ArraysSupport.mismatch(a, aFromIndex,
8221 b, bFromIndex,
8222 length);
8223 return (i < 0 && aLength != bLength) ? length : i;
8224 }
8225
8226 // Mismatch float
8227
8228 /**
8229 * Finds and returns the index of the first mismatch between two {@code float}
8230 * arrays, otherwise return -1 if no mismatch is found. The index will be
8231 * in the range of 0 (inclusive) up to the length (inclusive) of the smaller
8232 * array.
8233 *
8234 * <p>If the two arrays share a common prefix then the returned index is the
8235 * length of the common prefix and it follows that there is a mismatch
8236 * between the two elements at that index within the respective arrays.
8237 * If one array is a proper prefix of the other then the returned index is
8238 * the length of the smaller array and it follows that the index is only
8239 * valid for the larger array.
8240 * Otherwise, there is no mismatch.
8241 *
8242 * <p>Two non-{@code null} arrays, {@code a} and {@code b}, share a common
8243 * prefix of length {@code pl} if the following expression is true:
8244 * <pre>{@code
8245 * pl >= 0 &&
8246 * pl < Math.min(a.length, b.length) &&
8247 * Arrays.equals(a, 0, pl, b, 0, pl) &&
8248 * Float.compare(a[pl], b[pl]) != 0
8249 * }</pre>
8250 * Note that a common prefix length of {@code 0} indicates that the first
8251 * elements from each array mismatch.
8252 *
8253 * <p>Two non-{@code null} arrays, {@code a} and {@code b}, share a proper
8254 * prefix if the following expression is true:
8255 * <pre>{@code
8256 * a.length != b.length &&
8257 * Arrays.equals(a, 0, Math.min(a.length, b.length),
8258 * b, 0, Math.min(a.length, b.length))
8259 * }</pre>
8260 *
8261 * @param a the first array to be tested for a mismatch
8262 * @param b the second array to be tested for a mismatch
8263 * @return the index of the first mismatch between the two arrays,
8264 * otherwise {@code -1}.
8265 * @throws NullPointerException
8266 * if either array is {@code null}
8267 * @since 9
8268 */
8269 public static int mismatch(float[] a, float[] b) {
8270 int length = Math.min(a.length, b.length); // Check null array refs
8271 if (a == b)
8272 return -1;
8273
8274 int i = ArraysSupport.mismatch(a, b, length);
8275 return (i < 0 && a.length != b.length) ? length : i;
8276 }
8277
8278 /**
8279 * Finds and returns the relative index of the first mismatch between two
8280 * {@code float} arrays over the specified ranges, otherwise return -1 if no
8281 * mismatch is found. The index will be in the range of 0 (inclusive) up to
8282 * the length (inclusive) of the smaller range.
8283 *
8284 * <p>If the two arrays, over the specified ranges, share a common prefix
8285 * then the returned relative index is the length of the common prefix and
8286 * it follows that there is a mismatch between the two elements at that
8287 * relative index within the respective arrays.
8288 * If one array is a proper prefix of the other, over the specified ranges,
8289 * then the returned relative index is the length of the smaller range and
8290 * it follows that the relative index is only valid for the array with the
8291 * larger range.
8292 * Otherwise, there is no mismatch.
8293 *
8294 * <p>Two non-{@code null} arrays, {@code a} and {@code b} with specified
8295 * ranges [{@code aFromIndex}, {@code aToIndex}) and
8296 * [{@code bFromIndex}, {@code bToIndex}) respectively, share a common
8297 * prefix of length {@code pl} if the following expression is true:
8298 * <pre>{@code
8299 * pl >= 0 &&
8300 * pl < Math.min(aToIndex - aFromIndex, bToIndex - bFromIndex) &&
8301 * Arrays.equals(a, aFromIndex, aFromIndex + pl, b, bFromIndex, bFromIndex + pl) &&
8302 * Float.compare(a[aFromIndex + pl], b[bFromIndex + pl]) != 0
8303 * }</pre>
8304 * Note that a common prefix length of {@code 0} indicates that the first
8305 * elements from each array mismatch.
8306 *
8307 * <p>Two non-{@code null} arrays, {@code a} and {@code b} with specified
8308 * ranges [{@code aFromIndex}, {@code aToIndex}) and
8309 * [{@code bFromIndex}, {@code bToIndex}) respectively, share a proper
8310 * prefix if the following expression is true:
8311 * <pre>{@code
8312 * (aToIndex - aFromIndex) != (bToIndex - bFromIndex) &&
8313 * Arrays.equals(a, 0, Math.min(aToIndex - aFromIndex, bToIndex - bFromIndex),
8314 * b, 0, Math.min(aToIndex - aFromIndex, bToIndex - bFromIndex))
8315 * }</pre>
8316 *
8317 * @param a the first array to be tested for a mismatch
8318 * @param aFromIndex the index (inclusive) of the first element in the
8319 * first array to be tested
8320 * @param aToIndex the index (exclusive) of the last element in the
8321 * first array to be tested
8322 * @param b the second array to be tested for a mismatch
8323 * @param bFromIndex the index (inclusive) of the first element in the
8324 * second array to be tested
8325 * @param bToIndex the index (exclusive) of the last element in the
8326 * second array to be tested
8327 * @return the relative index of the first mismatch between the two arrays
8328 * over the specified ranges, otherwise {@code -1}.
8329 * @throws IllegalArgumentException
8330 * if {@code aFromIndex > aToIndex} or
8331 * if {@code bFromIndex > bToIndex}
8332 * @throws ArrayIndexOutOfBoundsException
8333 * if {@code aFromIndex < 0 or aToIndex > a.length} or
8334 * if {@code bFromIndex < 0 or bToIndex > b.length}
8335 * @throws NullPointerException
8336 * if either array is {@code null}
8337 * @since 9
8338 */
8339 public static int mismatch(float[] a, int aFromIndex, int aToIndex,
8340 float[] b, int bFromIndex, int bToIndex) {
8341 rangeCheck(a.length, aFromIndex, aToIndex);
8342 rangeCheck(b.length, bFromIndex, bToIndex);
8343
8344 int aLength = aToIndex - aFromIndex;
8345 int bLength = bToIndex - bFromIndex;
8346 int length = Math.min(aLength, bLength);
8347 int i = ArraysSupport.mismatch(a, aFromIndex,
8348 b, bFromIndex,
8349 length);
8350 return (i < 0 && aLength != bLength) ? length : i;
8351 }
8352
8353 // Mismatch double
8354
8355 /**
8356 * Finds and returns the index of the first mismatch between two
8357 * {@code double} arrays, otherwise return -1 if no mismatch is found. The
8358 * index will be in the range of 0 (inclusive) up to the length (inclusive)
8359 * of the smaller array.
8360 *
8361 * <p>If the two arrays share a common prefix then the returned index is the
8362 * length of the common prefix and it follows that there is a mismatch
8363 * between the two elements at that index within the respective arrays.
8364 * If one array is a proper prefix of the other then the returned index is
8365 * the length of the smaller array and it follows that the index is only
8366 * valid for the larger array.
8367 * Otherwise, there is no mismatch.
8368 *
8369 * <p>Two non-{@code null} arrays, {@code a} and {@code b}, share a common
8370 * prefix of length {@code pl} if the following expression is true:
8371 * <pre>{@code
8372 * pl >= 0 &&
8373 * pl < Math.min(a.length, b.length) &&
8374 * Arrays.equals(a, 0, pl, b, 0, pl) &&
8375 * Double.compare(a[pl], b[pl]) != 0
8376 * }</pre>
8377 * Note that a common prefix length of {@code 0} indicates that the first
8378 * elements from each array mismatch.
8379 *
8380 * <p>Two non-{@code null} arrays, {@code a} and {@code b}, share a proper
8381 * prefix if the following expression is true:
8382 * <pre>{@code
8383 * a.length != b.length &&
8384 * Arrays.equals(a, 0, Math.min(a.length, b.length),
8385 * b, 0, Math.min(a.length, b.length))
8386 * }</pre>
8387 *
8388 * @param a the first array to be tested for a mismatch
8389 * @param b the second array to be tested for a mismatch
8390 * @return the index of the first mismatch between the two arrays,
8391 * otherwise {@code -1}.
8392 * @throws NullPointerException
8393 * if either array is {@code null}
8394 * @since 9
8395 */
8396 public static int mismatch(double[] a, double[] b) {
8397 int length = Math.min(a.length, b.length); // Check null array refs
8398 if (a == b)
8399 return -1;
8400
8401 int i = ArraysSupport.mismatch(a, b, length);
8402 return (i < 0 && a.length != b.length) ? length : i;
8403 }
8404
8405 /**
8406 * Finds and returns the relative index of the first mismatch between two
8407 * {@code double} arrays over the specified ranges, otherwise return -1 if
8408 * no mismatch is found. The index will be in the range of 0 (inclusive) up
8409 * to the length (inclusive) of the smaller range.
8410 *
8411 * <p>If the two arrays, over the specified ranges, share a common prefix
8412 * then the returned relative index is the length of the common prefix and
8413 * it follows that there is a mismatch between the two elements at that
8414 * relative index within the respective arrays.
8415 * If one array is a proper prefix of the other, over the specified ranges,
8416 * then the returned relative index is the length of the smaller range and
8417 * it follows that the relative index is only valid for the array with the
8418 * larger range.
8419 * Otherwise, there is no mismatch.
8420 *
8421 * <p>Two non-{@code null} arrays, {@code a} and {@code b} with specified
8422 * ranges [{@code aFromIndex}, {@code aToIndex}) and
8423 * [{@code bFromIndex}, {@code bToIndex}) respectively, share a common
8424 * prefix of length {@code pl} if the following expression is true:
8425 * <pre>{@code
8426 * pl >= 0 &&
8427 * pl < Math.min(aToIndex - aFromIndex, bToIndex - bFromIndex) &&
8428 * Arrays.equals(a, aFromIndex, aFromIndex + pl, b, bFromIndex, bFromIndex + pl) &&
8429 * Double.compare(a[aFromIndex + pl], b[bFromIndex + pl]) != 0
8430 * }</pre>
8431 * Note that a common prefix length of {@code 0} indicates that the first
8432 * elements from each array mismatch.
8433 *
8434 * <p>Two non-{@code null} arrays, {@code a} and {@code b} with specified
8435 * ranges [{@code aFromIndex}, {@code aToIndex}) and
8436 * [{@code bFromIndex}, {@code bToIndex}) respectively, share a proper
8437 * prefix if the following expression is true:
8438 * <pre>{@code
8439 * (aToIndex - aFromIndex) != (bToIndex - bFromIndex) &&
8440 * Arrays.equals(a, 0, Math.min(aToIndex - aFromIndex, bToIndex - bFromIndex),
8441 * b, 0, Math.min(aToIndex - aFromIndex, bToIndex - bFromIndex))
8442 * }</pre>
8443 *
8444 * @param a the first array to be tested for a mismatch
8445 * @param aFromIndex the index (inclusive) of the first element in the
8446 * first array to be tested
8447 * @param aToIndex the index (exclusive) of the last element in the
8448 * first array to be tested
8449 * @param b the second array to be tested for a mismatch
8450 * @param bFromIndex the index (inclusive) of the first element in the
8451 * second array to be tested
8452 * @param bToIndex the index (exclusive) of the last element in the
8453 * second array to be tested
8454 * @return the relative index of the first mismatch between the two arrays
8455 * over the specified ranges, otherwise {@code -1}.
8456 * @throws IllegalArgumentException
8457 * if {@code aFromIndex > aToIndex} or
8458 * if {@code bFromIndex > bToIndex}
8459 * @throws ArrayIndexOutOfBoundsException
8460 * if {@code aFromIndex < 0 or aToIndex > a.length} or
8461 * if {@code bFromIndex < 0 or bToIndex > b.length}
8462 * @throws NullPointerException
8463 * if either array is {@code null}
8464 * @since 9
8465 */
8466 public static int mismatch(double[] a, int aFromIndex, int aToIndex,
8467 double[] b, int bFromIndex, int bToIndex) {
8468 rangeCheck(a.length, aFromIndex, aToIndex);
8469 rangeCheck(b.length, bFromIndex, bToIndex);
8470
8471 int aLength = aToIndex - aFromIndex;
8472 int bLength = bToIndex - bFromIndex;
8473 int length = Math.min(aLength, bLength);
8474 int i = ArraysSupport.mismatch(a, aFromIndex,
8475 b, bFromIndex,
8476 length);
8477 return (i < 0 && aLength != bLength) ? length : i;
8478 }
8479
8480 // Mismatch objects
8481
8482 /**
8483 * Finds and returns the index of the first mismatch between two
8484 * {@code Object} arrays, otherwise return -1 if no mismatch is found. The
8485 * index will be in the range of 0 (inclusive) up to the length (inclusive)
8486 * of the smaller array.
8487 *
8488 * <p>If the two arrays share a common prefix then the returned index is the
8489 * length of the common prefix and it follows that there is a mismatch
8490 * between the two elements at that index within the respective arrays.
8491 * If one array is a proper prefix of the other then the returned index is
8492 * the length of the smaller array and it follows that the index is only
8493 * valid for the larger array.
8494 * Otherwise, there is no mismatch.
8495 *
8496 * <p>Two non-{@code null} arrays, {@code a} and {@code b}, share a common
8497 * prefix of length {@code pl} if the following expression is true:
8498 * <pre>{@code
8499 * pl >= 0 &&
8500 * pl < Math.min(a.length, b.length) &&
8501 * Arrays.equals(a, 0, pl, b, 0, pl) &&
8502 * !Objects.equals(a[pl], b[pl])
8503 * }</pre>
8504 * Note that a common prefix length of {@code 0} indicates that the first
8505 * elements from each array mismatch.
8506 *
8507 * <p>Two non-{@code null} arrays, {@code a} and {@code b}, share a proper
8508 * prefix if the following expression is true:
8509 * <pre>{@code
8510 * a.length != b.length &&
8511 * Arrays.equals(a, 0, Math.min(a.length, b.length),
8512 * b, 0, Math.min(a.length, b.length))
8513 * }</pre>
8514 *
8515 * @param a the first array to be tested for a mismatch
8516 * @param b the second array to be tested for a mismatch
8517 * @return the index of the first mismatch between the two arrays,
8518 * otherwise {@code -1}.
8519 * @throws NullPointerException
8520 * if either array is {@code null}
8521 * @since 9
8522 */
8523 public static int mismatch(Object[] a, Object[] b) {
8524 int length = Math.min(a.length, b.length); // Check null array refs
8525 if (a == b)
8526 return -1;
8527
8528 for (int i = 0; i < length; i++) {
8529 if (!Objects.equals(a[i], b[i]))
8530 return i;
8531 }
8532
8533 return a.length != b.length ? length : -1;
8534 }
8535
8536 /**
8537 * Finds and returns the relative index of the first mismatch between two
8538 * {@code Object} arrays over the specified ranges, otherwise return -1 if
8539 * no mismatch is found. The index will be in the range of 0 (inclusive) up
8540 * to the length (inclusive) of the smaller range.
8541 *
8542 * <p>If the two arrays, over the specified ranges, share a common prefix
8543 * then the returned relative index is the length of the common prefix and
8544 * it follows that there is a mismatch between the two elements at that
8545 * relative index within the respective arrays.
8546 * If one array is a proper prefix of the other, over the specified ranges,
8547 * then the returned relative index is the length of the smaller range and
8548 * it follows that the relative index is only valid for the array with the
8549 * larger range.
8550 * Otherwise, there is no mismatch.
8551 *
8552 * <p>Two non-{@code null} arrays, {@code a} and {@code b} with specified
8553 * ranges [{@code aFromIndex}, {@code aToIndex}) and
8554 * [{@code bFromIndex}, {@code bToIndex}) respectively, share a common
8555 * prefix of length {@code pl} if the following expression is true:
8556 * <pre>{@code
8557 * pl >= 0 &&
8558 * pl < Math.min(aToIndex - aFromIndex, bToIndex - bFromIndex) &&
8559 * Arrays.equals(a, aFromIndex, aFromIndex + pl, b, bFromIndex, bFromIndex + pl) &&
8560 * !Objects.equals(a[aFromIndex + pl], b[bFromIndex + pl])
8561 * }</pre>
8562 * Note that a common prefix length of {@code 0} indicates that the first
8563 * elements from each array mismatch.
8564 *
8565 * <p>Two non-{@code null} arrays, {@code a} and {@code b} with specified
8566 * ranges [{@code aFromIndex}, {@code aToIndex}) and
8567 * [{@code bFromIndex}, {@code bToIndex}) respectively, share a proper
8568 * prefix if the following expression is true:
8569 * <pre>{@code
8570 * (aToIndex - aFromIndex) != (bToIndex - bFromIndex) &&
8571 * Arrays.equals(a, 0, Math.min(aToIndex - aFromIndex, bToIndex - bFromIndex),
8572 * b, 0, Math.min(aToIndex - aFromIndex, bToIndex - bFromIndex))
8573 * }</pre>
8574 *
8575 * @param a the first array to be tested for a mismatch
8576 * @param aFromIndex the index (inclusive) of the first element in the
8577 * first array to be tested
8578 * @param aToIndex the index (exclusive) of the last element in the
8579 * first array to be tested
8580 * @param b the second array to be tested for a mismatch
8581 * @param bFromIndex the index (inclusive) of the first element in the
8582 * second array to be tested
8583 * @param bToIndex the index (exclusive) of the last element in the
8584 * second array to be tested
8585 * @return the relative index of the first mismatch between the two arrays
8586 * over the specified ranges, otherwise {@code -1}.
8587 * @throws IllegalArgumentException
8588 * if {@code aFromIndex > aToIndex} or
8589 * if {@code bFromIndex > bToIndex}
8590 * @throws ArrayIndexOutOfBoundsException
8591 * if {@code aFromIndex < 0 or aToIndex > a.length} or
8592 * if {@code bFromIndex < 0 or bToIndex > b.length}
8593 * @throws NullPointerException
8594 * if either array is {@code null}
8595 * @since 9
8596 */
8597 public static int mismatch(
8598 Object[] a, int aFromIndex, int aToIndex,
8599 Object[] b, int bFromIndex, int bToIndex) {
8600 rangeCheck(a.length, aFromIndex, aToIndex);
8601 rangeCheck(b.length, bFromIndex, bToIndex);
8602
8603 int aLength = aToIndex - aFromIndex;
8604 int bLength = bToIndex - bFromIndex;
8605 int length = Math.min(aLength, bLength);
8606 for (int i = 0; i < length; i++) {
8607 if (!Objects.equals(a[aFromIndex++], b[bFromIndex++]))
8608 return i;
8609 }
8610
8611 return aLength != bLength ? length : -1;
8612 }
8613
8614 /**
8615 * Finds and returns the index of the first mismatch between two
8616 * {@code Object} arrays, otherwise return -1 if no mismatch is found.
8617 * The index will be in the range of 0 (inclusive) up to the length
8618 * (inclusive) of the smaller array.
8619 *
8620 * <p>The specified comparator is used to determine if two array elements
8621 * from the each array are not equal.
8622 *
8623 * <p>If the two arrays share a common prefix then the returned index is the
8624 * length of the common prefix and it follows that there is a mismatch
8625 * between the two elements at that index within the respective arrays.
8626 * If one array is a proper prefix of the other then the returned index is
8627 * the length of the smaller array and it follows that the index is only
8628 * valid for the larger array.
8629 * Otherwise, there is no mismatch.
8630 *
8631 * <p>Two non-{@code null} arrays, {@code a} and {@code b}, share a common
8632 * prefix of length {@code pl} if the following expression is true:
8633 * <pre>{@code
8634 * pl >= 0 &&
8635 * pl < Math.min(a.length, b.length) &&
8636 * Arrays.equals(a, 0, pl, b, 0, pl, cmp)
8637 * cmp.compare(a[pl], b[pl]) != 0
8638 * }</pre>
8639 * Note that a common prefix length of {@code 0} indicates that the first
8640 * elements from each array mismatch.
8641 *
8642 * <p>Two non-{@code null} arrays, {@code a} and {@code b}, share a proper
8643 * prefix if the following expression is true:
8644 * <pre>{@code
8645 * a.length != b.length &&
8646 * Arrays.equals(a, 0, Math.min(a.length, b.length),
8647 * b, 0, Math.min(a.length, b.length),
8648 * cmp)
8649 * }</pre>
8650 *
8651 * @param a the first array to be tested for a mismatch
8652 * @param b the second array to be tested for a mismatch
8653 * @param cmp the comparator to compare array elements
8654 * @param <T> the type of array elements
8655 * @return the index of the first mismatch between the two arrays,
8656 * otherwise {@code -1}.
8657 * @throws NullPointerException
8658 * if either array or the comparator is {@code null}
8659 * @since 9
8660 */
8661 public static <T> int mismatch(T[] a, T[] b, Comparator<? super T> cmp) {
8662 Objects.requireNonNull(cmp);
8663 int length = Math.min(a.length, b.length); // Check null array refs
8664 if (a == b)
8665 return -1;
8666
8667 for (int i = 0; i < length; i++) {
8668 T oa = a[i];
8669 T ob = b[i];
8670 if (oa != ob) {
8671 // Null-value comparison is deferred to the comparator
8672 int v = cmp.compare(oa, ob);
8673 if (v != 0) {
8674 return i;
8675 }
8676 }
8677 }
8678
8679 return a.length != b.length ? length : -1;
8680 }
8681
8682 /**
8683 * Finds and returns the relative index of the first mismatch between two
8684 * {@code Object} arrays over the specified ranges, otherwise return -1 if
8685 * no mismatch is found. The index will be in the range of 0 (inclusive) up
8686 * to the length (inclusive) of the smaller range.
8687 *
8688 * <p>If the two arrays, over the specified ranges, share a common prefix
8689 * then the returned relative index is the length of the common prefix and
8690 * it follows that there is a mismatch between the two elements at that
8691 * relative index within the respective arrays.
8692 * If one array is a proper prefix of the other, over the specified ranges,
8693 * then the returned relative index is the length of the smaller range and
8694 * it follows that the relative index is only valid for the array with the
8695 * larger range.
8696 * Otherwise, there is no mismatch.
8697 *
8698 * <p>Two non-{@code null} arrays, {@code a} and {@code b} with specified
8699 * ranges [{@code aFromIndex}, {@code aToIndex}) and
8700 * [{@code bFromIndex}, {@code bToIndex}) respectively, share a common
8701 * prefix of length {@code pl} if the following expression is true:
8702 * <pre>{@code
8703 * pl >= 0 &&
8704 * pl < Math.min(aToIndex - aFromIndex, bToIndex - bFromIndex) &&
8705 * Arrays.equals(a, aFromIndex, aFromIndex + pl, b, bFromIndex, bFromIndex + pl, cmp) &&
8706 * cmp.compare(a[aFromIndex + pl], b[bFromIndex + pl]) != 0
8707 * }</pre>
8708 * Note that a common prefix length of {@code 0} indicates that the first
8709 * elements from each array mismatch.
8710 *
8711 * <p>Two non-{@code null} arrays, {@code a} and {@code b} with specified
8712 * ranges [{@code aFromIndex}, {@code aToIndex}) and
8713 * [{@code bFromIndex}, {@code bToIndex}) respectively, share a proper
8714 * prefix if the following expression is true:
8715 * <pre>{@code
8716 * (aToIndex - aFromIndex) != (bToIndex - bFromIndex) &&
8717 * Arrays.equals(a, 0, Math.min(aToIndex - aFromIndex, bToIndex - bFromIndex),
8718 * b, 0, Math.min(aToIndex - aFromIndex, bToIndex - bFromIndex),
8719 * cmp)
8720 * }</pre>
8721 *
8722 * @param a the first array to be tested for a mismatch
8723 * @param aFromIndex the index (inclusive) of the first element in the
8724 * first array to be tested
8725 * @param aToIndex the index (exclusive) of the last element in the
8726 * first array to be tested
8727 * @param b the second array to be tested for a mismatch
8728 * @param bFromIndex the index (inclusive) of the first element in the
8729 * second array to be tested
8730 * @param bToIndex the index (exclusive) of the last element in the
8731 * second array to be tested
8732 * @param cmp the comparator to compare array elements
8733 * @param <T> the type of array elements
8734 * @return the relative index of the first mismatch between the two arrays
8735 * over the specified ranges, otherwise {@code -1}.
8736 * @throws IllegalArgumentException
8737 * if {@code aFromIndex > aToIndex} or
8738 * if {@code bFromIndex > bToIndex}
8739 * @throws ArrayIndexOutOfBoundsException
8740 * if {@code aFromIndex < 0 or aToIndex > a.length} or
8741 * if {@code bFromIndex < 0 or bToIndex > b.length}
8742 * @throws NullPointerException
8743 * if either array or the comparator is {@code null}
8744 * @since 9
8745 */
8746 public static <T> int mismatch(
8747 T[] a, int aFromIndex, int aToIndex,
8748 T[] b, int bFromIndex, int bToIndex,
8749 Comparator<? super T> cmp) {
8750 Objects.requireNonNull(cmp);
8751 rangeCheck(a.length, aFromIndex, aToIndex);
8752 rangeCheck(b.length, bFromIndex, bToIndex);
8753
8754 int aLength = aToIndex - aFromIndex;
8755 int bLength = bToIndex - bFromIndex;
8756 int length = Math.min(aLength, bLength);
8757 for (int i = 0; i < length; i++) {
8758 T oa = a[aFromIndex++];
8759 T ob = b[bFromIndex++];
8760 if (oa != ob) {
8761 // Null-value comparison is deferred to the comparator
8762 int v = cmp.compare(oa, ob);
8763 if (v != 0) {
8764 return i;
8765 }
8766 }
8767 }
8768
8769 return aLength != bLength ? length : -1;
8770 }
8771 }