You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by eb...@apache.org on 2016/02/01 08:42:44 UTC

[2/3] [lang] CRLF -> LF

http://git-wip-us.apache.org/repos/asf/commons-lang/blob/3b204c07/src/main/java/org/apache/commons/lang3/ArrayUtils.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/commons/lang3/ArrayUtils.java b/src/main/java/org/apache/commons/lang3/ArrayUtils.java
index 7a80e47..ef6b795 100644
--- a/src/main/java/org/apache/commons/lang3/ArrayUtils.java
+++ b/src/main/java/org/apache/commons/lang3/ArrayUtils.java
@@ -1,7893 +1,7893 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3;
-
-import java.lang.reflect.Array;
-import java.util.Arrays;
-import java.util.BitSet;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.apache.commons.lang3.builder.EqualsBuilder;
-import org.apache.commons.lang3.builder.HashCodeBuilder;
-import org.apache.commons.lang3.builder.ToStringBuilder;
-import org.apache.commons.lang3.builder.ToStringStyle;
-import org.apache.commons.lang3.math.NumberUtils;
-import org.apache.commons.lang3.mutable.MutableInt;
-
-/**
- * <p>Operations on arrays, primitive arrays (like {@code int[]}) and
- * primitive wrapper arrays (like {@code Integer[]}).</p>
- *
- * <p>This class tries to handle {@code null} input gracefully.
- * An exception will not be thrown for a {@code null}
- * array input. However, an Object array that contains a {@code null}
- * element may throw an exception. Each method documents its behaviour.</p>
- *
- * <p>#ThreadSafe#</p>
- * @since 2.0
- */
-public class ArrayUtils {
-
-    /**
-     * An empty immutable {@code Object} array.
-     */
-    public static final Object[] EMPTY_OBJECT_ARRAY = new Object[0];
-    /**
-     * An empty immutable {@code Class} array.
-     */
-    public static final Class<?>[] EMPTY_CLASS_ARRAY = new Class[0];
-    /**
-     * An empty immutable {@code String} array.
-     */
-    public static final String[] EMPTY_STRING_ARRAY = new String[0];
-    /**
-     * An empty immutable {@code long} array.
-     */
-    public static final long[] EMPTY_LONG_ARRAY = new long[0];
-    /**
-     * An empty immutable {@code Long} array.
-     */
-    public static final Long[] EMPTY_LONG_OBJECT_ARRAY = new Long[0];
-    /**
-     * An empty immutable {@code int} array.
-     */
-    public static final int[] EMPTY_INT_ARRAY = new int[0];
-    /**
-     * An empty immutable {@code Integer} array.
-     */
-    public static final Integer[] EMPTY_INTEGER_OBJECT_ARRAY = new Integer[0];
-    /**
-     * An empty immutable {@code short} array.
-     */
-    public static final short[] EMPTY_SHORT_ARRAY = new short[0];
-    /**
-     * An empty immutable {@code Short} array.
-     */
-    public static final Short[] EMPTY_SHORT_OBJECT_ARRAY = new Short[0];
-    /**
-     * An empty immutable {@code byte} array.
-     */
-    public static final byte[] EMPTY_BYTE_ARRAY = new byte[0];
-    /**
-     * An empty immutable {@code Byte} array.
-     */
-    public static final Byte[] EMPTY_BYTE_OBJECT_ARRAY = new Byte[0];
-    /**
-     * An empty immutable {@code double} array.
-     */
-    public static final double[] EMPTY_DOUBLE_ARRAY = new double[0];
-    /**
-     * An empty immutable {@code Double} array.
-     */
-    public static final Double[] EMPTY_DOUBLE_OBJECT_ARRAY = new Double[0];
-    /**
-     * An empty immutable {@code float} array.
-     */
-    public static final float[] EMPTY_FLOAT_ARRAY = new float[0];
-    /**
-     * An empty immutable {@code Float} array.
-     */
-    public static final Float[] EMPTY_FLOAT_OBJECT_ARRAY = new Float[0];
-    /**
-     * An empty immutable {@code boolean} array.
-     */
-    public static final boolean[] EMPTY_BOOLEAN_ARRAY = new boolean[0];
-    /**
-     * An empty immutable {@code Boolean} array.
-     */
-    public static final Boolean[] EMPTY_BOOLEAN_OBJECT_ARRAY = new Boolean[0];
-    /**
-     * An empty immutable {@code char} array.
-     */
-    public static final char[] EMPTY_CHAR_ARRAY = new char[0];
-    /**
-     * An empty immutable {@code Character} array.
-     */
-    public static final Character[] EMPTY_CHARACTER_OBJECT_ARRAY = new Character[0];
-
-    /**
-     * The index value when an element is not found in a list or array: {@code -1}.
-     * This value is returned by methods in this class and can also be used in comparisons with values returned by
-     * various method from {@link java.util.List}.
-     */
-    public static final int INDEX_NOT_FOUND = -1;
-
-    /**
-     * <p>ArrayUtils instances should NOT be constructed in standard programming.
-     * Instead, the class should be used as <code>ArrayUtils.clone(new int[] {2})</code>.</p>
-     *
-     * <p>This constructor is public to permit tools that require a JavaBean instance
-     * to operate.</p>
-     */
-    public ArrayUtils() {
-      super();
-    }
-
-
-    // NOTE: Cannot use {@code} to enclose text which includes {}, but <code></code> is OK
-
-
-    // Basic methods handling multi-dimensional arrays
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Outputs an array as a String, treating {@code null} as an empty array.</p>
-     *
-     * <p>Multi-dimensional arrays are handled correctly, including
-     * multi-dimensional primitive arrays.</p>
-     *
-     * <p>The format is that of Java source code, for example <code>{a,b}</code>.</p>
-     *
-     * @param array  the array to get a toString for, may be {@code null}
-     * @return a String representation of the array, '{}' if null array input
-     */
-    public static String toString(final Object array) {
-        return toString(array, "{}");
-    }
-
-    /**
-     * <p>Outputs an array as a String handling {@code null}s.</p>
-     *
-     * <p>Multi-dimensional arrays are handled correctly, including
-     * multi-dimensional primitive arrays.</p>
-     *
-     * <p>The format is that of Java source code, for example <code>{a,b}</code>.</p>
-     *
-     * @param array  the array to get a toString for, may be {@code null}
-     * @param stringIfNull  the String to return if the array is {@code null}
-     * @return a String representation of the array
-     */
-    public static String toString(final Object array, final String stringIfNull) {
-        if (array == null) {
-            return stringIfNull;
-        }
-        return new ToStringBuilder(array, ToStringStyle.SIMPLE_STYLE).append(array).toString();
-    }
-
-    /**
-     * <p>Get a hash code for an array handling multi-dimensional arrays correctly.</p>
-     *
-     * <p>Multi-dimensional primitive arrays are also handled correctly by this method.</p>
-     *
-     * @param array  the array to get a hash code for, {@code null} returns zero
-     * @return a hash code for the array
-     */
-    public static int hashCode(final Object array) {
-        return new HashCodeBuilder().append(array).toHashCode();
-    }
-
-    /**
-     * <p>Compares two arrays, using equals(), handling multi-dimensional arrays
-     * correctly.</p>
-     *
-     * <p>Multi-dimensional primitive arrays are also handled correctly by this method.</p>
-     *
-     * @param array1  the left hand array to compare, may be {@code null}
-     * @param array2  the right hand array to compare, may be {@code null}
-     * @return {@code true} if the arrays are equal
-     * @deprecated this method has been replaced by {@code java.util.Objects.deepEquals(Object, Object)} and will be
-     * removed from future releases.
-     */
-    @Deprecated
-    public static boolean isEquals(final Object array1, final Object array2) {
-        return new EqualsBuilder().append(array1, array2).isEquals();
-    }
-
-    // To map
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Converts the given array into a {@link java.util.Map}. Each element of the array
-     * must be either a {@link java.util.Map.Entry} or an Array, containing at least two
-     * elements, where the first element is used as key and the second as
-     * value.</p>
-     *
-     * <p>This method can be used to initialize:</p>
-     * <pre>
-     * // Create a Map mapping colors.
-     * Map colorMap = MapUtils.toMap(new String[][] {{
-     *     {"RED", "#FF0000"},
-     *     {"GREEN", "#00FF00"},
-     *     {"BLUE", "#0000FF"}});
-     * </pre>
-     *
-     * <p>This method returns {@code null} for a {@code null} input array.</p>
-     *
-     * @param array  an array whose elements are either a {@link java.util.Map.Entry} or
-     *  an Array containing at least two elements, may be {@code null}
-     * @return a {@code Map} that was created from the array
-     * @throws IllegalArgumentException  if one element of this Array is
-     *  itself an Array containing less then two elements
-     * @throws IllegalArgumentException  if the array contains elements other
-     *  than {@link java.util.Map.Entry} and an Array
-     */
-    public static Map<Object, Object> toMap(final Object[] array) {
-        if (array == null) {
-            return null;
-        }
-        final Map<Object, Object> map = new HashMap<Object, Object>((int) (array.length * 1.5));
-        for (int i = 0; i < array.length; i++) {
-            final Object object = array[i];
-            if (object instanceof Map.Entry<?, ?>) {
-                final Map.Entry<?,?> entry = (Map.Entry<?,?>) object;
-                map.put(entry.getKey(), entry.getValue());
-            } else if (object instanceof Object[]) {
-                final Object[] entry = (Object[]) object;
-                if (entry.length < 2) {
-                    throw new IllegalArgumentException("Array element " + i + ", '"
-                        + object
-                        + "', has a length less than 2");
-                }
-                map.put(entry[0], entry[1]);
-            } else {
-                throw new IllegalArgumentException("Array element " + i + ", '"
-                        + object
-                        + "', is neither of type Map.Entry nor an Array");
-            }
-        }
-        return map;
-    }
-
-    // Generic array
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Create a type-safe generic array.</p>
-     *
-     * <p>The Java language does not allow an array to be created from a generic type:</p>
-     *
-     * <pre>
-    public static &lt;T&gt; T[] createAnArray(int size) {
-        return new T[size]; // compiler error here
-    }
-    public static &lt;T&gt; T[] createAnArray(int size) {
-        return (T[])new Object[size]; // ClassCastException at runtime
-    }
-     * </pre>
-     *
-     * <p>Therefore new arrays of generic types can be created with this method.
-     * For example, an array of Strings can be created:</p>
-     *
-     * <pre>
-    String[] array = ArrayUtils.toArray("1", "2");
-    String[] emptyArray = ArrayUtils.&lt;String&gt;toArray();
-     * </pre>
-     *
-     * <p>The method is typically used in scenarios, where the caller itself uses generic types
-     * that have to be combined into an array.</p>
-     *
-     * <p>Note, this method makes only sense to provide arguments of the same type so that the
-     * compiler can deduce the type of the array itself. While it is possible to select the
-     * type explicitly like in
-     * <code>Number[] array = ArrayUtils.&lt;Number&gt;toArray(Integer.valueOf(42), Double.valueOf(Math.PI))</code>,
-     * there is no real advantage when compared to
-     * <code>new Number[] {Integer.valueOf(42), Double.valueOf(Math.PI)}</code>.</p>
-     *
-     * @param  <T>   the array's element type
-     * @param  items  the varargs array items, null allowed
-     * @return the array, not null unless a null array is passed in
-     * @since  3.0
-     */
-    public static <T> T[] toArray(final T... items) {
-        return items;
-    }
-
-    // Clone
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Shallow clones an array returning a typecast result and handling
-     * {@code null}.</p>
-     *
-     * <p>The objects in the array are not cloned, thus there is no special
-     * handling for multi-dimensional arrays.</p>
-     *
-     * <p>This method returns {@code null} for a {@code null} input array.</p>
-     *
-     * @param <T> the component type of the array
-     * @param array  the array to shallow clone, may be {@code null}
-     * @return the cloned array, {@code null} if {@code null} input
-     */
-    public static <T> T[] clone(final T[] array) {
-        if (array == null) {
-            return null;
-        }
-        return array.clone();
-    }
-
-    /**
-     * <p>Clones an array returning a typecast result and handling
-     * {@code null}.</p>
-     *
-     * <p>This method returns {@code null} for a {@code null} input array.</p>
-     *
-     * @param array  the array to clone, may be {@code null}
-     * @return the cloned array, {@code null} if {@code null} input
-     */
-    public static long[] clone(final long[] array) {
-        if (array == null) {
-            return null;
-        }
-        return array.clone();
-    }
-
-    /**
-     * <p>Clones an array returning a typecast result and handling
-     * {@code null}.</p>
-     *
-     * <p>This method returns {@code null} for a {@code null} input array.</p>
-     *
-     * @param array  the array to clone, may be {@code null}
-     * @return the cloned array, {@code null} if {@code null} input
-     */
-    public static int[] clone(final int[] array) {
-        if (array == null) {
-            return null;
-        }
-        return array.clone();
-    }
-
-    /**
-     * <p>Clones an array returning a typecast result and handling
-     * {@code null}.</p>
-     *
-     * <p>This method returns {@code null} for a {@code null} input array.</p>
-     *
-     * @param array  the array to clone, may be {@code null}
-     * @return the cloned array, {@code null} if {@code null} input
-     */
-    public static short[] clone(final short[] array) {
-        if (array == null) {
-            return null;
-        }
-        return array.clone();
-    }
-
-    /**
-     * <p>Clones an array returning a typecast result and handling
-     * {@code null}.</p>
-     *
-     * <p>This method returns {@code null} for a {@code null} input array.</p>
-     *
-     * @param array  the array to clone, may be {@code null}
-     * @return the cloned array, {@code null} if {@code null} input
-     */
-    public static char[] clone(final char[] array) {
-        if (array == null) {
-            return null;
-        }
-        return array.clone();
-    }
-
-    /**
-     * <p>Clones an array returning a typecast result and handling
-     * {@code null}.</p>
-     *
-     * <p>This method returns {@code null} for a {@code null} input array.</p>
-     *
-     * @param array  the array to clone, may be {@code null}
-     * @return the cloned array, {@code null} if {@code null} input
-     */
-    public static byte[] clone(final byte[] array) {
-        if (array == null) {
-            return null;
-        }
-        return array.clone();
-    }
-
-    /**
-     * <p>Clones an array returning a typecast result and handling
-     * {@code null}.</p>
-     *
-     * <p>This method returns {@code null} for a {@code null} input array.</p>
-     *
-     * @param array  the array to clone, may be {@code null}
-     * @return the cloned array, {@code null} if {@code null} input
-     */
-    public static double[] clone(final double[] array) {
-        if (array == null) {
-            return null;
-        }
-        return array.clone();
-    }
-
-    /**
-     * <p>Clones an array returning a typecast result and handling
-     * {@code null}.</p>
-     *
-     * <p>This method returns {@code null} for a {@code null} input array.</p>
-     *
-     * @param array  the array to clone, may be {@code null}
-     * @return the cloned array, {@code null} if {@code null} input
-     */
-    public static float[] clone(final float[] array) {
-        if (array == null) {
-            return null;
-        }
-        return array.clone();
-    }
-
-    /**
-     * <p>Clones an array returning a typecast result and handling
-     * {@code null}.</p>
-     *
-     * <p>This method returns {@code null} for a {@code null} input array.</p>
-     *
-     * @param array  the array to clone, may be {@code null}
-     * @return the cloned array, {@code null} if {@code null} input
-     */
-    public static boolean[] clone(final boolean[] array) {
-        if (array == null) {
-            return null;
-        }
-        return array.clone();
-    }
-
-    // nullToEmpty
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Defensive programming technique to change a {@code null}
-     * reference to an empty one.</p>
-     *
-     * <p>This method returns an empty array for a {@code null} input array.</p>
-     *
-     * @param array  the array to check for {@code null} or empty
-     * @param type   the class representation of the desired array
-     * @return the same array, {@code public static} empty array if {@code null}
-     * @throws IllegalArgumentException if the type argument is null
-     * @since 3.5
-     */
-    public static <T> T[] nullToEmpty(final T[] array, final Class<T[]> type) {
-        if(type == null) {
-            throw new IllegalArgumentException("The type must not be null");
-        }
-
-        if(array == null) {
-            return type.cast(Array.newInstance(type.getComponentType(), 0));
-        }
-        return array;
-    }    
-    
-    
-    /**
-     * <p>Defensive programming technique to change a {@code null}
-     * reference to an empty one.</p>
-     *
-     * <p>This method returns an empty array for a {@code null} input array.</p>
-     *
-     * <p>As a memory optimizing technique an empty array passed in will be overridden with
-     * the empty {@code public static} references in this class.</p>
-     *
-     * @param array  the array to check for {@code null} or empty
-     * @return the same array, {@code public static} empty array if {@code null} or empty input
-     * @since 2.5
-     */
-    public static Object[] nullToEmpty(final Object[] array) {
-        if (isEmpty(array)) {
-            return EMPTY_OBJECT_ARRAY;
-        }
-        return array;
-    }
-
-    /**
-     * <p>Defensive programming technique to change a {@code null}
-     * reference to an empty one.</p>
-     *
-     * <p>This method returns an empty array for a {@code null} input array.</p>
-     *
-     * <p>As a memory optimizing technique an empty array passed in will be overridden with
-     * the empty {@code public static} references in this class.</p>
-     *
-     * @param array  the array to check for {@code null} or empty
-     * @return the same array, {@code public static} empty array if {@code null} or empty input
-     * @since 3.2
-     */
-    public static Class<?>[] nullToEmpty(final Class<?>[] array) {
-        if (isEmpty(array)) {
-            return EMPTY_CLASS_ARRAY;
-        }
-        return array;
-    }
-
-    /**
-     * <p>Defensive programming technique to change a {@code null}
-     * reference to an empty one.</p>
-     *
-     * <p>This method returns an empty array for a {@code null} input array.</p>
-     *
-     * <p>As a memory optimizing technique an empty array passed in will be overridden with
-     * the empty {@code public static} references in this class.</p>
-     *
-     * @param array  the array to check for {@code null} or empty
-     * @return the same array, {@code public static} empty array if {@code null} or empty input
-     * @since 2.5
-     */
-    public static String[] nullToEmpty(final String[] array) {
-        if (isEmpty(array)) {
-            return EMPTY_STRING_ARRAY;
-        }
-        return array;
-    }
-
-    /**
-     * <p>Defensive programming technique to change a {@code null}
-     * reference to an empty one.</p>
-     *
-     * <p>This method returns an empty array for a {@code null} input array.</p>
-     *
-     * <p>As a memory optimizing technique an empty array passed in will be overridden with
-     * the empty {@code public static} references in this class.</p>
-     *
-     * @param array  the array to check for {@code null} or empty
-     * @return the same array, {@code public static} empty array if {@code null} or empty input
-     * @since 2.5
-     */
-    public static long[] nullToEmpty(final long[] array) {
-        if (isEmpty(array)) {
-            return EMPTY_LONG_ARRAY;
-        }
-        return array;
-    }
-
-    /**
-     * <p>Defensive programming technique to change a {@code null}
-     * reference to an empty one.</p>
-     *
-     * <p>This method returns an empty array for a {@code null} input array.</p>
-     *
-     * <p>As a memory optimizing technique an empty array passed in will be overridden with
-     * the empty {@code public static} references in this class.</p>
-     *
-     * @param array  the array to check for {@code null} or empty
-     * @return the same array, {@code public static} empty array if {@code null} or empty input
-     * @since 2.5
-     */
-    public static int[] nullToEmpty(final int[] array) {
-        if (isEmpty(array)) {
-            return EMPTY_INT_ARRAY;
-        }
-        return array;
-    }
-
-    /**
-     * <p>Defensive programming technique to change a {@code null}
-     * reference to an empty one.</p>
-     *
-     * <p>This method returns an empty array for a {@code null} input array.</p>
-     *
-     * <p>As a memory optimizing technique an empty array passed in will be overridden with
-     * the empty {@code public static} references in this class.</p>
-     *
-     * @param array  the array to check for {@code null} or empty
-     * @return the same array, {@code public static} empty array if {@code null} or empty input
-     * @since 2.5
-     */
-    public static short[] nullToEmpty(final short[] array) {
-        if (isEmpty(array)) {
-            return EMPTY_SHORT_ARRAY;
-        }
-        return array;
-    }
-
-    /**
-     * <p>Defensive programming technique to change a {@code null}
-     * reference to an empty one.</p>
-     *
-     * <p>This method returns an empty array for a {@code null} input array.</p>
-     *
-     * <p>As a memory optimizing technique an empty array passed in will be overridden with
-     * the empty {@code public static} references in this class.</p>
-     *
-     * @param array  the array to check for {@code null} or empty
-     * @return the same array, {@code public static} empty array if {@code null} or empty input
-     * @since 2.5
-     */
-    public static char[] nullToEmpty(final char[] array) {
-        if (isEmpty(array)) {
-            return EMPTY_CHAR_ARRAY;
-        }
-        return array;
-    }
-
-    /**
-     * <p>Defensive programming technique to change a {@code null}
-     * reference to an empty one.</p>
-     *
-     * <p>This method returns an empty array for a {@code null} input array.</p>
-     *
-     * <p>As a memory optimizing technique an empty array passed in will be overridden with
-     * the empty {@code public static} references in this class.</p>
-     *
-     * @param array  the array to check for {@code null} or empty
-     * @return the same array, {@code public static} empty array if {@code null} or empty input
-     * @since 2.5
-     */
-    public static byte[] nullToEmpty(final byte[] array) {
-        if (isEmpty(array)) {
-            return EMPTY_BYTE_ARRAY;
-        }
-        return array;
-    }
-
-    /**
-     * <p>Defensive programming technique to change a {@code null}
-     * reference to an empty one.</p>
-     *
-     * <p>This method returns an empty array for a {@code null} input array.</p>
-     *
-     * <p>As a memory optimizing technique an empty array passed in will be overridden with
-     * the empty {@code public static} references in this class.</p>
-     *
-     * @param array  the array to check for {@code null} or empty
-     * @return the same array, {@code public static} empty array if {@code null} or empty input
-     * @since 2.5
-     */
-    public static double[] nullToEmpty(final double[] array) {
-        if (isEmpty(array)) {
-            return EMPTY_DOUBLE_ARRAY;
-        }
-        return array;
-    }
-
-    /**
-     * <p>Defensive programming technique to change a {@code null}
-     * reference to an empty one.</p>
-     *
-     * <p>This method returns an empty array for a {@code null} input array.</p>
-     *
-     * <p>As a memory optimizing technique an empty array passed in will be overridden with
-     * the empty {@code public static} references in this class.</p>
-     *
-     * @param array  the array to check for {@code null} or empty
-     * @return the same array, {@code public static} empty array if {@code null} or empty input
-     * @since 2.5
-     */
-    public static float[] nullToEmpty(final float[] array) {
-        if (isEmpty(array)) {
-            return EMPTY_FLOAT_ARRAY;
-        }
-        return array;
-    }
-
-    /**
-     * <p>Defensive programming technique to change a {@code null}
-     * reference to an empty one.</p>
-     *
-     * <p>This method returns an empty array for a {@code null} input array.</p>
-     *
-     * <p>As a memory optimizing technique an empty array passed in will be overridden with
-     * the empty {@code public static} references in this class.</p>
-     *
-     * @param array  the array to check for {@code null} or empty
-     * @return the same array, {@code public static} empty array if {@code null} or empty input
-     * @since 2.5
-     */
-    public static boolean[] nullToEmpty(final boolean[] array) {
-        if (isEmpty(array)) {
-            return EMPTY_BOOLEAN_ARRAY;
-        }
-        return array;
-    }
-
-    /**
-     * <p>Defensive programming technique to change a {@code null}
-     * reference to an empty one.</p>
-     *
-     * <p>This method returns an empty array for a {@code null} input array.</p>
-     *
-     * <p>As a memory optimizing technique an empty array passed in will be overridden with
-     * the empty {@code public static} references in this class.</p>
-     *
-     * @param array  the array to check for {@code null} or empty
-     * @return the same array, {@code public static} empty array if {@code null} or empty input
-     * @since 2.5
-     */
-    public static Long[] nullToEmpty(final Long[] array) {
-        if (isEmpty(array)) {
-            return EMPTY_LONG_OBJECT_ARRAY;
-        }
-        return array;
-    }
-
-    /**
-     * <p>Defensive programming technique to change a {@code null}
-     * reference to an empty one.</p>
-     *
-     * <p>This method returns an empty array for a {@code null} input array.</p>
-     *
-     * <p>As a memory optimizing technique an empty array passed in will be overridden with
-     * the empty {@code public static} references in this class.</p>
-     *
-     * @param array  the array to check for {@code null} or empty
-     * @return the same array, {@code public static} empty array if {@code null} or empty input
-     * @since 2.5
-     */
-    public static Integer[] nullToEmpty(final Integer[] array) {
-        if (isEmpty(array)) {
-            return EMPTY_INTEGER_OBJECT_ARRAY;
-        }
-        return array;
-    }
-
-    /**
-     * <p>Defensive programming technique to change a {@code null}
-     * reference to an empty one.</p>
-     *
-     * <p>This method returns an empty array for a {@code null} input array.</p>
-     *
-     * <p>As a memory optimizing technique an empty array passed in will be overridden with
-     * the empty {@code public static} references in this class.</p>
-     *
-     * @param array  the array to check for {@code null} or empty
-     * @return the same array, {@code public static} empty array if {@code null} or empty input
-     * @since 2.5
-     */
-    public static Short[] nullToEmpty(final Short[] array) {
-        if (isEmpty(array)) {
-            return EMPTY_SHORT_OBJECT_ARRAY;
-        }
-        return array;
-    }
-
-    /**
-     * <p>Defensive programming technique to change a {@code null}
-     * reference to an empty one.</p>
-     *
-     * <p>This method returns an empty array for a {@code null} input array.</p>
-     *
-     * <p>As a memory optimizing technique an empty array passed in will be overridden with
-     * the empty {@code public static} references in this class.</p>
-     *
-     * @param array  the array to check for {@code null} or empty
-     * @return the same array, {@code public static} empty array if {@code null} or empty input
-     * @since 2.5
-     */
-    public static Character[] nullToEmpty(final Character[] array) {
-        if (isEmpty(array)) {
-            return EMPTY_CHARACTER_OBJECT_ARRAY;
-        }
-        return array;
-    }
-
-    /**
-     * <p>Defensive programming technique to change a {@code null}
-     * reference to an empty one.</p>
-     *
-     * <p>This method returns an empty array for a {@code null} input array.</p>
-     *
-     * <p>As a memory optimizing technique an empty array passed in will be overridden with
-     * the empty {@code public static} references in this class.</p>
-     *
-     * @param array  the array to check for {@code null} or empty
-     * @return the same array, {@code public static} empty array if {@code null} or empty input
-     * @since 2.5
-     */
-    public static Byte[] nullToEmpty(final Byte[] array) {
-        if (isEmpty(array)) {
-            return EMPTY_BYTE_OBJECT_ARRAY;
-        }
-        return array;
-    }
-
-    /**
-     * <p>Defensive programming technique to change a {@code null}
-     * reference to an empty one.</p>
-     *
-     * <p>This method returns an empty array for a {@code null} input array.</p>
-     *
-     * <p>As a memory optimizing technique an empty array passed in will be overridden with
-     * the empty {@code public static} references in this class.</p>
-     *
-     * @param array  the array to check for {@code null} or empty
-     * @return the same array, {@code public static} empty array if {@code null} or empty input
-     * @since 2.5
-     */
-    public static Double[] nullToEmpty(final Double[] array) {
-        if (isEmpty(array)) {
-            return EMPTY_DOUBLE_OBJECT_ARRAY;
-        }
-        return array;
-    }
-
-    /**
-     * <p>Defensive programming technique to change a {@code null}
-     * reference to an empty one.</p>
-     *
-     * <p>This method returns an empty array for a {@code null} input array.</p>
-     *
-     * <p>As a memory optimizing technique an empty array passed in will be overridden with
-     * the empty {@code public static} references in this class.</p>
-     *
-     * @param array  the array to check for {@code null} or empty
-     * @return the same array, {@code public static} empty array if {@code null} or empty input
-     * @since 2.5
-     */
-    public static Float[] nullToEmpty(final Float[] array) {
-        if (isEmpty(array)) {
-            return EMPTY_FLOAT_OBJECT_ARRAY;
-        }
-        return array;
-    }
-
-    /**
-     * <p>Defensive programming technique to change a {@code null}
-     * reference to an empty one.</p>
-     *
-     * <p>This method returns an empty array for a {@code null} input array.</p>
-     *
-     * <p>As a memory optimizing technique an empty array passed in will be overridden with
-     * the empty {@code public static} references in this class.</p>
-     *
-     * @param array  the array to check for {@code null} or empty
-     * @return the same array, {@code public static} empty array if {@code null} or empty input
-     * @since 2.5
-     */
-    public static Boolean[] nullToEmpty(final Boolean[] array) {
-        if (isEmpty(array)) {
-            return EMPTY_BOOLEAN_OBJECT_ARRAY;
-        }
-        return array;
-    }
-
-    // Subarrays
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Produces a new array containing the elements between
-     * the start and end indices.</p>
-     *
-     * <p>The start index is inclusive, the end index exclusive.
-     * Null array input produces null output.</p>
-     *
-     * <p>The component type of the subarray is always the same as
-     * that of the input array. Thus, if the input is an array of type
-     * {@code Date}, the following usage is envisaged:</p>
-     *
-     * <pre>
-     * Date[] someDates = (Date[])ArrayUtils.subarray(allDates, 2, 5);
-     * </pre>
-     *
-     * @param <T> the component type of the array
-     * @param array  the array
-     * @param startIndexInclusive  the starting index. Undervalue (&lt;0)
-     *      is promoted to 0, overvalue (&gt;array.length) results
-     *      in an empty array.
-     * @param endIndexExclusive  elements up to endIndex-1 are present in the
-     *      returned subarray. Undervalue (&lt; startIndex) produces
-     *      empty array, overvalue (&gt;array.length) is demoted to
-     *      array length.
-     * @return a new array containing the elements between
-     *      the start and end indices.
-     * @since 2.1
-     * @see Arrays#copyOfRange(Object[], int, int)
-     */
-    public static <T> T[] subarray(final T[] array, int startIndexInclusive, int endIndexExclusive) {
-        if (array == null) {
-            return null;
-        }
-        if (startIndexInclusive < 0) {
-            startIndexInclusive = 0;
-        }
-        if (endIndexExclusive > array.length) {
-            endIndexExclusive = array.length;
-        }
-        final int newSize = endIndexExclusive - startIndexInclusive;
-        final Class<?> type = array.getClass().getComponentType();
-        if (newSize <= 0) {
-            @SuppressWarnings("unchecked") // OK, because array is of type T
-            final T[] emptyArray = (T[]) Array.newInstance(type, 0);
-            return emptyArray;
-        }
-        @SuppressWarnings("unchecked") // OK, because array is of type T
-        final
-        T[] subarray = (T[]) Array.newInstance(type, newSize);
-        System.arraycopy(array, startIndexInclusive, subarray, 0, newSize);
-        return subarray;
-    }
-
-    /**
-     * <p>Produces a new {@code long} array containing the elements
-     * between the start and end indices.</p>
-     *
-     * <p>The start index is inclusive, the end index exclusive.
-     * Null array input produces null output.</p>
-     *
-     * @param array  the array
-     * @param startIndexInclusive  the starting index. Undervalue (&lt;0)
-     *      is promoted to 0, overvalue (&gt;array.length) results
-     *      in an empty array.
-     * @param endIndexExclusive  elements up to endIndex-1 are present in the
-     *      returned subarray. Undervalue (&lt; startIndex) produces
-     *      empty array, overvalue (&gt;array.length) is demoted to
-     *      array length.
-     * @return a new array containing the elements between
-     *      the start and end indices.
-     * @since 2.1
-     * @see Arrays#copyOfRange(long[], int, int)
-     */
-    public static long[] subarray(final long[] array, int startIndexInclusive, int endIndexExclusive) {
-        if (array == null) {
-            return null;
-        }
-        if (startIndexInclusive < 0) {
-            startIndexInclusive = 0;
-        }
-        if (endIndexExclusive > array.length) {
-            endIndexExclusive = array.length;
-        }
-        final int newSize = endIndexExclusive - startIndexInclusive;
-        if (newSize <= 0) {
-            return EMPTY_LONG_ARRAY;
-        }
-
-        final long[] subarray = new long[newSize];
-        System.arraycopy(array, startIndexInclusive, subarray, 0, newSize);
-        return subarray;
-    }
-
-    /**
-     * <p>Produces a new {@code int} array containing the elements
-     * between the start and end indices.</p>
-     *
-     * <p>The start index is inclusive, the end index exclusive.
-     * Null array input produces null output.</p>
-     *
-     * @param array  the array
-     * @param startIndexInclusive  the starting index. Undervalue (&lt;0)
-     *      is promoted to 0, overvalue (&gt;array.length) results
-     *      in an empty array.
-     * @param endIndexExclusive  elements up to endIndex-1 are present in the
-     *      returned subarray. Undervalue (&lt; startIndex) produces
-     *      empty array, overvalue (&gt;array.length) is demoted to
-     *      array length.
-     * @return a new array containing the elements between
-     *      the start and end indices.
-     * @since 2.1
-     * @see Arrays#copyOfRange(int[], int, int)
-     */
-    public static int[] subarray(final int[] array, int startIndexInclusive, int endIndexExclusive) {
-        if (array == null) {
-            return null;
-        }
-        if (startIndexInclusive < 0) {
-            startIndexInclusive = 0;
-        }
-        if (endIndexExclusive > array.length) {
-            endIndexExclusive = array.length;
-        }
-        final int newSize = endIndexExclusive - startIndexInclusive;
-        if (newSize <= 0) {
-            return EMPTY_INT_ARRAY;
-        }
-
-        final int[] subarray = new int[newSize];
-        System.arraycopy(array, startIndexInclusive, subarray, 0, newSize);
-        return subarray;
-    }
-
-    /**
-     * <p>Produces a new {@code short} array containing the elements
-     * between the start and end indices.</p>
-     *
-     * <p>The start index is inclusive, the end index exclusive.
-     * Null array input produces null output.</p>
-     *
-     * @param array  the array
-     * @param startIndexInclusive  the starting index. Undervalue (&lt;0)
-     *      is promoted to 0, overvalue (&gt;array.length) results
-     *      in an empty array.
-     * @param endIndexExclusive  elements up to endIndex-1 are present in the
-     *      returned subarray. Undervalue (&lt; startIndex) produces
-     *      empty array, overvalue (&gt;array.length) is demoted to
-     *      array length.
-     * @return a new array containing the elements between
-     *      the start and end indices.
-     * @since 2.1
-     * @see Arrays#copyOfRange(short[], int, int)
-     */
-    public static short[] subarray(final short[] array, int startIndexInclusive, int endIndexExclusive) {
-        if (array == null) {
-            return null;
-        }
-        if (startIndexInclusive < 0) {
-            startIndexInclusive = 0;
-        }
-        if (endIndexExclusive > array.length) {
-            endIndexExclusive = array.length;
-        }
-        final int newSize = endIndexExclusive - startIndexInclusive;
-        if (newSize <= 0) {
-            return EMPTY_SHORT_ARRAY;
-        }
-
-        final short[] subarray = new short[newSize];
-        System.arraycopy(array, startIndexInclusive, subarray, 0, newSize);
-        return subarray;
-    }
-
-    /**
-     * <p>Produces a new {@code char} array containing the elements
-     * between the start and end indices.</p>
-     *
-     * <p>The start index is inclusive, the end index exclusive.
-     * Null array input produces null output.</p>
-     *
-     * @param array  the array
-     * @param startIndexInclusive  the starting index. Undervalue (&lt;0)
-     *      is promoted to 0, overvalue (&gt;array.length) results
-     *      in an empty array.
-     * @param endIndexExclusive  elements up to endIndex-1 are present in the
-     *      returned subarray. Undervalue (&lt; startIndex) produces
-     *      empty array, overvalue (&gt;array.length) is demoted to
-     *      array length.
-     * @return a new array containing the elements between
-     *      the start and end indices.
-     * @since 2.1
-     * @see Arrays#copyOfRange(char[], int, int)
-     */
-    public static char[] subarray(final char[] array, int startIndexInclusive, int endIndexExclusive) {
-        if (array == null) {
-            return null;
-        }
-        if (startIndexInclusive < 0) {
-            startIndexInclusive = 0;
-        }
-        if (endIndexExclusive > array.length) {
-            endIndexExclusive = array.length;
-        }
-        final int newSize = endIndexExclusive - startIndexInclusive;
-        if (newSize <= 0) {
-            return EMPTY_CHAR_ARRAY;
-        }
-
-        final char[] subarray = new char[newSize];
-        System.arraycopy(array, startIndexInclusive, subarray, 0, newSize);
-        return subarray;
-    }
-
-    /**
-     * <p>Produces a new {@code byte} array containing the elements
-     * between the start and end indices.</p>
-     *
-     * <p>The start index is inclusive, the end index exclusive.
-     * Null array input produces null output.</p>
-     *
-     * @param array  the array
-     * @param startIndexInclusive  the starting index. Undervalue (&lt;0)
-     *      is promoted to 0, overvalue (&gt;array.length) results
-     *      in an empty array.
-     * @param endIndexExclusive  elements up to endIndex-1 are present in the
-     *      returned subarray. Undervalue (&lt; startIndex) produces
-     *      empty array, overvalue (&gt;array.length) is demoted to
-     *      array length.
-     * @return a new array containing the elements between
-     *      the start and end indices.
-     * @since 2.1
-     * @see Arrays#copyOfRange(byte[], int, int)
-     */
-    public static byte[] subarray(final byte[] array, int startIndexInclusive, int endIndexExclusive) {
-        if (array == null) {
-            return null;
-        }
-        if (startIndexInclusive < 0) {
-            startIndexInclusive = 0;
-        }
-        if (endIndexExclusive > array.length) {
-            endIndexExclusive = array.length;
-        }
-        final int newSize = endIndexExclusive - startIndexInclusive;
-        if (newSize <= 0) {
-            return EMPTY_BYTE_ARRAY;
-        }
-
-        final byte[] subarray = new byte[newSize];
-        System.arraycopy(array, startIndexInclusive, subarray, 0, newSize);
-        return subarray;
-    }
-
-    /**
-     * <p>Produces a new {@code double} array containing the elements
-     * between the start and end indices.</p>
-     *
-     * <p>The start index is inclusive, the end index exclusive.
-     * Null array input produces null output.</p>
-     *
-     * @param array  the array
-     * @param startIndexInclusive  the starting index. Undervalue (&lt;0)
-     *      is promoted to 0, overvalue (&gt;array.length) results
-     *      in an empty array.
-     * @param endIndexExclusive  elements up to endIndex-1 are present in the
-     *      returned subarray. Undervalue (&lt; startIndex) produces
-     *      empty array, overvalue (&gt;array.length) is demoted to
-     *      array length.
-     * @return a new array containing the elements between
-     *      the start and end indices.
-     * @since 2.1
-     * @see Arrays#copyOfRange(double[], int, int)
-     */
-    public static double[] subarray(final double[] array, int startIndexInclusive, int endIndexExclusive) {
-        if (array == null) {
-            return null;
-        }
-        if (startIndexInclusive < 0) {
-            startIndexInclusive = 0;
-        }
-        if (endIndexExclusive > array.length) {
-            endIndexExclusive = array.length;
-        }
-        final int newSize = endIndexExclusive - startIndexInclusive;
-        if (newSize <= 0) {
-            return EMPTY_DOUBLE_ARRAY;
-        }
-
-        final double[] subarray = new double[newSize];
-        System.arraycopy(array, startIndexInclusive, subarray, 0, newSize);
-        return subarray;
-    }
-
-    /**
-     * <p>Produces a new {@code float} array containing the elements
-     * between the start and end indices.</p>
-     *
-     * <p>The start index is inclusive, the end index exclusive.
-     * Null array input produces null output.</p>
-     *
-     * @param array  the array
-     * @param startIndexInclusive  the starting index. Undervalue (&lt;0)
-     *      is promoted to 0, overvalue (&gt;array.length) results
-     *      in an empty array.
-     * @param endIndexExclusive  elements up to endIndex-1 are present in the
-     *      returned subarray. Undervalue (&lt; startIndex) produces
-     *      empty array, overvalue (&gt;array.length) is demoted to
-     *      array length.
-     * @return a new array containing the elements between
-     *      the start and end indices.
-     * @since 2.1
-     * @see Arrays#copyOfRange(float[], int, int)
-     */
-    public static float[] subarray(final float[] array, int startIndexInclusive, int endIndexExclusive) {
-        if (array == null) {
-            return null;
-        }
-        if (startIndexInclusive < 0) {
-            startIndexInclusive = 0;
-        }
-        if (endIndexExclusive > array.length) {
-            endIndexExclusive = array.length;
-        }
-        final int newSize = endIndexExclusive - startIndexInclusive;
-        if (newSize <= 0) {
-            return EMPTY_FLOAT_ARRAY;
-        }
-
-        final float[] subarray = new float[newSize];
-        System.arraycopy(array, startIndexInclusive, subarray, 0, newSize);
-        return subarray;
-    }
-
-    /**
-     * <p>Produces a new {@code boolean} array containing the elements
-     * between the start and end indices.</p>
-     *
-     * <p>The start index is inclusive, the end index exclusive.
-     * Null array input produces null output.</p>
-     *
-     * @param array  the array
-     * @param startIndexInclusive  the starting index. Undervalue (&lt;0)
-     *      is promoted to 0, overvalue (&gt;array.length) results
-     *      in an empty array.
-     * @param endIndexExclusive  elements up to endIndex-1 are present in the
-     *      returned subarray. Undervalue (&lt; startIndex) produces
-     *      empty array, overvalue (&gt;array.length) is demoted to
-     *      array length.
-     * @return a new array containing the elements between
-     *      the start and end indices.
-     * @since 2.1
-     * @see Arrays#copyOfRange(boolean[], int, int)
-     */
-    public static boolean[] subarray(final boolean[] array, int startIndexInclusive, int endIndexExclusive) {
-        if (array == null) {
-            return null;
-        }
-        if (startIndexInclusive < 0) {
-            startIndexInclusive = 0;
-        }
-        if (endIndexExclusive > array.length) {
-            endIndexExclusive = array.length;
-        }
-        final int newSize = endIndexExclusive - startIndexInclusive;
-        if (newSize <= 0) {
-            return EMPTY_BOOLEAN_ARRAY;
-        }
-
-        final boolean[] subarray = new boolean[newSize];
-        System.arraycopy(array, startIndexInclusive, subarray, 0, newSize);
-        return subarray;
-    }
-
-    // Is same length
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Checks whether two arrays are the same length, treating
-     * {@code null} arrays as length {@code 0}.
-     *
-     * <p>Any multi-dimensional aspects of the arrays are ignored.</p>
-     *
-     * @param array1 the first array, may be {@code null}
-     * @param array2 the second array, may be {@code null}
-     * @return {@code true} if length of arrays matches, treating
-     *  {@code null} as an empty array
-     */
-    public static boolean isSameLength(final Object[] array1, final Object[] array2) {
-        return getLength(array1) == getLength(array2);
-    }
-
-    /**
-     * <p>Checks whether two arrays are the same length, treating
-     * {@code null} arrays as length {@code 0}.</p>
-     *
-     * @param array1 the first array, may be {@code null}
-     * @param array2 the second array, may be {@code null}
-     * @return {@code true} if length of arrays matches, treating
-     *  {@code null} as an empty array
-     */
-    public static boolean isSameLength(final long[] array1, final long[] array2) {
-        return getLength(array1) == getLength(array2);
-    }
-
-    /**
-     * <p>Checks whether two arrays are the same length, treating
-     * {@code null} arrays as length {@code 0}.</p>
-     *
-     * @param array1 the first array, may be {@code null}
-     * @param array2 the second array, may be {@code null}
-     * @return {@code true} if length of arrays matches, treating
-     *  {@code null} as an empty array
-     */
-    public static boolean isSameLength(final int[] array1, final int[] array2) {
-        return getLength(array1) == getLength(array2);
-    }
-
-    /**
-     * <p>Checks whether two arrays are the same length, treating
-     * {@code null} arrays as length {@code 0}.</p>
-     *
-     * @param array1 the first array, may be {@code null}
-     * @param array2 the second array, may be {@code null}
-     * @return {@code true} if length of arrays matches, treating
-     *  {@code null} as an empty array
-     */
-    public static boolean isSameLength(final short[] array1, final short[] array2) {
-        return getLength(array1) == getLength(array2);
-    }
-
-    /**
-     * <p>Checks whether two arrays are the same length, treating
-     * {@code null} arrays as length {@code 0}.</p>
-     *
-     * @param array1 the first array, may be {@code null}
-     * @param array2 the second array, may be {@code null}
-     * @return {@code true} if length of arrays matches, treating
-     *  {@code null} as an empty array
-     */
-    public static boolean isSameLength(final char[] array1, final char[] array2) {
-        return getLength(array1) == getLength(array2);
-    }
-
-    /**
-     * <p>Checks whether two arrays are the same length, treating
-     * {@code null} arrays as length {@code 0}.</p>
-     *
-     * @param array1 the first array, may be {@code null}
-     * @param array2 the second array, may be {@code null}
-     * @return {@code true} if length of arrays matches, treating
-     *  {@code null} as an empty array
-     */
-    public static boolean isSameLength(final byte[] array1, final byte[] array2) {
-        return getLength(array1) == getLength(array2);
-    }
-
-    /**
-     * <p>Checks whether two arrays are the same length, treating
-     * {@code null} arrays as length {@code 0}.</p>
-     *
-     * @param array1 the first array, may be {@code null}
-     * @param array2 the second array, may be {@code null}
-     * @return {@code true} if length of arrays matches, treating
-     *  {@code null} as an empty array
-     */
-    public static boolean isSameLength(final double[] array1, final double[] array2) {
-        return getLength(array1) == getLength(array2);
-    }
-
-    /**
-     * <p>Checks whether two arrays are the same length, treating
-     * {@code null} arrays as length {@code 0}.</p>
-     *
-     * @param array1 the first array, may be {@code null}
-     * @param array2 the second array, may be {@code null}
-     * @return {@code true} if length of arrays matches, treating
-     *  {@code null} as an empty array
-     */
-    public static boolean isSameLength(final float[] array1, final float[] array2) {
-        return getLength(array1) == getLength(array2);
-    }
-
-    /**
-     * <p>Checks whether two arrays are the same length, treating
-     * {@code null} arrays as length {@code 0}.</p>
-     *
-     * @param array1 the first array, may be {@code null}
-     * @param array2 the second array, may be {@code null}
-     * @return {@code true} if length of arrays matches, treating
-     *  {@code null} as an empty array
-     */
-    public static boolean isSameLength(final boolean[] array1, final boolean[] array2) {
-        return getLength(array1) == getLength(array2);
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Returns the length of the specified array.
-     * This method can deal with {@code Object} arrays and with primitive arrays.</p>
-     *
-     * <p>If the input array is {@code null}, {@code 0} is returned.</p>
-     *
-     * <pre>
-     * ArrayUtils.getLength(null)            = 0
-     * ArrayUtils.getLength([])              = 0
-     * ArrayUtils.getLength([null])          = 1
-     * ArrayUtils.getLength([true, false])   = 2
-     * ArrayUtils.getLength([1, 2, 3])       = 3
-     * ArrayUtils.getLength(["a", "b", "c"]) = 3
-     * </pre>
-     *
-     * @param array  the array to retrieve the length from, may be null
-     * @return The length of the array, or {@code 0} if the array is {@code null}
-     * @throws IllegalArgumentException if the object argument is not an array.
-     * @since 2.1
-     */
-    public static int getLength(final Object array) {
-        if (array == null) {
-            return 0;
-        }
-        return Array.getLength(array);
-    }
-
-    /**
-     * <p>Checks whether two arrays are the same type taking into account
-     * multi-dimensional arrays.</p>
-     *
-     * @param array1 the first array, must not be {@code null}
-     * @param array2 the second array, must not be {@code null}
-     * @return {@code true} if type of arrays matches
-     * @throws IllegalArgumentException if either array is {@code null}
-     */
-    public static boolean isSameType(final Object array1, final Object array2) {
-        if (array1 == null || array2 == null) {
-            throw new IllegalArgumentException("The Array must not be null");
-        }
-        return array1.getClass().getName().equals(array2.getClass().getName());
-    }
-
-    // Reverse
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Reverses the order of the given array.</p>
-     *
-     * <p>There is no special handling for multi-dimensional arrays.</p>
-     *
-     * <p>This method does nothing for a {@code null} input array.</p>
-     *
-     * @param array  the array to reverse, may be {@code null}
-     */
-    public static void reverse(final Object[] array) {
-        if (array == null) {
-            return;
-        }
-        reverse(array, 0, array.length);
-    }
-
-    /**
-     * <p>Reverses the order of the given array.</p>
-     *
-     * <p>This method does nothing for a {@code null} input array.</p>
-     *
-     * @param array  the array to reverse, may be {@code null}
-     */
-    public static void reverse(final long[] array) {
-        if (array == null) {
-            return;
-        }
-        reverse(array, 0, array.length);
-    }
-
-    /**
-     * <p>Reverses the order of the given array.</p>
-     *
-     * <p>This method does nothing for a {@code null} input array.</p>
-     *
-     * @param array  the array to reverse, may be {@code null}
-     */
-    public static void reverse(final int[] array) {
-        if (array == null) {
-            return;
-        }
-        reverse(array, 0, array.length);
-    }
-
-    /**
-     * <p>Reverses the order of the given array.</p>
-     *
-     * <p>This method does nothing for a {@code null} input array.</p>
-     *
-     * @param array  the array to reverse, may be {@code null}
-     */
-    public static void reverse(final short[] array) {
-        if (array == null) {
-            return;
-        }
-        reverse(array, 0, array.length);
-    }
-
-    /**
-     * <p>Reverses the order of the given array.</p>
-     *
-     * <p>This method does nothing for a {@code null} input array.</p>
-     *
-     * @param array  the array to reverse, may be {@code null}
-     */
-    public static void reverse(final char[] array) {
-        if (array == null) {
-            return;
-        }
-        reverse(array, 0, array.length);
-    }
-
-    /**
-     * <p>Reverses the order of the given array.</p>
-     *
-     * <p>This method does nothing for a {@code null} input array.</p>
-     *
-     * @param array  the array to reverse, may be {@code null}
-     */
-    public static void reverse(final byte[] array) {
-        if (array == null) {
-            return;
-        }
-        reverse(array, 0, array.length);
-    }
-
-    /**
-     * <p>Reverses the order of the given array.</p>
-     *
-     * <p>This method does nothing for a {@code null} input array.</p>
-     *
-     * @param array  the array to reverse, may be {@code null}
-     */
-    public static void reverse(final double[] array) {
-        if (array == null) {
-            return;
-        }
-        reverse(array, 0, array.length);
-    }
-
-    /**
-     * <p>Reverses the order of the given array.</p>
-     *
-     * <p>This method does nothing for a {@code null} input array.</p>
-     *
-     * @param array  the array to reverse, may be {@code null}
-     */
-    public static void reverse(final float[] array) {
-        if (array == null) {
-            return;
-        }
-        reverse(array, 0, array.length);
-    }
-
-    /**
-     * <p>Reverses the order of the given array.</p>
-     *
-     * <p>This method does nothing for a {@code null} input array.</p>
-     *
-     * @param array  the array to reverse, may be {@code null}
-     */
-    public static void reverse(final boolean[] array) {
-        if (array == null) {
-            return;
-        }
-        reverse(array, 0, array.length);
-    }
-
-    /**
-     * <p>
-     * Reverses the order of the given array in the given range.
-     * </p>
-     * 
-     * <p>
-     * This method does nothing for a {@code null} input array.
-     * </p>
-     * 
-     * @param array
-     *            the array to reverse, may be {@code null}
-     * @param startIndexInclusive
-     *            the starting index. Undervalue (&lt;0) is promoted to 0, overvalue (&gt;array.length) results in no
-     *            change.
-     * @param endIndexExclusive
-     *            elements up to endIndex-1 are reversed in the array. Undervalue (&lt; start index) results in no
-     *            change. Overvalue (&gt;array.length) is demoted to array length.
-     * @since 3.2
-     */
-    public static void reverse(final boolean[] array, final int startIndexInclusive, final int endIndexExclusive) {
-        if (array == null) {
-            return;
-        }
-        int i = startIndexInclusive < 0 ? 0 : startIndexInclusive;
-        int j = Math.min(array.length, endIndexExclusive) - 1;
-        boolean tmp;
-        while (j > i) {
-            tmp = array[j];
-            array[j] = array[i];
-            array[i] = tmp;
-            j--;
-            i++;
-        }
-    }
-
-    /**
-     * <p>
-     * Reverses the order of the given array in the given range.
-     * </p>
-     * 
-     * <p>
-     * This method does nothing for a {@code null} input array.
-     * </p>
-     * 
-     * @param array
-     *            the array to reverse, may be {@code null}
-     * @param startIndexInclusive
-     *            the starting index. Undervalue (&lt;0) is promoted to 0, overvalue (&gt;array.length) results in no
-     *            change.
-     * @param endIndexExclusive
-     *            elements up to endIndex-1 are reversed in the array. Undervalue (&lt; start index) results in no
-     *            change. Overvalue (&gt;array.length) is demoted to array length.
-     * @since 3.2
-     */
-    public static void reverse(final byte[] array, final int startIndexInclusive, final int endIndexExclusive) {
-        if (array == null) {
-            return;
-        }
-        int i = startIndexInclusive < 0 ? 0 : startIndexInclusive;
-        int j = Math.min(array.length, endIndexExclusive) - 1;
-        byte tmp;
-        while (j > i) {
-            tmp = array[j];
-            array[j] = array[i];
-            array[i] = tmp;
-            j--;
-            i++;
-        }
-    }
-
-    /**
-     * <p>
-     * Reverses the order of the given array in the given range.
-     * </p>
-     * 
-     * <p>
-     * This method does nothing for a {@code null} input array.
-     * </p>
-     * 
-     * @param array
-     *            the array to reverse, may be {@code null}
-     * @param startIndexInclusive
-     *            the starting index. Undervalue (&lt;0) is promoted to 0, overvalue (&gt;array.length) results in no
-     *            change.
-     * @param endIndexExclusive
-     *            elements up to endIndex-1 are reversed in the array. Undervalue (&lt; start index) results in no
-     *            change. Overvalue (&gt;array.length) is demoted to array length.
-     * @since 3.2
-     */
-    public static void reverse(final char[] array, final int startIndexInclusive, final int endIndexExclusive) {
-        if (array == null) {
-            return;
-        }
-        int i = startIndexInclusive < 0 ? 0 : startIndexInclusive;
-        int j = Math.min(array.length, endIndexExclusive) - 1;
-        char tmp;
-        while (j > i) {
-            tmp = array[j];
-            array[j] = array[i];
-            array[i] = tmp;
-            j--;
-            i++;
-        }
-    }
-
-    /**
-     * <p>
-     * Reverses the order of the given array in the given range.
-     * </p>
-     * 
-     * <p>
-     * This method does nothing for a {@code null} input array.
-     * </p>
-     * 
-     * @param array
-     *            the array to reverse, may be {@code null}
-     * @param startIndexInclusive
-     *            the starting index. Undervalue (&lt;0) is promoted to 0, overvalue (&gt;array.length) results in no
-     *            change.
-     * @param endIndexExclusive
-     *            elements up to endIndex-1 are reversed in the array. Undervalue (&lt; start index) results in no
-     *            change. Overvalue (&gt;array.length) is demoted to array length.
-     * @since 3.2
-     */
-    public static void reverse(final double[] array, final int startIndexInclusive, final int endIndexExclusive) {
-        if (array == null) {
-            return;
-        }
-        int i = startIndexInclusive < 0 ? 0 : startIndexInclusive;
-        int j = Math.min(array.length, endIndexExclusive) - 1;
-        double tmp;
-        while (j > i) {
-            tmp = array[j];
-            array[j] = array[i];
-            array[i] = tmp;
-            j--;
-            i++;
-        }
-    }
-
-    /**
-     * <p>
-     * Reverses the order of the given array in the given range.
-     * </p>
-     * 
-     * <p>
-     * This method does nothing for a {@code null} input array.
-     * </p>
-     * 
-     * @param array
-     *            the array to reverse, may be {@code null}
-     * @param startIndexInclusive
-     *            the starting index. Undervalue (&lt;0) is promoted to 0, overvalue (&gt;array.length) results in no
-     *            change.
-     * @param endIndexExclusive
-     *            elements up to endIndex-1 are reversed in the array. Undervalue (&lt; start index) results in no
-     *            change. Overvalue (&gt;array.length) is demoted to array length.
-     * @since 3.2
-     */
-    public static void reverse(final float[] array, final int startIndexInclusive, final int endIndexExclusive) {
-        if (array == null) {
-            return;
-        }
-        int i = startIndexInclusive < 0 ? 0 : startIndexInclusive;
-        int j = Math.min(array.length, endIndexExclusive) - 1;
-        float tmp;
-        while (j > i) {
-            tmp = array[j];
-            array[j] = array[i];
-            array[i] = tmp;
-            j--;
-            i++;
-        }
-    }
-
-    /**
-     * <p>
-     * Reverses the order of the given array in the given range.
-     * </p>
-     * 
-     * <p>
-     * This method does nothing for a {@code null} input array.
-     * </p>
-     * 
-     * @param array
-     *            the array to reverse, may be {@code null}
-     * @param startIndexInclusive
-     *            the starting index. Undervalue (&lt;0) is promoted to 0, overvalue (&gt;array.length) results in no
-     *            change.
-     * @param endIndexExclusive
-     *            elements up to endIndex-1 are reversed in the array. Undervalue (&lt; start index) results in no
-     *            change. Overvalue (&gt;array.length) is demoted to array length.
-     * @since 3.2
-     */
-    public static void reverse(final int[] array, final int startIndexInclusive, final int endIndexExclusive) {
-        if (array == null) {
-            return;
-        }
-        int i = startIndexInclusive < 0 ? 0 : startIndexInclusive;
-        int j = Math.min(array.length, endIndexExclusive) - 1;
-        int tmp;
-        while (j > i) {
-            tmp = array[j];
-            array[j] = array[i];
-            array[i] = tmp;
-            j--;
-            i++;
-        }
-    }
-
-    /**
-     * <p>
-     * Reverses the order of the given array in the given range.
-     * </p>
-     * 
-     * <p>
-     * This method does nothing for a {@code null} input array.
-     * </p>
-     * 
-     * @param array
-     *            the array to reverse, may be {@code null}
-     * @param startIndexInclusive
-     *            the starting index. Undervalue (&lt;0) is promoted to 0, overvalue (&gt;array.length) results in no
-     *            change.
-     * @param endIndexExclusive
-     *            elements up to endIndex-1 are reversed in the array. Undervalue (&lt; start index) results in no
-     *            change. Overvalue (&gt;array.length) is demoted to array length.
-     * @since 3.2
-     */
-    public static void reverse(final long[] array, final int startIndexInclusive, final int endIndexExclusive) {
-        if (array == null) {
-            return;
-        }
-        int i = startIndexInclusive < 0 ? 0 : startIndexInclusive;
-        int j = Math.min(array.length, endIndexExclusive) - 1;
-        long tmp;
-        while (j > i) {
-            tmp = array[j];
-            array[j] = array[i];
-            array[i] = tmp;
-            j--;
-            i++;
-        }
-    }
-
-    /**
-     * <p>
-     * Reverses the order of the given array in the given range.
-     * </p>
-     * 
-     * <p>
-     * This method does nothing for a {@code null} input array.
-     * </p>
-     * 
-     * @param array
-     *            the array to reverse, may be {@code null}
-     * @param startIndexInclusive
-     *            the starting index. Under value (&lt;0) is promoted to 0, over value (&gt;array.length) results in no
-     *            change.
-     * @param endIndexExclusive
-     *            elements up to endIndex-1 are reversed in the array. Under value (&lt; start index) results in no
-     *            change. Over value (&gt;array.length) is demoted to array length.
-     * @since 3.2
-     */
-    public static void reverse(final Object[] array, final int startIndexInclusive, final int endIndexExclusive) {
-        if (array == null) {
-            return;
-        }
-        int i = startIndexInclusive < 0 ? 0 : startIndexInclusive;
-        int j = Math.min(array.length, endIndexExclusive) - 1;
-        Object tmp;
-        while (j > i) {
-            tmp = array[j];
-            array[j] = array[i];
-            array[i] = tmp;
-            j--;
-            i++;
-        }
-    }
-
-    /**
-     * <p>
-     * Reverses the order of the given array in the given range.
-     * </p>
-     * 
-     * <p>
-     * This method does nothing for a {@code null} input array.
-     * </p>
-     * 
-     * @param array
-     *            the array to reverse, may be {@code null}
-     * @param startIndexInclusive
-     *            the starting index. Undervalue (&lt;0) is promoted to 0, overvalue (&gt;array.length) results in no
-     *            change.
-     * @param endIndexExclusive
-     *            elements up to endIndex-1 are reversed in the array. Undervalue (&lt; start index) results in no
-     *            change. Overvalue (&gt;array.length) is demoted to array length.
-     * @since 3.2
-     */
-    public static void reverse(final short[] array, final int startIndexInclusive, final int endIndexExclusive) {
-        if (array == null) {
-            return;
-        }
-        int i = startIndexInclusive < 0 ? 0 : startIndexInclusive;
-        int j = Math.min(array.length, endIndexExclusive) - 1;
-        short tmp;
-        while (j > i) {
-            tmp = array[j];
-            array[j] = array[i];
-            array[i] = tmp;
-            j--;
-            i++;
-        }
-    }
-
-    // Swap
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Swaps two elements in the given array.</p>
-     *
-     * <p>There is no special handling for multi-dimensional arrays.</p>
-     *
-     * <p>This method does nothing for a {@code null} or empty input array or for overflow indices.
-     * Negative indices are promoted to 0(zero).</p>
-     * 
-     * <p>Examples:
-     *     <ul>
-     *         <li>ArrayUtils.swap(["1", "2", "3"], 0, 2) -> ["3", "2", "1"]</li>
-     *         <li>ArrayUtils.swap(["1", "2", "3"], 0, 0) -> ["1", "2", "3"]</li>
-     *         <li>ArrayUtils.swap(["1", "2", "3"], 1, 0) -> ["2", "1", "3"]</li>
-     *         <li>ArrayUtils.swap(["1", "2", "3"], 0, 5) -> ["1", "2", "3"]</li>
-     *         <li>ArrayUtils.swap(["1", "2", "3"], -1, 1) -> ["2", "1", "3"]</li>
-     *     </ul>
-     * </p>
-     *
-     * @param array the array to swap, may be {@code null}
-     * @param offset1 the index of the first element to swap
-     * @param offset2 the index of the second element to swap
-     */
-    public static void swap(final Object[] array, int offset1, int offset2) {
-        if (array == null || array.length == 0) {
-            return;
-        }
-        swap(array, offset1, offset2, 1);
-    }
-
-    /**
-     * <p>Swaps two elements in the given array.</p>
-     *
-     * <p>There is no special handling for multi-dimensional arrays.</p>
-     *
-     * <p>This method does nothing for a {@code null} or empty input array or for overflow indices.
-     * Negative indices are promoted to 0(zero).</p>
-     *
-     * <p>Examples:
-     *     <ul>
-     *         <li>ArrayUtils.swap([true, false, true], 0, 2) -> [true, false, true]</li>
-     *         <li>ArrayUtils.swap([true, false, true], 0, 0) -> [true, false, true]</li>
-     *         <li>ArrayUtils.swap([true, false, true], 1, 0) -> [false, true, true]</li>
-     *         <li>ArrayUtils.swap([true, false, true], 0, 5) -> [true, false, true]</li>
-     *         <li>ArrayUtils.swap([true, false, true], -1, 1) -> [false, true, true]</li>
-     *     </ul>
-     * </p>
-     * 
-     * @param array  the array to swap, may be {@code null}
-     * @param offset1 the index of the first element to swap
-     * @param offset2 the index of the second element to swap
-     */
-    public static void swap(final long[] array, int offset1, int offset2) {
-        if (array == null || array.length == 0) {
-            return;
-        }
-        swap(array, offset1, offset2, 1);
-    }
-
-    /**
-     * <p>Swaps two elements in the given array.</p>
-     *
-     * <p>This method does nothing for a {@code null} or empty input array or for overflow indices.
-     * Negative indices are promoted to 0(zero).</p>
-     *
-     * <p>Examples:
-     *     <ul>
-     *         <li>ArrayUtils.swap([1, 2, 3], 0, 2) -> [3, 2, 1]</li>
-     *         <li>ArrayUtils.swap([1, 2, 3], 0, 0) -> [1, 2, 3]</li>
-     *         <li>ArrayUtils.swap([1, 2, 3], 1, 0) -> [2, 1, 3]</li>
-     *         <li>ArrayUtils.swap([1, 2, 3], 0, 5) -> [1, 2, 3]</li>
-     *         <li>ArrayUtils.swap([1, 2, 3], -1, 1) -> [2, 1, 3]</li>
-     *     </ul>
-     * </p>
-     *
-     * @param array  the array to swap, may be {@code null}
-     * @param offset1 the index of the first element to swap
-     * @param offset2 the index of the second element to swap
-     */
-    public static void swap(final int[] array, int offset1, int offset2) {
-        if (array == null || array.length == 0) {
-            return;
-        }
-        swap(array, offset1, offset2, 1);
-    }
-
-    /**
-     * <p>Swaps two elements in the given array.</p>
-     *
-     * <p>This method does nothing for a {@code null} or empty input array or for overflow indices.
-     * Negative indices are promoted to 0(zero).</p>
-     *
-     * <p>Examples:
-     *     <ul>
-     *         <li>ArrayUtils.swap([1, 2, 3], 0, 2) -> [3, 2, 1]</li>
-     *         <li>ArrayUtils.swap([1, 2, 3], 0, 0) -> [1, 2, 3]</li>
-     *         <li>ArrayUtils.swap([1, 2, 3], 1, 0) -> [2, 1, 3]</li>
-     *         <li>ArrayUtils.swap([1, 2, 3], 0, 5) -> [1, 2, 3]</li>
-     *         <li>ArrayUtils.swap([1, 2, 3], -1, 1) -> [2, 1, 3]</li>
-     *     </ul>
-     * </p>
-     * 
-     * @param array  the array to swap, may be {@code null}
-     * @param offset1 the index of the first element to swap
-     * @param offset2 the index of the second element to swap
-     */
-    public static void swap(final short[] array, int offset1, int offset2) {
-        if (array == null || array.length == 0) {
-            return;
-        }
-        swap(array, offset1, offset2, 1);
-    }
-
-    /**
-     * <p>Swaps two elements in the given array.</p>
-     *
-     * <p>This method does nothing for a {@code null} or empty input array or for overflow indices.
-     * Negative indices are promoted to 0(zero).</p>
-     * 
-     * <p>Examples:
-     *     <ul>
-     *         <li>ArrayUtils.swap([1, 2, 3], 0, 2) -> [3, 2, 1]</li>
-     *         <li>ArrayUtils.swap([1, 2, 3], 0, 0) -> [1, 2, 3]</li>
-     *         <li>ArrayUtils.swap([1, 2, 3], 1, 0) -> [2, 1, 3]</li>
-     *         <li>ArrayUtils.swap([1, 2, 3], 0, 5) -> [1, 2, 3]</li>
-     *         <li>ArrayUtils.swap([1, 2, 3], -1, 1) -> [2, 1, 3]</li>
-     *     </ul>
-     * </p>
-     *
-     * @param array  the array to swap, may be {@code null}
-     * @param offset1 the index of the first element to swap
-     * @param offset2 the index of the second element to swap
-     */
-    public static void swap(final char[] array, int offset1, int offset2) {
-        if (array == null || array.length == 0) {
-            return;
-        }
-        swap(array, offset1, offset2, 1);
-    }
-
-    /**
-     * <p>Swaps two elements in the given array.</p>
-     *
-     * <p>This method does nothing for a {@code null} or empty input array or for overflow indices.
-     * Negative indices are promoted to 0(zero).</p>
-     *
-     * <p>Examples:
-     *     <ul>
-     *         <li>ArrayUtils.swap([1, 2, 3], 0, 2) -> [3, 2, 1]</li>
-     *         <li>ArrayUtils.swap([1, 2, 3], 0, 0) -> [1, 2, 3]</li>
-     *         <li>ArrayUtils.swap([1, 2, 3], 1, 0) -> [2, 1, 3]</li>
-     *         <li>ArrayUtils.swap([1, 2, 3], 0, 5) -> [1, 2, 3]</li>
-     *         <li>ArrayUtils.swap([1, 2, 3], -1, 1) -> [2, 1, 3]</li>
-     *     </ul>
-     * </p>
-     * 
-     * @param array  the array to swap, may be {@code null}
-     * @param offset1 the index of the first element to swap
-     * @param offset2 the index of the second element to swap
-     */
-    public static void swap(final byte[] array, int offset1, int offset2) {
-        if (array == null || array.length == 0) {
-            return;
-        }
-        swap(array, offset1, offset2, 1);
-    }
-
-    /**
-     * <p>Swaps two elements in the given array.</p>
-     *
-     * <p>This method does nothing for a {@code null} or empty input array or for overflow indices.
-     * Negative indices are promoted to 0(zero).</p>
-     *
-     * <p>Examples:
-     *     <ul>
-     *         <li>ArrayUtils.swap([1, 2, 3], 0, 2) -> [3, 2, 1]</li>
-     *         <li>ArrayUtils.swap([1, 2, 3], 0, 0) -> [1, 2, 3]</li>
-     *         <li>ArrayUtils.swap([1, 2, 3], 1, 0) -> [2, 1, 3]</li>
-     *         <li>ArrayUtils.swap([1, 2, 3], 0, 5) -> [1, 2, 3]</li>
-     *         <li>ArrayUtils.swap([1, 2, 3], -1, 1) -> [2, 1, 3]</li>
-     *     </ul>
-     * </p>
-     * 
-     * @param array  the array to swap, may be {@code null}
-     * @param offset1 the index of the first element to swap
-     * @param offset2 the index of the second element to swap
-     */
-    public static void swap(final double[] array, int offset1, int offset2) {
-        if (array == null || array.length == 0) {
-            return;
-        }
-        swap(array, offset1, offset2, 1);
-    }
-
-    /**
-     * <p>Swaps two elements in the given array.</p>
-     *
-     * <p>This method does nothing for a {@code null} or empty input array or for overflow indices.
-     * Negative indices are promoted to 0(zero).</p>
-     *
-     * <p>Examples:
-     *     <ul>
-     *         <li>ArrayUtils.swap([1, 2, 3], 0, 2) -> [3, 2, 1]</li>
-     *         <li>ArrayUtils.swap([1, 2, 3], 0, 0) -> [1, 2, 3]</li>
-     *         <li>ArrayUtils.swap([1, 2, 3], 1, 0) -> [2, 1, 3]</li>
-     *         <li>ArrayUtils.swap([1, 2, 3], 0, 5) -> [1, 2, 3]</li>
-     *         <li>ArrayUtils.swap([1, 2, 3], -1, 1) -> [2, 1, 3]</li>
-     *     </ul>
-     * </p>
-     * 
-     * @param array  the array to swap, may be {@code null}
-     * @param offset1 the index of the first element to swap
-     * @param offset2 the index of the second element to swap
-     */
-    public static void swap(final float[] array, int offset1, int offset2) {
-        if (array == null || array.length == 0) {
-            return;
-        }
-        swap(array, offset1, offset2, 1);
-    }
-
-    /**
-     * <p>Swaps two elements in the given array.</p>
-     *
-     * <p>This method does nothing for a {@code null} or empty input array or for overflow indices.
-     * Negative indices are promoted to 0(zero).</p>
-     *
-     * <p>Examples:
-     *     <ul>
-     *         <li>ArrayUtils.swap([1, 2, 3], 0, 2) -> [3, 2, 1]</li>
-     *         <li>ArrayUtils.swap([1, 2, 3], 0, 0) -> [1, 2, 3]</li>
-     *         <li>ArrayUtils.swap([1, 2, 3], 1, 0) -> [2, 1, 3]</li>
-     *         <li>ArrayUtils.swap([1, 2, 3], 0, 5) -> [1, 2, 3]</li>
-     *         <li>ArrayUtils.swap([1, 2, 3], -1, 1) -> [2, 1, 3]</li>
-     *     </ul>
-     * </p>
-     * 
-     * @param array  the array to swap, may be {@code null}
-     * @param offset1 the index of the first element to swap
-     * @param offset2 the index of the second element to swap
-     */
-    public static void swap(final boolean[] array, int offset1, int offset2) {
-        if (array == null || array.length == 0) {
-            return;
-        }
-        swap(array, offset1, offset2, 1);
-    }
-
-    /**
-     * <p>Swaps a series of elements in the given array.</p>
-     * 
-     * <p>This method does nothing for a {@code null} or empty input array or for overflow indices.
-     * Negative indices are promoted to 0(zero). 
-     * If any of the sub-arrays to swap falls outside of the given array, 
-     * then the swap is stopped at the end of the array and as many as possible elements are swapped.
-     * </p>
-     * 
-     * <p>Examples:
-     *     <ul>
-     *         <li>ArrayUtils.swap([true, false, true, false], 0, 2, 1) -> [true, false, true, false]</li>
-     *         <li>ArrayUtils.swap([true, false, true, false], 0, 0, 1) -> [true, false, true, false]</li>
-     *         <li>ArrayUtils.swap([true, false, true, false], 0, 2, 2) -> [true, false, true, false]</li>
-     *         <li>ArrayUtils.swap([true, false, true, false], -3, 2, 2) -> [true, false, true, false]</li>
-     *         <li>ArrayUtils.swap([true, false, true, false], 0, 3, 3) -> [false, false, true, true]</li>
-     *     </ul>
-     * </p>
-     * 
-     * @param array the array to swap, may be {@code null}
-     * @param offset1 the index of the first element in the series to swap
-     * @param offset2 the index of the second element in the series to swap
-     * @param len the number of elements to swap starting with the given indices
-     */
-    public static void swap(final boolean[] array,  int offset1, int offset2, int len) {
-        if (array == null || array.length == 0 || offset1 >= array.length || offset2 >= array.length) {
-            return;
-        }
-        if (offset1 < 0) {
-            offset1 = 0;
-        }
-        if (offset2 < 0) {
-            offset2 = 0;
-        }
-        len = Math.min(Math.min(len, array.length - offset1), array.length - offset2);
-        for (int i = 0; i < len; i++, offset1++, offset2++) {
-            boolean aux = array[offset1];
-            array[offset1] = array[offset2];
-            array[offset2] = aux;
-        }
-    }
-
-    /**
-     * <p>Swaps a series of elements in the given array.</p>
-     * 
-     * <p>This method does nothing for a {@code null} or empty input array or for overflow indices.
-     * Negative indices are promoted to 0(zero). 
-     * If any of the sub-arrays to swap falls outside of the given array, 
-     * then the swap is stopped at the end of the array and as many as possible elements are swapped.
-     * </p>
-     * 
-     * <p>Examples:
-     *     <ul>
-     *         <li>ArrayUtils.swap([1, 2, 3, 4], 0, 2, 1) -> [3, 2, 1, 4]</li>
-     *         <li>ArrayUtils.swap([1, 2, 3, 4], 0, 0, 1) -> [1, 2, 3, 4]</li>
-     *         <li>ArrayUtils.swap([1, 2, 3, 4], 2, 0, 2) -> [3, 4, 1, 2]</li>
-     *         <li>ArrayUtils.swap([1, 2, 3, 4], -3, 2, 2) -> [3, 4, 1, 2]</li>
-     *         <li>ArrayUtils.swap([1, 2, 3, 4], 0, 3, 3) -> [4, 2, 3, 1]</li>
-     *     </ul>
-     * </p>
-     * 
-     * @param array the array to swap, may be {@code null}
-     * @param offset1 the index of the first element in the series to swap
-     * @param offset2 the index of the second element in the series to swap
-     * @param len the number of elements to swap starting with the given indices
-     */
-
-    public static void swap(final byte[] array,  int offset1, int offset2, int len) {
-        if (array == null || array.length == 0 || offset1 >= array.length || offset2 >= array.length) {
-            return;
-        }
-        if (offset1 < 0) {
-            offset1 = 0;
-        }
-        if (offset2 < 0) {
-            offset2 = 0;
-        }
-        len = Math.min(Math.min(len, array.length - offset1), array.length - offset2);
-        for (int i = 0; i < len; i++, offset1++, offset2++) {
-            byte aux = array[offset1];
-            array[offset1] = array[offset2];
-            array[offset2] = aux;
-        }
-    }
-
-    /**
-     * <p>Swaps a series of elements in the given array.</p>
-     * 
-     * <p>This method does nothing for a {@code null} or empty input array or for overflow indices.
-     * Negative indices are promoted to 0(zero). 
-     * If any of the sub-arrays to swap falls outside of the given array, 
-     * then the swap is stopped at the end of the array and as many as possible elements are swapped.
-     * </p>
-     * 
-     * <p>Examples:
-     *     <ul>
-     *         <li>ArrayUtils.swap([1, 2, 3, 4], 0, 2, 1) -> [3, 2, 1, 4]</li>
-     *         <li>ArrayUtils.swap([1, 2, 3, 4], 0, 0, 1) -> [1, 2, 3, 4]</li>
-     *         <li>ArrayUtils.swap([1, 2, 3, 4], 2, 0, 2) -> [3, 4, 1, 2]</li>
-     *         <li>ArrayUtils.swap([1, 2, 3, 4], -3, 2, 2) -> [3, 4, 1, 2]</li>
-     *         <li>ArrayUtils.swap([1, 2, 3, 4], 0, 3, 3) -> [4, 2, 3, 1]</li>
-     *     </ul>
-     * </p>
-     * 
-     * @param array the array to swap, may be {@code null}
-     * @param offset1 the index of the first element in the series to swap
-     * @param offset2 the index of the second element in the series to swap
-     * @param len the number of elements to swap starting with the given indices
-     */
-    public static void swap(final char[] array,  int offset1, int offset2, int len) {
-        if (array == null || array.length == 0 || offset1 >= array.length || offset2 >= array.length) {
-            return;
-        }
-        if (offset1 < 0) {
-            offset1 = 0;
-        }
-        if (offset2 < 0) {
-            offset2 = 0;
-        }
-        len = Math.min(Math.min(len, array.length - offset1), array.length - offset2);
-        for (int i = 0; i < len; i++, offset1++, offset2++) {
-            char aux = array[offset1];
-            array[offset1] = array[offset2];
-            array[offset2] = aux;
-        }
-    }
-
-    /**
-     * <p>Swaps a series of elements in the given array.</p>
-     * 
-     * <p>This method does nothing for a {@code null} or empty input array or for overflow indices.
-     * Negative indices are promoted to 0(zero). 
-     * If any of the sub-arrays to swap falls outside of the given array, 
-     * then the swap is stopped at the end of the array and as many as possible elements are swapped.
-     * </p>
-     * 
-     * <p>Examples:
-     *     <ul>
-     *         <li>ArrayUtils.swap([1, 2, 3, 4], 0, 2, 1) -> [3, 2, 1, 4]</li>
-     *         <li>ArrayUtils.swap([1, 2, 3, 4], 0, 0, 1) -> [1, 2, 3, 4]</li>
-     *         <li>ArrayUtils.swap([1, 2, 3, 4], 2, 0, 2) -> [3, 4, 1, 2]</li>
-     *         <li>ArrayUtils.swap([1, 2, 3, 4], -3, 2, 2) -> [3, 4, 1, 2]</li>
-     *         <li>ArrayUtils.swap([1, 2, 3, 4], 0, 3, 3) -> [4, 2, 3, 1]</li>
-     *     </ul>
-     * </p>
-     * 
-     * @param array the array to swap, may be {@code null}
-     * @param offset1 the index of the first element in the series to swap
-     * @param offset2 the index of the second element in the series to swap
-     * @param len the number of elements to swap starting with the given indices
-     */
-    public static void swap(final double[] array,  int offset1, int offset2, int len) {
-        if (array == null || array.length == 0 || offset1 >= array.length || offset2 >= array.length) {
-            return;
-        }
-        if (offset1 < 0) {
-            offset1 = 0;
-        }
-        if (offset2 < 0) {
-            offset2 = 0;
-        }
-        len = Math.min(Math.min(len, array.length - offset1), array.length - offset2);
-        for (int i = 0; i < len; i++, offset1++, offset2++) {
-            double aux = array[offset1];
-            array[offset1] = array[offset2];
-            array[offset2] = aux;
-        }
-    }
-
-    /**
-     * <p>Swaps a series of elements in the given array.</p>
-     * 
-     * <p>This method does nothing for a {@code null} or empty input array or for overflow indices.
-     * Negative in

<TRUNCATED>