1 /*
2  * Licensed to the Apache Software Foundation (ASF) under one or more
3  * contributor license agreements.  See the NOTICE file distributed with
4  * this work for additional information regarding copyright ownership.
5  * The ASF licenses this file to You under the Apache License, Version 2.0
6  * (the "License"); you may not use this file except in compliance with
7  * the License.  You may obtain a copy of the License at
8  *
9  *      http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  */
17 package org.apache.commons.lang;
18 
19 import java.lang.reflect.Array;
20 import java.util.HashMap;
21 import java.util.Map;
22 
23 import org.apache.commons.lang.builder.EqualsBuilder;
24 import org.apache.commons.lang.builder.HashCodeBuilder;
25 import org.apache.commons.lang.builder.ToStringBuilder;
26 import org.apache.commons.lang.builder.ToStringStyle;
27 
28 /**
29  * <p>Operations on arrays, primitive arrays (like <code>int[]</code>) and
30  * primitive wrapper arrays (like <code>Integer[]</code>).</p>
31  *
32  * <p>This class tries to handle <code>null</code> input gracefully.
33  * An exception will not be thrown for a <code>null</code>
34  * array input. However, an Object array that contains a <code>null</code>
35  * element may throw an exception. Each method documents its behaviour.</p>
36  *
37  * <p>#ThreadSafe#</p>
38  * @author Apache Software Foundation
39  * @author Moritz Petersen
40  * @author <a href="mailto:fredrik@westermarck.com">Fredrik Westermarck</a>
41  * @author Nikolay Metchev
42  * @author Matthew Hawthorne
43  * @author Tim O'Brien
44  * @author Pete Gieser
45  * @author Gary Gregory
46  * @author <a href="mailto:equinus100@hotmail.com">Ashwin S</a>
47  * @author Maarten Coene
48  * @since 2.0
49  * @version $Id: ArrayUtils.java 1056988 2011-01-09 17:58:53Z niallp $
50  */
51 public class ArrayUtils {
52 
53     /**
54      * An empty immutable <code>Object</code> array.
55      */
56     public static final Object[] EMPTY_OBJECT_ARRAY = new Object[0];
57     /**
58      * An empty immutable <code>Class</code> array.
59      */
60     public static final Class[] EMPTY_CLASS_ARRAY = new Class[0];
61     /**
62      * An empty immutable <code>String</code> array.
63      */
64     public static final String[] EMPTY_STRING_ARRAY = new String[0];
65     /**
66      * An empty immutable <code>long</code> array.
67      */
68     public static final long[] EMPTY_LONG_ARRAY = new long[0];
69     /**
70      * An empty immutable <code>Long</code> array.
71      */
72     public static final Long[] EMPTY_LONG_OBJECT_ARRAY = new Long[0];
73     /**
74      * An empty immutable <code>int</code> array.
75      */
76     public static final int[] EMPTY_INT_ARRAY = new int[0];
77     /**
78      * An empty immutable <code>Integer</code> array.
79      */
80     public static final Integer[] EMPTY_INTEGER_OBJECT_ARRAY = new Integer[0];
81     /**
82      * An empty immutable <code>short</code> array.
83      */
84     public static final short[] EMPTY_SHORT_ARRAY = new short[0];
85     /**
86      * An empty immutable <code>Short</code> array.
87      */
88     public static final Short[] EMPTY_SHORT_OBJECT_ARRAY = new Short[0];
89     /**
90      * An empty immutable <code>byte</code> array.
91      */
92     public static final byte[] EMPTY_BYTE_ARRAY = new byte[0];
93     /**
94      * An empty immutable <code>Byte</code> array.
95      */
96     public static final Byte[] EMPTY_BYTE_OBJECT_ARRAY = new Byte[0];
97     /**
98      * An empty immutable <code>double</code> array.
99      */
100     public static final double[] EMPTY_DOUBLE_ARRAY = new double[0];
101     /**
102      * An empty immutable <code>Double</code> array.
103      */
104     public static final Double[] EMPTY_DOUBLE_OBJECT_ARRAY = new Double[0];
105     /**
106      * An empty immutable <code>float</code> array.
107      */
108     public static final float[] EMPTY_FLOAT_ARRAY = new float[0];
109     /**
110      * An empty immutable <code>Float</code> array.
111      */
112     public static final Float[] EMPTY_FLOAT_OBJECT_ARRAY = new Float[0];
113     /**
114      * An empty immutable <code>boolean</code> array.
115      */
116     public static final boolean[] EMPTY_BOOLEAN_ARRAY = new boolean[0];
117     /**
118      * An empty immutable <code>Boolean</code> array.
119      */
120     public static final Boolean[] EMPTY_BOOLEAN_OBJECT_ARRAY = new Boolean[0];
121     /**
122      * An empty immutable <code>char</code> array.
123      */
124     public static final char[] EMPTY_CHAR_ARRAY = new char[0];
125     /**
126      * An empty immutable <code>Character</code> array.
127      */
128     public static final Character[] EMPTY_CHARACTER_OBJECT_ARRAY = new Character[0];
129 
130     /**
131      * The index value when an element is not found in a list or array: <code>-1</code>.
132      * This value is returned by methods in this class and can also be used in comparisons with values returned by
133      * various method from {@link java.util.List}.
134      */
135     public static final int INDEX_NOT_FOUND = -1;
136 
137     /**
138      * <p>ArrayUtils instances should NOT be constructed in standard programming.
139      * Instead, the class should be used as <code>ArrayUtils.clone(new int[] {2})</code>.</p>
140      *
141      * <p>This constructor is public to permit tools that require a JavaBean instance
142      * to operate.</p>
143      */
ArrayUtils()144     public ArrayUtils() {
145       super();
146     }
147 
148     // Basic methods handling multi-dimensional arrays
149     //-----------------------------------------------------------------------
150     /**
151      * <p>Outputs an array as a String, treating <code>null</code> as an empty array.</p>
152      *
153      * <p>Multi-dimensional arrays are handled correctly, including
154      * multi-dimensional primitive arrays.</p>
155      *
156      * <p>The format is that of Java source code, for example <code>{a,b}</code>.</p>
157      *
158      * @param array  the array to get a toString for, may be <code>null</code>
159      * @return a String representation of the array, '{}' if null array input
160      */
toString(Object array)161     public static String toString(Object array) {
162         return toString(array, "{}");
163     }
164 
165     /**
166      * <p>Outputs an array as a String handling <code>null</code>s.</p>
167      *
168      * <p>Multi-dimensional arrays are handled correctly, including
169      * multi-dimensional primitive arrays.</p>
170      *
171      * <p>The format is that of Java source code, for example <code>{a,b}</code>.</p>
172      *
173      * @param array  the array to get a toString for, may be <code>null</code>
174      * @param stringIfNull  the String to return if the array is <code>null</code>
175      * @return a String representation of the array
176      */
toString(Object array, String stringIfNull)177     public static String toString(Object array, String stringIfNull) {
178         if (array == null) {
179             return stringIfNull;
180         }
181         return new ToStringBuilder(array, ToStringStyle.SIMPLE_STYLE).append(array).toString();
182     }
183 
184     /**
185      * <p>Get a hashCode for an array handling multi-dimensional arrays correctly.</p>
186      *
187      * <p>Multi-dimensional primitive arrays are also handled correctly by this method.</p>
188      *
189      * @param array  the array to get a hashCode for, may be <code>null</code>
190      * @return a hashCode for the array, zero if null array input
191      */
hashCode(Object array)192     public static int hashCode(Object array) {
193         return new HashCodeBuilder().append(array).toHashCode();
194     }
195 
196     /**
197      * <p>Compares two arrays, using equals(), handling multi-dimensional arrays
198      * correctly.</p>
199      *
200      * <p>Multi-dimensional primitive arrays are also handled correctly by this method.</p>
201      *
202      * @param array1  the left hand array to compare, may be <code>null</code>
203      * @param array2  the right hand array to compare, may be <code>null</code>
204      * @return <code>true</code> if the arrays are equal
205      */
isEquals(Object array1, Object array2)206     public static boolean isEquals(Object array1, Object array2) {
207         return new EqualsBuilder().append(array1, array2).isEquals();
208     }
209 
210     // To map
211     //-----------------------------------------------------------------------
212     /**
213      * <p>Converts the given array into a {@link java.util.Map}. Each element of the array
214      * must be either a {@link java.util.Map.Entry} or an Array, containing at least two
215      * elements, where the first element is used as key and the second as
216      * value.</p>
217      *
218      * <p>This method can be used to initialize:</p>
219      * <pre>
220      * // Create a Map mapping colors.
221      * Map colorMap = MapUtils.toMap(new String[][] {{
222      *     {"RED", "#FF0000"},
223      *     {"GREEN", "#00FF00"},
224      *     {"BLUE", "#0000FF"}});
225      * </pre>
226      *
227      * <p>This method returns <code>null</code> for a <code>null</code> input array.</p>
228      *
229      * @param array  an array whose elements are either a {@link java.util.Map.Entry} or
230      *  an Array containing at least two elements, may be <code>null</code>
231      * @return a <code>Map</code> that was created from the array
232      * @throws IllegalArgumentException  if one element of this Array is
233      *  itself an Array containing less then two elements
234      * @throws IllegalArgumentException  if the array contains elements other
235      *  than {@link java.util.Map.Entry} and an Array
236      */
toMap(Object[] array)237     public static Map toMap(Object[] array) {
238         if (array == null) {
239             return null;
240         }
241         final Map map = new HashMap((int) (array.length * 1.5));
242         for (int i = 0; i < array.length; i++) {
243             Object object = array[i];
244             if (object instanceof Map.Entry) {
245                 Map.Entry entry = (Map.Entry) object;
246                 map.put(entry.getKey(), entry.getValue());
247             } else if (object instanceof Object[]) {
248                 Object[] entry = (Object[]) object;
249                 if (entry.length < 2) {
250                     throw new IllegalArgumentException("Array element " + i + ", '"
251                         + object
252                         + "', has a length less than 2");
253                 }
254                 map.put(entry[0], entry[1]);
255             } else {
256                 throw new IllegalArgumentException("Array element " + i + ", '"
257                         + object
258                         + "', is neither of type Map.Entry nor an Array");
259             }
260         }
261         return map;
262     }
263 
264     // Clone
265     //-----------------------------------------------------------------------
266     /**
267      * <p>Shallow clones an array returning a typecast result and handling
268      * <code>null</code>.</p>
269      *
270      * <p>The objects in the array are not cloned, thus there is no special
271      * handling for multi-dimensional arrays.</p>
272      *
273      * <p>This method returns <code>null</code> for a <code>null</code> input array.</p>
274      *
275      * @param array  the array to shallow clone, may be <code>null</code>
276      * @return the cloned array, <code>null</code> if <code>null</code> input
277      */
clone(Object[] array)278     public static Object[] clone(Object[] array) {
279         if (array == null) {
280             return null;
281         }
282         return (Object[]) array.clone();
283     }
284 
285     /**
286      * <p>Clones an array returning a typecast result and handling
287      * <code>null</code>.</p>
288      *
289      * <p>This method returns <code>null</code> for a <code>null</code> input array.</p>
290      *
291      * @param array  the array to clone, may be <code>null</code>
292      * @return the cloned array, <code>null</code> if <code>null</code> input
293      */
clone(long[] array)294     public static long[] clone(long[] array) {
295         if (array == null) {
296             return null;
297         }
298         return (long[]) array.clone();
299     }
300 
301     /**
302      * <p>Clones an array returning a typecast result and handling
303      * <code>null</code>.</p>
304      *
305      * <p>This method returns <code>null</code> for a <code>null</code> input array.</p>
306      *
307      * @param array  the array to clone, may be <code>null</code>
308      * @return the cloned array, <code>null</code> if <code>null</code> input
309      */
clone(int[] array)310     public static int[] clone(int[] array) {
311         if (array == null) {
312             return null;
313         }
314         return (int[]) array.clone();
315     }
316 
317     /**
318      * <p>Clones an array returning a typecast result and handling
319      * <code>null</code>.</p>
320      *
321      * <p>This method returns <code>null</code> for a <code>null</code> input array.</p>
322      *
323      * @param array  the array to clone, may be <code>null</code>
324      * @return the cloned array, <code>null</code> if <code>null</code> input
325      */
clone(short[] array)326     public static short[] clone(short[] array) {
327         if (array == null) {
328             return null;
329         }
330         return (short[]) array.clone();
331     }
332 
333     /**
334      * <p>Clones an array returning a typecast result and handling
335      * <code>null</code>.</p>
336      *
337      * <p>This method returns <code>null</code> for a <code>null</code> input array.</p>
338      *
339      * @param array  the array to clone, may be <code>null</code>
340      * @return the cloned array, <code>null</code> if <code>null</code> input
341      */
clone(char[] array)342     public static char[] clone(char[] array) {
343         if (array == null) {
344             return null;
345         }
346         return (char[]) array.clone();
347     }
348 
349     /**
350      * <p>Clones an array returning a typecast result and handling
351      * <code>null</code>.</p>
352      *
353      * <p>This method returns <code>null</code> for a <code>null</code> input array.</p>
354      *
355      * @param array  the array to clone, may be <code>null</code>
356      * @return the cloned array, <code>null</code> if <code>null</code> input
357      */
clone(byte[] array)358     public static byte[] clone(byte[] array) {
359         if (array == null) {
360             return null;
361         }
362         return (byte[]) array.clone();
363     }
364 
365     /**
366      * <p>Clones an array returning a typecast result and handling
367      * <code>null</code>.</p>
368      *
369      * <p>This method returns <code>null</code> for a <code>null</code> input array.</p>
370      *
371      * @param array  the array to clone, may be <code>null</code>
372      * @return the cloned array, <code>null</code> if <code>null</code> input
373      */
clone(double[] array)374     public static double[] clone(double[] array) {
375         if (array == null) {
376             return null;
377         }
378         return (double[]) array.clone();
379     }
380 
381     /**
382      * <p>Clones an array returning a typecast result and handling
383      * <code>null</code>.</p>
384      *
385      * <p>This method returns <code>null</code> for a <code>null</code> input array.</p>
386      *
387      * @param array  the array to clone, may be <code>null</code>
388      * @return the cloned array, <code>null</code> if <code>null</code> input
389      */
clone(float[] array)390     public static float[] clone(float[] array) {
391         if (array == null) {
392             return null;
393         }
394         return (float[]) array.clone();
395     }
396 
397     /**
398      * <p>Clones an array returning a typecast result and handling
399      * <code>null</code>.</p>
400      *
401      * <p>This method returns <code>null</code> for a <code>null</code> input array.</p>
402      *
403      * @param array  the array to clone, may be <code>null</code>
404      * @return the cloned array, <code>null</code> if <code>null</code> input
405      */
clone(boolean[] array)406     public static boolean[] clone(boolean[] array) {
407         if (array == null) {
408             return null;
409         }
410         return (boolean[]) array.clone();
411     }
412 
413     // nullToEmpty
414     //-----------------------------------------------------------------------
415     /**
416      * <p>Defensive programming technique to change a <code>null</code>
417      * reference to an empty one.</p>
418      *
419      * <p>This method returns an empty array for a <code>null</code> input array.</p>
420      *
421      * <p>As a memory optimizing technique an empty array passed in will be overridden with
422      * the empty <code>public static</code> references in this class.</p>
423      *
424      * @param array  the array to check for <code>null</code> or empty
425      * @return the same array, <code>public static</code> empty array if <code>null</code> or empty input
426      * @since 2.5
427      */
nullToEmpty(Object[] array)428     public static Object[] nullToEmpty(Object[] array) {
429         if (array == null || array.length == 0) {
430             return EMPTY_OBJECT_ARRAY;
431         }
432         return array;
433     }
434 
435     /**
436      * <p>Defensive programming technique to change a <code>null</code>
437      * reference to an empty one.</p>
438      *
439      * <p>This method returns an empty array for a <code>null</code> input array.</p>
440      *
441      * <p>As a memory optimizing technique an empty array passed in will be overridden with
442      * the empty <code>public static</code> references in this class.</p>
443      *
444      * @param array  the array to check for <code>null</code> or empty
445      * @return the same array, <code>public static</code> empty array if <code>null</code> or empty input
446      * @since 2.5
447      */
nullToEmpty(String[] array)448     public static String[] nullToEmpty(String[] array) {
449         if (array == null || array.length == 0) {
450             return EMPTY_STRING_ARRAY;
451         }
452         return array;
453     }
454 
455     /**
456      * <p>Defensive programming technique to change a <code>null</code>
457      * reference to an empty one.</p>
458      *
459      * <p>This method returns an empty array for a <code>null</code> input array.</p>
460      *
461      * <p>As a memory optimizing technique an empty array passed in will be overridden with
462      * the empty <code>public static</code> references in this class.</p>
463      *
464      * @param array  the array to check for <code>null</code> or empty
465      * @return the same array, <code>public static</code> empty array if <code>null</code> or empty input
466      * @since 2.5
467      */
nullToEmpty(long[] array)468     public static long[] nullToEmpty(long[] array) {
469         if (array == null || array.length == 0) {
470             return EMPTY_LONG_ARRAY;
471         }
472         return array;
473     }
474 
475     /**
476      * <p>Defensive programming technique to change a <code>null</code>
477      * reference to an empty one.</p>
478      *
479      * <p>This method returns an empty array for a <code>null</code> input array.</p>
480      *
481      * <p>As a memory optimizing technique an empty array passed in will be overridden with
482      * the empty <code>public static</code> references in this class.</p>
483      *
484      * @param array  the array to check for <code>null</code> or empty
485      * @return the same array, <code>public static</code> empty array if <code>null</code> or empty input
486      * @since 2.5
487      */
nullToEmpty(int[] array)488     public static int[] nullToEmpty(int[] array) {
489         if (array == null || array.length == 0) {
490             return EMPTY_INT_ARRAY;
491         }
492         return array;
493     }
494 
495     /**
496      * <p>Defensive programming technique to change a <code>null</code>
497      * reference to an empty one.</p>
498      *
499      * <p>This method returns an empty array for a <code>null</code> input array.</p>
500      *
501      * <p>As a memory optimizing technique an empty array passed in will be overridden with
502      * the empty <code>public static</code> references in this class.</p>
503      *
504      * @param array  the array to check for <code>null</code> or empty
505      * @return the same array, <code>public static</code> empty array if <code>null</code> or empty input
506      * @since 2.5
507      */
nullToEmpty(short[] array)508     public static short[] nullToEmpty(short[] array) {
509         if (array == null || array.length == 0) {
510             return EMPTY_SHORT_ARRAY;
511         }
512         return array;
513     }
514 
515     /**
516      * <p>Defensive programming technique to change a <code>null</code>
517      * reference to an empty one.</p>
518      *
519      * <p>This method returns an empty array for a <code>null</code> input array.</p>
520      *
521      * <p>As a memory optimizing technique an empty array passed in will be overridden with
522      * the empty <code>public static</code> references in this class.</p>
523      *
524      * @param array  the array to check for <code>null</code> or empty
525      * @return the same array, <code>public static</code> empty array if <code>null</code> or empty input
526      * @since 2.5
527      */
nullToEmpty(char[] array)528     public static char[] nullToEmpty(char[] array) {
529         if (array == null || array.length == 0) {
530             return EMPTY_CHAR_ARRAY;
531         }
532         return array;
533     }
534 
535     /**
536      * <p>Defensive programming technique to change a <code>null</code>
537      * reference to an empty one.</p>
538      *
539      * <p>This method returns an empty array for a <code>null</code> input array.</p>
540      *
541      * <p>As a memory optimizing technique an empty array passed in will be overridden with
542      * the empty <code>public static</code> references in this class.</p>
543      *
544      * @param array  the array to check for <code>null</code> or empty
545      * @return the same array, <code>public static</code> empty array if <code>null</code> or empty input
546      * @since 2.5
547      */
nullToEmpty(byte[] array)548     public static byte[] nullToEmpty(byte[] array) {
549         if (array == null || array.length == 0) {
550             return EMPTY_BYTE_ARRAY;
551         }
552         return array;
553     }
554 
555     /**
556      * <p>Defensive programming technique to change a <code>null</code>
557      * reference to an empty one.</p>
558      *
559      * <p>This method returns an empty array for a <code>null</code> input array.</p>
560      *
561      * <p>As a memory optimizing technique an empty array passed in will be overridden with
562      * the empty <code>public static</code> references in this class.</p>
563      *
564      * @param array  the array to check for <code>null</code> or empty
565      * @return the same array, <code>public static</code> empty array if <code>null</code> or empty input
566      * @since 2.5
567      */
nullToEmpty(double[] array)568     public static double[] nullToEmpty(double[] array) {
569         if (array == null || array.length == 0) {
570             return EMPTY_DOUBLE_ARRAY;
571         }
572         return array;
573     }
574 
575     /**
576      * <p>Defensive programming technique to change a <code>null</code>
577      * reference to an empty one.</p>
578      *
579      * <p>This method returns an empty array for a <code>null</code> input array.</p>
580      *
581      * <p>As a memory optimizing technique an empty array passed in will be overridden with
582      * the empty <code>public static</code> references in this class.</p>
583      *
584      * @param array  the array to check for <code>null</code> or empty
585      * @return the same array, <code>public static</code> empty array if <code>null</code> or empty input
586      * @since 2.5
587      */
nullToEmpty(float[] array)588     public static float[] nullToEmpty(float[] array) {
589         if (array == null || array.length == 0) {
590             return EMPTY_FLOAT_ARRAY;
591         }
592         return array;
593     }
594 
595     /**
596      * <p>Defensive programming technique to change a <code>null</code>
597      * reference to an empty one.</p>
598      *
599      * <p>This method returns an empty array for a <code>null</code> input array.</p>
600      *
601      * <p>As a memory optimizing technique an empty array passed in will be overridden with
602      * the empty <code>public static</code> references in this class.</p>
603      *
604      * @param array  the array to check for <code>null</code> or empty
605      * @return the same array, <code>public static</code> empty array if <code>null</code> or empty input
606      * @since 2.5
607      */
nullToEmpty(boolean[] array)608     public static boolean[] nullToEmpty(boolean[] array) {
609         if (array == null || array.length == 0) {
610             return EMPTY_BOOLEAN_ARRAY;
611         }
612         return array;
613     }
614 
615     /**
616      * <p>Defensive programming technique to change a <code>null</code>
617      * reference to an empty one.</p>
618      *
619      * <p>This method returns an empty array for a <code>null</code> input array.</p>
620      *
621      * <p>As a memory optimizing technique an empty array passed in will be overridden with
622      * the empty <code>public static</code> references in this class.</p>
623      *
624      * @param array  the array to check for <code>null</code> or empty
625      * @return the same array, <code>public static</code> empty array if <code>null</code> or empty input
626      * @since 2.5
627      */
nullToEmpty(Long[] array)628     public static Long[] nullToEmpty(Long[] array) {
629         if (array == null || array.length == 0) {
630             return EMPTY_LONG_OBJECT_ARRAY;
631         }
632         return array;
633     }
634 
635     /**
636      * <p>Defensive programming technique to change a <code>null</code>
637      * reference to an empty one.</p>
638      *
639      * <p>This method returns an empty array for a <code>null</code> input array.</p>
640      *
641      * <p>As a memory optimizing technique an empty array passed in will be overridden with
642      * the empty <code>public static</code> references in this class.</p>
643      *
644      * @param array  the array to check for <code>null</code> or empty
645      * @return the same array, <code>public static</code> empty array if <code>null</code> or empty input
646      * @since 2.5
647      */
nullToEmpty(Integer[] array)648     public static Integer[] nullToEmpty(Integer[] array) {
649         if (array == null || array.length == 0) {
650             return EMPTY_INTEGER_OBJECT_ARRAY;
651         }
652         return array;
653     }
654 
655     /**
656      * <p>Defensive programming technique to change a <code>null</code>
657      * reference to an empty one.</p>
658      *
659      * <p>This method returns an empty array for a <code>null</code> input array.</p>
660      *
661      * <p>As a memory optimizing technique an empty array passed in will be overridden with
662      * the empty <code>public static</code> references in this class.</p>
663      *
664      * @param array  the array to check for <code>null</code> or empty
665      * @return the same array, <code>public static</code> empty array if <code>null</code> or empty input
666      * @since 2.5
667      */
nullToEmpty(Short[] array)668     public static Short[] nullToEmpty(Short[] array) {
669         if (array == null || array.length == 0) {
670             return EMPTY_SHORT_OBJECT_ARRAY;
671         }
672         return array;
673     }
674 
675     /**
676      * <p>Defensive programming technique to change a <code>null</code>
677      * reference to an empty one.</p>
678      *
679      * <p>This method returns an empty array for a <code>null</code> input array.</p>
680      *
681      * <p>As a memory optimizing technique an empty array passed in will be overridden with
682      * the empty <code>public static</code> references in this class.</p>
683      *
684      * @param array  the array to check for <code>null</code> or empty
685      * @return the same array, <code>public static</code> empty array if <code>null</code> or empty input
686      * @since 2.5
687      */
nullToEmpty(Character[] array)688     public static Character[] nullToEmpty(Character[] array) {
689         if (array == null || array.length == 0) {
690             return EMPTY_CHARACTER_OBJECT_ARRAY;
691         }
692         return array;
693     }
694 
695     /**
696      * <p>Defensive programming technique to change a <code>null</code>
697      * reference to an empty one.</p>
698      *
699      * <p>This method returns an empty array for a <code>null</code> input array.</p>
700      *
701      * <p>As a memory optimizing technique an empty array passed in will be overridden with
702      * the empty <code>public static</code> references in this class.</p>
703      *
704      * @param array  the array to check for <code>null</code> or empty
705      * @return the same array, <code>public static</code> empty array if <code>null</code> or empty input
706      * @since 2.5
707      */
nullToEmpty(Byte[] array)708     public static Byte[] nullToEmpty(Byte[] array) {
709         if (array == null || array.length == 0) {
710             return EMPTY_BYTE_OBJECT_ARRAY;
711         }
712         return array;
713     }
714 
715     /**
716      * <p>Defensive programming technique to change a <code>null</code>
717      * reference to an empty one.</p>
718      *
719      * <p>This method returns an empty array for a <code>null</code> input array.</p>
720      *
721      * <p>As a memory optimizing technique an empty array passed in will be overridden with
722      * the empty <code>public static</code> references in this class.</p>
723      *
724      * @param array  the array to check for <code>null</code> or empty
725      * @return the same array, <code>public static</code> empty array if <code>null</code> or empty input
726      * @since 2.5
727      */
nullToEmpty(Double[] array)728     public static Double[] nullToEmpty(Double[] array) {
729         if (array == null || array.length == 0) {
730             return EMPTY_DOUBLE_OBJECT_ARRAY;
731         }
732         return array;
733     }
734 
735     /**
736      * <p>Defensive programming technique to change a <code>null</code>
737      * reference to an empty one.</p>
738      *
739      * <p>This method returns an empty array for a <code>null</code> input array.</p>
740      *
741      * <p>As a memory optimizing technique an empty array passed in will be overridden with
742      * the empty <code>public static</code> references in this class.</p>
743      *
744      * @param array  the array to check for <code>null</code> or empty
745      * @return the same array, <code>public static</code> empty array if <code>null</code> or empty input
746      * @since 2.5
747      */
nullToEmpty(Float[] array)748     public static Float[] nullToEmpty(Float[] array) {
749         if (array == null || array.length == 0) {
750             return EMPTY_FLOAT_OBJECT_ARRAY;
751         }
752         return array;
753     }
754 
755     /**
756      * <p>Defensive programming technique to change a <code>null</code>
757      * reference to an empty one.</p>
758      *
759      * <p>This method returns an empty array for a <code>null</code> input array.</p>
760      *
761      * <p>As a memory optimizing technique an empty array passed in will be overridden with
762      * the empty <code>public static</code> references in this class.</p>
763      *
764      * @param array  the array to check for <code>null</code> or empty
765      * @return the same array, <code>public static</code> empty array if <code>null</code> or empty input
766      * @since 2.5
767      */
nullToEmpty(Boolean[] array)768     public static Boolean[] nullToEmpty(Boolean[] array) {
769         if (array == null || array.length == 0) {
770             return EMPTY_BOOLEAN_OBJECT_ARRAY;
771         }
772         return array;
773     }
774 
775     // Subarrays
776     //-----------------------------------------------------------------------
777     /**
778      * <p>Produces a new array containing the elements between
779      * the start and end indices.</p>
780      *
781      * <p>The start index is inclusive, the end index exclusive.
782      * Null array input produces null output.</p>
783      *
784      * <p>The component type of the subarray is always the same as
785      * that of the input array. Thus, if the input is an array of type
786      * <code>Date</code>, the following usage is envisaged:</p>
787      *
788      * <pre>
789      * Date[] someDates = (Date[])ArrayUtils.subarray(allDates, 2, 5);
790      * </pre>
791      *
792      * @param array  the array
793      * @param startIndexInclusive  the starting index. Undervalue (&lt;0)
794      *      is promoted to 0, overvalue (&gt;array.length) results
795      *      in an empty array.
796      * @param endIndexExclusive  elements up to endIndex-1 are present in the
797      *      returned subarray. Undervalue (&lt; startIndex) produces
798      *      empty array, overvalue (&gt;array.length) is demoted to
799      *      array length.
800      * @return a new array containing the elements between
801      *      the start and end indices.
802      * @since 2.1
803      */
subarray(Object[] array, int startIndexInclusive, int endIndexExclusive)804     public static Object[] subarray(Object[] array, int startIndexInclusive, int endIndexExclusive) {
805         if (array == null) {
806             return null;
807         }
808         if (startIndexInclusive < 0) {
809             startIndexInclusive = 0;
810         }
811         if (endIndexExclusive > array.length) {
812             endIndexExclusive = array.length;
813         }
814         int newSize = endIndexExclusive - startIndexInclusive;
815         Class type = array.getClass().getComponentType();
816         if (newSize <= 0) {
817             return (Object[]) Array.newInstance(type, 0);
818         }
819         Object[] subarray = (Object[]) Array.newInstance(type, newSize);
820         System.arraycopy(array, startIndexInclusive, subarray, 0, newSize);
821         return subarray;
822     }
823 
824     /**
825      * <p>Produces a new <code>long</code> array containing the elements
826      * between the start and end indices.</p>
827      *
828      * <p>The start index is inclusive, the end index exclusive.
829      * Null array input produces null output.</p>
830      *
831      * @param array  the array
832      * @param startIndexInclusive  the starting index. Undervalue (&lt;0)
833      *      is promoted to 0, overvalue (&gt;array.length) results
834      *      in an empty array.
835      * @param endIndexExclusive  elements up to endIndex-1 are present in the
836      *      returned subarray. Undervalue (&lt; startIndex) produces
837      *      empty array, overvalue (&gt;array.length) is demoted to
838      *      array length.
839      * @return a new array containing the elements between
840      *      the start and end indices.
841      * @since 2.1
842      */
subarray(long[] array, int startIndexInclusive, int endIndexExclusive)843     public static long[] subarray(long[] array, int startIndexInclusive, int endIndexExclusive) {
844         if (array == null) {
845             return null;
846         }
847         if (startIndexInclusive < 0) {
848             startIndexInclusive = 0;
849         }
850         if (endIndexExclusive > array.length) {
851             endIndexExclusive = array.length;
852         }
853         int newSize = endIndexExclusive - startIndexInclusive;
854         if (newSize <= 0) {
855             return EMPTY_LONG_ARRAY;
856         }
857 
858         long[] subarray = new long[newSize];
859         System.arraycopy(array, startIndexInclusive, subarray, 0, newSize);
860         return subarray;
861     }
862 
863     /**
864      * <p>Produces a new <code>int</code> array containing the elements
865      * between the start and end indices.</p>
866      *
867      * <p>The start index is inclusive, the end index exclusive.
868      * Null array input produces null output.</p>
869      *
870      * @param array  the array
871      * @param startIndexInclusive  the starting index. Undervalue (&lt;0)
872      *      is promoted to 0, overvalue (&gt;array.length) results
873      *      in an empty array.
874      * @param endIndexExclusive  elements up to endIndex-1 are present in the
875      *      returned subarray. Undervalue (&lt; startIndex) produces
876      *      empty array, overvalue (&gt;array.length) is demoted to
877      *      array length.
878      * @return a new array containing the elements between
879      *      the start and end indices.
880      * @since 2.1
881      */
subarray(int[] array, int startIndexInclusive, int endIndexExclusive)882     public static int[] subarray(int[] array, int startIndexInclusive, int endIndexExclusive) {
883         if (array == null) {
884             return null;
885         }
886         if (startIndexInclusive < 0) {
887             startIndexInclusive = 0;
888         }
889         if (endIndexExclusive > array.length) {
890             endIndexExclusive = array.length;
891         }
892         int newSize = endIndexExclusive - startIndexInclusive;
893         if (newSize <= 0) {
894             return EMPTY_INT_ARRAY;
895         }
896 
897         int[] subarray = new int[newSize];
898         System.arraycopy(array, startIndexInclusive, subarray, 0, newSize);
899         return subarray;
900     }
901 
902     /**
903      * <p>Produces a new <code>short</code> array containing the elements
904      * between the start and end indices.</p>
905      *
906      * <p>The start index is inclusive, the end index exclusive.
907      * Null array input produces null output.</p>
908      *
909      * @param array  the array
910      * @param startIndexInclusive  the starting index. Undervalue (&lt;0)
911      *      is promoted to 0, overvalue (&gt;array.length) results
912      *      in an empty array.
913      * @param endIndexExclusive  elements up to endIndex-1 are present in the
914      *      returned subarray. Undervalue (&lt; startIndex) produces
915      *      empty array, overvalue (&gt;array.length) is demoted to
916      *      array length.
917      * @return a new array containing the elements between
918      *      the start and end indices.
919      * @since 2.1
920      */
subarray(short[] array, int startIndexInclusive, int endIndexExclusive)921     public static short[] subarray(short[] array, int startIndexInclusive, int endIndexExclusive) {
922         if (array == null) {
923             return null;
924         }
925         if (startIndexInclusive < 0) {
926             startIndexInclusive = 0;
927         }
928         if (endIndexExclusive > array.length) {
929             endIndexExclusive = array.length;
930         }
931         int newSize = endIndexExclusive - startIndexInclusive;
932         if (newSize <= 0) {
933             return EMPTY_SHORT_ARRAY;
934         }
935 
936         short[] subarray = new short[newSize];
937         System.arraycopy(array, startIndexInclusive, subarray, 0, newSize);
938         return subarray;
939     }
940 
941     /**
942      * <p>Produces a new <code>char</code> array containing the elements
943      * between the start and end indices.</p>
944      *
945      * <p>The start index is inclusive, the end index exclusive.
946      * Null array input produces null output.</p>
947      *
948      * @param array  the array
949      * @param startIndexInclusive  the starting index. Undervalue (&lt;0)
950      *      is promoted to 0, overvalue (&gt;array.length) results
951      *      in an empty array.
952      * @param endIndexExclusive  elements up to endIndex-1 are present in the
953      *      returned subarray. Undervalue (&lt; startIndex) produces
954      *      empty array, overvalue (&gt;array.length) is demoted to
955      *      array length.
956      * @return a new array containing the elements between
957      *      the start and end indices.
958      * @since 2.1
959      */
subarray(char[] array, int startIndexInclusive, int endIndexExclusive)960     public static char[] subarray(char[] array, int startIndexInclusive, int endIndexExclusive) {
961         if (array == null) {
962             return null;
963         }
964         if (startIndexInclusive < 0) {
965             startIndexInclusive = 0;
966         }
967         if (endIndexExclusive > array.length) {
968             endIndexExclusive = array.length;
969         }
970         int newSize = endIndexExclusive - startIndexInclusive;
971         if (newSize <= 0) {
972             return EMPTY_CHAR_ARRAY;
973         }
974 
975         char[] subarray = new char[newSize];
976         System.arraycopy(array, startIndexInclusive, subarray, 0, newSize);
977         return subarray;
978     }
979 
980     /**
981      * <p>Produces a new <code>byte</code> array containing the elements
982      * between the start and end indices.</p>
983      *
984      * <p>The start index is inclusive, the end index exclusive.
985      * Null array input produces null output.</p>
986      *
987      * @param array  the array
988      * @param startIndexInclusive  the starting index. Undervalue (&lt;0)
989      *      is promoted to 0, overvalue (&gt;array.length) results
990      *      in an empty array.
991      * @param endIndexExclusive  elements up to endIndex-1 are present in the
992      *      returned subarray. Undervalue (&lt; startIndex) produces
993      *      empty array, overvalue (&gt;array.length) is demoted to
994      *      array length.
995      * @return a new array containing the elements between
996      *      the start and end indices.
997      * @since 2.1
998      */
subarray(byte[] array, int startIndexInclusive, int endIndexExclusive)999     public static byte[] subarray(byte[] array, int startIndexInclusive, int endIndexExclusive) {
1000         if (array == null) {
1001             return null;
1002         }
1003         if (startIndexInclusive < 0) {
1004             startIndexInclusive = 0;
1005         }
1006         if (endIndexExclusive > array.length) {
1007             endIndexExclusive = array.length;
1008         }
1009         int newSize = endIndexExclusive - startIndexInclusive;
1010         if (newSize <= 0) {
1011             return EMPTY_BYTE_ARRAY;
1012         }
1013 
1014         byte[] subarray = new byte[newSize];
1015         System.arraycopy(array, startIndexInclusive, subarray, 0, newSize);
1016         return subarray;
1017     }
1018 
1019     /**
1020      * <p>Produces a new <code>double</code> array containing the elements
1021      * between the start and end indices.</p>
1022      *
1023      * <p>The start index is inclusive, the end index exclusive.
1024      * Null array input produces null output.</p>
1025      *
1026      * @param array  the array
1027      * @param startIndexInclusive  the starting index. Undervalue (&lt;0)
1028      *      is promoted to 0, overvalue (&gt;array.length) results
1029      *      in an empty array.
1030      * @param endIndexExclusive  elements up to endIndex-1 are present in the
1031      *      returned subarray. Undervalue (&lt; startIndex) produces
1032      *      empty array, overvalue (&gt;array.length) is demoted to
1033      *      array length.
1034      * @return a new array containing the elements between
1035      *      the start and end indices.
1036      * @since 2.1
1037      */
subarray(double[] array, int startIndexInclusive, int endIndexExclusive)1038     public static double[] subarray(double[] array, int startIndexInclusive, int endIndexExclusive) {
1039         if (array == null) {
1040             return null;
1041         }
1042         if (startIndexInclusive < 0) {
1043             startIndexInclusive = 0;
1044         }
1045         if (endIndexExclusive > array.length) {
1046             endIndexExclusive = array.length;
1047         }
1048         int newSize = endIndexExclusive - startIndexInclusive;
1049         if (newSize <= 0) {
1050             return EMPTY_DOUBLE_ARRAY;
1051         }
1052 
1053         double[] subarray = new double[newSize];
1054         System.arraycopy(array, startIndexInclusive, subarray, 0, newSize);
1055         return subarray;
1056     }
1057 
1058     /**
1059      * <p>Produces a new <code>float</code> array containing the elements
1060      * between the start and end indices.</p>
1061      *
1062      * <p>The start index is inclusive, the end index exclusive.
1063      * Null array input produces null output.</p>
1064      *
1065      * @param array  the array
1066      * @param startIndexInclusive  the starting index. Undervalue (&lt;0)
1067      *      is promoted to 0, overvalue (&gt;array.length) results
1068      *      in an empty array.
1069      * @param endIndexExclusive  elements up to endIndex-1 are present in the
1070      *      returned subarray. Undervalue (&lt; startIndex) produces
1071      *      empty array, overvalue (&gt;array.length) is demoted to
1072      *      array length.
1073      * @return a new array containing the elements between
1074      *      the start and end indices.
1075      * @since 2.1
1076      */
subarray(float[] array, int startIndexInclusive, int endIndexExclusive)1077     public static float[] subarray(float[] array, int startIndexInclusive, int endIndexExclusive) {
1078         if (array == null) {
1079             return null;
1080         }
1081         if (startIndexInclusive < 0) {
1082             startIndexInclusive = 0;
1083         }
1084         if (endIndexExclusive > array.length) {
1085             endIndexExclusive = array.length;
1086         }
1087         int newSize = endIndexExclusive - startIndexInclusive;
1088         if (newSize <= 0) {
1089             return EMPTY_FLOAT_ARRAY;
1090         }
1091 
1092         float[] subarray = new float[newSize];
1093         System.arraycopy(array, startIndexInclusive, subarray, 0, newSize);
1094         return subarray;
1095     }
1096 
1097     /**
1098      * <p>Produces a new <code>boolean</code> array containing the elements
1099      * between the start and end indices.</p>
1100      *
1101      * <p>The start index is inclusive, the end index exclusive.
1102      * Null array input produces null output.</p>
1103      *
1104      * @param array  the array
1105      * @param startIndexInclusive  the starting index. Undervalue (&lt;0)
1106      *      is promoted to 0, overvalue (&gt;array.length) results
1107      *      in an empty array.
1108      * @param endIndexExclusive  elements up to endIndex-1 are present in the
1109      *      returned subarray. Undervalue (&lt; startIndex) produces
1110      *      empty array, overvalue (&gt;array.length) is demoted to
1111      *      array length.
1112      * @return a new array containing the elements between
1113      *      the start and end indices.
1114      * @since 2.1
1115      */
subarray(boolean[] array, int startIndexInclusive, int endIndexExclusive)1116     public static boolean[] subarray(boolean[] array, int startIndexInclusive, int endIndexExclusive) {
1117         if (array == null) {
1118             return null;
1119         }
1120         if (startIndexInclusive < 0) {
1121             startIndexInclusive = 0;
1122         }
1123         if (endIndexExclusive > array.length) {
1124             endIndexExclusive = array.length;
1125         }
1126         int newSize = endIndexExclusive - startIndexInclusive;
1127         if (newSize <= 0) {
1128             return EMPTY_BOOLEAN_ARRAY;
1129         }
1130 
1131         boolean[] subarray = new boolean[newSize];
1132         System.arraycopy(array, startIndexInclusive, subarray, 0, newSize);
1133         return subarray;
1134     }
1135 
1136     // Is same length
1137     //-----------------------------------------------------------------------
1138     /**
1139      * <p>Checks whether two arrays are the same length, treating
1140      * <code>null</code> arrays as length <code>0</code>.
1141      *
1142      * <p>Any multi-dimensional aspects of the arrays are ignored.</p>
1143      *
1144      * @param array1 the first array, may be <code>null</code>
1145      * @param array2 the second array, may be <code>null</code>
1146      * @return <code>true</code> if length of arrays matches, treating
1147      *  <code>null</code> as an empty array
1148      */
isSameLength(Object[] array1, Object[] array2)1149     public static boolean isSameLength(Object[] array1, Object[] array2) {
1150         if ((array1 == null && array2 != null && array2.length > 0) ||
1151             (array2 == null && array1 != null && array1.length > 0) ||
1152             (array1 != null && array2 != null && array1.length != array2.length)) {
1153                 return false;
1154         }
1155         return true;
1156     }
1157 
1158     /**
1159      * <p>Checks whether two arrays are the same length, treating
1160      * <code>null</code> arrays as length <code>0</code>.</p>
1161      *
1162      * @param array1 the first array, may be <code>null</code>
1163      * @param array2 the second array, may be <code>null</code>
1164      * @return <code>true</code> if length of arrays matches, treating
1165      *  <code>null</code> as an empty array
1166      */
isSameLength(long[] array1, long[] array2)1167     public static boolean isSameLength(long[] array1, long[] array2) {
1168         if ((array1 == null && array2 != null && array2.length > 0) ||
1169             (array2 == null && array1 != null && array1.length > 0) ||
1170             (array1 != null && array2 != null && array1.length != array2.length)) {
1171                 return false;
1172         }
1173         return true;
1174     }
1175 
1176     /**
1177      * <p>Checks whether two arrays are the same length, treating
1178      * <code>null</code> arrays as length <code>0</code>.</p>
1179      *
1180      * @param array1 the first array, may be <code>null</code>
1181      * @param array2 the second array, may be <code>null</code>
1182      * @return <code>true</code> if length of arrays matches, treating
1183      *  <code>null</code> as an empty array
1184      */
isSameLength(int[] array1, int[] array2)1185     public static boolean isSameLength(int[] array1, int[] array2) {
1186         if ((array1 == null && array2 != null && array2.length > 0) ||
1187             (array2 == null && array1 != null && array1.length > 0) ||
1188             (array1 != null && array2 != null && array1.length != array2.length)) {
1189                 return false;
1190         }
1191         return true;
1192     }
1193 
1194     /**
1195      * <p>Checks whether two arrays are the same length, treating
1196      * <code>null</code> arrays as length <code>0</code>.</p>
1197      *
1198      * @param array1 the first array, may be <code>null</code>
1199      * @param array2 the second array, may be <code>null</code>
1200      * @return <code>true</code> if length of arrays matches, treating
1201      *  <code>null</code> as an empty array
1202      */
isSameLength(short[] array1, short[] array2)1203     public static boolean isSameLength(short[] array1, short[] array2) {
1204         if ((array1 == null && array2 != null && array2.length > 0) ||
1205             (array2 == null && array1 != null && array1.length > 0) ||
1206             (array1 != null && array2 != null && array1.length != array2.length)) {
1207                 return false;
1208         }
1209         return true;
1210     }
1211 
1212     /**
1213      * <p>Checks whether two arrays are the same length, treating
1214      * <code>null</code> arrays as length <code>0</code>.</p>
1215      *
1216      * @param array1 the first array, may be <code>null</code>
1217      * @param array2 the second array, may be <code>null</code>
1218      * @return <code>true</code> if length of arrays matches, treating
1219      *  <code>null</code> as an empty array
1220      */
isSameLength(char[] array1, char[] array2)1221     public static boolean isSameLength(char[] array1, char[] array2) {
1222         if ((array1 == null && array2 != null && array2.length > 0) ||
1223             (array2 == null && array1 != null && array1.length > 0) ||
1224             (array1 != null && array2 != null && array1.length != array2.length)) {
1225                 return false;
1226         }
1227         return true;
1228     }
1229 
1230     /**
1231      * <p>Checks whether two arrays are the same length, treating
1232      * <code>null</code> arrays as length <code>0</code>.</p>
1233      *
1234      * @param array1 the first array, may be <code>null</code>
1235      * @param array2 the second array, may be <code>null</code>
1236      * @return <code>true</code> if length of arrays matches, treating
1237      *  <code>null</code> as an empty array
1238      */
isSameLength(byte[] array1, byte[] array2)1239     public static boolean isSameLength(byte[] array1, byte[] array2) {
1240         if ((array1 == null && array2 != null && array2.length > 0) ||
1241             (array2 == null && array1 != null && array1.length > 0) ||
1242             (array1 != null && array2 != null && array1.length != array2.length)) {
1243                 return false;
1244         }
1245         return true;
1246     }
1247 
1248     /**
1249      * <p>Checks whether two arrays are the same length, treating
1250      * <code>null</code> arrays as length <code>0</code>.</p>
1251      *
1252      * @param array1 the first array, may be <code>null</code>
1253      * @param array2 the second array, may be <code>null</code>
1254      * @return <code>true</code> if length of arrays matches, treating
1255      *  <code>null</code> as an empty array
1256      */
isSameLength(double[] array1, double[] array2)1257     public static boolean isSameLength(double[] array1, double[] array2) {
1258         if ((array1 == null && array2 != null && array2.length > 0) ||
1259             (array2 == null && array1 != null && array1.length > 0) ||
1260             (array1 != null && array2 != null && array1.length != array2.length)) {
1261                 return false;
1262         }
1263         return true;
1264     }
1265 
1266     /**
1267      * <p>Checks whether two arrays are the same length, treating
1268      * <code>null</code> arrays as length <code>0</code>.</p>
1269      *
1270      * @param array1 the first array, may be <code>null</code>
1271      * @param array2 the second array, may be <code>null</code>
1272      * @return <code>true</code> if length of arrays matches, treating
1273      *  <code>null</code> as an empty array
1274      */
isSameLength(float[] array1, float[] array2)1275     public static boolean isSameLength(float[] array1, float[] array2) {
1276         if ((array1 == null && array2 != null && array2.length > 0) ||
1277             (array2 == null && array1 != null && array1.length > 0) ||
1278             (array1 != null && array2 != null && array1.length != array2.length)) {
1279                 return false;
1280         }
1281         return true;
1282     }
1283 
1284     /**
1285      * <p>Checks whether two arrays are the same length, treating
1286      * <code>null</code> arrays as length <code>0</code>.</p>
1287      *
1288      * @param array1 the first array, may be <code>null</code>
1289      * @param array2 the second array, may be <code>null</code>
1290      * @return <code>true</code> if length of arrays matches, treating
1291      *  <code>null</code> as an empty array
1292      */
isSameLength(boolean[] array1, boolean[] array2)1293     public static boolean isSameLength(boolean[] array1, boolean[] array2) {
1294         if ((array1 == null && array2 != null && array2.length > 0) ||
1295             (array2 == null && array1 != null && array1.length > 0) ||
1296             (array1 != null && array2 != null && array1.length != array2.length)) {
1297                 return false;
1298         }
1299         return true;
1300     }
1301 
1302     //-----------------------------------------------------------------------
1303     /**
1304      * <p>Returns the length of the specified array.
1305      * This method can deal with <code>Object</code> arrays and with primitive arrays.</p>
1306      *
1307      * <p>If the input array is <code>null</code>, <code>0</code> is returned.</p>
1308      *
1309      * <pre>
1310      * ArrayUtils.getLength(null)            = 0
1311      * ArrayUtils.getLength([])              = 0
1312      * ArrayUtils.getLength([null])          = 1
1313      * ArrayUtils.getLength([true, false])   = 2
1314      * ArrayUtils.getLength([1, 2, 3])       = 3
1315      * ArrayUtils.getLength(["a", "b", "c"]) = 3
1316      * </pre>
1317      *
1318      * @param array  the array to retrieve the length from, may be null
1319      * @return The length of the array, or <code>0</code> if the array is <code>null</code>
1320      * @throws IllegalArgumentException if the object arguement is not an array.
1321      * @since 2.1
1322      */
getLength(Object array)1323     public static int getLength(Object array) {
1324         if (array == null) {
1325             return 0;
1326         }
1327         return Array.getLength(array);
1328     }
1329 
1330     /**
1331      * <p>Checks whether two arrays are the same type taking into account
1332      * multi-dimensional arrays.</p>
1333      *
1334      * @param array1 the first array, must not be <code>null</code>
1335      * @param array2 the second array, must not be <code>null</code>
1336      * @return <code>true</code> if type of arrays matches
1337      * @throws IllegalArgumentException if either array is <code>null</code>
1338      */
isSameType(Object array1, Object array2)1339     public static boolean isSameType(Object array1, Object array2) {
1340         if (array1 == null || array2 == null) {
1341             throw new IllegalArgumentException("The Array must not be null");
1342         }
1343         return array1.getClass().getName().equals(array2.getClass().getName());
1344     }
1345 
1346     // Reverse
1347     //-----------------------------------------------------------------------
1348     /**
1349      * <p>Reverses the order of the given array.</p>
1350      *
1351      * <p>There is no special handling for multi-dimensional arrays.</p>
1352      *
1353      * <p>This method does nothing for a <code>null</code> input array.</p>
1354      *
1355      * @param array  the array to reverse, may be <code>null</code>
1356      */
reverse(Object[] array)1357     public static void reverse(Object[] array) {
1358         if (array == null) {
1359             return;
1360         }
1361         int i = 0;
1362         int j = array.length - 1;
1363         Object tmp;
1364         while (j > i) {
1365             tmp = array[j];
1366             array[j] = array[i];
1367             array[i] = tmp;
1368             j--;
1369             i++;
1370         }
1371     }
1372 
1373     /**
1374      * <p>Reverses the order of the given array.</p>
1375      *
1376      * <p>This method does nothing for a <code>null</code> input array.</p>
1377      *
1378      * @param array  the array to reverse, may be <code>null</code>
1379      */
reverse(long[] array)1380     public static void reverse(long[] array) {
1381         if (array == null) {
1382             return;
1383         }
1384         int i = 0;
1385         int j = array.length - 1;
1386         long tmp;
1387         while (j > i) {
1388             tmp = array[j];
1389             array[j] = array[i];
1390             array[i] = tmp;
1391             j--;
1392             i++;
1393         }
1394     }
1395 
1396     /**
1397      * <p>Reverses the order of the given array.</p>
1398      *
1399      * <p>This method does nothing for a <code>null</code> input array.</p>
1400      *
1401      * @param array  the array to reverse, may be <code>null</code>
1402      */
reverse(int[] array)1403     public static void reverse(int[] array) {
1404         if (array == null) {
1405             return;
1406         }
1407         int i = 0;
1408         int j = array.length - 1;
1409         int tmp;
1410         while (j > i) {
1411             tmp = array[j];
1412             array[j] = array[i];
1413             array[i] = tmp;
1414             j--;
1415             i++;
1416         }
1417     }
1418 
1419     /**
1420      * <p>Reverses the order of the given array.</p>
1421      *
1422      * <p>This method does nothing for a <code>null</code> input array.</p>
1423      *
1424      * @param array  the array to reverse, may be <code>null</code>
1425      */
reverse(short[] array)1426     public static void reverse(short[] array) {
1427         if (array == null) {
1428             return;
1429         }
1430         int i = 0;
1431         int j = array.length - 1;
1432         short tmp;
1433         while (j > i) {
1434             tmp = array[j];
1435             array[j] = array[i];
1436             array[i] = tmp;
1437             j--;
1438             i++;
1439         }
1440     }
1441 
1442     /**
1443      * <p>Reverses the order of the given array.</p>
1444      *
1445      * <p>This method does nothing for a <code>null</code> input array.</p>
1446      *
1447      * @param array  the array to reverse, may be <code>null</code>
1448      */
reverse(char[] array)1449     public static void reverse(char[] array) {
1450         if (array == null) {
1451             return;
1452         }
1453         int i = 0;
1454         int j = array.length - 1;
1455         char tmp;
1456         while (j > i) {
1457             tmp = array[j];
1458             array[j] = array[i];
1459             array[i] = tmp;
1460             j--;
1461             i++;
1462         }
1463     }
1464 
1465     /**
1466      * <p>Reverses the order of the given array.</p>
1467      *
1468      * <p>This method does nothing for a <code>null</code> input array.</p>
1469      *
1470      * @param array  the array to reverse, may be <code>null</code>
1471      */
reverse(byte[] array)1472     public static void reverse(byte[] array) {
1473         if (array == null) {
1474             return;
1475         }
1476         int i = 0;
1477         int j = array.length - 1;
1478         byte tmp;
1479         while (j > i) {
1480             tmp = array[j];
1481             array[j] = array[i];
1482             array[i] = tmp;
1483             j--;
1484             i++;
1485         }
1486     }
1487 
1488     /**
1489      * <p>Reverses the order of the given array.</p>
1490      *
1491      * <p>This method does nothing for a <code>null</code> input array.</p>
1492      *
1493      * @param array  the array to reverse, may be <code>null</code>
1494      */
reverse(double[] array)1495     public static void reverse(double[] array) {
1496         if (array == null) {
1497             return;
1498         }
1499         int i = 0;
1500         int j = array.length - 1;
1501         double tmp;
1502         while (j > i) {
1503             tmp = array[j];
1504             array[j] = array[i];
1505             array[i] = tmp;
1506             j--;
1507             i++;
1508         }
1509     }
1510 
1511     /**
1512      * <p>Reverses the order of the given array.</p>
1513      *
1514      * <p>This method does nothing for a <code>null</code> input array.</p>
1515      *
1516      * @param array  the array to reverse, may be <code>null</code>
1517      */
reverse(float[] array)1518     public static void reverse(float[] array) {
1519         if (array == null) {
1520             return;
1521         }
1522         int i = 0;
1523         int j = array.length - 1;
1524         float tmp;
1525         while (j > i) {
1526             tmp = array[j];
1527             array[j] = array[i];
1528             array[i] = tmp;
1529             j--;
1530             i++;
1531         }
1532     }
1533 
1534     /**
1535      * <p>Reverses the order of the given array.</p>
1536      *
1537      * <p>This method does nothing for a <code>null</code> input array.</p>
1538      *
1539      * @param array  the array to reverse, may be <code>null</code>
1540      */
reverse(boolean[] array)1541     public static void reverse(boolean[] array) {
1542         if (array == null) {
1543             return;
1544         }
1545         int i = 0;
1546         int j = array.length - 1;
1547         boolean tmp;
1548         while (j > i) {
1549             tmp = array[j];
1550             array[j] = array[i];
1551             array[i] = tmp;
1552             j--;
1553             i++;
1554         }
1555     }
1556 
1557     // IndexOf search
1558     // ----------------------------------------------------------------------
1559 
1560     // Object IndexOf
1561     //-----------------------------------------------------------------------
1562     /**
1563      * <p>Finds the index of the given object in the array.</p>
1564      *
1565      * <p>This method returns {@link #INDEX_NOT_FOUND} (<code>-1</code>) for a <code>null</code> input array.</p>
1566      *
1567      * @param array  the array to search through for the object, may be <code>null</code>
1568      * @param objectToFind  the object to find, may be <code>null</code>
1569      * @return the index of the object within the array,
1570      *  {@link #INDEX_NOT_FOUND} (<code>-1</code>) if not found or <code>null</code> array input
1571      */
indexOf(Object[] array, Object objectToFind)1572     public static int indexOf(Object[] array, Object objectToFind) {
1573         return indexOf(array, objectToFind, 0);
1574     }
1575 
1576     /**
1577      * <p>Finds the index of the given object in the array starting at the given index.</p>
1578      *
1579      * <p>This method returns {@link #INDEX_NOT_FOUND} (<code>-1</code>) for a <code>null</code> input array.</p>
1580      *
1581      * <p>A negative startIndex is treated as zero. A startIndex larger than the array
1582      * length will return {@link #INDEX_NOT_FOUND} (<code>-1</code>).</p>
1583      *
1584      * @param array  the array to search through for the object, may be <code>null</code>
1585      * @param objectToFind  the object to find, may be <code>null</code>
1586      * @param startIndex  the index to start searching at
1587      * @return the index of the object within the array starting at the index,
1588      *  {@link #INDEX_NOT_FOUND} (<code>-1</code>) if not found or <code>null</code> array input
1589      */
indexOf(Object[] array, Object objectToFind, int startIndex)1590     public static int indexOf(Object[] array, Object objectToFind, int startIndex) {
1591         if (array == null) {
1592             return INDEX_NOT_FOUND;
1593         }
1594         if (startIndex < 0) {
1595             startIndex = 0;
1596         }
1597         if (objectToFind == null) {
1598             for (int i = startIndex; i < array.length; i++) {
1599                 if (array[i] == null) {
1600                     return i;
1601                 }
1602             }
1603         } else if (array.getClass().getComponentType().isInstance(objectToFind)) {
1604             for (int i = startIndex; i < array.length; i++) {
1605                 if (objectToFind.equals(array[i])) {
1606                     return i;
1607                 }
1608             }
1609         }
1610         return INDEX_NOT_FOUND;
1611     }
1612 
1613     /**
1614      * <p>Finds the last index of the given object within the array.</p>
1615      *
1616      * <p>This method returns {@link #INDEX_NOT_FOUND} (<code>-1</code>) for a <code>null</code> input array.</p>
1617      *
1618      * @param array  the array to travers backwords looking for the object, may be <code>null</code>
1619      * @param objectToFind  the object to find, may be <code>null</code>
1620      * @return the last index of the object within the array,
1621      *  {@link #INDEX_NOT_FOUND} (<code>-1</code>) if not found or <code>null</code> array input
1622      */
lastIndexOf(Object[] array, Object objectToFind)1623     public static int lastIndexOf(Object[] array, Object objectToFind) {
1624         return lastIndexOf(array, objectToFind, Integer.MAX_VALUE);
1625     }
1626 
1627     /**
1628      * <p>Finds the last index of the given object in the array starting at the given index.</p>
1629      *
1630      * <p>This method returns {@link #INDEX_NOT_FOUND} (<code>-1</code>) for a <code>null</code> input array.</p>
1631      *
1632      * <p>A negative startIndex will return {@link #INDEX_NOT_FOUND} (<code>-1</code>). A startIndex larger than
1633      * the array length will search from the end of the array.</p>
1634      *
1635      * @param array  the array to traverse for looking for the object, may be <code>null</code>
1636      * @param objectToFind  the object to find, may be <code>null</code>
1637      * @param startIndex  the start index to travers backwards from
1638      * @return the last index of the object within the array,
1639      *  {@link #INDEX_NOT_FOUND} (<code>-1</code>) if not found or <code>null</code> array input
1640      */
lastIndexOf(Object[] array, Object objectToFind, int startIndex)1641     public static int lastIndexOf(Object[] array, Object objectToFind, int startIndex) {
1642         if (array == null) {
1643             return INDEX_NOT_FOUND;
1644         }
1645         if (startIndex < 0) {
1646             return INDEX_NOT_FOUND;
1647         } else if (startIndex >= array.length) {
1648             startIndex = array.length - 1;
1649         }
1650         if (objectToFind == null) {
1651             for (int i = startIndex; i >= 0; i--) {
1652                 if (array[i] == null) {
1653                     return i;
1654                 }
1655             }
1656         } else if (array.getClass().getComponentType().isInstance(objectToFind)) {
1657             for (int i = startIndex; i >= 0; i--) {
1658                 if (objectToFind.equals(array[i])) {
1659                     return i;
1660                 }
1661             }
1662         }
1663         return INDEX_NOT_FOUND;
1664     }
1665 
1666     /**
1667      * <p>Checks if the object is in the given array.</p>
1668      *
1669      * <p>The method returns <code>false</code> if a <code>null</code> array is passed in.</p>
1670      *
1671      * @param array  the array to search through
1672      * @param objectToFind  the object to find
1673      * @return <code>true</code> if the array contains the object
1674      */
contains(Object[] array, Object objectToFind)1675     public static boolean contains(Object[] array, Object objectToFind) {
1676         return indexOf(array, objectToFind) != INDEX_NOT_FOUND;
1677     }
1678 
1679     // long IndexOf
1680     //-----------------------------------------------------------------------
1681     /**
1682      * <p>Finds the index of the given value in the array.</p>
1683      *
1684      * <p>This method returns {@link #INDEX_NOT_FOUND} (<code>-1</code>) for a <code>null</code> input array.</p>
1685      *
1686      * @param array  the array to search through for the object, may be <code>null</code>
1687      * @param valueToFind  the value to find
1688      * @return the index of the value within the array,
1689      *  {@link #INDEX_NOT_FOUND} (<code>-1</code>) if not found or <code>null</code> array input
1690      */
indexOf(long[] array, long valueToFind)1691     public static int indexOf(long[] array, long valueToFind) {
1692         return indexOf(array, valueToFind, 0);
1693     }
1694 
1695     /**
1696      * <p>Finds the index of the given value in the array starting at the given index.</p>
1697      *
1698      * <p>This method returns {@link #INDEX_NOT_FOUND} (<code>-1</code>) for a <code>null</code> input array.</p>
1699      *
1700      * <p>A negative startIndex is treated as zero. A startIndex larger than the array
1701      * length will return {@link #INDEX_NOT_FOUND} (<code>-1</code>).</p>
1702      *
1703      * @param array  the array to search through for the object, may be <code>null</code>
1704      * @param valueToFind  the value to find
1705      * @param startIndex  the index to start searching at
1706      * @return the index of the value within the array,
1707      *  {@link #INDEX_NOT_FOUND} (<code>-1</code>) if not found or <code>null</code> array input
1708      */
indexOf(long[] array, long valueToFind, int startIndex)1709     public static int indexOf(long[] array, long valueToFind, int startIndex) {
1710         if (array == null) {
1711             return INDEX_NOT_FOUND;
1712         }
1713         if (startIndex < 0) {
1714             startIndex = 0;
1715         }
1716         for (int i = startIndex; i < array.length; i++) {
1717             if (valueToFind == array[i]) {
1718                 return i;
1719             }
1720         }
1721         return INDEX_NOT_FOUND;
1722     }
1723 
1724     /**
1725      * <p>Finds the last index of the given value within the array.</p>
1726      *
1727      * <p>This method returns {@link #INDEX_NOT_FOUND} (<code>-1</code>) for a <code>null</code> input array.</p>
1728      *
1729      * @param array  the array to travers backwords looking for the object, may be <code>null</code>
1730      * @param valueToFind  the object to find
1731      * @return the last index of the value within the array,
1732      *  {@link #INDEX_NOT_FOUND} (<code>-1</code>) if not found or <code>null</code> array input
1733      */
lastIndexOf(long[] array, long valueToFind)1734     public static int lastIndexOf(long[] array, long valueToFind) {
1735         return lastIndexOf(array, valueToFind, Integer.MAX_VALUE);
1736     }
1737 
1738     /**
1739      * <p>Finds the last index of the given value in the array starting at the given index.</p>
1740      *
1741      * <p>This method returns {@link #INDEX_NOT_FOUND} (<code>-1</code>) for a <code>null</code> input array.</p>
1742      *
1743      * <p>A negative startIndex will return {@link #INDEX_NOT_FOUND} (<code>-1</code>). A startIndex larger than the
1744      * array length will search from the end of the array.</p>
1745      *
1746      * @param array  the array to traverse for looking for the object, may be <code>null</code>
1747      * @param valueToFind  the value to find
1748      * @param startIndex  the start index to travers backwards from
1749      * @return the last index of the value within the array,
1750      *  {@link #INDEX_NOT_FOUND} (<code>-1</code>) if not found or <code>null</code> array input
1751      */
lastIndexOf(long[] array, long valueToFind, int startIndex)1752     public static int lastIndexOf(long[] array, long valueToFind, int startIndex) {
1753         if (array == null) {
1754             return INDEX_NOT_FOUND;
1755         }
1756         if (startIndex < 0) {
1757             return INDEX_NOT_FOUND;
1758         } else if (startIndex >= array.length) {
1759             startIndex = array.length - 1;
1760         }
1761         for (int i = startIndex; i >= 0; i--) {
1762             if (valueToFind == array[i]) {
1763                 return i;
1764             }
1765         }
1766         return INDEX_NOT_FOUND;
1767     }
1768 
1769     /**
1770      * <p>Checks if the value is in the given array.</p>
1771      *
1772      * <p>The method returns <code>false</code> if a <code>null</code> array is passed in.</p>
1773      *
1774      * @param array  the array to search through
1775      * @param valueToFind  the value to find
1776      * @return <code>true</code> if the array contains the object
1777      */
contains(long[] array, long valueToFind)1778     public static boolean contains(long[] array, long valueToFind) {
1779         return indexOf(array, valueToFind) != INDEX_NOT_FOUND;
1780     }
1781 
1782     // int IndexOf
1783     //-----------------------------------------------------------------------
1784     /**
1785      * <p>Finds the index of the given value in the array.</p>
1786      *
1787      * <p>This method returns {@link #INDEX_NOT_FOUND} (<code>-1</code>) for a <code>null</code> input array.</p>
1788      *
1789      * @param array  the array to search through for the object, may be <code>null</code>
1790      * @param valueToFind  the value to find
1791      * @return the index of the value within the array,
1792      *  {@link #INDEX_NOT_FOUND} (<code>-1</code>) if not found or <code>null</code> array input
1793      */
indexOf(int[] array, int valueToFind)1794     public static int indexOf(int[] array, int valueToFind) {
1795         return indexOf(array, valueToFind, 0);
1796     }
1797 
1798     /**
1799      * <p>Finds the index of the given value in the array starting at the given index.</p>
1800      *
1801      * <p>This method returns {@link #INDEX_NOT_FOUND} (<code>-1</code>) for a <code>null</code> input array.</p>
1802      *
1803      * <p>A negative startIndex is treated as zero. A startIndex larger than the array
1804      * length will return {@link #INDEX_NOT_FOUND} (<code>-1</code>).</p>
1805      *
1806      * @param array  the array to search through for the object, may be <code>null</code>
1807      * @param valueToFind  the value to find
1808      * @param startIndex  the index to start searching at
1809      * @return the index of the value within the array,
1810      *  {@link #INDEX_NOT_FOUND} (<code>-1</code>) if not found or <code>null</code> array input
1811      */
indexOf(int[] array, int valueToFind, int startIndex)1812     public static int indexOf(int[] array, int valueToFind, int startIndex) {
1813         if (array == null) {
1814             return INDEX_NOT_FOUND;
1815         }
1816         if (startIndex < 0) {
1817             startIndex = 0;
1818         }
1819         for (int i = startIndex; i < array.length; i++) {
1820             if (valueToFind == array[i]) {
1821                 return i;
1822             }
1823         }
1824         return INDEX_NOT_FOUND;
1825     }
1826 
1827     /**
1828      * <p>Finds the last index of the given value within the array.</p>
1829      *
1830      * <p>This method returns {@link #INDEX_NOT_FOUND} (<code>-1</code>) for a <code>null</code> input array.</p>
1831      *
1832      * @param array  the array to travers backwords looking for the object, may be <code>null</code>
1833      * @param valueToFind  the object to find
1834      * @return the last index of the value within the array,
1835      *  {@link #INDEX_NOT_FOUND} (<code>-1</code>) if not found or <code>null</code> array input
1836      */
lastIndexOf(int[] array, int valueToFind)1837     public static int lastIndexOf(int[] array, int valueToFind) {
1838         return lastIndexOf(array, valueToFind, Integer.MAX_VALUE);
1839     }
1840 
1841     /**
1842      * <p>Finds the last index of the given value in the array starting at the given index.</p>
1843      *
1844      * <p>This method returns {@link #INDEX_NOT_FOUND} (<code>-1</code>) for a <code>null</code> input array.</p>
1845      *
1846      * <p>A negative startIndex will return {@link #INDEX_NOT_FOUND} (<code>-1</code>). A startIndex larger than the
1847      * array length will search from the end of the array.</p>
1848      *
1849      * @param array  the array to traverse for looking for the object, may be <code>null</code>
1850      * @param valueToFind  the value to find
1851      * @param startIndex  the start index to travers backwards from
1852      * @return the last index of the value within the array,
1853      *  {@link #INDEX_NOT_FOUND} (<code>-1</code>) if not found or <code>null</code> array input
1854      */
lastIndexOf(int[] array, int valueToFind, int startIndex)1855     public static int lastIndexOf(int[] array, int valueToFind, int startIndex) {
1856         if (array == null) {
1857             return INDEX_NOT_FOUND;
1858         }
1859         if (startIndex < 0) {
1860             return INDEX_NOT_FOUND;
1861         } else if (startIndex >= array.length) {
1862             startIndex = array.length - 1;
1863         }
1864         for (int i = startIndex; i >= 0; i--) {
1865             if (valueToFind == array[i]) {
1866                 return i;
1867             }
1868         }
1869         return INDEX_NOT_FOUND;
1870     }
1871 
1872     /**
1873      * <p>Checks if the value is in the given array.</p>
1874      *
1875      * <p>The method returns <code>false</code> if a <code>null</code> array is passed in.</p>
1876      *
1877      * @param array  the array to search through
1878      * @param valueToFind  the value to find
1879      * @return <code>true</code> if the array contains the object
1880      */
contains(int[] array, int valueToFind)1881     public static boolean contains(int[] array, int valueToFind) {
1882         return indexOf(array, valueToFind) != INDEX_NOT_FOUND;
1883     }
1884 
1885     // short IndexOf
1886     //-----------------------------------------------------------------------
1887     /**
1888      * <p>Finds the index of the given value in the array.</p>
1889      *
1890      * <p>This method returns {@link #INDEX_NOT_FOUND} (<code>-1</code>) for a <code>null</code> input array.</p>
1891      *
1892      * @param array  the array to search through for the object, may be <code>null</code>
1893      * @param valueToFind  the value to find
1894      * @return the index of the value within the array,
1895      *  {@link #INDEX_NOT_FOUND} (<code>-1</code>) if not found or <code>null</code> array input
1896      */
indexOf(short[] array, short valueToFind)1897     public static int indexOf(short[] array, short valueToFind) {
1898         return indexOf(array, valueToFind, 0);
1899     }
1900 
1901     /**
1902      * <p>Finds the index of the given value in the array starting at the given index.</p>
1903      *
1904      * <p>This method returns {@link #INDEX_NOT_FOUND} (<code>-1</code>) for a <code>null</code> input array.</p>
1905      *
1906      * <p>A negative startIndex is treated as zero. A startIndex larger than the array
1907      * length will return {@link #INDEX_NOT_FOUND} (<code>-1</code>).</p>
1908      *
1909      * @param array  the array to search through for the object, may be <code>null</code>
1910      * @param valueToFind  the value to find
1911      * @param startIndex  the index to start searching at
1912      * @return the index of the value within the array,
1913      *  {@link #INDEX_NOT_FOUND} (<code>-1</code>) if not found or <code>null</code> array input
1914      */
indexOf(short[] array, short valueToFind, int startIndex)1915     public static int indexOf(short[] array, short valueToFind, int startIndex) {
1916         if (array == null) {
1917             return INDEX_NOT_FOUND;
1918         }
1919         if (startIndex < 0) {
1920             startIndex = 0;
1921         }
1922         for (int i = startIndex; i < array.length; i++) {
1923             if (valueToFind == array[i]) {
1924                 return i;
1925             }
1926         }
1927         return INDEX_NOT_FOUND;
1928     }
1929 
1930     /**
1931      * <p>Finds the last index of the given value within the array.</p>
1932      *
1933      * <p>This method returns {@link #INDEX_NOT_FOUND} (<code>-1</code>) for a <code>null</code> input array.</p>
1934      *
1935      * @param array  the array to travers backwords looking for the object, may be <code>null</code>
1936      * @param valueToFind  the object to find
1937      * @return the last index of the value within the array,
1938      *  {@link #INDEX_NOT_FOUND} (<code>-1</code>) if not found or <code>null</code> array input
1939      */
lastIndexOf(short[] array, short valueToFind)1940     public static int lastIndexOf(short[] array, short valueToFind) {
1941         return lastIndexOf(array, valueToFind, Integer.MAX_VALUE);
1942     }
1943 
1944     /**
1945      * <p>Finds the last index of the given value in the array starting at the given index.</p>
1946      *
1947      * <p>This method returns {@link #INDEX_NOT_FOUND} (<code>-1</code>) for a <code>null</code> input array.</p>
1948      *
1949      * <p>A negative startIndex will return {@link #INDEX_NOT_FOUND} (<code>-1</code>). A startIndex larger than the
1950      * array length will search from the end of the array.</p>
1951      *
1952      * @param array  the array to traverse for looking for the object, may be <code>null</code>
1953      * @param valueToFind  the value to find
1954      * @param startIndex  the start index to travers backwards from
1955      * @return the last index of the value within the array,
1956      *  {@link #INDEX_NOT_FOUND} (<code>-1</code>) if not found or <code>null</code> array input
1957      */
lastIndexOf(short[] array, short valueToFind, int startIndex)1958     public static int lastIndexOf(short[] array, short valueToFind, int startIndex) {
1959         if (array == null) {
1960             return INDEX_NOT_FOUND;
1961         }
1962         if (startIndex < 0) {
1963             return INDEX_NOT_FOUND;
1964         } else if (startIndex >= array.length) {
1965             startIndex = array.length - 1;
1966         }
1967         for (int i = startIndex; i >= 0; i--) {
1968             if (valueToFind == array[i]) {
1969                 return i;
1970             }
1971         }
1972         return INDEX_NOT_FOUND;
1973     }
1974 
1975     /**
1976      * <p>Checks if the value is in the given array.</p>
1977      *
1978      * <p>The method returns <code>false</code> if a <code>null</code> array is passed in.</p>
1979      *
1980      * @param array  the array to search through
1981      * @param valueToFind  the value to find
1982      * @return <code>true</code> if the array contains the object
1983      */
contains(short[] array, short valueToFind)1984     public static boolean contains(short[] array, short valueToFind) {
1985         return indexOf(array, valueToFind) != INDEX_NOT_FOUND;
1986     }
1987 
1988     // char IndexOf
1989     //-----------------------------------------------------------------------
1990     /**
1991      * <p>Finds the index of the given value in the array.</p>
1992      *
1993      * <p>This method returns {@link #INDEX_NOT_FOUND} (<code>-1</code>) for a <code>null</code> input array.</p>
1994      *
1995      * @param array  the array to search through for the object, may be <code>null</code>
1996      * @param valueToFind  the value to find
1997      * @return the index of the value within the array,
1998      *  {@link #INDEX_NOT_FOUND} (<code>-1</code>) if not found or <code>null</code> array input
1999      * @since 2.1
2000      */
indexOf(char[] array, char valueToFind)2001     public static int indexOf(char[] array, char valueToFind) {
2002         return indexOf(array, valueToFind, 0);
2003     }
2004 
2005     /**
2006      * <p>Finds the index of the given value in the array starting at the given index.</p>
2007      *
2008      * <p>This method returns {@link #INDEX_NOT_FOUND} (<code>-1</code>) for a <code>null</code> input array.</p>
2009      *
2010      * <p>A negative startIndex is treated as zero. A startIndex larger than the array
2011      * length will return {@link #INDEX_NOT_FOUND} (<code>-1</code>).</p>
2012      *
2013      * @param array  the array to search through for the object, may be <code>null</code>
2014      * @param valueToFind  the value to find
2015      * @param startIndex  the index to start searching at
2016      * @return the index of the value within the array,
2017      *  {@link #INDEX_NOT_FOUND} (<code>-1</code>) if not found or <code>null</code> array input
2018      * @since 2.1
2019      */
indexOf(char[] array, char valueToFind, int startIndex)2020     public static int indexOf(char[] array, char valueToFind, int startIndex) {
2021         if (array == null) {
2022             return INDEX_NOT_FOUND;
2023         }
2024         if (startIndex < 0) {
2025             startIndex = 0;
2026         }
2027         for (int i = startIndex; i < array.length; i++) {
2028             if (valueToFind == array[i]) {
2029                 return i;
2030             }
2031         }
2032         return INDEX_NOT_FOUND;
2033     }
2034 
2035     /**
2036      * <p>Finds the last index of the given value within the array.</p>
2037      *
2038      * <p>This method returns {@link #INDEX_NOT_FOUND} (<code>-1</code>) for a <code>null</code> input array.</p>
2039      *
2040      * @param array  the array to travers backwords looking for the object, may be <code>null</code>
2041      * @param valueToFind  the object to find
2042      * @return the last index of the value within the array,
2043      *  {@link #INDEX_NOT_FOUND} (<code>-1</code>) if not found or <code>null</code> array input
2044      * @since 2.1
2045      */
lastIndexOf(char[] array, char valueToFind)2046     public static int lastIndexOf(char[] array, char valueToFind) {
2047         return lastIndexOf(array, valueToFind, Integer.MAX_VALUE);
2048     }
2049 
2050     /**
2051      * <p>Finds the last index of the given value in the array starting at the given index.</p>
2052      *
2053      * <p>This method returns {@link #INDEX_NOT_FOUND} (<code>-1</code>) for a <code>null</code> input array.</p>
2054      *
2055      * <p>A negative startIndex will return {@link #INDEX_NOT_FOUND} (<code>-1</code>). A startIndex larger than the
2056      * array length will search from the end of the array.</p>
2057      *
2058      * @param array  the array to traverse for looking for the object, may be <code>null</code>
2059      * @param valueToFind  the value to find
2060      * @param startIndex  the start index to travers backwards from
2061      * @return the last index of the value within the array,
2062      *  {@link #INDEX_NOT_FOUND} (<code>-1</code>) if not found or <code>null</code> array input
2063      * @since 2.1
2064      */
lastIndexOf(char[] array, char valueToFind, int startIndex)2065     public static int lastIndexOf(char[] array, char valueToFind, int startIndex) {
2066         if (array == null) {
2067             return INDEX_NOT_FOUND;
2068         }
2069         if (startIndex < 0) {
2070             return INDEX_NOT_FOUND;
2071         } else if (startIndex >= array.length) {
2072             startIndex = array.length - 1;
2073         }
2074         for (int i = startIndex; i >= 0; i--) {
2075             if (valueToFind == array[i]) {
2076                 return i;
2077             }
2078         }
2079         return INDEX_NOT_FOUND;
2080     }
2081 
2082     /**
2083      * <p>Checks if the value is in the given array.</p>
2084      *
2085      * <p>The method returns <code>false</code> if a <code>null</code> array is passed in.</p>
2086      *
2087      * @param array  the array to search through
2088      * @param valueToFind  the value to find
2089      * @return <code>true</code> if the array contains the object
2090      * @since 2.1
2091      */
contains(char[] array, char valueToFind)2092     public static boolean contains(char[] array, char valueToFind) {
2093         return indexOf(array, valueToFind) != INDEX_NOT_FOUND;
2094     }
2095 
2096     // byte IndexOf
2097     //-----------------------------------------------------------------------
2098     /**
2099      * <p>Finds the index of the given value in the array.</p>
2100      *
2101      * <p>This method returns {@link #INDEX_NOT_FOUND} (<code>-1</code>) for a <code>null</code> input array.</p>
2102      *
2103      * @param array  the array to search through for the object, may be <code>null</code>
2104      * @param valueToFind  the value to find
2105      * @return the index of the value within the array,
2106      *  {@link #INDEX_NOT_FOUND} (<code>-1</code>) if not found or <code>null</code> array input
2107      */
indexOf(byte[] array, byte valueToFind)2108     public static int indexOf(byte[] array, byte valueToFind) {
2109         return indexOf(array, valueToFind, 0);
2110     }
2111 
2112     /**
2113      * <p>Finds the index of the given value in the array starting at the given index.</p>
2114      *
2115      * <p>This method returns {@link #INDEX_NOT_FOUND} (<code>-1</code>) for a <code>null</code> input array.</p>
2116      *
2117      * <p>A negative startIndex is treated as zero. A startIndex larger than the array
2118      * length will return {@link #INDEX_NOT_FOUND} (<code>-1</code>).</p>
2119      *
2120      * @param array  the array to search through for the object, may be <code>null</code>
2121      * @param valueToFind  the value to find
2122      * @param startIndex  the index to start searching at
2123      * @return the index of the value within the array,
2124      *  {@link #INDEX_NOT_FOUND} (<code>-1</code>) if not found or <code>null</code> array input
2125      */
indexOf(byte[] array, byte valueToFind, int startIndex)2126     public static int indexOf(byte[] array, byte valueToFind, int startIndex) {
2127         if (array == null) {
2128             return INDEX_NOT_FOUND;
2129         }
2130         if (startIndex < 0) {
2131             startIndex = 0;
2132         }
2133         for (int i = startIndex; i < array.length; i++) {
2134             if (valueToFind == array[i]) {
2135                 return i;
2136             }
2137         }
2138         return INDEX_NOT_FOUND;
2139     }
2140 
2141     /**
2142      * <p>Finds the last index of the given value within the array.</p>
2143      *
2144      * <p>This method returns {@link #INDEX_NOT_FOUND} (<code>-1</code>) for a <code>null</code> input array.</p>
2145      *
2146      * @param array  the array to travers backwords looking for the object, may be <code>null</code>
2147      * @param valueToFind  the object to find
2148      * @return the last index of the value within the array,
2149      *  {@link #INDEX_NOT_FOUND} (<code>-1</code>) if not found or <code>null</code> array input
2150      */
lastIndexOf(byte[] array, byte valueToFind)2151     public static int lastIndexOf(byte[] array, byte valueToFind) {
2152         return lastIndexOf(array, valueToFind, Integer.MAX_VALUE);
2153     }
2154 
2155     /**
2156      * <p>Finds the last index of the given value in the array starting at the given index.</p>
2157      *
2158      * <p>This method returns {@link #INDEX_NOT_FOUND} (<code>-1</code>) for a <code>null</code> input array.</p>
2159      *
2160      * <p>A negative startIndex will return {@link #INDEX_NOT_FOUND} (<code>-1</code>). A startIndex larger than the
2161      * array length will search from the end of the array.</p>
2162      *
2163      * @param array  the array to traverse for looking for the object, may be <code>null</code>
2164      * @param valueToFind  the value to find
2165      * @param startIndex  the start index to travers backwards from
2166      * @return the last index of the value within the array,
2167      *  {@link #INDEX_NOT_FOUND} (<code>-1</code>) if not found or <code>null</code> array input
2168      */
lastIndexOf(byte[] array, byte valueToFind, int startIndex)2169     public static int lastIndexOf(byte[] array, byte valueToFind, int startIndex) {
2170         if (array == null) {
2171             return INDEX_NOT_FOUND;
2172         }
2173         if (startIndex < 0) {
2174             return INDEX_NOT_FOUND;
2175         } else if (startIndex >= array.length) {
2176             startIndex = array.length - 1;
2177         }
2178         for (int i = startIndex; i >= 0; i--) {
2179             if (valueToFind == array[i]) {
2180                 return i;
2181             }
2182         }
2183         return INDEX_NOT_FOUND;
2184     }
2185 
2186     /**
2187      * <p>Checks if the value is in the given array.</p>
2188      *
2189      * <p>The method returns <code>false</code> if a <code>null</code> array is passed in.</p>
2190      *
2191      * @param array  the array to search through
2192      * @param valueToFind  the value to find
2193      * @return <code>true</code> if the array contains the object
2194      */
contains(byte[] array, byte valueToFind)2195     public static boolean contains(byte[] array, byte valueToFind) {
2196         return indexOf(array, valueToFind) != INDEX_NOT_FOUND;
2197     }
2198 
2199     // double IndexOf
2200     //-----------------------------------------------------------------------
2201     /**
2202      * <p>Finds the index of the given value in the array.</p>
2203      *
2204      * <p>This method returns {@link #INDEX_NOT_FOUND} (<code>-1</code>) for a <code>null</code> input array.</p>
2205      *
2206      * @param array  the array to search through for the object, may be <code>null</code>
2207      * @param valueToFind  the value to find
2208      * @return the index of the value within the array,
2209      *  {@link #INDEX_NOT_FOUND} (<code>-1</code>) if not found or <code>null</code> array input
2210      */
indexOf(double[] array, double valueToFind)2211     public static int indexOf(double[] array, double valueToFind) {
2212         return indexOf(array, valueToFind, 0);
2213     }
2214 
2215     /**
2216      * <p>Finds the index of the given value within a given tolerance in the array.
2217      * This method will return the index of the first value which falls between the region
2218      * defined by valueToFind - tolerance and valueToFind + tolerance.</p>
2219      *
2220      * <p>This method returns {@link #INDEX_NOT_FOUND} (<code>-1</code>) for a <code>null</code> input array.</p>
2221      *
2222      * @param array  the array to search through for the object, may be <code>null</code>
2223      * @param valueToFind  the value to find
2224      * @param tolerance tolerance of the search
2225      * @return the index of the value within the array,
2226      *  {@link #INDEX_NOT_FOUND} (<code>-1</code>) if not found or <code>null</code> array input
2227      */
indexOf(double[] array, double valueToFind, double tolerance)2228     public static int indexOf(double[] array, double valueToFind, double tolerance) {
2229         return indexOf(array, valueToFind, 0, tolerance);
2230     }
2231 
2232     /**
2233      * <p>Finds the index of the given value in the array starting at the given index.</p>
2234      *
2235      * <p>This method returns {@link #INDEX_NOT_FOUND} (<code>-1</code>) for a <code>null</code> input array.</p>
2236      *
2237      * <p>A negative startIndex is treated as zero. A startIndex larger than the array
2238      * length will return {@link #INDEX_NOT_FOUND} (<code>-1</code>).</p>
2239      *
2240      * @param array  the array to search through for the object, may be <code>null</code>
2241      * @param valueToFind  the value to find
2242      * @param startIndex  the index to start searching at
2243      * @return the index of the value within the array,
2244      *  {@link #INDEX_NOT_FOUND} (<code>-1</code>) if not found or <code>null</code> array input
2245      */
indexOf(double[] array, double valueToFind, int startIndex)2246     public static int indexOf(double[] array, double valueToFind, int startIndex) {
2247         if (ArrayUtils.isEmpty(array)) {
2248             return INDEX_NOT_FOUND;
2249         }
2250         if (startIndex < 0) {
2251             startIndex = 0;
2252         }
2253         for (int i = startIndex; i < array.length; i++) {
2254             if (valueToFind == array[i]) {
2255                 return i;
2256             }
2257         }
2258         return INDEX_NOT_FOUND;
2259     }
2260 
2261     /**
2262      * <p>Finds the index of the given value in the array starting at the given index.
2263      * This method will return the index of the first value which falls between the region
2264      * defined by valueToFind - tolerance and valueToFind + tolerance.</p>
2265      *
2266      * <p>This method returns {@link #INDEX_NOT_FOUND} (<code>-1</code>) for a <code>null</code> input array.</p>
2267      *
2268      * <p>A negative startIndex is treated as zero. A startIndex larger than the array
2269      * length will return {@link #INDEX_NOT_FOUND} (<code>-1</code>).</p>
2270      *
2271      * @param array  the array to search through for the object, may be <code>null</code>
2272      * @param valueToFind  the value to find
2273      * @param startIndex  the index to start searching at
2274      * @param tolerance tolerance of the search
2275      * @return the index of the value within the array,
2276      *  {@link #INDEX_NOT_FOUND} (<code>-1</code>) if not found or <code>null</code> array input
2277      */
indexOf(double[] array, double valueToFind, int startIndex, double tolerance)2278     public static int indexOf(double[] array, double valueToFind, int startIndex, double tolerance) {
2279         if (ArrayUtils.isEmpty(array)) {
2280             return INDEX_NOT_FOUND;
2281         }
2282         if (startIndex < 0) {
2283             startIndex = 0;
2284         }
2285         double min = valueToFind - tolerance;
2286         double max = valueToFind + tolerance;
2287         for (int i = startIndex; i < array.length; i++) {
2288             if (array[i] >= min && array[i] <= max) {
2289                 return i;
2290             }
2291         }
2292         return INDEX_NOT_FOUND;
2293     }
2294 
2295     /**
2296      * <p>Finds the last index of the given value within the array.</p>
2297      *
2298      * <p>This method returns {@link #INDEX_NOT_FOUND} (<code>-1</code>) for a <code>null</code> input array.</p>
2299      *
2300      * @param array  the array to travers backwords looking for the object, may be <code>null</code>
2301      * @param valueToFind  the object to find
2302      * @return the last index of the value within the array,
2303      *  {@link #INDEX_NOT_FOUND} (<code>-1</code>) if not found or <code>null</code> array input
2304      */
lastIndexOf(double[] array, double valueToFind)2305     public static int lastIndexOf(double[] array, double valueToFind) {
2306         return lastIndexOf(array, valueToFind, Integer.MAX_VALUE);
2307     }
2308 
2309     /**
2310      * <p>Finds the last index of the given value within a given tolerance in the array.
2311      * This method will return the index of the last value which falls between the region
2312      * defined by valueToFind - tolerance and valueToFind + tolerance.</p>
2313      *
2314      * <p>This method returns {@link #INDEX_NOT_FOUND} (<code>-1</code>) for a <code>null</code> input array.</p>
2315      *
2316      * @param array  the array to search through for the object, may be <code>null</code>
2317      * @param valueToFind  the value to find
2318      * @param tolerance tolerance of the search
2319      * @return the index of the value within the array,
2320      *  {@link #INDEX_NOT_FOUND} (<code>-1</code>) if not found or <code>null</code> array input
2321      */
lastIndexOf(double[] array, double valueToFind, double tolerance)2322     public static int lastIndexOf(double[] array, double valueToFind, double tolerance) {
2323         return lastIndexOf(array, valueToFind, Integer.MAX_VALUE, tolerance);
2324     }
2325 
2326     /**
2327      * <p>Finds the last index of the given value in the array starting at the given index.</p>
2328      *
2329      * <p>This method returns {@link #INDEX_NOT_FOUND} (<code>-1</code>) for a <code>null</code> input array.</p>
2330      *
2331      * <p>A negative startIndex will return {@link #INDEX_NOT_FOUND} (<code>-1</code>). A startIndex larger than the
2332      * array length will search from the end of the array.</p>
2333      *
2334      * @param array  the array to traverse for looking for the object, may be <code>null</code>
2335      * @param valueToFind  the value to find
2336      * @param startIndex  the start index to travers backwards from
2337      * @return the last index of the value within the array,
2338      *  {@link #INDEX_NOT_FOUND} (<code>-1</code>) if not found or <code>null</code> array input
2339      */
lastIndexOf(double[] array, double valueToFind, int startIndex)2340     public static int lastIndexOf(double[] array, double valueToFind, int startIndex) {
2341         if (ArrayUtils.isEmpty(array)) {
2342             return INDEX_NOT_FOUND;
2343         }
2344         if (startIndex < 0) {
2345             return INDEX_NOT_FOUND;
2346         } else if (startIndex >= array.length) {
2347             startIndex = array.length - 1;
2348         }
2349         for (int i = startIndex; i >= 0; i--) {
2350             if (valueToFind == array[i]) {
2351                 return i;
2352             }
2353         }
2354         return INDEX_NOT_FOUND;
2355     }
2356 
2357     /**
2358      * <p>Finds the last index of the given value in the array starting at the given index.
2359      * This method will return the index of the last value which falls between the region
2360      * defined by valueToFind - tolerance and valueToFind + tolerance.</p>
2361      *
2362      * <p>This method returns {@link #INDEX_NOT_FOUND} (<code>-1</code>) for a <code>null</code> input array.</p>
2363      *
2364      * <p>A negative startIndex will return {@link #INDEX_NOT_FOUND} (<code>-1</code>). A startIndex larger than the
2365      * array length will search from the end of the array.</p>
2366      *
2367      * @param array  the array to traverse for looking for the object, may be <code>null</code>
2368      * @param valueToFind  the value to find
2369      * @param startIndex  the start index to travers backwards from
2370      * @param tolerance  search for value within plus/minus this amount
2371      * @return the last index of the value within the array,
2372      *  {@link #INDEX_NOT_FOUND} (<code>-1</code>) if not found or <code>null</code> array input
2373      */
lastIndexOf(double[] array, double valueToFind, int startIndex, double tolerance)2374     public static int lastIndexOf(double[] array, double valueToFind, int startIndex, double tolerance) {
2375         if (ArrayUtils.isEmpty(array)) {
2376             return INDEX_NOT_FOUND;
2377         }
2378         if (startIndex < 0) {
2379             return INDEX_NOT_FOUND;
2380         } else if (startIndex >= array.length) {
2381             startIndex = array.length - 1;
2382         }
2383         double min = valueToFind - tolerance;
2384         double max = valueToFind + tolerance;
2385         for (int i = startIndex; i >= 0; i--) {
2386             if (array[i] >= min && array[i] <= max) {
2387                 return i;
2388             }
2389         }
2390         return INDEX_NOT_FOUND;
2391     }
2392 
2393     /**
2394      * <p>Checks if the value is in the given array.</p>
2395      *
2396      * <p>The method returns <code>false</code> if a <code>null</code> array is passed in.</p>
2397      *
2398      * @param array  the array to search through
2399      * @param valueToFind  the value to find
2400      * @return <code>true</code> if the array contains the object
2401      */
contains(double[] array, double valueToFind)2402     public static boolean contains(double[] array, double valueToFind) {
2403         return indexOf(array, valueToFind) != INDEX_NOT_FOUND;
2404     }
2405 
2406     /**
2407      * <p>Checks if a value falling within the given tolerance is in the
2408      * given array.  If the array contains a value within the inclusive range
2409      * defined by (value - tolerance) to (value + tolerance).</p>
2410      *
2411      * <p>The method returns <code>false</code> if a <code>null</code> array
2412      * is passed in.</p>
2413      *
2414      * @param array  the array to search
2415      * @param valueToFind  the value to find
2416      * @param tolerance  the array contains the tolerance of the search
2417      * @return true if value falling within tolerance is in array
2418      */
contains(double[] array, double valueToFind, double tolerance)2419     public static boolean contains(double[] array, double valueToFind, double tolerance) {
2420         return indexOf(array, valueToFind, 0, tolerance) != INDEX_NOT_FOUND;
2421     }
2422 
2423     // float IndexOf
2424     //-----------------------------------------------------------------------
2425     /**
2426      * <p>Finds the index of the given value in the array.</p>
2427      *
2428      * <p>This method returns {@link #INDEX_NOT_FOUND} (<code>-1</code>) for a <code>null</code> input array.</p>
2429      *
2430      * @param array  the array to search through for the object, may be <code>null</code>
2431      * @param valueToFind  the value to find
2432      * @return the index of the value within the array,
2433      *  {@link #INDEX_NOT_FOUND} (<code>-1</code>) if not found or <code>null</code> array input
2434      */
indexOf(float[] array, float valueToFind)2435     public static int indexOf(float[] array, float valueToFind) {
2436         return indexOf(array, valueToFind, 0);
2437     }
2438 
2439     /**
2440      * <p>Finds the index of the given value in the array starting at the given index.</p>
2441      *
2442      * <p>This method returns {@link #INDEX_NOT_FOUND} (<code>-1</code>) for a <code>null</code> input array.</p>
2443      *
2444      * <p>A negative startIndex is treated as zero. A startIndex larger than the array
2445      * length will return {@link #INDEX_NOT_FOUND} (<code>-1</code>).</p>
2446      *
2447      * @param array  the array to search through for the object, may be <code>null</code>
2448      * @param valueToFind  the value to find
2449      * @param startIndex  the index to start searching at
2450      * @return the index of the value within the array,
2451      *  {@link #INDEX_NOT_FOUND} (<code>-1</code>) if not found or <code>null</code> array input
2452      */
indexOf(float[] array, float valueToFind, int startIndex)2453     public static int indexOf(float[] array, float valueToFind, int startIndex) {
2454         if (ArrayUtils.isEmpty(array)) {
2455             return INDEX_NOT_FOUND;
2456         }
2457         if (startIndex < 0) {
2458             startIndex = 0;
2459         }
2460         for (int i = startIndex; i < array.length; i++) {
2461             if (valueToFind == array[i]) {
2462                 return i;
2463             }
2464         }
2465         return INDEX_NOT_FOUND;
2466     }
2467 
2468     /**
2469      * <p>Finds the last index of the given value within the array.</p>
2470      *
2471      * <p>This method returns {@link #INDEX_NOT_FOUND} (<code>-1</code>) for a <code>null</code> input array.</p>
2472      *
2473      * @param array  the array to travers backwords looking for the object, may be <code>null</code>
2474      * @param valueToFind  the object to find
2475      * @return the last index of the value within the array,
2476      *  {@link #INDEX_NOT_FOUND} (<code>-1</code>) if not found or <code>null</code> array input
2477      */
lastIndexOf(float[] array, float valueToFind)2478     public static int lastIndexOf(float[] array, float valueToFind) {
2479         return lastIndexOf(array, valueToFind, Integer.MAX_VALUE);
2480     }
2481 
2482     /**
2483      * <p>Finds the last index of the given value in the array starting at the given index.</p>
2484      *
2485      * <p>This method returns {@link #INDEX_NOT_FOUND} (<code>-1</code>) for a <code>null</code> input array.</p>
2486      *
2487      * <p>A negative startIndex will return {@link #INDEX_NOT_FOUND} (<code>-1</code>). A startIndex larger than the
2488      * array length will search from the end of the array.</p>
2489      *
2490      * @param array  the array to traverse for looking for the object, may be <code>null</code>
2491      * @param valueToFind  the value to find
2492      * @param startIndex  the start index to travers backwards from
2493      * @return the last index of the value within the array,
2494      *  {@link #INDEX_NOT_FOUND} (<code>-1</code>) if not found or <code>null</code> array input
2495      */
lastIndexOf(float[] array, float valueToFind, int startIndex)2496     public static int lastIndexOf(float[] array, float valueToFind, int startIndex) {
2497         if (ArrayUtils.isEmpty(array)) {
2498             return INDEX_NOT_FOUND;
2499         }
2500         if (startIndex < 0) {
2501             return INDEX_NOT_FOUND;
2502         } else if (startIndex >= array.length) {
2503             startIndex = array.length - 1;
2504         }
2505         for (int i = startIndex; i >= 0; i--) {
2506             if (valueToFind == array[i]) {
2507                 return i;
2508             }
2509         }
2510         return INDEX_NOT_FOUND;
2511     }
2512 
2513     /**
2514      * <p>Checks if the value is in the given array.</p>
2515      *
2516      * <p>The method returns <code>false</code> if a <code>null</code> array is passed in.</p>
2517      *
2518      * @param array  the array to search through
2519      * @param valueToFind  the value to find
2520      * @return <code>true</code> if the array contains the object
2521      */
contains(float[] array, float valueToFind)2522     public static boolean contains(float[] array, float valueToFind) {
2523         return indexOf(array, valueToFind) != INDEX_NOT_FOUND;
2524     }
2525 
2526     // boolean IndexOf
2527     //-----------------------------------------------------------------------
2528     /**
2529      * <p>Finds the index of the given value in the array.</p>
2530      *
2531      * <p>This method returns {@link #INDEX_NOT_FOUND} (<code>-1</code>) for a <code>null</code> input array.</p>
2532      *
2533      * @param array  the array to search through for the object, may be <code>null</code>
2534      * @param valueToFind  the value to find
2535      * @return the index of the value within the array,
2536      *  {@link #INDEX_NOT_FOUND} (<code>-1</code>) if not found or <code>null</code> array input
2537      */
indexOf(boolean[] array, boolean valueToFind)2538     public static int indexOf(boolean[] array, boolean valueToFind) {
2539         return indexOf(array, valueToFind, 0);
2540     }
2541 
2542     /**
2543      * <p>Finds the index of the given value in the array starting at the given index.</p>
2544      *
2545      * <p>This method returns {@link #INDEX_NOT_FOUND} (<code>-1</code>) for a <code>null</code> input array.</p>
2546      *
2547      * <p>A negative startIndex is treated as zero. A startIndex larger than the array
2548      * length will return {@link #INDEX_NOT_FOUND} (<code>-1</code>).</p>
2549      *
2550      * @param array  the array to search through for the object, may be <code>null</code>
2551      * @param valueToFind  the value to find
2552      * @param startIndex  the index to start searching at
2553      * @return the index of the value within the array,
2554      *  {@link #INDEX_NOT_FOUND} (<code>-1</code>) if not found or <code>null</code>
2555      *  array input
2556      */
indexOf(boolean[] array, boolean valueToFind, int startIndex)2557     public static int indexOf(boolean[] array, boolean valueToFind, int startIndex) {
2558         if (ArrayUtils.isEmpty(array)) {
2559             return INDEX_NOT_FOUND;
2560         }
2561         if (startIndex < 0) {
2562             startIndex = 0;
2563         }
2564         for (int i = startIndex; i < array.length; i++) {
2565             if (valueToFind == array[i]) {
2566                 return i;
2567             }
2568         }
2569         return INDEX_NOT_FOUND;
2570     }
2571 
2572     /**
2573      * <p>Finds the last index of the given value within the array.</p>
2574      *
2575      * <p>This method returns {@link #INDEX_NOT_FOUND} (<code>-1</code>) if
2576      * <code>null</code> array input.</p>
2577      *
2578      * @param array  the array to travers backwords looking for the object, may be <code>null</code>
2579      * @param valueToFind  the object to find
2580      * @return the last index of the value within the array,
2581      *  {@link #INDEX_NOT_FOUND} (<code>-1</code>) if not found or <code>null</code> array input
2582      */
lastIndexOf(boolean[] array, boolean valueToFind)2583     public static int lastIndexOf(boolean[] array, boolean valueToFind) {
2584         return lastIndexOf(array, valueToFind, Integer.MAX_VALUE);
2585     }
2586 
2587     /**
2588      * <p>Finds the last index of the given value in the array starting at the given index.</p>
2589      *
2590      * <p>This method returns {@link #INDEX_NOT_FOUND} (<code>-1</code>) for a <code>null</code> input array.</p>
2591      *
2592      * <p>A negative startIndex will return {@link #INDEX_NOT_FOUND} (<code>-1</code>). A startIndex larger than
2593      * the array length will search from the end of the array.</p>
2594      *
2595      * @param array  the array to traverse for looking for the object, may be <code>null</code>
2596      * @param valueToFind  the value to find
2597      * @param startIndex  the start index to travers backwards from
2598      * @return the last index of the value within the array,
2599      *  {@link #INDEX_NOT_FOUND} (<code>-1</code>) if not found or <code>null</code> array input
2600      */
lastIndexOf(boolean[] array, boolean valueToFind, int startIndex)2601     public static int lastIndexOf(boolean[] array, boolean valueToFind, int startIndex) {
2602         if (ArrayUtils.isEmpty(array)) {
2603             return INDEX_NOT_FOUND;
2604         }
2605         if (startIndex < 0) {
2606             return INDEX_NOT_FOUND;
2607         } else if (startIndex >= array.length) {
2608             startIndex = array.length - 1;
2609         }
2610         for (int i = startIndex; i >= 0; i--) {
2611             if (valueToFind == array[i]) {
2612                 return i;
2613             }
2614         }
2615         return INDEX_NOT_FOUND;
2616     }
2617 
2618     /**
2619      * <p>Checks if the value is in the given array.</p>
2620      *
2621      * <p>The method returns <code>false</code> if a <code>null</code> array is passed in.</p>
2622      *
2623      * @param array  the array to search through
2624      * @param valueToFind  the value to find
2625      * @return <code>true</code> if the array contains the object
2626      */
contains(boolean[] array, boolean valueToFind)2627     public static boolean contains(boolean[] array, boolean valueToFind) {
2628         return indexOf(array, valueToFind) != INDEX_NOT_FOUND;
2629     }
2630 
2631     // Primitive/Object array converters
2632     // ----------------------------------------------------------------------
2633 
2634     // Character array converters
2635     // ----------------------------------------------------------------------
2636     /**
2637      * <p>Converts an array of object Characters to primitives.</p>
2638      *
2639      * <p>This method returns <code>null</code> for a <code>null</code> input array.</p>
2640      *
2641      * @param array  a <code>Character</code> array, may be <code>null</code>
2642      * @return a <code>char</code> array, <code>null</code> if null array input
2643      * @throws NullPointerException if array content is <code>null</code>
2644      */
toPrimitive(Character[] array)2645     public static char[] toPrimitive(Character[] array) {
2646         if (array == null) {
2647             return null;
2648         } else if (array.length == 0) {
2649             return EMPTY_CHAR_ARRAY;
2650         }
2651         final char[] result = new char[array.length];
2652         for (int i = 0; i < array.length; i++) {
2653             result[i] = array[i].charValue();
2654         }
2655         return result;
2656     }
2657 
2658     /**
2659      * <p>Converts an array of object Character to primitives handling <code>null</code>.</p>
2660      *
2661      * <p>This method returns <code>null</code> for a <code>null</code> input array.</p>
2662      *
2663      * @param array  a <code>Character</code> array, may be <code>null</code>
2664      * @param valueForNull  the value to insert if <code>null</code> found
2665      * @return a <code>char</code> array, <code>null</code> if null array input
2666      */
toPrimitive(Character[] array, char valueForNull)2667     public static char[] toPrimitive(Character[] array, char valueForNull) {
2668         if (array == null) {
2669             return null;
2670         } else if (array.length == 0) {
2671             return EMPTY_CHAR_ARRAY;
2672         }
2673         final char[] result = new char[array.length];
2674         for (int i = 0; i < array.length; i++) {
2675             Character b = array[i];
2676             result[i] = (b == null ? valueForNull : b.charValue());
2677         }
2678         return result;
2679     }
2680 
2681     /**
2682      * <p>Converts an array of primitive chars to objects.</p>
2683      *
2684      * <p>This method returns <code>null</code> for a <code>null</code> input array.</p>
2685      *
2686      * @param array a <code>char</code> array
2687      * @return a <code>Character</code> array, <code>null</code> if null array input
2688      */
toObject(char[] array)2689     public static Character[] toObject(char[] array) {
2690         if (array == null) {
2691             return null;
2692         } else if (array.length == 0) {
2693             return EMPTY_CHARACTER_OBJECT_ARRAY;
2694         }
2695         final Character[] result = new Character[array.length];
2696         for (int i = 0; i < array.length; i++) {
2697             result[i] = new Character(array[i]);
2698         }
2699         return result;
2700      }
2701 
2702     // Long array converters
2703     // ----------------------------------------------------------------------
2704     /**
2705      * <p>Converts an array of object Longs to primitives.</p>
2706      *
2707      * <p>This method returns <code>null</code> for a <code>null</code> input array.</p>
2708      *
2709      * @param array  a <code>Long</code> array, may be <code>null</code>
2710      * @return a <code>long</code> array, <code>null</code> if null array input
2711      * @throws NullPointerException if array content is <code>null</code>
2712      */
toPrimitive(Long[] array)2713     public static long[] toPrimitive(Long[] array) {
2714         if (array == null) {
2715             return null;
2716         } else if (array.length == 0) {
2717             return EMPTY_LONG_ARRAY;
2718         }
2719         final long[] result = new long[array.length];
2720         for (int i = 0; i < array.length; i++) {
2721             result[i] = array[i].longValue();
2722         }
2723         return result;
2724     }
2725 
2726     /**
2727      * <p>Converts an array of object Long to primitives handling <code>null</code>.</p>
2728      *
2729      * <p>This method returns <code>null</code> for a <code>null</code> input array.</p>
2730      *
2731      * @param array  a <code>Long</code> array, may be <code>null</code>
2732      * @param valueForNull  the value to insert if <code>null</code> found
2733      * @return a <code>long</code> array, <code>null</code> if null array input
2734      */
toPrimitive(Long[] array, long valueForNull)2735     public static long[] toPrimitive(Long[] array, long valueForNull) {
2736         if (array == null) {
2737             return null;
2738         } else if (array.length == 0) {
2739             return EMPTY_LONG_ARRAY;
2740         }
2741         final long[] result = new long[array.length];
2742         for (int i = 0; i < array.length; i++) {
2743             Long b = array[i];
2744             result[i] = (b == null ? valueForNull : b.longValue());
2745         }
2746         return result;
2747     }
2748 
2749     /**
2750      * <p>Converts an array of primitive longs to objects.</p>
2751      *
2752      * <p>This method returns <code>null</code> for a <code>null</code> input array.</p>
2753      *
2754      * @param array  a <code>long</code> array
2755      * @return a <code>Long</code> array, <code>null</code> if null array input
2756      */
toObject(long[] array)2757     public static Long[] toObject(long[] array) {
2758         if (array == null) {
2759             return null;
2760         } else if (array.length == 0) {
2761             return EMPTY_LONG_OBJECT_ARRAY;
2762         }
2763         final Long[] result = new Long[array.length];
2764         for (int i = 0; i < array.length; i++) {
2765             result[i] = new Long(array[i]);
2766         }
2767         return result;
2768     }
2769 
2770     // Int array converters
2771     // ----------------------------------------------------------------------
2772     /**
2773      * <p>Converts an array of object Integers to primitives.</p>
2774      *
2775      * <p>This method returns <code>null</code> for a <code>null</code> input array.</p>
2776      *
2777      * @param array  a <code>Integer</code> array, may be <code>null</code>
2778      * @return an <code>int</code> array, <code>null</code> if null array input
2779      * @throws NullPointerException if array content is <code>null</code>
2780      */
toPrimitive(Integer[] array)2781     public static int[] toPrimitive(Integer[] array) {
2782         if (array == null) {
2783             return null;
2784         } else if (array.length == 0) {
2785             return EMPTY_INT_ARRAY;
2786         }
2787         final int[] result = new int[array.length];
2788         for (int i = 0; i < array.length; i++) {
2789             result[i] = array[i].intValue();
2790         }
2791         return result;
2792     }
2793 
2794     /**
2795      * <p>Converts an array of object Integer to primitives handling <code>null</code>.</p>
2796      *
2797      * <p>This method returns <code>null</code> for a <code>null</code> input array.</p>
2798      *
2799      * @param array  a <code>Integer</code> array, may be <code>null</code>
2800      * @param valueForNull  the value to insert if <code>null</code> found
2801      * @return an <code>int</code> array, <code>null</code> if null array input
2802      */
toPrimitive(Integer[] array, int valueForNull)2803     public static int[] toPrimitive(Integer[] array, int valueForNull) {
2804         if (array == null) {
2805             return null;
2806         } else if (array.length == 0) {
2807             return EMPTY_INT_ARRAY;
2808         }
2809         final int[] result = new int[array.length];
2810         for (int i = 0; i < array.length; i++) {
2811             Integer b = array[i];
2812             result[i] = (b == null ? valueForNull : b.intValue());
2813         }
2814         return result;
2815     }
2816 
2817     /**
2818      * <p>Converts an array of primitive ints to objects.</p>
2819      *
2820      * <p>This method returns <code>null</code> for a <code>null</code> input array.</p>
2821      *
2822      * @param array  an <code>int</code> array
2823      * @return an <code>Integer</code> array, <code>null</code> if null array input
2824      */
toObject(int[] array)2825     public static Integer[] toObject(int[] array) {
2826         if (array == null) {
2827             return null;
2828         } else if (array.length == 0) {
2829             return EMPTY_INTEGER_OBJECT_ARRAY;
2830         }
2831         final Integer[] result = new Integer[array.length];
2832         for (int i = 0; i < array.length; i++) {
2833             result[i] = new Integer(array[i]);
2834         }
2835         return result;
2836     }
2837 
2838     // Short array converters
2839     // ----------------------------------------------------------------------
2840     /**
2841      * <p>Converts an array of object Shorts to primitives.</p>
2842      *
2843      * <p>This method returns <code>null</code> for a <code>null</code> input array.</p>
2844      *
2845      * @param array  a <code>Short</code> array, may be <code>null</code>
2846      * @return a <code>byte</code> array, <code>null</code> if null array input
2847      * @throws NullPointerException if array content is <code>null</code>
2848      */
toPrimitive(Short[] array)2849     public static short[] toPrimitive(Short[] array) {
2850         if (array == null) {
2851             return null;
2852         } else if (array.length == 0) {
2853             return EMPTY_SHORT_ARRAY;
2854         }
2855         final short[] result = new short[array.length];
2856         for (int i = 0; i < array.length; i++) {
2857             result[i] = array[i].shortValue();
2858         }
2859         return result;
2860     }
2861 
2862     /**
2863      * <p>Converts an array of object Short to primitives handling <code>null</code>.</p>
2864      *
2865      * <p>This method returns <code>null</code> for a <code>null</code> input array.</p>
2866      *
2867      * @param array  a <code>Short</code> array, may be <code>null</code>
2868      * @param valueForNull  the value to insert if <code>null</code> found
2869      * @return a <code>byte</code> array, <code>null</code> if null array input
2870      */
toPrimitive(Short[] array, short valueForNull)2871     public static short[] toPrimitive(Short[] array, short valueForNull) {
2872         if (array == null) {
2873             return null;
2874         } else if (array.length == 0) {
2875             return EMPTY_SHORT_ARRAY;
2876         }
2877         final short[] result = new short[array.length];
2878         for (int i = 0; i < array.length; i++) {
2879             Short b = array[i];
2880             result[i] = (b == null ? valueForNull : b.shortValue());
2881         }
2882         return result;
2883     }
2884 
2885     /**
2886      * <p>Converts an array of primitive shorts to objects.</p>
2887      *
2888      * <p>This method returns <code>null</code> for a <code>null</code> input array.</p>
2889      *
2890      * @param array  a <code>short</code> array
2891      * @return a <code>Short</code> array, <code>null</code> if null array input
2892      */
toObject(short[] array)2893     public static Short[] toObject(short[] array) {
2894         if (array == null) {
2895             return null;
2896         } else if (array.length == 0) {
2897             return EMPTY_SHORT_OBJECT_ARRAY;
2898         }
2899         final Short[] result = new Short[array.length];
2900         for (int i = 0; i < array.length; i++) {
2901             result[i] = new Short(array[i]);
2902         }
2903         return result;
2904     }
2905 
2906     // Byte array converters
2907     // ----------------------------------------------------------------------
2908     /**
2909      * <p>Converts an array of object Bytes to primitives.</p>
2910      *
2911      * <p>This method returns <code>null</code> for a <code>null</code> input array.</p>
2912      *
2913      * @param array  a <code>Byte</code> array, may be <code>null</code>
2914      * @return a <code>byte</code> array, <code>null</code> if null array input
2915      * @throws NullPointerException if array content is <code>null</code>
2916      */
toPrimitive(Byte[] array)2917     public static byte[] toPrimitive(Byte[] array) {
2918         if (array == null) {
2919             return null;
2920         } else if (array.length == 0) {
2921             return EMPTY_BYTE_ARRAY;
2922         }
2923         final byte[] result = new byte[array.length];
2924         for (int i = 0; i < array.length; i++) {
2925             result[i] = array[i].byteValue();
2926         }
2927         return result;
2928     }
2929 
2930     /**
2931      * <p>Converts an array of object Bytes to primitives handling <code>null</code>.</p>
2932      *
2933      * <p>This method returns <code>null</code> for a <code>null</code> input array.</p>
2934      *
2935      * @param array  a <code>Byte</code> array, may be <code>null</code>
2936      * @param valueForNull  the value to insert if <code>null</code> found
2937      * @return a <code>byte</code> array, <code>null</code> if null array input
2938      */
toPrimitive(Byte[] array, byte valueForNull)2939     public static byte[] toPrimitive(Byte[] array, byte valueForNull) {
2940         if (array == null) {
2941             return null;
2942         } else if (array.length == 0) {
2943             return EMPTY_BYTE_ARRAY;
2944         }
2945         final byte[] result = new byte[array.length];
2946         for (int i = 0; i < array.length; i++) {
2947             Byte b = array[i];
2948             result[i] = (b == null ? valueForNull : b.byteValue());
2949         }
2950         return result;
2951     }
2952 
2953     /**
2954      * <p>Converts an array of primitive bytes to objects.</p>
2955      *
2956      * <p>This method returns <code>null</code> for a <code>null</code> input array.</p>
2957      *
2958      * @param array  a <code>byte</code> array
2959      * @return a <code>Byte</code> array, <code>null</code> if null array input
2960      */
toObject(byte[] array)2961     public static Byte[] toObject(byte[] array) {
2962         if (array == null) {
2963             return null;
2964         } else if (array.length == 0) {
2965             return EMPTY_BYTE_OBJECT_ARRAY;
2966         }
2967         final Byte[] result = new Byte[array.length];
2968         for (int i = 0; i < array.length; i++) {
2969             result[i] = new Byte(array[i]);
2970         }
2971         return result;
2972     }
2973 
2974     // Double array converters
2975     // ----------------------------------------------------------------------
2976     /**
2977      * <p>Converts an array of object Doubles to primitives.</p>
2978      *
2979      * <p>This method returns <code>null</code> for a <code>null</code> input array.</p>
2980      *
2981      * @param array  a <code>Double</code> array, may be <code>null</code>
2982      * @return a <code>double</code> array, <code>null</code> if null array input
2983      * @throws NullPointerException if array content is <code>null</code>
2984      */
toPrimitive(Double[] array)2985     public static double[] toPrimitive(Double[] array) {
2986         if (array == null) {
2987             return null;
2988         } else if (array.length == 0) {
2989             return EMPTY_DOUBLE_ARRAY;
2990         }
2991         final double[] result = new double[array.length];
2992         for (int i = 0; i < array.length; i++) {
2993             result[i] = array[i].doubleValue();
2994         }
2995         return result;
2996     }
2997 
2998     /**
2999      * <p>Converts an array of object Doubles to primitives handling <code>null</code>.</p>
3000      *
3001      * <p>This method returns <code>null</code> for a <code>null</code> input array.</p>
3002      *
3003      * @param array  a <code>Double</code> array, may be <code>null</code>
3004      * @param valueForNull  the value to insert if <code>null</code> found
3005      * @return a <code>double</code> array, <code>null</code> if null array input
3006      */
toPrimitive(Double[] array, double valueForNull)3007     public static double[] toPrimitive(Double[] array, double valueForNull) {
3008         if (array == null) {
3009             return null;
3010         } else if (array.length == 0) {
3011             return EMPTY_DOUBLE_ARRAY;
3012         }
3013         final double[] result = new double[array.length];
3014         for (int i = 0; i < array.length; i++) {
3015             Double b = array[i];
3016             result[i] = (b == null ? valueForNull : b.doubleValue());
3017         }
3018         return result;
3019     }
3020 
3021     /**
3022      * <p>Converts an array of primitive doubles to objects.</p>
3023      *
3024      * <p>This method returns <code>null</code> for a <code>null</code> input array.</p>
3025      *
3026      * @param array  a <code>double</code> array
3027      * @return a <code>Double</code> array, <code>null</code> if null array input
3028      */
toObject(double[] array)3029     public static Double[] toObject(double[] array) {
3030         if (array == null) {
3031             return null;
3032         } else if (array.length == 0) {
3033             return EMPTY_DOUBLE_OBJECT_ARRAY;
3034         }
3035         final Double[] result = new Double[array.length];
3036         for (int i = 0; i < array.length; i++) {
3037             result[i] = new Double(array[i]);
3038         }
3039         return result;
3040     }
3041 
3042     //   Float array converters
3043     // ----------------------------------------------------------------------
3044     /**
3045      * <p>Converts an array of object Floats to primitives.</p>
3046      *
3047      * <p>This method returns <code>null</code> for a <code>null</code> input array.</p>
3048      *
3049      * @param array  a <code>Float</code> array, may be <code>null</code>
3050      * @return a <code>float</code> array, <code>null</code> if null array input
3051      * @throws NullPointerException if array content is <code>null</code>
3052      */
toPrimitive(Float[] array)3053     public static float[] toPrimitive(Float[] array) {
3054         if (array == null) {
3055             return null;
3056         } else if (array.length == 0) {
3057             return EMPTY_FLOAT_ARRAY;
3058         }
3059         final float[] result = new float[array.length];
3060         for (int i = 0; i < array.length; i++) {
3061             result[i] = array[i].floatValue();
3062         }
3063         return result;
3064     }
3065 
3066     /**
3067      * <p>Converts an array of object Floats to primitives handling <code>null</code>.</p>
3068      *
3069      * <p>This method returns <code>null</code> for a <code>null</code> input array.</p>
3070      *
3071      * @param array  a <code>Float</code> array, may be <code>null</code>
3072      * @param valueForNull  the value to insert if <code>null</code> found
3073      * @return a <code>float</code> array, <code>null</code> if null array input
3074      */
toPrimitive(Float[] array, float valueForNull)3075     public static float[] toPrimitive(Float[] array, float valueForNull) {
3076         if (array == null) {
3077             return null;
3078         } else if (array.length == 0) {
3079             return EMPTY_FLOAT_ARRAY;
3080         }
3081         final float[] result = new float[array.length];
3082         for (int i = 0; i < array.length; i++) {
3083             Float b = array[i];
3084             result[i] = (b == null ? valueForNull : b.floatValue());
3085         }
3086         return result;
3087     }
3088 
3089     /**
3090      * <p>Converts an array of primitive floats to objects.</p>
3091      *
3092      * <p>This method returns <code>null</code> for a <code>null</code> input array.</p>
3093      *
3094      * @param array  a <code>float</code> array
3095      * @return a <code>Float</code> array, <code>null</code> if null array input
3096      */
toObject(float[] array)3097     public static Float[] toObject(float[] array) {
3098         if (array == null) {
3099             return null;
3100         } else if (array.length == 0) {
3101             return EMPTY_FLOAT_OBJECT_ARRAY;
3102         }
3103         final Float[] result = new Float[array.length];
3104         for (int i = 0; i < array.length; i++) {
3105             result[i] = new Float(array[i]);
3106         }
3107         return result;
3108     }
3109 
3110     // Boolean array converters
3111     // ----------------------------------------------------------------------
3112     /**
3113      * <p>Converts an array of object Booleans to primitives.</p>
3114      *
3115      * <p>This method returns <code>null</code> for a <code>null</code> input array.</p>
3116      *
3117      * @param array  a <code>Boolean</code> array, may be <code>null</code>
3118      * @return a <code>boolean</code> array, <code>null</code> if null array input
3119      * @throws NullPointerException if array content is <code>null</code>
3120      */
toPrimitive(Boolean[] array)3121     public static boolean[] toPrimitive(Boolean[] array) {
3122         if (array == null) {
3123             return null;
3124         } else if (array.length == 0) {
3125             return EMPTY_BOOLEAN_ARRAY;
3126         }
3127         final boolean[] result = new boolean[array.length];
3128         for (int i = 0; i < array.length; i++) {
3129             result[i] = array[i].booleanValue();
3130         }
3131         return result;
3132     }
3133 
3134     /**
3135      * <p>Converts an array of object Booleans to primitives handling <code>null</code>.</p>
3136      *
3137      * <p>This method returns <code>null</code> for a <code>null</code> input array.</p>
3138      *
3139      * @param array  a <code>Boolean</code> array, may be <code>null</code>
3140      * @param valueForNull  the value to insert if <code>null</code> found
3141      * @return a <code>boolean</code> array, <code>null</code> if null array input
3142      */
toPrimitive(Boolean[] array, boolean valueForNull)3143     public static boolean[] toPrimitive(Boolean[] array, boolean valueForNull) {
3144         if (array == null) {
3145             return null;
3146         } else if (array.length == 0) {
3147             return EMPTY_BOOLEAN_ARRAY;
3148         }
3149         final boolean[] result = new boolean[array.length];
3150         for (int i = 0; i < array.length; i++) {
3151             Boolean b = array[i];
3152             result[i] = (b == null ? valueForNull : b.booleanValue());
3153         }
3154         return result;
3155     }
3156 
3157     /**
3158      * <p>Converts an array of primitive booleans to objects.</p>
3159      *
3160      * <p>This method returns <code>null</code> for a <code>null</code> input array.</p>
3161      *
3162      * @param array  a <code>boolean</code> array
3163      * @return a <code>Boolean</code> array, <code>null</code> if null array input
3164      */
toObject(boolean[] array)3165     public static Boolean[] toObject(boolean[] array) {
3166         if (array == null) {
3167             return null;
3168         } else if (array.length == 0) {
3169             return EMPTY_BOOLEAN_OBJECT_ARRAY;
3170         }
3171         final Boolean[] result = new Boolean[array.length];
3172         for (int i = 0; i < array.length; i++) {
3173             result[i] = (array[i] ? Boolean.TRUE : Boolean.FALSE);
3174         }
3175         return result;
3176     }
3177 
3178     // ----------------------------------------------------------------------
3179     /**
3180      * <p>Checks if an array of Objects is empty or <code>null</code>.</p>
3181      *
3182      * @param array  the array to test
3183      * @return <code>true</code> if the array is empty or <code>null</code>
3184      * @since 2.1
3185      */
isEmpty(Object[] array)3186     public static boolean isEmpty(Object[] array) {
3187         return array == null || array.length == 0;
3188     }
3189 
3190     /**
3191      * <p>Checks if an array of primitive longs is empty or <code>null</code>.</p>
3192      *
3193      * @param array  the array to test
3194      * @return <code>true</code> if the array is empty or <code>null</code>
3195      * @since 2.1
3196      */
isEmpty(long[] array)3197     public static boolean isEmpty(long[] array) {
3198         return array == null || array.length == 0;
3199     }
3200 
3201     /**
3202      * <p>Checks if an array of primitive ints is empty or <code>null</code>.</p>
3203      *
3204      * @param array  the array to test
3205      * @return <code>true</code> if the array is empty or <code>null</code>
3206      * @since 2.1
3207      */
isEmpty(int[] array)3208     public static boolean isEmpty(int[] array) {
3209         return array == null || array.length == 0;
3210     }
3211 
3212     /**
3213      * <p>Checks if an array of primitive shorts is empty or <code>null</code>.</p>
3214      *
3215      * @param array  the array to test
3216      * @return <code>true</code> if the array is empty or <code>null</code>
3217      * @since 2.1
3218      */
isEmpty(short[] array)3219     public static boolean isEmpty(short[] array) {
3220         return array == null || array.length == 0;
3221     }
3222 
3223     /**
3224      * <p>Checks if an array of primitive chars is empty or <code>null</code>.</p>
3225      *
3226      * @param array  the array to test
3227      * @return <code>true</code> if the array is empty or <code>null</code>
3228      * @since 2.1
3229      */
isEmpty(char[] array)3230     public static boolean isEmpty(char[] array) {
3231         return array == null || array.length == 0;
3232     }
3233 
3234     /**
3235      * <p>Checks if an array of primitive bytes is empty or <code>null</code>.</p>
3236      *
3237      * @param array  the array to test
3238      * @return <code>true</code> if the array is empty or <code>null</code>
3239      * @since 2.1
3240      */
isEmpty(byte[] array)3241     public static boolean isEmpty(byte[] array) {
3242         return array == null || array.length == 0;
3243     }
3244 
3245     /**
3246      * <p>Checks if an array of primitive doubles is empty or <code>null</code>.</p>
3247      *
3248      * @param array  the array to test
3249      * @return <code>true</code> if the array is empty or <code>null</code>
3250      * @since 2.1
3251      */
isEmpty(double[] array)3252     public static boolean isEmpty(double[] array) {
3253         return array == null || array.length == 0;
3254     }
3255 
3256     /**
3257      * <p>Checks if an array of primitive floats is empty or <code>null</code>.</p>
3258      *
3259      * @param array  the array to test
3260      * @return <code>true</code> if the array is empty or <code>null</code>
3261      * @since 2.1
3262      */
isEmpty(float[] array)3263     public static boolean isEmpty(float[] array) {
3264         return array == null || array.length == 0;
3265     }
3266 
3267     /**
3268      * <p>Checks if an array of primitive booleans is empty or <code>null</code>.</p>
3269      *
3270      * @param array  the array to test
3271      * @return <code>true</code> if the array is empty or <code>null</code>
3272      * @since 2.1
3273      */
isEmpty(boolean[] array)3274     public static boolean isEmpty(boolean[] array) {
3275         return array == null || array.length == 0;
3276     }
3277 
3278     // ----------------------------------------------------------------------
3279     /**
3280      * <p>Checks if an array of Objects is not empty or not <code>null</code>.</p>
3281      *
3282      * @param array  the array to test
3283      * @return <code>true</code> if the array is not empty or not <code>null</code>
3284      * @since 2.5
3285      */
isNotEmpty(Object[] array)3286      public static boolean isNotEmpty(Object[] array) {
3287          return (array != null && array.length != 0);
3288      }
3289 
3290     /**
3291      * <p>Checks if an array of primitive longs is not empty or not <code>null</code>.</p>
3292      *
3293      * @param array  the array to test
3294      * @return <code>true</code> if the array is not empty or not <code>null</code>
3295      * @since 2.5
3296      */
isNotEmpty(long[] array)3297     public static boolean isNotEmpty(long[] array) {
3298         return (array != null && array.length != 0);
3299     }
3300 
3301     /**
3302      * <p>Checks if an array of primitive ints is not empty or not <code>null</code>.</p>
3303      *
3304      * @param array  the array to test
3305      * @return <code>true</code> if the array is not empty or not <code>null</code>
3306      * @since 2.5
3307      */
isNotEmpty(int[] array)3308     public static boolean isNotEmpty(int[] array) {
3309         return (array != null && array.length != 0);
3310     }
3311 
3312     /**
3313      * <p>Checks if an array of primitive shorts is not empty or not <code>null</code>.</p>
3314      *
3315      * @param array  the array to test
3316      * @return <code>true</code> if the array is not empty or not <code>null</code>
3317      * @since 2.5
3318      */
isNotEmpty(short[] array)3319     public static boolean isNotEmpty(short[] array) {
3320         return (array != null && array.length != 0);
3321     }
3322 
3323     /**
3324      * <p>Checks if an array of primitive chars is not empty or not <code>null</code>.</p>
3325      *
3326      * @param array  the array to test
3327      * @return <code>true</code> if the array is not empty or not <code>null</code>
3328      * @since 2.5
3329      */
isNotEmpty(char[] array)3330     public static boolean isNotEmpty(char[] array) {
3331         return (array != null && array.length != 0);
3332     }
3333 
3334     /**
3335      * <p>Checks if an array of primitive bytes is not empty or not <code>null</code>.</p>
3336      *
3337      * @param array  the array to test
3338      * @return <code>true</code> if the array is not empty or not <code>null</code>
3339      * @since 2.5
3340      */
isNotEmpty(byte[] array)3341     public static boolean isNotEmpty(byte[] array) {
3342         return (array != null && array.length != 0);
3343     }
3344 
3345     /**
3346      * <p>Checks if an array of primitive doubles is not empty or not <code>null</code>.</p>
3347      *
3348      * @param array  the array to test
3349      * @return <code>true</code> if the array is not empty or not <code>null</code>
3350      * @since 2.5
3351      */
isNotEmpty(double[] array)3352     public static boolean isNotEmpty(double[] array) {
3353         return (array != null && array.length != 0);
3354     }
3355 
3356     /**
3357      * <p>Checks if an array of primitive floats is not empty or not <code>null</code>.</p>
3358      *
3359      * @param array  the array to test
3360      * @return <code>true</code> if the array is not empty or not <code>null</code>
3361      * @since 2.5
3362      */
isNotEmpty(float[] array)3363     public static boolean isNotEmpty(float[] array) {
3364         return (array != null && array.length != 0);
3365     }
3366 
3367     /**
3368      * <p>Checks if an array of primitive booleans is not empty or not <code>null</code>.</p>
3369      *
3370      * @param array  the array to test
3371      * @return <code>true</code> if the array is not empty or not <code>null</code>
3372      * @since 2.5
3373      */
isNotEmpty(boolean[] array)3374     public static boolean isNotEmpty(boolean[] array) {
3375         return (array != null && array.length != 0);
3376     }
3377 
3378     /**
3379      * <p>Adds all the elements of the given arrays into a new array.</p>
3380      * <p>The new array contains all of the element of <code>array1</code> followed
3381      * by all of the elements <code>array2</code>. When an array is returned, it is always
3382      * a new array.</p>
3383      *
3384      * <pre>
3385      * ArrayUtils.addAll(null, null)     = null
3386      * ArrayUtils.addAll(array1, null)   = cloned copy of array1
3387      * ArrayUtils.addAll(null, array2)   = cloned copy of array2
3388      * ArrayUtils.addAll([], [])         = []
3389      * ArrayUtils.addAll([null], [null]) = [null, null]
3390      * ArrayUtils.addAll(["a", "b", "c"], ["1", "2", "3"]) = ["a", "b", "c", "1", "2", "3"]
3391      * </pre>
3392      *
3393      * @param array1  the first array whose elements are added to the new array, may be <code>null</code>
3394      * @param array2  the second array whose elements are added to the new array, may be <code>null</code>
3395      * @return The new array, <code>null</code> if both arrays are <code>null</code>.
3396      *      The type of the new array is the type of the first array,
3397      *      unless the first array is null, in which case the type is the same as the second array.
3398      * @since 2.1
3399      * @throws IllegalArgumentException if the array types are incompatible
3400      */
addAll(Object[] array1, Object[] array2)3401     public static Object[] addAll(Object[] array1, Object[] array2) {
3402         if (array1 == null) {
3403             return clone(array2);
3404         } else if (array2 == null) {
3405             return clone(array1);
3406         }
3407         Object[] joinedArray = (Object[]) Array.newInstance(array1.getClass().getComponentType(),
3408                                                             array1.length + array2.length);
3409         System.arraycopy(array1, 0, joinedArray, 0, array1.length);
3410         try {
3411             System.arraycopy(array2, 0, joinedArray, array1.length, array2.length);
3412         } catch (ArrayStoreException ase) {
3413             // Check if problem was due to incompatible types
3414             /*
3415              * We do this here, rather than before the copy because:
3416              * - it would be a wasted check most of the time
3417              * - safer, in case check turns out to be too strict
3418              */
3419             final Class type1 = array1.getClass().getComponentType();
3420             final Class type2 = array2.getClass().getComponentType();
3421             if (!type1.isAssignableFrom(type2)){
3422                 throw new IllegalArgumentException("Cannot store "+type2.getName()+" in an array of "+type1.getName());
3423             }
3424             throw ase; // No, so rethrow original
3425         }
3426         return joinedArray;
3427     }
3428 
3429     /**
3430      * <p>Adds all the elements of the given arrays into a new array.</p>
3431      * <p>The new array contains all of the element of <code>array1</code> followed
3432      * by all of the elements <code>array2</code>. When an array is returned, it is always
3433      * a new array.</p>
3434      *
3435      * <pre>
3436      * ArrayUtils.addAll(array1, null)   = cloned copy of array1
3437      * ArrayUtils.addAll(null, array2)   = cloned copy of array2
3438      * ArrayUtils.addAll([], [])         = []
3439      * </pre>
3440      *
3441      * @param array1  the first array whose elements are added to the new array.
3442      * @param array2  the second array whose elements are added to the new array.
3443      * @return The new boolean[] array.
3444      * @since 2.1
3445      */
addAll(boolean[] array1, boolean[] array2)3446     public static boolean[] addAll(boolean[] array1, boolean[] array2) {
3447         if (array1 == null) {
3448             return clone(array2);
3449         } else if (array2 == null) {
3450             return clone(array1);
3451         }
3452         boolean[] joinedArray = new boolean[array1.length + array2.length];
3453         System.arraycopy(array1, 0, joinedArray, 0, array1.length);
3454         System.arraycopy(array2, 0, joinedArray, array1.length, array2.length);
3455         return joinedArray;
3456     }
3457 
3458     /**
3459      * <p>Adds all the elements of the given arrays into a new array.</p>
3460      * <p>The new array contains all of the element of <code>array1</code> followed
3461      * by all of the elements <code>array2</code>. When an array is returned, it is always
3462      * a new array.</p>
3463      *
3464      * <pre>
3465      * ArrayUtils.addAll(array1, null)   = cloned copy of array1
3466      * ArrayUtils.addAll(null, array2)   = cloned copy of array2
3467      * ArrayUtils.addAll([], [])         = []
3468      * </pre>
3469      *
3470      * @param array1  the first array whose elements are added to the new array.
3471      * @param array2  the second array whose elements are added to the new array.
3472      * @return The new char[] array.
3473      * @since 2.1
3474      */
addAll(char[] array1, char[] array2)3475     public static char[] addAll(char[] array1, char[] array2) {
3476         if (array1 == null) {
3477             return clone(array2);
3478         } else if (array2 == null) {
3479             return clone(array1);
3480         }
3481         char[] joinedArray = new char[array1.length + array2.length];
3482         System.arraycopy(array1, 0, joinedArray, 0, array1.length);
3483         System.arraycopy(array2, 0, joinedArray, array1.length, array2.length);
3484         return joinedArray;
3485     }
3486 
3487     /**
3488      * <p>Adds all the elements of the given arrays into a new array.</p>
3489      * <p>The new array contains all of the element of <code>array1</code> followed
3490      * by all of the elements <code>array2</code>. When an array is returned, it is always
3491      * a new array.</p>
3492      *
3493      * <pre>
3494      * ArrayUtils.addAll(array1, null)   = cloned copy of array1
3495      * ArrayUtils.addAll(null, array2)   = cloned copy of array2
3496      * ArrayUtils.addAll([], [])         = []
3497      * </pre>
3498      *
3499      * @param array1  the first array whose elements are added to the new array.
3500      * @param array2  the second array whose elements are added to the new array.
3501      * @return The new byte[] array.
3502      * @since 2.1
3503      */
addAll(byte[] array1, byte[] array2)3504     public static byte[] addAll(byte[] array1, byte[] array2) {
3505         if (array1 == null) {
3506             return clone(array2);
3507         } else if (array2 == null) {
3508             return clone(array1);
3509         }
3510         byte[] joinedArray = new byte[array1.length + array2.length];
3511         System.arraycopy(array1, 0, joinedArray, 0, array1.length);
3512         System.arraycopy(array2, 0, joinedArray, array1.length, array2.length);
3513         return joinedArray;
3514     }
3515 
3516     /**
3517      * <p>Adds all the elements of the given arrays into a new array.</p>
3518      * <p>The new array contains all of the element of <code>array1</code> followed
3519      * by all of the elements <code>array2</code>. When an array is returned, it is always
3520      * a new array.</p>
3521      *
3522      * <pre>
3523      * ArrayUtils.addAll(array1, null)   = cloned copy of array1
3524      * ArrayUtils.addAll(null, array2)   = cloned copy of array2
3525      * ArrayUtils.addAll([], [])         = []
3526      * </pre>
3527      *
3528      * @param array1  the first array whose elements are added to the new array.
3529      * @param array2  the second array whose elements are added to the new array.
3530      * @return The new short[] array.
3531      * @since 2.1
3532      */
addAll(short[] array1, short[] array2)3533     public static short[] addAll(short[] array1, short[] array2) {
3534         if (array1 == null) {
3535             return clone(array2);
3536         } else if (array2 == null) {
3537             return clone(array1);
3538         }
3539         short[] joinedArray = new short[array1.length + array2.length];
3540         System.arraycopy(array1, 0, joinedArray, 0, array1.length);
3541         System.arraycopy(array2, 0, joinedArray, array1.length, array2.length);
3542         return joinedArray;
3543     }
3544 
3545     /**
3546      * <p>Adds all the elements of the given arrays into a new array.</p>
3547      * <p>The new array contains all of the element of <code>array1</code> followed
3548      * by all of the elements <code>array2</code>. When an array is returned, it is always
3549      * a new array.</p>
3550      *
3551      * <pre>
3552      * ArrayUtils.addAll(array1, null)   = cloned copy of array1
3553      * ArrayUtils.addAll(null, array2)   = cloned copy of array2
3554      * ArrayUtils.addAll([], [])         = []
3555      * </pre>
3556      *
3557      * @param array1  the first array whose elements are added to the new array.
3558      * @param array2  the second array whose elements are added to the new array.
3559      * @return The new int[] array.
3560      * @since 2.1
3561      */
addAll(int[] array1, int[] array2)3562     public static int[] addAll(int[] array1, int[] array2) {
3563         if (array1 == null) {
3564             return clone(array2);
3565         } else if (array2 == null) {
3566             return clone(array1);
3567         }
3568         int[] joinedArray = new int[array1.length + array2.length];
3569         System.arraycopy(array1, 0, joinedArray, 0, array1.length);
3570         System.arraycopy(array2, 0, joinedArray, array1.length, array2.length);
3571         return joinedArray;
3572     }
3573 
3574     /**
3575      * <p>Adds all the elements of the given arrays into a new array.</p>
3576      * <p>The new array contains all of the element of <code>array1</code> followed
3577      * by all of the elements <code>array2</code>. When an array is returned, it is always
3578      * a new array.</p>
3579      *
3580      * <pre>
3581      * ArrayUtils.addAll(array1, null)   = cloned copy of array1
3582      * ArrayUtils.addAll(null, array2)   = cloned copy of array2
3583      * ArrayUtils.addAll([], [])         = []
3584      * </pre>
3585      *
3586      * @param array1  the first array whose elements are added to the new array.
3587      * @param array2  the second array whose elements are added to the new array.
3588      * @return The new long[] array.
3589      * @since 2.1
3590      */
addAll(long[] array1, long[] array2)3591     public static long[] addAll(long[] array1, long[] array2) {
3592         if (array1 == null) {
3593             return clone(array2);
3594         } else if (array2 == null) {
3595             return clone(array1);
3596         }
3597         long[] joinedArray = new long[array1.length + array2.length];
3598         System.arraycopy(array1, 0, joinedArray, 0, array1.length);
3599         System.arraycopy(array2, 0, joinedArray, array1.length, array2.length);
3600         return joinedArray;
3601     }
3602 
3603     /**
3604      * <p>Adds all the elements of the given arrays into a new array.</p>
3605      * <p>The new array contains all of the element of <code>array1</code> followed
3606      * by all of the elements <code>array2</code>. When an array is returned, it is always
3607      * a new array.</p>
3608      *
3609      * <pre>
3610      * ArrayUtils.addAll(array1, null)   = cloned copy of array1
3611      * ArrayUtils.addAll(null, array2)   = cloned copy of array2
3612      * ArrayUtils.addAll([], [])         = []
3613      * </pre>
3614      *
3615      * @param array1  the first array whose elements are added to the new array.
3616      * @param array2  the second array whose elements are added to the new array.
3617      * @return The new float[] array.
3618      * @since 2.1
3619      */
addAll(float[] array1, float[] array2)3620     public static float[] addAll(float[] array1, float[] array2) {
3621         if (array1 == null) {
3622             return clone(array2);
3623         } else if (array2 == null) {
3624             return clone(array1);
3625         }
3626         float[] joinedArray = new float[array1.length + array2.length];
3627         System.arraycopy(array1, 0, joinedArray, 0, array1.length);
3628         System.arraycopy(array2, 0, joinedArray, array1.length, array2.length);
3629         return joinedArray;
3630     }
3631 
3632     /**
3633      * <p>Adds all the elements of the given arrays into a new array.</p>
3634      * <p>The new array contains all of the element of <code>array1</code> followed
3635      * by all of the elements <code>array2</code>. When an array is returned, it is always
3636      * a new array.</p>
3637      *
3638      * <pre>
3639      * ArrayUtils.addAll(array1, null)   = cloned copy of array1
3640      * ArrayUtils.addAll(null, array2)   = cloned copy of array2
3641      * ArrayUtils.addAll([], [])         = []
3642      * </pre>
3643      *
3644      * @param array1  the first array whose elements are added to the new array.
3645      * @param array2  the second array whose elements are added to the new array.
3646      * @return The new double[] array.
3647      * @since 2.1
3648      */
addAll(double[] array1, double[] array2)3649     public static double[] addAll(double[] array1, double[] array2) {
3650         if (array1 == null) {
3651             return clone(array2);
3652         } else if (array2 == null) {
3653             return clone(array1);
3654         }
3655         double[] joinedArray = new double[array1.length + array2.length];
3656         System.arraycopy(array1, 0, joinedArray, 0, array1.length);
3657         System.arraycopy(array2, 0, joinedArray, array1.length, array2.length);
3658         return joinedArray;
3659     }
3660 
3661     /**
3662      * <p>Copies the given array and adds the given element at the end of the new array.</p>
3663      *
3664      * <p>The new array contains the same elements of the input
3665      * array plus the given element in the last position. The component type of
3666      * the new array is the same as that of the input array.</p>
3667      *
3668      * <p>If the input array is <code>null</code>, a new one element array is returned
3669      *  whose component type is the same as the element, unless the element itself is null,
3670      *  in which case the return type is Object[]</p>
3671      *
3672      * <pre>
3673      * ArrayUtils.add(null, null)      = [null]
3674      * ArrayUtils.add(null, "a")       = ["a"]
3675      * ArrayUtils.add(["a"], null)     = ["a", null]
3676      * ArrayUtils.add(["a"], "b")      = ["a", "b"]
3677      * ArrayUtils.add(["a", "b"], "c") = ["a", "b", "c"]
3678      * </pre>
3679      *
3680      * @param array  the array to "add" the element to, may be <code>null</code>
3681      * @param element  the object to add, may be <code>null</code>
3682      * @return A new array containing the existing elements plus the new element
3683      * The returned array type will be that of the input array (unless null),
3684      * in which case it will have the same type as the element.
3685      * @since 2.1
3686      */
add(Object[] array, Object element)3687     public static Object[] add(Object[] array, Object element) {
3688         Class type;
3689         if (array != null){
3690             type = array.getClass();
3691         } else if (element != null) {
3692             type = element.getClass();
3693         } else {
3694             type = Object.class;
3695         }
3696         Object[] newArray = (Object[]) copyArrayGrow1(array, type);
3697         newArray[newArray.length - 1] = element;
3698         return newArray;
3699     }
3700 
3701     /**
3702      * <p>Copies the given array and adds the given element at the end of the new array.</p>
3703      *
3704      * <p>The new array contains the same elements of the input
3705      * array plus the given element in the last position. The component type of
3706      * the new array is the same as that of the input array.</p>
3707      *
3708      * <p>If the input array is <code>null</code>, a new one element array is returned
3709      *  whose component type is the same as the element.</p>
3710      *
3711      * <pre>
3712      * ArrayUtils.add(null, true)          = [true]
3713      * ArrayUtils.add([true], false)       = [true, false]
3714      * ArrayUtils.add([true, false], true) = [true, false, true]
3715      * </pre>
3716      *
3717      * @param array  the array to copy and add the element to, may be <code>null</code>
3718      * @param element  the object to add at the last index of the new array
3719      * @return A new array containing the existing elements plus the new element
3720      * @since 2.1
3721      */
add(boolean[] array, boolean element)3722     public static boolean[] add(boolean[] array, boolean element) {
3723         boolean[] newArray = (boolean[])copyArrayGrow1(array, Boolean.TYPE);
3724         newArray[newArray.length - 1] = element;
3725         return newArray;
3726     }
3727 
3728     /**
3729      * <p>Copies the given array and adds the given element at the end of the new array.</p>
3730      *
3731      * <p>The new array contains the same elements of the input
3732      * array plus the given element in the last position. The component type of
3733      * the new array is the same as that of the input array.</p>
3734      *
3735      * <p>If the input array is <code>null</code>, a new one element array is returned
3736      *  whose component type is the same as the element.</p>
3737      *
3738      * <pre>
3739      * ArrayUtils.add(null, 0)   = [0]
3740      * ArrayUtils.add([1], 0)    = [1, 0]
3741      * ArrayUtils.add([1, 0], 1) = [1, 0, 1]
3742      * </pre>
3743      *
3744      * @param array  the array to copy and add the element to, may be <code>null</code>
3745      * @param element  the object to add at the last index of the new array
3746      * @return A new array containing the existing elements plus the new element
3747      * @since 2.1
3748      */
add(byte[] array, byte element)3749     public static byte[] add(byte[] array, byte element) {
3750         byte[] newArray = (byte[])copyArrayGrow1(array, Byte.TYPE);
3751         newArray[newArray.length - 1] = element;
3752         return newArray;
3753     }
3754 
3755     /**
3756      * <p>Copies the given array and adds the given element at the end of the new array.</p>
3757      *
3758      * <p>The new array contains the same elements of the input
3759      * array plus the given element in the last position. The component type of
3760      * the new array is the same as that of the input array.</p>
3761      *
3762      * <p>If the input array is <code>null</code>, a new one element array is returned
3763      *  whose component type is the same as the element.</p>
3764      *
3765      * <pre>
3766      * ArrayUtils.add(null, '0')       = ['0']
3767      * ArrayUtils.add(['1'], '0')      = ['1', '0']
3768      * ArrayUtils.add(['1', '0'], '1') = ['1', '0', '1']
3769      * </pre>
3770      *
3771      * @param array  the array to copy and add the element to, may be <code>null</code>
3772      * @param element  the object to add at the last index of the new array
3773      * @return A new array containing the existing elements plus the new element
3774      * @since 2.1
3775      */
add(char[] array, char element)3776     public static char[] add(char[] array, char element) {
3777         char[] newArray = (char[])copyArrayGrow1(array, Character.TYPE);
3778         newArray[newArray.length - 1] = element;
3779         return newArray;
3780     }
3781 
3782     /**
3783      * <p>Copies the given array and adds the given element at the end of the new array.</p>
3784      *
3785      * <p>The new array contains the same elements of the input
3786      * array plus the given element in the last position. The component type of
3787      * the new array is the same as that of the input array.</p>
3788      *
3789      * <p>If the input array is <code>null</code>, a new one element array is returned
3790      *  whose component type is the same as the element.</p>
3791      *
3792      * <pre>
3793      * ArrayUtils.add(null, 0)   = [0]
3794      * ArrayUtils.add([1], 0)    = [1, 0]
3795      * ArrayUtils.add([1, 0], 1) = [1, 0, 1]
3796      * </pre>
3797      *
3798      * @param array  the array to copy and add the element to, may be <code>null</code>
3799      * @param element  the object to add at the last index of the new array
3800      * @return A new array containing the existing elements plus the new element
3801      * @since 2.1
3802      */
add(double[] array, double element)3803     public static double[] add(double[] array, double element) {
3804         double[] newArray = (double[])copyArrayGrow1(array, Double.TYPE);
3805         newArray[newArray.length - 1] = element;
3806         return newArray;
3807     }
3808 
3809     /**
3810      * <p>Copies the given array and adds the given element at the end of the new array.</p>
3811      *
3812      * <p>The new array contains the same elements of the input
3813      * array plus the given element in the last position. The component type of
3814      * the new array is the same as that of the input array.</p>
3815      *
3816      * <p>If the input array is <code>null</code>, a new one element array is returned
3817      *  whose component type is the same as the element.</p>
3818      *
3819      * <pre>
3820      * ArrayUtils.add(null, 0)   = [0]
3821      * ArrayUtils.add([1], 0)    = [1, 0]
3822      * ArrayUtils.add([1, 0], 1) = [1, 0, 1]
3823      * </pre>
3824      *
3825      * @param array  the array to copy and add the element to, may be <code>null</code>
3826      * @param element  the object to add at the last index of the new array
3827      * @return A new array containing the existing elements plus the new element
3828      * @since 2.1
3829      */
add(float[] array, float element)3830     public static float[] add(float[] array, float element) {
3831         float[] newArray = (float[])copyArrayGrow1(array, Float.TYPE);
3832         newArray[newArray.length - 1] = element;
3833         return newArray;
3834     }
3835 
3836     /**
3837      * <p>Copies the given array and adds the given element at the end of the new array.</p>
3838      *
3839      * <p>The new array contains the same elements of the input
3840      * array plus the given element in the last position. The component type of
3841      * the new array is the same as that of the input array.</p>
3842      *
3843      * <p>If the input array is <code>null</code>, a new one element array is returned
3844      *  whose component type is the same as the element.</p>
3845      *
3846      * <pre>
3847      * ArrayUtils.add(null, 0)   = [0]
3848      * ArrayUtils.add([1], 0)    = [1, 0]
3849      * ArrayUtils.add([1, 0], 1) = [1, 0, 1]
3850      * </pre>
3851      *
3852      * @param array  the array to copy and add the element to, may be <code>null</code>
3853      * @param element  the object to add at the last index of the new array
3854      * @return A new array containing the existing elements plus the new element
3855      * @since 2.1
3856      */
add(int[] array, int element)3857     public static int[] add(int[] array, int element) {
3858         int[] newArray = (int[])copyArrayGrow1(array, Integer.TYPE);
3859         newArray[newArray.length - 1] = element;
3860         return newArray;
3861     }
3862 
3863     /**
3864      * <p>Copies the given array and adds the given element at the end of the new array.</p>
3865      *
3866      * <p>The new array contains the same elements of the input
3867      * array plus the given element in the last position. The component type of
3868      * the new array is the same as that of the input array.</p>
3869      *
3870      * <p>If the input array is <code>null</code>, a new one element array is returned
3871      *  whose component type is the same as the element.</p>
3872      *
3873      * <pre>
3874      * ArrayUtils.add(null, 0)   = [0]
3875      * ArrayUtils.add([1], 0)    = [1, 0]
3876      * ArrayUtils.add([1, 0], 1) = [1, 0, 1]
3877      * </pre>
3878      *
3879      * @param array  the array to copy and add the element to, may be <code>null</code>
3880      * @param element  the object to add at the last index of the new array
3881      * @return A new array containing the existing elements plus the new element
3882      * @since 2.1
3883      */
add(long[] array, long element)3884     public static long[] add(long[] array, long element) {
3885         long[] newArray = (long[])copyArrayGrow1(array, Long.TYPE);
3886         newArray[newArray.length - 1] = element;
3887         return newArray;
3888     }
3889 
3890     /**
3891      * <p>Copies the given array and adds the given element at the end of the new array.</p>
3892      *
3893      * <p>The new array contains the same elements of the input
3894      * array plus the given element in the last position. The component type of
3895      * the new array is the same as that of the input array.</p>
3896      *
3897      * <p>If the input array is <code>null</code>, a new one element array is returned
3898      *  whose component type is the same as the element.</p>
3899      *
3900      * <pre>
3901      * ArrayUtils.add(null, 0)   = [0]
3902      * ArrayUtils.add([1], 0)    = [1, 0]
3903      * ArrayUtils.add([1, 0], 1) = [1, 0, 1]
3904      * </pre>
3905      *
3906      * @param array  the array to copy and add the element to, may be <code>null</code>
3907      * @param element  the object to add at the last index of the new array
3908      * @return A new array containing the existing elements plus the new element
3909      * @since 2.1
3910      */
add(short[] array, short element)3911     public static short[] add(short[] array, short element) {
3912         short[] newArray = (short[])copyArrayGrow1(array, Short.TYPE);
3913         newArray[newArray.length - 1] = element;
3914         return newArray;
3915     }
3916 
3917     /**
3918      * Returns a copy of the given array of size 1 greater than the argument.
3919      * The last value of the array is left to the default value.
3920      *
3921      * @param array The array to copy, must not be <code>null</code>.
3922      * @param newArrayComponentType If <code>array</code> is <code>null</code>, create a
3923      * size 1 array of this type.
3924      * @return A new copy of the array of size 1 greater than the input.
3925      */
copyArrayGrow1(Object array, Class newArrayComponentType)3926     private static Object copyArrayGrow1(Object array, Class newArrayComponentType) {
3927         if (array != null) {
3928             int arrayLength = Array.getLength(array);
3929             Object newArray = Array.newInstance(array.getClass().getComponentType(), arrayLength + 1);
3930             System.arraycopy(array, 0, newArray, 0, arrayLength);
3931             return newArray;
3932         }
3933         return Array.newInstance(newArrayComponentType, 1);
3934     }
3935 
3936     /**
3937      * <p>Inserts the specified element at the specified position in the array.
3938      * Shifts the element currently at that position (if any) and any subsequent
3939      * elements to the right (adds one to their indices).</p>
3940      *
3941      * <p>This method returns a new array with the same elements of the input
3942      * array plus the given element on the specified position. The component
3943      * type of the returned array is always the same as that of the input
3944      * array.</p>
3945      *
3946      * <p>If the input array is <code>null</code>, a new one element array is returned
3947      *  whose component type is the same as the element.</p>
3948      *
3949      * <pre>
3950      * ArrayUtils.add(null, 0, null)      = [null]
3951      * ArrayUtils.add(null, 0, "a")       = ["a"]
3952      * ArrayUtils.add(["a"], 1, null)     = ["a", null]
3953      * ArrayUtils.add(["a"], 1, "b")      = ["a", "b"]
3954      * ArrayUtils.add(["a", "b"], 3, "c") = ["a", "b", "c"]
3955      * </pre>
3956      *
3957      * @param array  the array to add the element to, may be <code>null</code>
3958      * @param index  the position of the new object
3959      * @param element  the object to add
3960      * @return A new array containing the existing elements and the new element
3961      * @throws IndexOutOfBoundsException if the index is out of range
3962      * (index < 0 || index > array.length).
3963      */
add(Object[] array, int index, Object element)3964     public static Object[] add(Object[] array, int index, Object element) {
3965         Class clss = null;
3966         if (array != null) {
3967             clss = array.getClass().getComponentType();
3968         } else if (element != null) {
3969             clss = element.getClass();
3970         } else {
3971             return new Object[]{null};
3972         }
3973         return (Object[]) add(array, index, element, clss);
3974     }
3975 
3976     /**
3977      * <p>Inserts the specified element at the specified position in the array.
3978      * Shifts the element currently at that position (if any) and any subsequent
3979      * elements to the right (adds one to their indices).</p>
3980      *
3981      * <p>This method returns a new array with the same elements of the input
3982      * array plus the given element on the specified position. The component
3983      * type of the returned array is always the same as that of the input
3984      * array.</p>
3985      *
3986      * <p>If the input array is <code>null</code>, a new one element array is returned
3987      *  whose component type is the same as the element.</p>
3988      *
3989      * <pre>
3990      * ArrayUtils.add(null, 0, true)          = [true]
3991      * ArrayUtils.add([true], 0, false)       = [false, true]
3992      * ArrayUtils.add([false], 1, true)       = [false, true]
3993      * ArrayUtils.add([true, false], 1, true) = [true, true, false]
3994      * </pre>
3995      *
3996      * @param array  the array to add the element to, may be <code>null</code>
3997      * @param index  the position of the new object
3998      * @param element  the object to add
3999      * @return A new array containing the existing elements and the new element
4000      * @throws IndexOutOfBoundsException if the index is out of range
4001      * (index < 0 || index > array.length).
4002      */
add(boolean[] array, int index, boolean element)4003     public static boolean[] add(boolean[] array, int index, boolean element) {
4004         return (boolean[]) add(array, index, BooleanUtils.toBooleanObject(element), Boolean.TYPE);
4005     }
4006 
4007     /**
4008      * <p>Inserts the specified element at the specified position in the array.
4009      * Shifts the element currently at that position (if any) and any subsequent
4010      * elements to the right (adds one to their indices).</p>
4011      *
4012      * <p>This method returns a new array with the same elements of the input
4013      * array plus the given element on the specified position. The component
4014      * type of the returned array is always the same as that of the input
4015      * array.</p>
4016      *
4017      * <p>If the input array is <code>null</code>, a new one element array is returned
4018      *  whose component type is the same as the element.</p>
4019      *
4020      * <pre>
4021      * ArrayUtils.add(null, 0, 'a')            = ['a']
4022      * ArrayUtils.add(['a'], 0, 'b')           = ['b', 'a']
4023      * ArrayUtils.add(['a', 'b'], 0, 'c')      = ['c', 'a', 'b']
4024      * ArrayUtils.add(['a', 'b'], 1, 'k')      = ['a', 'k', 'b']
4025      * ArrayUtils.add(['a', 'b', 'c'], 1, 't') = ['a', 't', 'b', 'c']
4026      * </pre>
4027      *
4028      * @param array  the array to add the element to, may be <code>null</code>
4029      * @param index  the position of the new object
4030      * @param element  the object to add
4031      * @return A new array containing the existing elements and the new element
4032      * @throws IndexOutOfBoundsException if the index is out of range
4033      * (index < 0 || index > array.length).
4034      */
add(char[] array, int index, char element)4035     public static char[] add(char[] array, int index, char element) {
4036         return (char[]) add(array, index, new Character(element), Character.TYPE);
4037     }
4038 
4039     /**
4040      * <p>Inserts the specified element at the specified position in the array.
4041      * Shifts the element currently at that position (if any) and any subsequent
4042      * elements to the right (adds one to their indices).</p>
4043      *
4044      * <p>This method returns a new array with the same elements of the input
4045      * array plus the given element on the specified position. The component
4046      * type of the returned array is always the same as that of the input
4047      * array.</p>
4048      *
4049      * <p>If the input array is <code>null</code>, a new one element array is returned
4050      *  whose component type is the same as the element.</p>
4051      *
4052      * <pre>
4053      * ArrayUtils.add([1], 0, 2)         = [2, 1]
4054      * ArrayUtils.add([2, 6], 2, 3)      = [2, 6, 3]
4055      * ArrayUtils.add([2, 6], 0, 1)      = [1, 2, 6]
4056      * ArrayUtils.add([2, 6, 3], 2, 1)   = [2, 6, 1, 3]
4057      * </pre>
4058      *
4059      * @param array  the array to add the element to, may be <code>null</code>
4060      * @param index  the position of the new object
4061      * @param element  the object to add
4062      * @return A new array containing the existing elements and the new element
4063      * @throws IndexOutOfBoundsException if the index is out of range
4064      * (index < 0 || index > array.length).
4065      */
add(byte[] array, int index, byte element)4066     public static byte[] add(byte[] array, int index, byte element) {
4067         return (byte[]) add(array, index, new Byte(element), Byte.TYPE);
4068     }
4069 
4070     /**
4071      * <p>Inserts the specified element at the specified position in the array.
4072      * Shifts the element currently at that position (if any) and any subsequent
4073      * elements to the right (adds one to their indices).</p>
4074      *
4075      * <p>This method returns a new array with the same elements of the input
4076      * array plus the given element on the specified position. The component
4077      * type of the returned array is always the same as that of the input
4078      * array.</p>
4079      *
4080      * <p>If the input array is <code>null</code>, a new one element array is returned
4081      *  whose component type is the same as the element.</p>
4082      *
4083      * <pre>
4084      * ArrayUtils.add([1], 0, 2)         = [2, 1]
4085      * ArrayUtils.add([2, 6], 2, 10)     = [2, 6, 10]
4086      * ArrayUtils.add([2, 6], 0, -4)     = [-4, 2, 6]
4087      * ArrayUtils.add([2, 6, 3], 2, 1)   = [2, 6, 1, 3]
4088      * </pre>
4089      *
4090      * @param array  the array to add the element to, may be <code>null</code>
4091      * @param index  the position of the new object
4092      * @param element  the object to add
4093      * @return A new array containing the existing elements and the new element
4094      * @throws IndexOutOfBoundsException if the index is out of range
4095      * (index < 0 || index > array.length).
4096      */
add(short[] array, int index, short element)4097     public static short[] add(short[] array, int index, short element) {
4098         return (short[]) add(array, index, new Short(element), Short.TYPE);
4099     }
4100 
4101     /**
4102      * <p>Inserts the specified element at the specified position in the array.
4103      * Shifts the element currently at that position (if any) and any subsequent
4104      * elements to the right (adds one to their indices).</p>
4105      *
4106      * <p>This method returns a new array with the same elements of the input
4107      * array plus the given element on the specified position. The component
4108      * type of the returned array is always the same as that of the input
4109      * array.</p>
4110      *
4111      * <p>If the input array is <code>null</code>, a new one element array is returned
4112      *  whose component type is the same as the element.</p>
4113      *
4114      * <pre>
4115      * ArrayUtils.add([1], 0, 2)         = [2, 1]
4116      * ArrayUtils.add([2, 6], 2, 10)     = [2, 6, 10]
4117      * ArrayUtils.add([2, 6], 0, -4)     = [-4, 2, 6]
4118      * ArrayUtils.add([2, 6, 3], 2, 1)   = [2, 6, 1, 3]
4119      * </pre>
4120      *
4121      * @param array  the array to add the element to, may be <code>null</code>
4122      * @param index  the position of the new object
4123      * @param element  the object to add
4124      * @return A new array containing the existing elements and the new element
4125      * @throws IndexOutOfBoundsException if the index is out of range
4126      * (index < 0 || index > array.length).
4127      */
add(int[] array, int index, int element)4128     public static int[] add(int[] array, int index, int element) {
4129         return (int[]) add(array, index, new Integer(element), Integer.TYPE);
4130     }
4131 
4132     /**
4133      * <p>Inserts the specified element at the specified position in the array.
4134      * Shifts the element currently at that position (if any) and any subsequent
4135      * elements to the right (adds one to their indices).</p>
4136      *
4137      * <p>This method returns a new array with the same elements of the input
4138      * array plus the given element on the specified position. The component
4139      * type of the returned array is always the same as that of the input
4140      * array.</p>
4141      *
4142      * <p>If the input array is <code>null</code>, a new one element array is returned
4143      *  whose component type is the same as the element.</p>
4144      *
4145      * <pre>
4146      * ArrayUtils.add([1L], 0, 2L)           = [2L, 1L]
4147      * ArrayUtils.add([2L, 6L], 2, 10L)      = [2L, 6L, 10L]
4148      * ArrayUtils.add([2L, 6L], 0, -4L)      = [-4L, 2L, 6L]
4149      * ArrayUtils.add([2L, 6L, 3L], 2, 1L)   = [2L, 6L, 1L, 3L]
4150      * </pre>
4151      *
4152      * @param array  the array to add the element to, may be <code>null</code>
4153      * @param index  the position of the new object
4154      * @param element  the object to add
4155      * @return A new array containing the existing elements and the new element
4156      * @throws IndexOutOfBoundsException if the index is out of range
4157      * (index < 0 || index > array.length).
4158      */
add(long[] array, int index, long element)4159     public static long[] add(long[] array, int index, long element) {
4160         return (long[]) add(array, index, new Long(element), Long.TYPE);
4161     }
4162 
4163     /**
4164      * <p>Inserts the specified element at the specified position in the array.
4165      * Shifts the element currently at that position (if any) and any subsequent
4166      * elements to the right (adds one to their indices).</p>
4167      *
4168      * <p>This method returns a new array with the same elements of the input
4169      * array plus the given element on the specified position. The component
4170      * type of the returned array is always the same as that of the input
4171      * array.</p>
4172      *
4173      * <p>If the input array is <code>null</code>, a new one element array is returned
4174      *  whose component type is the same as the element.</p>
4175      *
4176      * <pre>
4177      * ArrayUtils.add([1.1f], 0, 2.2f)               = [2.2f, 1.1f]
4178      * ArrayUtils.add([2.3f, 6.4f], 2, 10.5f)        = [2.3f, 6.4f, 10.5f]
4179      * ArrayUtils.add([2.6f, 6.7f], 0, -4.8f)        = [-4.8f, 2.6f, 6.7f]
4180      * ArrayUtils.add([2.9f, 6.0f, 0.3f], 2, 1.0f)   = [2.9f, 6.0f, 1.0f, 0.3f]
4181      * </pre>
4182      *
4183      * @param array  the array to add the element to, may be <code>null</code>
4184      * @param index  the position of the new object
4185      * @param element  the object to add
4186      * @return A new array containing the existing elements and the new element
4187      * @throws IndexOutOfBoundsException if the index is out of range
4188      * (index < 0 || index > array.length).
4189      */
add(float[] array, int index, float element)4190     public static float[] add(float[] array, int index, float element) {
4191         return (float[]) add(array, index, new Float(element), Float.TYPE);
4192     }
4193 
4194     /**
4195      * <p>Inserts the specified element at the specified position in the array.
4196      * Shifts the element currently at that position (if any) and any subsequent
4197      * elements to the right (adds one to their indices).</p>
4198      *
4199      * <p>This method returns a new array with the same elements of the input
4200      * array plus the given element on the specified position. The component
4201      * type of the returned array is always the same as that of the input
4202      * array.</p>
4203      *
4204      * <p>If the input array is <code>null</code>, a new one element array is returned
4205      *  whose component type is the same as the element.</p>
4206      *
4207      * <pre>
4208      * ArrayUtils.add([1.1], 0, 2.2)              = [2.2, 1.1]
4209      * ArrayUtils.add([2.3, 6.4], 2, 10.5)        = [2.3, 6.4, 10.5]
4210      * ArrayUtils.add([2.6, 6.7], 0, -4.8)        = [-4.8, 2.6, 6.7]
4211      * ArrayUtils.add([2.9, 6.0, 0.3], 2, 1.0)    = [2.9, 6.0, 1.0, 0.3]
4212      * </pre>
4213      *
4214      * @param array  the array to add the element to, may be <code>null</code>
4215      * @param index  the position of the new object
4216      * @param element  the object to add
4217      * @return A new array containing the existing elements and the new element
4218      * @throws IndexOutOfBoundsException if the index is out of range
4219      * (index < 0 || index > array.length).
4220      */
add(double[] array, int index, double element)4221     public static double[] add(double[] array, int index, double element) {
4222         return (double[]) add(array, index, new Double(element), Double.TYPE);
4223     }
4224 
4225     /**
4226      * Underlying implementation of add(array, index, element) methods.
4227      * The last parameter is the class, which may not equal element.getClass
4228      * for primitives.
4229      *
4230      * @param array  the array to add the element to, may be <code>null</code>
4231      * @param index  the position of the new object
4232      * @param element  the object to add
4233      * @param clss the type of the element being added
4234      * @return A new array containing the existing elements and the new element
4235      */
add(Object array, int index, Object element, Class clss)4236     private static Object add(Object array, int index, Object element, Class clss) {
4237         if (array == null) {
4238             if (index != 0) {
4239                 throw new IndexOutOfBoundsException("Index: " + index + ", Length: 0");
4240             }
4241             Object joinedArray = Array.newInstance(clss, 1);
4242             Array.set(joinedArray, 0, element);
4243             return joinedArray;
4244         }
4245         int length = Array.getLength(array);
4246         if (index > length || index < 0) {
4247             throw new IndexOutOfBoundsException("Index: " + index + ", Length: " + length);
4248         }
4249         Object result = Array.newInstance(clss, length + 1);
4250         System.arraycopy(array, 0, result, 0, index);
4251         Array.set(result, index, element);
4252         if (index < length) {
4253             System.arraycopy(array, index, result, index + 1, length - index);
4254         }
4255         return result;
4256     }
4257 
4258     /**
4259      * <p>Removes the element at the specified position from the specified array.
4260      * All subsequent elements are shifted to the left (substracts one from
4261      * their indices).</p>
4262      *
4263      * <p>This method returns a new array with the same elements of the input
4264      * array except the element on the specified position. The component
4265      * type of the returned array is always the same as that of the input
4266      * array.</p>
4267      *
4268      * <p>If the input array is <code>null</code>, an IndexOutOfBoundsException
4269      * will be thrown, because in that case no valid index can be specified.</p>
4270      *
4271      * <pre>
4272      * ArrayUtils.remove(["a"], 0)           = []
4273      * ArrayUtils.remove(["a", "b"], 0)      = ["b"]
4274      * ArrayUtils.remove(["a", "b"], 1)      = ["a"]
4275      * ArrayUtils.remove(["a", "b", "c"], 1) = ["a", "c"]
4276      * </pre>
4277      *
4278      * @param array  the array to remove the element from, may not be <code>null</code>
4279      * @param index  the position of the element to be removed
4280      * @return A new array containing the existing elements except the element
4281      *         at the specified position.
4282      * @throws IndexOutOfBoundsException if the index is out of range
4283      * (index < 0 || index >= array.length), or if the array is <code>null</code>.
4284      * @since 2.1
4285      */
remove(Object[] array, int index)4286     public static Object[] remove(Object[] array, int index) {
4287         return (Object[]) remove((Object) array, index);
4288     }
4289 
4290     /**
4291      * <p>Removes the first occurrence of the specified element from the
4292      * specified array. All subsequent elements are shifted to the left
4293      * (substracts one from their indices). If the array doesn't contains
4294      * such an element, no elements are removed from the array.</p>
4295      *
4296      * <p>This method returns a new array with the same elements of the input
4297      * array except the first occurrence of the specified element. The component
4298      * type of the returned array is always the same as that of the input
4299      * array.</p>
4300      *
4301      * <pre>
4302      * ArrayUtils.removeElement(null, "a")            = null
4303      * ArrayUtils.removeElement([], "a")              = []
4304      * ArrayUtils.removeElement(["a"], "b")           = ["a"]
4305      * ArrayUtils.removeElement(["a", "b"], "a")      = ["b"]
4306      * ArrayUtils.removeElement(["a", "b", "a"], "a") = ["b", "a"]
4307      * </pre>
4308      *
4309      * @param array  the array to remove the element from, may be <code>null</code>
4310      * @param element  the element to be removed
4311      * @return A new array containing the existing elements except the first
4312      *         occurrence of the specified element.
4313      * @since 2.1
4314      */
removeElement(Object[] array, Object element)4315     public static Object[] removeElement(Object[] array, Object element) {
4316         int index = indexOf(array, element);
4317         if (index == INDEX_NOT_FOUND) {
4318             return clone(array);
4319         }
4320         return remove(array, index);
4321     }
4322 
4323     /**
4324      * <p>Removes the element at the specified position from the specified array.
4325      * All subsequent elements are shifted to the left (substracts one from
4326      * their indices).</p>
4327      *
4328      * <p>This method returns a new array with the same elements of the input
4329      * array except the element on the specified position. The component
4330      * type of the returned array is always the same as that of the input
4331      * array.</p>
4332      *
4333      * <p>If the input array is <code>null</code>, an IndexOutOfBoundsException
4334      * will be thrown, because in that case no valid index can be specified.</p>
4335      *
4336      * <pre>
4337      * ArrayUtils.remove([true], 0)              = []
4338      * ArrayUtils.remove([true, false], 0)       = [false]
4339      * ArrayUtils.remove([true, false], 1)       = [true]
4340      * ArrayUtils.remove([true, true, false], 1) = [true, false]
4341      * </pre>
4342      *
4343      * @param array  the array to remove the element from, may not be <code>null</code>
4344      * @param index  the position of the element to be removed
4345      * @return A new array containing the existing elements except the element
4346      *         at the specified position.
4347      * @throws IndexOutOfBoundsException if the index is out of range
4348      * (index < 0 || index >= array.length), or if the array is <code>null</code>.
4349      * @since 2.1
4350      */
remove(boolean[] array, int index)4351     public static boolean[] remove(boolean[] array, int index) {
4352         return (boolean[]) remove((Object) array, index);
4353     }
4354 
4355     /**
4356      * <p>Removes the first occurrence of the specified element from the
4357      * specified array. All subsequent elements are shifted to the left
4358      * (substracts one from their indices). If the array doesn't contains
4359      * such an element, no elements are removed from the array.</p>
4360      *
4361      * <p>This method returns a new array with the same elements of the input
4362      * array except the first occurrence of the specified element. The component
4363      * type of the returned array is always the same as that of the input
4364      * array.</p>
4365      *
4366      * <pre>
4367      * ArrayUtils.removeElement(null, true)                = null
4368      * ArrayUtils.removeElement([], true)                  = []
4369      * ArrayUtils.removeElement([true], false)             = [true]
4370      * ArrayUtils.removeElement([true, false], false)      = [true]
4371      * ArrayUtils.removeElement([true, false, true], true) = [false, true]
4372      * </pre>
4373      *
4374      * @param array  the array to remove the element from, may be <code>null</code>
4375      * @param element  the element to be removed
4376      * @return A new array containing the existing elements except the first
4377      *         occurrence of the specified element.
4378      * @since 2.1
4379      */
removeElement(boolean[] array, boolean element)4380     public static boolean[] removeElement(boolean[] array, boolean element) {
4381         int index = indexOf(array, element);
4382         if (index == INDEX_NOT_FOUND) {
4383             return clone(array);
4384         }
4385         return remove(array, index);
4386     }
4387 
4388     /**
4389      * <p>Removes the element at the specified position from the specified array.
4390      * All subsequent elements are shifted to the left (substracts one from
4391      * their indices).</p>
4392      *
4393      * <p>This method returns a new array with the same elements of the input
4394      * array except the element on the specified position. The component
4395      * type of the returned array is always the same as that of the input
4396      * array.</p>
4397      *
4398      * <p>If the input array is <code>null</code>, an IndexOutOfBoundsException
4399      * will be thrown, because in that case no valid index can be specified.</p>
4400      *
4401      * <pre>
4402      * ArrayUtils.remove([1], 0)          = []
4403      * ArrayUtils.remove([1, 0], 0)       = [0]
4404      * ArrayUtils.remove([1, 0], 1)       = [1]
4405      * ArrayUtils.remove([1, 0, 1], 1)    = [1, 1]
4406      * </pre>
4407      *
4408      * @param array  the array to remove the element from, may not be <code>null</code>
4409      * @param index  the position of the element to be removed
4410      * @return A new array containing the existing elements except the element
4411      *         at the specified position.
4412      * @throws IndexOutOfBoundsException if the index is out of range
4413      * (index < 0 || index >= array.length), or if the array is <code>null</code>.
4414      * @since 2.1
4415      */
remove(byte[] array, int index)4416     public static byte[] remove(byte[] array, int index) {
4417         return (byte[]) remove((Object) array, index);
4418     }
4419 
4420     /**
4421      * <p>Removes the first occurrence of the specified element from the
4422      * specified array. All subsequent elements are shifted to the left
4423      * (substracts one from their indices). If the array doesn't contains
4424      * such an element, no elements are removed from the array.</p>
4425      *
4426      * <p>This method returns a new array with the same elements of the input
4427      * array except the first occurrence of the specified element. The component
4428      * type of the returned array is always the same as that of the input
4429      * array.</p>
4430      *
4431      * <pre>
4432      * ArrayUtils.removeElement(null, 1)        = null
4433      * ArrayUtils.removeElement([], 1)          = []
4434      * ArrayUtils.removeElement([1], 0)         = [1]
4435      * ArrayUtils.removeElement([1, 0], 0)      = [1]
4436      * ArrayUtils.removeElement([1, 0, 1], 1)   = [0, 1]
4437      * </pre>
4438      *
4439      * @param array  the array to remove the element from, may be <code>null</code>
4440      * @param element  the element to be removed
4441      * @return A new array containing the existing elements except the first
4442      *         occurrence of the specified element.
4443      * @since 2.1
4444      */
removeElement(byte[] array, byte element)4445     public static byte[] removeElement(byte[] array, byte element) {
4446         int index = indexOf(array, element);
4447         if (index == INDEX_NOT_FOUND) {
4448             return clone(array);
4449         }
4450         return remove(array, index);
4451     }
4452 
4453     /**
4454      * <p>Removes the element at the specified position from the specified array.
4455      * All subsequent elements are shifted to the left (substracts one from
4456      * their indices).</p>
4457      *
4458      * <p>This method returns a new array with the same elements of the input
4459      * array except the element on the specified position. The component
4460      * type of the returned array is always the same as that of the input
4461      * array.</p>
4462      *
4463      * <p>If the input array is <code>null</code>, an IndexOutOfBoundsException
4464      * will be thrown, because in that case no valid index can be specified.</p>
4465      *
4466      * <pre>
4467      * ArrayUtils.remove(['a'], 0)           = []
4468      * ArrayUtils.remove(['a', 'b'], 0)      = ['b']
4469      * ArrayUtils.remove(['a', 'b'], 1)      = ['a']
4470      * ArrayUtils.remove(['a', 'b', 'c'], 1) = ['a', 'c']
4471      * </pre>
4472      *
4473      * @param array  the array to remove the element from, may not be <code>null</code>
4474      * @param index  the position of the element to be removed
4475      * @return A new array containing the existing elements except the element
4476      *         at the specified position.
4477      * @throws IndexOutOfBoundsException if the index is out of range
4478      * (index < 0 || index >= array.length), or if the array is <code>null</code>.
4479      * @since 2.1
4480      */
remove(char[] array, int index)4481     public static char[] remove(char[] array, int index) {
4482         return (char[]) remove((Object) array, index);
4483     }
4484 
4485     /**
4486      * <p>Removes the first occurrence of the specified element from the
4487      * specified array. All subsequent elements are shifted to the left
4488      * (substracts one from their indices). If the array doesn't contains
4489      * such an element, no elements are removed from the array.</p>
4490      *
4491      * <p>This method returns a new array with the same elements of the input
4492      * array except the first occurrence of the specified element. The component
4493      * type of the returned array is always the same as that of the input
4494      * array.</p>
4495      *
4496      * <pre>
4497      * ArrayUtils.removeElement(null, 'a')            = null
4498      * ArrayUtils.removeElement([], 'a')              = []
4499      * ArrayUtils.removeElement(['a'], 'b')           = ['a']
4500      * ArrayUtils.removeElement(['a', 'b'], 'a')      = ['b']
4501      * ArrayUtils.removeElement(['a', 'b', 'a'], 'a') = ['b', 'a']
4502      * </pre>
4503      *
4504      * @param array  the array to remove the element from, may be <code>null</code>
4505      * @param element  the element to be removed
4506      * @return A new array containing the existing elements except the first
4507      *         occurrence of the specified element.
4508      * @since 2.1
4509      */
removeElement(char[] array, char element)4510     public static char[] removeElement(char[] array, char element) {
4511         int index = indexOf(array, element);
4512         if (index == INDEX_NOT_FOUND) {
4513             return clone(array);
4514         }
4515         return remove(array, index);
4516     }
4517 
4518     /**
4519      * <p>Removes the element at the specified position from the specified array.
4520      * All subsequent elements are shifted to the left (substracts one from
4521      * their indices).</p>
4522      *
4523      * <p>This method returns a new array with the same elements of the input
4524      * array except the element on the specified position. The component
4525      * type of the returned array is always the same as that of the input
4526      * array.</p>
4527      *
4528      * <p>If the input array is <code>null</code>, an IndexOutOfBoundsException
4529      * will be thrown, because in that case no valid index can be specified.</p>
4530      *
4531      * <pre>
4532      * ArrayUtils.remove([1.1], 0)           = []
4533      * ArrayUtils.remove([2.5, 6.0], 0)      = [6.0]
4534      * ArrayUtils.remove([2.5, 6.0], 1)      = [2.5]
4535      * ArrayUtils.remove([2.5, 6.0, 3.8], 1) = [2.5, 3.8]
4536      * </pre>
4537      *
4538      * @param array  the array to remove the element from, may not be <code>null</code>
4539      * @param index  the position of the element to be removed
4540      * @return A new array containing the existing elements except the element
4541      *         at the specified position.
4542      * @throws IndexOutOfBoundsException if the index is out of range
4543      * (index < 0 || index >= array.length), or if the array is <code>null</code>.
4544      * @since 2.1
4545      */
remove(double[] array, int index)4546     public static double[] remove(double[] array, int index) {
4547         return (double[]) remove((Object) array, index);
4548     }
4549 
4550     /**
4551      * <p>Removes the first occurrence of the specified element from the
4552      * specified array. All subsequent elements are shifted to the left
4553      * (substracts one from their indices). If the array doesn't contains
4554      * such an element, no elements are removed from the array.</p>
4555      *
4556      * <p>This method returns a new array with the same elements of the input
4557      * array except the first occurrence of the specified element. The component
4558      * type of the returned array is always the same as that of the input
4559      * array.</p>
4560      *
4561      * <pre>
4562      * ArrayUtils.removeElement(null, 1.1)            = null
4563      * ArrayUtils.removeElement([], 1.1)              = []
4564      * ArrayUtils.removeElement([1.1], 1.2)           = [1.1]
4565      * ArrayUtils.removeElement([1.1, 2.3], 1.1)      = [2.3]
4566      * ArrayUtils.removeElement([1.1, 2.3, 1.1], 1.1) = [2.3, 1.1]
4567      * </pre>
4568      *
4569      * @param array  the array to remove the element from, may be <code>null</code>
4570      * @param element  the element to be removed
4571      * @return A new array containing the existing elements except the first
4572      *         occurrence of the specified element.
4573      * @since 2.1
4574      */
removeElement(double[] array, double element)4575     public static double[] removeElement(double[] array, double element) {
4576         int index = indexOf(array, element);
4577         if (index == INDEX_NOT_FOUND) {
4578             return clone(array);
4579         }
4580         return remove(array, index);
4581     }
4582 
4583     /**
4584      * <p>Removes the element at the specified position from the specified array.
4585      * All subsequent elements are shifted to the left (substracts one from
4586      * their indices).</p>
4587      *
4588      * <p>This method returns a new array with the same elements of the input
4589      * array except the element on the specified position. The component
4590      * type of the returned array is always the same as that of the input
4591      * array.</p>
4592      *
4593      * <p>If the input array is <code>null</code>, an IndexOutOfBoundsException
4594      * will be thrown, because in that case no valid index can be specified.</p>
4595      *
4596      * <pre>
4597      * ArrayUtils.remove([1.1], 0)           = []
4598      * ArrayUtils.remove([2.5, 6.0], 0)      = [6.0]
4599      * ArrayUtils.remove([2.5, 6.0], 1)      = [2.5]
4600      * ArrayUtils.remove([2.5, 6.0, 3.8], 1) = [2.5, 3.8]
4601      * </pre>
4602      *
4603      * @param array  the array to remove the element from, may not be <code>null</code>
4604      * @param index  the position of the element to be removed
4605      * @return A new array containing the existing elements except the element
4606      *         at the specified position.
4607      * @throws IndexOutOfBoundsException if the index is out of range
4608      * (index < 0 || index >= array.length), or if the array is <code>null</code>.
4609      * @since 2.1
4610      */
remove(float[] array, int index)4611     public static float[] remove(float[] array, int index) {
4612         return (float[]) remove((Object) array, index);
4613     }
4614 
4615     /**
4616      * <p>Removes the first occurrence of the specified element from the
4617      * specified array. All subsequent elements are shifted to the left
4618      * (substracts one from their indices). If the array doesn't contains
4619      * such an element, no elements are removed from the array.</p>
4620      *
4621      * <p>This method returns a new array with the same elements of the input
4622      * array except the first occurrence of the specified element. The component
4623      * type of the returned array is always the same as that of the input
4624      * array.</p>
4625      *
4626      * <pre>
4627      * ArrayUtils.removeElement(null, 1.1)            = null
4628      * ArrayUtils.removeElement([], 1.1)              = []
4629      * ArrayUtils.removeElement([1.1], 1.2)           = [1.1]
4630      * ArrayUtils.removeElement([1.1, 2.3], 1.1)      = [2.3]
4631      * ArrayUtils.removeElement([1.1, 2.3, 1.1], 1.1) = [2.3, 1.1]
4632      * </pre>
4633      *
4634      * @param array  the array to remove the element from, may be <code>null</code>
4635      * @param element  the element to be removed
4636      * @return A new array containing the existing elements except the first
4637      *         occurrence of the specified element.
4638      * @since 2.1
4639      */
removeElement(float[] array, float element)4640     public static float[] removeElement(float[] array, float element) {
4641         int index = indexOf(array, element);
4642         if (index == INDEX_NOT_FOUND) {
4643             return clone(array);
4644         }
4645         return remove(array, index);
4646     }
4647 
4648     /**
4649      * <p>Removes the element at the specified position from the specified array.
4650      * All subsequent elements are shifted to the left (substracts one from
4651      * their indices).</p>
4652      *
4653      * <p>This method returns a new array with the same elements of the input
4654      * array except the element on the specified position. The component
4655      * type of the returned array is always the same as that of the input
4656      * array.</p>
4657      *
4658      * <p>If the input array is <code>null</code>, an IndexOutOfBoundsException
4659      * will be thrown, because in that case no valid index can be specified.</p>
4660      *
4661      * <pre>
4662      * ArrayUtils.remove([1], 0)         = []
4663      * ArrayUtils.remove([2, 6], 0)      = [6]
4664      * ArrayUtils.remove([2, 6], 1)      = [2]
4665      * ArrayUtils.remove([2, 6, 3], 1)   = [2, 3]
4666      * </pre>
4667      *
4668      * @param array  the array to remove the element from, may not be <code>null</code>
4669      * @param index  the position of the element to be removed
4670      * @return A new array containing the existing elements except the element
4671      *         at the specified position.
4672      * @throws IndexOutOfBoundsException if the index is out of range
4673      * (index < 0 || index >= array.length), or if the array is <code>null</code>.
4674      * @since 2.1
4675      */
remove(int[] array, int index)4676     public static int[] remove(int[] array, int index) {
4677         return (int[]) remove((Object) array, index);
4678     }
4679 
4680     /**
4681      * <p>Removes the first occurrence of the specified element from the
4682      * specified array. All subsequent elements are shifted to the left
4683      * (substracts one from their indices). If the array doesn't contains
4684      * such an element, no elements are removed from the array.</p>
4685      *
4686      * <p>This method returns a new array with the same elements of the input
4687      * array except the first occurrence of the specified element. The component
4688      * type of the returned array is always the same as that of the input
4689      * array.</p>
4690      *
4691      * <pre>
4692      * ArrayUtils.removeElement(null, 1)      = null
4693      * ArrayUtils.removeElement([], 1)        = []
4694      * ArrayUtils.removeElement([1], 2)       = [1]
4695      * ArrayUtils.removeElement([1, 3], 1)    = [3]
4696      * ArrayUtils.removeElement([1, 3, 1], 1) = [3, 1]
4697      * </pre>
4698      *
4699      * @param array  the array to remove the element from, may be <code>null</code>
4700      * @param element  the element to be removed
4701      * @return A new array containing the existing elements except the first
4702      *         occurrence of the specified element.
4703      * @since 2.1
4704      */
removeElement(int[] array, int element)4705     public static int[] removeElement(int[] array, int element) {
4706         int index = indexOf(array, element);
4707         if (index == INDEX_NOT_FOUND) {
4708             return clone(array);
4709         }
4710         return remove(array, index);
4711     }
4712 
4713     /**
4714      * <p>Removes the element at the specified position from the specified array.
4715      * All subsequent elements are shifted to the left (substracts one from
4716      * their indices).</p>
4717      *
4718      * <p>This method returns a new array with the same elements of the input
4719      * array except the element on the specified position. The component
4720      * type of the returned array is always the same as that of the input
4721      * array.</p>
4722      *
4723      * <p>If the input array is <code>null</code>, an IndexOutOfBoundsException
4724      * will be thrown, because in that case no valid index can be specified.</p>
4725      *
4726      * <pre>
4727      * ArrayUtils.remove([1], 0)         = []
4728      * ArrayUtils.remove([2, 6], 0)      = [6]
4729      * ArrayUtils.remove([2, 6], 1)      = [2]
4730      * ArrayUtils.remove([2, 6, 3], 1)   = [2, 3]
4731      * </pre>
4732      *
4733      * @param array  the array to remove the element from, may not be <code>null</code>
4734      * @param index  the position of the element to be removed
4735      * @return A new array containing the existing elements except the element
4736      *         at the specified position.
4737      * @throws IndexOutOfBoundsException if the index is out of range
4738      * (index < 0 || index >= array.length), or if the array is <code>null</code>.
4739      * @since 2.1
4740      */
remove(long[] array, int index)4741     public static long[] remove(long[] array, int index) {
4742         return (long[]) remove((Object) array, index);
4743     }
4744 
4745     /**
4746      * <p>Removes the first occurrence of the specified element from the
4747      * specified array. All subsequent elements are shifted to the left
4748      * (substracts one from their indices). If the array doesn't contains
4749      * such an element, no elements are removed from the array.</p>
4750      *
4751      * <p>This method returns a new array with the same elements of the input
4752      * array except the first occurrence of the specified element. The component
4753      * type of the returned array is always the same as that of the input
4754      * array.</p>
4755      *
4756      * <pre>
4757      * ArrayUtils.removeElement(null, 1)      = null
4758      * ArrayUtils.removeElement([], 1)        = []
4759      * ArrayUtils.removeElement([1], 2)       = [1]
4760      * ArrayUtils.removeElement([1, 3], 1)    = [3]
4761      * ArrayUtils.removeElement([1, 3, 1], 1) = [3, 1]
4762      * </pre>
4763      *
4764      * @param array  the array to remove the element from, may be <code>null</code>
4765      * @param element  the element to be removed
4766      * @return A new array containing the existing elements except the first
4767      *         occurrence of the specified element.
4768      * @since 2.1
4769      */
removeElement(long[] array, long element)4770     public static long[] removeElement(long[] array, long element) {
4771         int index = indexOf(array, element);
4772         if (index == INDEX_NOT_FOUND) {
4773             return clone(array);
4774         }
4775         return remove(array, index);
4776     }
4777 
4778     /**
4779      * <p>Removes the element at the specified position from the specified array.
4780      * All subsequent elements are shifted to the left (substracts one from
4781      * their indices).</p>
4782      *
4783      * <p>This method returns a new array with the same elements of the input
4784      * array except the element on the specified position. The component
4785      * type of the returned array is always the same as that of the input
4786      * array.</p>
4787      *
4788      * <p>If the input array is <code>null</code>, an IndexOutOfBoundsException
4789      * will be thrown, because in that case no valid index can be specified.</p>
4790      *
4791      * <pre>
4792      * ArrayUtils.remove([1], 0)         = []
4793      * ArrayUtils.remove([2, 6], 0)      = [6]
4794      * ArrayUtils.remove([2, 6], 1)      = [2]
4795      * ArrayUtils.remove([2, 6, 3], 1)   = [2, 3]
4796      * </pre>
4797      *
4798      * @param array  the array to remove the element from, may not be <code>null</code>
4799      * @param index  the position of the element to be removed
4800      * @return A new array containing the existing elements except the element
4801      *         at the specified position.
4802      * @throws IndexOutOfBoundsException if the index is out of range
4803      * (index < 0 || index >= array.length), or if the array is <code>null</code>.
4804      * @since 2.1
4805      */
remove(short[] array, int index)4806     public static short[] remove(short[] array, int index) {
4807         return (short[]) remove((Object) array, index);
4808     }
4809 
4810     /**
4811      * <p>Removes the first occurrence of the specified element from the
4812      * specified array. All subsequent elements are shifted to the left
4813      * (substracts one from their indices). If the array doesn't contains
4814      * such an element, no elements are removed from the array.</p>
4815      *
4816      * <p>This method returns a new array with the same elements of the input
4817      * array except the first occurrence of the specified element. The component
4818      * type of the returned array is always the same as that of the input
4819      * array.</p>
4820      *
4821      * <pre>
4822      * ArrayUtils.removeElement(null, 1)      = null
4823      * ArrayUtils.removeElement([], 1)        = []
4824      * ArrayUtils.removeElement([1], 2)       = [1]
4825      * ArrayUtils.removeElement([1, 3], 1)    = [3]
4826      * ArrayUtils.removeElement([1, 3, 1], 1) = [3, 1]
4827      * </pre>
4828      *
4829      * @param array  the array to remove the element from, may be <code>null</code>
4830      * @param element  the element to be removed
4831      * @return A new array containing the existing elements except the first
4832      *         occurrence of the specified element.
4833      * @since 2.1
4834      */
removeElement(short[] array, short element)4835     public static short[] removeElement(short[] array, short element) {
4836         int index = indexOf(array, element);
4837         if (index == INDEX_NOT_FOUND) {
4838             return clone(array);
4839         }
4840         return remove(array, index);
4841     }
4842 
4843     /**
4844      * <p>Removes the element at the specified position from the specified array.
4845      * All subsequent elements are shifted to the left (substracts one from
4846      * their indices).</p>
4847      *
4848      * <p>This method returns a new array with the same elements of the input
4849      * array except the element on the specified position. The component
4850      * type of the returned array is always the same as that of the input
4851      * array.</p>
4852      *
4853      * <p>If the input array is <code>null</code>, an IndexOutOfBoundsException
4854      * will be thrown, because in that case no valid index can be specified.</p>
4855      *
4856      * @param array  the array to remove the element from, may not be <code>null</code>
4857      * @param index  the position of the element to be removed
4858      * @return A new array containing the existing elements except the element
4859      *         at the specified position.
4860      * @throws IndexOutOfBoundsException if the index is out of range
4861      * (index < 0 || index >= array.length), or if the array is <code>null</code>.
4862      * @since 2.1
4863      */
remove(Object array, int index)4864     private static Object remove(Object array, int index) {
4865         int length = getLength(array);
4866         if (index < 0 || index >= length) {
4867             throw new IndexOutOfBoundsException("Index: " + index + ", Length: " + length);
4868         }
4869 
4870         Object result = Array.newInstance(array.getClass().getComponentType(), length - 1);
4871         System.arraycopy(array, 0, result, 0, index);
4872         if (index < length - 1) {
4873             System.arraycopy(array, index + 1, result, index, length - index - 1);
4874         }
4875 
4876         return result;
4877     }
4878 
4879 }
4880