Collections Data Structure Java

import java.lang.reflect.Array;
/* 
 * 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.
 *
 *
 */
/**
 * @author Stephen Colebourne
 * @author Moritz Petersen
 * @author Fredrik Westermarck
 * @author Nikolay Metchev
 * @author Matthew Hawthorne
 * @author Tim O'Brien
 * @author Pete Gieser
 * @author Gary Gregory
 * @author Ashwin S
 * @author Maarten Coene
 * @since 2.0
 * @version $Id: ArrayUtils.java 632503 2008-03-01 00:21:52Z ggregory $
 */
public class Main {
  // Subarrays
  //-----------------------------------------------------------------------
  /**
   * 

Produces a new array containing the elements between
   * the start and end indices.


   *
   * 

The start index is inclusive, the end index exclusive.
   * Null array input produces null output.


   *
   * 

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
   * Date, the following usage is envisaged:


   *
   * 

   * Date[] someDates = (Date[])ArrayUtils.subarray(allDates, 2, 5);
   * 

   *
   * @param array  the array
   * @param startIndexInclusive  the starting index. Undervalue (<0)
   *      is promoted to 0, overvalue (>array.length) results
   *      in an empty array.
   * @param endIndexExclusive  elements up to endIndex-1 are present in the
   *      returned subarray. Undervalue (< startIndex) produces
   *      empty array, overvalue (>array.length) is demoted to
   *      array length.
   * @return a new array containing the elements between
   *      the start and end indices.
   * @since 2.1
   */
  public static Object[] subarray(Object[] array, int startIndexInclusive, int endIndexExclusive) {
      if (array == null) {
          return null;
      }
      if (startIndexInclusive < 0) {
          startIndexInclusive = 0;
      }
      if (endIndexExclusive > array.length) {
          endIndexExclusive = array.length;
      }
      int newSize = endIndexExclusive - startIndexInclusive;
      Class type = array.getClass().getComponentType();
      if (newSize <= 0) {
          return (Object[]) Array.newInstance(type, 0);
      }
      Object[] subarray = (Object[]) Array.newInstance(type, newSize);
      System.arraycopy(array, startIndexInclusive, subarray, 0, newSize);
      return subarray;
  }
}