由ArrayList构造函数源码引出的问题

由ArrayList构造函数源码引出的问题

  ArrayList应该用得很多了。最近看了看其源码,发现有很多细节,如果要我们自己来实现,估计会考虑不到。当然,这些细节跟jdk本身一些实现的bug有关,如果不去深挖,定然是不能发现。本文从ArrayList的一个构造函数开始剖析。

  该构造函数源代码如下:

复制代码
1 public ArrayList(Collection<? extends E> c) {
2         elementData = c.toArray();
3         size = elementData.length;
4         // c.toArray might (incorrectly) not return Object[] (see 6260652)
5         if (elementData.getClass() != Object[].class)
6             elementData = Arrays.copyOf(elementData, size, Object[].class);
7     }
复制代码

  与上述源代码相关的elementData的申明如下:

1 private transient Object[] elementData;

  注意到,这是一个Object类型的数组。 

我的疑问在于,第四行注释是什么意思?原来,它表明这里涉及到jdk的一个bug,代号6260652。经过查找,在http://bugs.java.com/bugdatabase/view_bug.do?bug_id=6260652中有描述这个bug。它是这么描述的:Arrays.asList(x).toArray().getClass() should be Object[].class。原来,bug由来于Arrays这个工具类。查看源代码:

1 public static <T> List<T> asList(T... a) {
2         return new ArrayList<>(a);
3     }

  这边的ArrayList并非我们常用的java.util.ArrayList,而是Arrays的内部类。它继承自AbstractList,自然实现了Collection接口,代码如下:

复制代码
 1 private static class ArrayList<E> extends AbstractList<E>
 2         implements RandomAccess, java.io.Serializable
 3  {
 4         private static final long serialVersionUID = -2764017481108945198L;
 5         private final E[] a;
 6 
 7         ArrayList(E[] array) {
 8             if (array==null)
 9                 throw new NullPointerException();
10             a = array;
11         }
12 
13         public int size() {
14             return a.length;
15         }
16         。。。。。。
17  }
18     
复制代码

  可以发现,这里的a不是 Object[],而是E[]。a称为该ArrayList的backed array。同时构造函数也是直接用array给a赋值。这就是问题的所在。举个例子:

1     String[] s=new String[]{"hello","world"};
2     List<String> list=Arrays.asList(s);
3     Object[] a=list.toArray();
4     System.out.println(a.getClass().getName());       
 

  上述代码输出的是"[Ljava.lang.String"。说明是String[]。而另一段代码(如下)输出的则是"[Ljava.lang.Object"。

1   ArrayList<String> s=new ArrayList<String>();
2   System.out.println(s.toArray().getClass().getName());

  出于可靠性考虑,需要保证java.util.ArrayList的backed array类型都是Object[]的。故而,文章第一段代码处需要做一个判断,如果参数的toArray得到的类型不是Object[],则做另外的处理。如果不做该处理,会有问题吗?假如有如下代码:

1   List<Object> l = new ArrayList<Object>(Arrays.asList("foo", "bar"));
2    l.set(0, new Object());

  如果不做处理,则会出现ArrayStoreException。因为l中的array类型是String[],不能随意存入Object类型的数据。通过该处理,就把Array.asList的问题在这个地方消除了。

  另一个问题:

  由此也更容易理解另一个问题,就是ArrayList的toArray。该函数有两种实现方式:

复制代码
 1   public Object[] toArray() {
 2         return Arrays.copyOf(elementData, size);
 3     }
 4 
 5   public <T> T[] toArray(T[] a) {
 6         if (a.length < size)
 7             // Make a new array of a's runtime type, but my contents:
 8             return (T[]) Arrays.copyOf(elementData, size, a.getClass());
 9         System.arraycopy(elementData, 0, a, 0, size);
10         if (a.length > size)
11             a[size] = null;
12         return a;
13     }
复制代码

  通常我们使用第二种,如果我们有一个ArrayList<String> s,要把它转换成String[],我们要这样写:

String[] sa=s.toArray(new String[0]);

  第二中返回的是泛型的数组,第一种则是Object[]。如果使用第一种,我们就不便对数组的值进行更改了,因为数组元素的类型是Object,而不是String。如果强制转成String[],则会出现ClassCastException。

  总结:ArrayList中的elementData是Object[],由此带来的问题,也应当在使用的时候注意。

 

 

 

private transient Object[] elementData;

分类:  Java
标签:  Java
0
0
« 上一篇: Linux驱动之内存映射
» 下一篇: 单件模式

posted on 2014-04-13 16:14 zhizhizhiyuan 阅读(145) 评论(1编辑 收藏

评论

#1楼 2017-10-22 21:24 N3verL4nd  

good

附:  Arrays与ArrayList源码
package java.util;


import java.io.Serializable;
import java.lang.reflect.Array;
import java.security.AccessController;
import sun.security.action.GetBooleanAction;


public class Arrays
{
  private static final int INSERTIONSORT_THRESHOLD = 7;


  public static void sort(int[] paramArrayOfInt)
  {
    DualPivotQuicksort.sort(paramArrayOfInt);
  }


  public static void sort(int[] paramArrayOfInt, int paramInt1, int paramInt2)
  {
    rangeCheck(paramArrayOfInt.length, paramInt1, paramInt2);
    DualPivotQuicksort.sort(paramArrayOfInt, paramInt1, paramInt2 - 1);
  }


  public static void sort(long[] paramArrayOfLong)
  {
    DualPivotQuicksort.sort(paramArrayOfLong);
  }


  public static void sort(long[] paramArrayOfLong, int paramInt1, int paramInt2)
  {
    rangeCheck(paramArrayOfLong.length, paramInt1, paramInt2);
    DualPivotQuicksort.sort(paramArrayOfLong, paramInt1, paramInt2 - 1);
  }


  public static void sort(short[] paramArrayOfShort)
  {
    DualPivotQuicksort.sort(paramArrayOfShort);
  }


  public static void sort(short[] paramArrayOfShort, int paramInt1, int paramInt2)
  {
    rangeCheck(paramArrayOfShort.length, paramInt1, paramInt2);
    DualPivotQuicksort.sort(paramArrayOfShort, paramInt1, paramInt2 - 1);
  }


  public static void sort(char[] paramArrayOfChar)
  {
    DualPivotQuicksort.sort(paramArrayOfChar);
  }


  public static void sort(char[] paramArrayOfChar, int paramInt1, int paramInt2)
  {
    rangeCheck(paramArrayOfChar.length, paramInt1, paramInt2);
    DualPivotQuicksort.sort(paramArrayOfChar, paramInt1, paramInt2 - 1);
  }


  public static void sort(byte[] paramArrayOfByte)
  {
    DualPivotQuicksort.sort(paramArrayOfByte);
  }


  public static void sort(byte[] paramArrayOfByte, int paramInt1, int paramInt2)
  {
    rangeCheck(paramArrayOfByte.length, paramInt1, paramInt2);
    DualPivotQuicksort.sort(paramArrayOfByte, paramInt1, paramInt2 - 1);
  }


  public static void sort(float[] paramArrayOfFloat)
  {
    DualPivotQuicksort.sort(paramArrayOfFloat);
  }


  public static void sort(float[] paramArrayOfFloat, int paramInt1, int paramInt2)
  {
    rangeCheck(paramArrayOfFloat.length, paramInt1, paramInt2);
    DualPivotQuicksort.sort(paramArrayOfFloat, paramInt1, paramInt2 - 1);
  }


  public static void sort(double[] paramArrayOfDouble)
  {
    DualPivotQuicksort.sort(paramArrayOfDouble);
  }


  public static void sort(double[] paramArrayOfDouble, int paramInt1, int paramInt2)
  {
    rangeCheck(paramArrayOfDouble.length, paramInt1, paramInt2);
    DualPivotQuicksort.sort(paramArrayOfDouble, paramInt1, paramInt2 - 1);
  }


  public static void sort(Object[] paramArrayOfObject)
  {
    if (LegacyMergeSort.userRequested)
      legacyMergeSort(paramArrayOfObject);
    else
      ComparableTimSort.sort(paramArrayOfObject);
  }


  private static void legacyMergeSort(Object[] paramArrayOfObject)
  {
    Object[] arrayOfObject = (Object[])paramArrayOfObject.clone();
    mergeSort(arrayOfObject, paramArrayOfObject, 0, paramArrayOfObject.length, 0);
  }


  public static void sort(Object[] paramArrayOfObject, int paramInt1, int paramInt2)
  {
    if (LegacyMergeSort.userRequested)
      legacyMergeSort(paramArrayOfObject, paramInt1, paramInt2);
    else
      ComparableTimSort.sort(paramArrayOfObject, paramInt1, paramInt2);
  }


  private static void legacyMergeSort(Object[] paramArrayOfObject, int paramInt1, int paramInt2)
  {
    rangeCheck(paramArrayOfObject.length, paramInt1, paramInt2);
    Object[] arrayOfObject = copyOfRange(paramArrayOfObject, paramInt1, paramInt2);
    mergeSort(arrayOfObject, paramArrayOfObject, paramInt1, paramInt2, -paramInt1);
  }


  private static void mergeSort(Object[] paramArrayOfObject1, Object[] paramArrayOfObject2, int paramInt1, int paramInt2, int paramInt3)
  {
    int i = paramInt2 - paramInt1;
    if (i < 7)
    {
      for (j = paramInt1; j < paramInt2; j++)
        for (k = j; (k > paramInt1) && (((Comparable)paramArrayOfObject2[(k - 1)]).compareTo(paramArrayOfObject2[k]) > 0); k--)
          swap(paramArrayOfObject2, k, k - 1);
      return;
    }
    int j = paramInt1;
    int k = paramInt2;
    paramInt1 += paramInt3;
    paramInt2 += paramInt3;
    int m = paramInt1 + paramInt2 >>> 1;
    mergeSort(paramArrayOfObject2, paramArrayOfObject1, paramInt1, m, -paramInt3);
    mergeSort(paramArrayOfObject2, paramArrayOfObject1, m, paramInt2, -paramInt3);
    if (((Comparable)paramArrayOfObject1[(m - 1)]).compareTo(paramArrayOfObject1[m]) <= 0)
    {
      System.arraycopy(paramArrayOfObject1, paramInt1, paramArrayOfObject2, j, i);
      return;
    }
    int n = j;
    int i1 = paramInt1;
    int i2 = m;
    while (n < k)
    {
      if ((i2 >= paramInt2) || ((i1 < m) && (((Comparable)paramArrayOfObject1[i1]).compareTo(paramArrayOfObject1[i2]) <= 0)))
        paramArrayOfObject2[n] = paramArrayOfObject1[(i1++)];
      else
        paramArrayOfObject2[n] = paramArrayOfObject1[(i2++)];
      n++;
    }
  }


  private static void swap(Object[] paramArrayOfObject, int paramInt1, int paramInt2)
  {
    Object localObject = paramArrayOfObject[paramInt1];
    paramArrayOfObject[paramInt1] = paramArrayOfObject[paramInt2];
    paramArrayOfObject[paramInt2] = localObject;
  }


  public static <T> void sort(T[] paramArrayOfT, Comparator<? super T> paramComparator)
  {
    if (LegacyMergeSort.userRequested)
      legacyMergeSort(paramArrayOfT, paramComparator);
    else
      TimSort.sort(paramArrayOfT, paramComparator);
  }


  private static <T> void legacyMergeSort(T[] paramArrayOfT, Comparator<? super T> paramComparator)
  {
    Object[] arrayOfObject = (Object[])paramArrayOfT.clone();
    if (paramComparator == null)
      mergeSort(arrayOfObject, paramArrayOfT, 0, paramArrayOfT.length, 0);
    else
      mergeSort(arrayOfObject, paramArrayOfT, 0, paramArrayOfT.length, 0, paramComparator);
  }


  public static <T> void sort(T[] paramArrayOfT, int paramInt1, int paramInt2, Comparator<? super T> paramComparator)
  {
    if (LegacyMergeSort.userRequested)
      legacyMergeSort(paramArrayOfT, paramInt1, paramInt2, paramComparator);
    else
      TimSort.sort(paramArrayOfT, paramInt1, paramInt2, paramComparator);
  }


  private static <T> void legacyMergeSort(T[] paramArrayOfT, int paramInt1, int paramInt2, Comparator<? super T> paramComparator)
  {
    rangeCheck(paramArrayOfT.length, paramInt1, paramInt2);
    Object[] arrayOfObject = copyOfRange(paramArrayOfT, paramInt1, paramInt2);
    if (paramComparator == null)
      mergeSort(arrayOfObject, paramArrayOfT, paramInt1, paramInt2, -paramInt1);
    else
      mergeSort(arrayOfObject, paramArrayOfT, paramInt1, paramInt2, -paramInt1, paramComparator);
  }


  private static void mergeSort(Object[] paramArrayOfObject1, Object[] paramArrayOfObject2, int paramInt1, int paramInt2, int paramInt3, Comparator paramComparator)
  {
    int i = paramInt2 - paramInt1;
    if (i < 7)
    {
      for (j = paramInt1; j < paramInt2; j++)
        for (k = j; (k > paramInt1) && (paramComparator.compare(paramArrayOfObject2[(k - 1)], paramArrayOfObject2[k]) > 0); k--)
          swap(paramArrayOfObject2, k, k - 1);
      return;
    }
    int j = paramInt1;
    int k = paramInt2;
    paramInt1 += paramInt3;
    paramInt2 += paramInt3;
    int m = paramInt1 + paramInt2 >>> 1;
    mergeSort(paramArrayOfObject2, paramArrayOfObject1, paramInt1, m, -paramInt3, paramComparator);
    mergeSort(paramArrayOfObject2, paramArrayOfObject1, m, paramInt2, -paramInt3, paramComparator);
    if (paramComparator.compare(paramArrayOfObject1[(m - 1)], paramArrayOfObject1[m]) <= 0)
    {
      System.arraycopy(paramArrayOfObject1, paramInt1, paramArrayOfObject2, j, i);
      return;
    }
    int n = j;
    int i1 = paramInt1;
    int i2 = m;
    while (n < k)
    {
      if ((i2 >= paramInt2) || ((i1 < m) && (paramComparator.compare(paramArrayOfObject1[i1], paramArrayOfObject1[i2]) <= 0)))
        paramArrayOfObject2[n] = paramArrayOfObject1[(i1++)];
      else
        paramArrayOfObject2[n] = paramArrayOfObject1[(i2++)];
      n++;
    }
  }


  private static void rangeCheck(int paramInt1, int paramInt2, int paramInt3)
  {
    if (paramInt2 > paramInt3)
      throw new IllegalArgumentException("fromIndex(" + paramInt2 + ") > toIndex(" + paramInt3 + ")");
    if (paramInt2 < 0)
      throw new ArrayIndexOutOfBoundsException(paramInt2);
    if (paramInt3 > paramInt1)
      throw new ArrayIndexOutOfBoundsException(paramInt3);
  }


  public static int binarySearch(long[] paramArrayOfLong, long paramLong)
  {
    return binarySearch0(paramArrayOfLong, 0, paramArrayOfLong.length, paramLong);
  }


  public static int binarySearch(long[] paramArrayOfLong, int paramInt1, int paramInt2, long paramLong)
  {
    rangeCheck(paramArrayOfLong.length, paramInt1, paramInt2);
    return binarySearch0(paramArrayOfLong, paramInt1, paramInt2, paramLong);
  }


  private static int binarySearch0(long[] paramArrayOfLong, int paramInt1, int paramInt2, long paramLong)
  {
    int i = paramInt1;
    int j = paramInt2 - 1;
    while (i <= j)
    {
      int k = i + j >>> 1;
      long l = paramArrayOfLong[k];
      if (l < paramLong)
        i = k + 1;
      else if (l > paramLong)
        j = k - 1;
      else
        return k;
    }
    return -(i + 1);
  }


  public static int binarySearch(int[] paramArrayOfInt, int paramInt)
  {
    return binarySearch0(paramArrayOfInt, 0, paramArrayOfInt.length, paramInt);
  }


  public static int binarySearch(int[] paramArrayOfInt, int paramInt1, int paramInt2, int paramInt3)
  {
    rangeCheck(paramArrayOfInt.length, paramInt1, paramInt2);
    return binarySearch0(paramArrayOfInt, paramInt1, paramInt2, paramInt3);
  }


  private static int binarySearch0(int[] paramArrayOfInt, int paramInt1, int paramInt2, int paramInt3)
  {
    int i = paramInt1;
    int j = paramInt2 - 1;
    while (i <= j)
    {
      int k = i + j >>> 1;
      int m = paramArrayOfInt[k];
      if (m < paramInt3)
        i = k + 1;
      else if (m > paramInt3)
        j = k - 1;
      else
        return k;
    }
    return -(i + 1);
  }


  public static int binarySearch(short[] paramArrayOfShort, short paramShort)
  {
    return binarySearch0(paramArrayOfShort, 0, paramArrayOfShort.length, paramShort);
  }


  public static int binarySearch(short[] paramArrayOfShort, int paramInt1, int paramInt2, short paramShort)
  {
    rangeCheck(paramArrayOfShort.length, paramInt1, paramInt2);
    return binarySearch0(paramArrayOfShort, paramInt1, paramInt2, paramShort);
  }


  private static int binarySearch0(short[] paramArrayOfShort, int paramInt1, int paramInt2, short paramShort)
  {
    int i = paramInt1;
    int j = paramInt2 - 1;
    while (i <= j)
    {
      int k = i + j >>> 1;
      short s = paramArrayOfShort[k];
      if (s < paramShort)
        i = k + 1;
      else if (s > paramShort)
        j = k - 1;
      else
        return k;
    }
    return -(i + 1);
  }


  public static int binarySearch(char[] paramArrayOfChar, char paramChar)
  {
    return binarySearch0(paramArrayOfChar, 0, paramArrayOfChar.length, paramChar);
  }


  public static int binarySearch(char[] paramArrayOfChar, int paramInt1, int paramInt2, char paramChar)
  {
    rangeCheck(paramArrayOfChar.length, paramInt1, paramInt2);
    return binarySearch0(paramArrayOfChar, paramInt1, paramInt2, paramChar);
  }


  private static int binarySearch0(char[] paramArrayOfChar, int paramInt1, int paramInt2, char paramChar)
  {
    int i = paramInt1;
    int j = paramInt2 - 1;
    while (i <= j)
    {
      int k = i + j >>> 1;
      char c = paramArrayOfChar[k];
      if (c < paramChar)
        i = k + 1;
      else if (c > paramChar)
        j = k - 1;
      else
        return k;
    }
    return -(i + 1);
  }


  public static int binarySearch(byte[] paramArrayOfByte, byte paramByte)
  {
    return binarySearch0(paramArrayOfByte, 0, paramArrayOfByte.length, paramByte);
  }


  public static int binarySearch(byte[] paramArrayOfByte, int paramInt1, int paramInt2, byte paramByte)
  {
    rangeCheck(paramArrayOfByte.length, paramInt1, paramInt2);
    return binarySearch0(paramArrayOfByte, paramInt1, paramInt2, paramByte);
  }


  private static int binarySearch0(byte[] paramArrayOfByte, int paramInt1, int paramInt2, byte paramByte)
  {
    int i = paramInt1;
    int j = paramInt2 - 1;
    while (i <= j)
    {
      int k = i + j >>> 1;
      byte b = paramArrayOfByte[k];
      if (b < paramByte)
        i = k + 1;
      else if (b > paramByte)
        j = k - 1;
      else
        return k;
    }
    return -(i + 1);
  }


  public static int binarySearch(double[] paramArrayOfDouble, double paramDouble)
  {
    return binarySearch0(paramArrayOfDouble, 0, paramArrayOfDouble.length, paramDouble);
  }


  public static int binarySearch(double[] paramArrayOfDouble, int paramInt1, int paramInt2, double paramDouble)
  {
    rangeCheck(paramArrayOfDouble.length, paramInt1, paramInt2);
    return binarySearch0(paramArrayOfDouble, paramInt1, paramInt2, paramDouble);
  }


  private static int binarySearch0(double[] paramArrayOfDouble, int paramInt1, int paramInt2, double paramDouble)
  {
    int i = paramInt1;
    int j = paramInt2 - 1;
    while (i <= j)
    {
      int k = i + j >>> 1;
      double d = paramArrayOfDouble[k];
      if (d < paramDouble)
      {
        i = k + 1;
      }
      else if (d > paramDouble)
      {
        j = k - 1;
      }
      else
      {
        long l1 = Double.doubleToLongBits(d);
        long l2 = Double.doubleToLongBits(paramDouble);
        if (l1 == l2)
          return k;
        if (l1 < l2)
          i = k + 1;
        else
          j = k - 1;
      }
    }
    return -(i + 1);
  }


  public static int binarySearch(float[] paramArrayOfFloat, float paramFloat)
  {
    return binarySearch0(paramArrayOfFloat, 0, paramArrayOfFloat.length, paramFloat);
  }


  public static int binarySearch(float[] paramArrayOfFloat, int paramInt1, int paramInt2, float paramFloat)
  {
    rangeCheck(paramArrayOfFloat.length, paramInt1, paramInt2);
    return binarySearch0(paramArrayOfFloat, paramInt1, paramInt2, paramFloat);
  }


  private static int binarySearch0(float[] paramArrayOfFloat, int paramInt1, int paramInt2, float paramFloat)
  {
    int i = paramInt1;
    int j = paramInt2 - 1;
    while (i <= j)
    {
      int k = i + j >>> 1;
      float f = paramArrayOfFloat[k];
      if (f < paramFloat)
      {
        i = k + 1;
      }
      else if (f > paramFloat)
      {
        j = k - 1;
      }
      else
      {
        int m = Float.floatToIntBits(f);
        int n = Float.floatToIntBits(paramFloat);
        if (m == n)
          return k;
        if (m < n)
          i = k + 1;
        else
          j = k - 1;
      }
    }
    return -(i + 1);
  }


  public static int binarySearch(Object[] paramArrayOfObject, Object paramObject)
  {
    return binarySearch0(paramArrayOfObject, 0, paramArrayOfObject.length, paramObject);
  }


  public static int binarySearch(Object[] paramArrayOfObject, int paramInt1, int paramInt2, Object paramObject)
  {
    rangeCheck(paramArrayOfObject.length, paramInt1, paramInt2);
    return binarySearch0(paramArrayOfObject, paramInt1, paramInt2, paramObject);
  }


  private static int binarySearch0(Object[] paramArrayOfObject, int paramInt1, int paramInt2, Object paramObject)
  {
    int i = paramInt1;
    int j = paramInt2 - 1;
    while (i <= j)
    {
      int k = i + j >>> 1;
      Comparable localComparable = (Comparable)paramArrayOfObject[k];
      int m = localComparable.compareTo(paramObject);
      if (m < 0)
        i = k + 1;
      else if (m > 0)
        j = k - 1;
      else
        return k;
    }
    return -(i + 1);
  }


  public static <T> int binarySearch(T[] paramArrayOfT, T paramT, Comparator<? super T> paramComparator)
  {
    return binarySearch0(paramArrayOfT, 0, paramArrayOfT.length, paramT, paramComparator);
  }


  public static <T> int binarySearch(T[] paramArrayOfT, int paramInt1, int paramInt2, T paramT, Comparator<? super T> paramComparator)
  {
    rangeCheck(paramArrayOfT.length, paramInt1, paramInt2);
    return binarySearch0(paramArrayOfT, paramInt1, paramInt2, paramT, paramComparator);
  }


  private static <T> int binarySearch0(T[] paramArrayOfT, int paramInt1, int paramInt2, T paramT, Comparator<? super T> paramComparator)
  {
    if (paramComparator == null)
      return binarySearch0(paramArrayOfT, paramInt1, paramInt2, paramT);
    int i = paramInt1;
    int j = paramInt2 - 1;
    while (i <= j)
    {
      int k = i + j >>> 1;
      T ? = paramArrayOfT[k];
      int m = paramComparator.compare(?, paramT);
      if (m < 0)
        i = k + 1;
      else if (m > 0)
        j = k - 1;
      else
        return k;
    }
    return -(i + 1);
  }


  public static boolean equals(long[] paramArrayOfLong1, long[] paramArrayOfLong2)
  {
    if (paramArrayOfLong1 == paramArrayOfLong2)
      return true;
    if ((paramArrayOfLong1 == null) || (paramArrayOfLong2 == null))
      return false;
    int i = paramArrayOfLong1.length;
    if (paramArrayOfLong2.length != i)
      return false;
    for (int j = 0; j < i; j++)
      if (paramArrayOfLong1[j] != paramArrayOfLong2[j])
        return false;
    return true;
  }


  public static boolean equals(int[] paramArrayOfInt1, int[] paramArrayOfInt2)
  {
    if (paramArrayOfInt1 == paramArrayOfInt2)
      return true;
    if ((paramArrayOfInt1 == null) || (paramArrayOfInt2 == null))
      return false;
    int i = paramArrayOfInt1.length;
    if (paramArrayOfInt2.length != i)
      return false;
    for (int j = 0; j < i; j++)
      if (paramArrayOfInt1[j] != paramArrayOfInt2[j])
        return false;
    return true;
  }


  public static boolean equals(short[] paramArrayOfShort1, short[] paramArrayOfShort2)
  {
    if (paramArrayOfShort1 == paramArrayOfShort2)
      return true;
    if ((paramArrayOfShort1 == null) || (paramArrayOfShort2 == null))
      return false;
    int i = paramArrayOfShort1.length;
    if (paramArrayOfShort2.length != i)
      return false;
    for (int j = 0; j < i; j++)
      if (paramArrayOfShort1[j] != paramArrayOfShort2[j])
        return false;
    return true;
  }


  public static boolean equals(char[] paramArrayOfChar1, char[] paramArrayOfChar2)
  {
    if (paramArrayOfChar1 == paramArrayOfChar2)
      return true;
    if ((paramArrayOfChar1 == null) || (paramArrayOfChar2 == null))
      return false;
    int i = paramArrayOfChar1.length;
    if (paramArrayOfChar2.length != i)
      return false;
    for (int j = 0; j < i; j++)
      if (paramArrayOfChar1[j] != paramArrayOfChar2[j])
        return false;
    return true;
  }


  public static boolean equals(byte[] paramArrayOfByte1, byte[] paramArrayOfByte2)
  {
    if (paramArrayOfByte1 == paramArrayOfByte2)
      return true;
    if ((paramArrayOfByte1 == null) || (paramArrayOfByte2 == null))
      return false;
    int i = paramArrayOfByte1.length;
    if (paramArrayOfByte2.length != i)
      return false;
    for (int j = 0; j < i; j++)
      if (paramArrayOfByte1[j] != paramArrayOfByte2[j])
        return false;
    return true;
  }


  public static boolean equals(boolean[] paramArrayOfBoolean1, boolean[] paramArrayOfBoolean2)
  {
    if (paramArrayOfBoolean1 == paramArrayOfBoolean2)
      return true;
    if ((paramArrayOfBoolean1 == null) || (paramArrayOfBoolean2 == null))
      return false;
    int i = paramArrayOfBoolean1.length;
    if (paramArrayOfBoolean2.length != i)
      return false;
    for (int j = 0; j < i; j++)
      if (paramArrayOfBoolean1[j] != paramArrayOfBoolean2[j])
        return false;
    return true;
  }


  public static boolean equals(double[] paramArrayOfDouble1, double[] paramArrayOfDouble2)
  {
    if (paramArrayOfDouble1 == paramArrayOfDouble2)
      return true;
    if ((paramArrayOfDouble1 == null) || (paramArrayOfDouble2 == null))
      return false;
    int i = paramArrayOfDouble1.length;
    if (paramArrayOfDouble2.length != i)
      return false;
    for (int j = 0; j < i; j++)
      if (Double.doubleToLongBits(paramArrayOfDouble1[j]) != Double.doubleToLongBits(paramArrayOfDouble2[j]))
        return false;
    return true;
  }


  public static boolean equals(float[] paramArrayOfFloat1, float[] paramArrayOfFloat2)
  {
    if (paramArrayOfFloat1 == paramArrayOfFloat2)
      return true;
    if ((paramArrayOfFloat1 == null) || (paramArrayOfFloat2 == null))
      return false;
    int i = paramArrayOfFloat1.length;
    if (paramArrayOfFloat2.length != i)
      return false;
    for (int j = 0; j < i; j++)
      if (Float.floatToIntBits(paramArrayOfFloat1[j]) != Float.floatToIntBits(paramArrayOfFloat2[j]))
        return false;
    return true;
  }


  public static boolean equals(Object[] paramArrayOfObject1, Object[] paramArrayOfObject2)
  {
    if (paramArrayOfObject1 == paramArrayOfObject2)
      return true;
    if ((paramArrayOfObject1 == null) || (paramArrayOfObject2 == null))
      return false;
    int i = paramArrayOfObject1.length;
    if (paramArrayOfObject2.length != i)
      return false;
    for (int j = 0; j < i; j++)
    {
      Object localObject1 = paramArrayOfObject1[j];
      Object localObject2 = paramArrayOfObject2[j];
      if (localObject1 == null ? localObject2 != null : !localObject1.equals(localObject2))
        return false;
    }
    return true;
  }


  public static void fill(long[] paramArrayOfLong, long paramLong)
  {
    int i = 0;
    int j = paramArrayOfLong.length;
    while (i < j)
    {
      paramArrayOfLong[i] = paramLong;
      i++;
    }
  }


  public static void fill(long[] paramArrayOfLong, int paramInt1, int paramInt2, long paramLong)
  {
    rangeCheck(paramArrayOfLong.length, paramInt1, paramInt2);
    for (int i = paramInt1; i < paramInt2; i++)
      paramArrayOfLong[i] = paramLong;
  }


  public static void fill(int[] paramArrayOfInt, int paramInt)
  {
    int i = 0;
    int j = paramArrayOfInt.length;
    while (i < j)
    {
      paramArrayOfInt[i] = paramInt;
      i++;
    }
  }


  public static void fill(int[] paramArrayOfInt, int paramInt1, int paramInt2, int paramInt3)
  {
    rangeCheck(paramArrayOfInt.length, paramInt1, paramInt2);
    for (int i = paramInt1; i < paramInt2; i++)
      paramArrayOfInt[i] = paramInt3;
  }


  public static void fill(short[] paramArrayOfShort, short paramShort)
  {
    int i = 0;
    int j = paramArrayOfShort.length;
    while (i < j)
    {
      paramArrayOfShort[i] = paramShort;
      i++;
    }
  }


  public static void fill(short[] paramArrayOfShort, int paramInt1, int paramInt2, short paramShort)
  {
    rangeCheck(paramArrayOfShort.length, paramInt1, paramInt2);
    for (int i = paramInt1; i < paramInt2; i++)
      paramArrayOfShort[i] = paramShort;
  }


  public static void fill(char[] paramArrayOfChar, char paramChar)
  {
    int i = 0;
    int j = paramArrayOfChar.length;
    while (i < j)
    {
      paramArrayOfChar[i] = paramChar;
      i++;
    }
  }


  public static void fill(char[] paramArrayOfChar, int paramInt1, int paramInt2, char paramChar)
  {
    rangeCheck(paramArrayOfChar.length, paramInt1, paramInt2);
    for (int i = paramInt1; i < paramInt2; i++)
      paramArrayOfChar[i] = paramChar;
  }


  public static void fill(byte[] paramArrayOfByte, byte paramByte)
  {
    int i = 0;
    int j = paramArrayOfByte.length;
    while (i < j)
    {
      paramArrayOfByte[i] = paramByte;
      i++;
    }
  }


  public static void fill(byte[] paramArrayOfByte, int paramInt1, int paramInt2, byte paramByte)
  {
    rangeCheck(paramArrayOfByte.length, paramInt1, paramInt2);
    for (int i = paramInt1; i < paramInt2; i++)
      paramArrayOfByte[i] = paramByte;
  }


  public static void fill(boolean[] paramArrayOfBoolean, boolean paramBoolean)
  {
    int i = 0;
    int j = paramArrayOfBoolean.length;
    while (i < j)
    {
      paramArrayOfBoolean[i] = paramBoolean;
      i++;
    }
  }


  public static void fill(boolean[] paramArrayOfBoolean, int paramInt1, int paramInt2, boolean paramBoolean)
  {
    rangeCheck(paramArrayOfBoolean.length, paramInt1, paramInt2);
    for (int i = paramInt1; i < paramInt2; i++)
      paramArrayOfBoolean[i] = paramBoolean;
  }


  public static void fill(double[] paramArrayOfDouble, double paramDouble)
  {
    int i = 0;
    int j = paramArrayOfDouble.length;
    while (i < j)
    {
      paramArrayOfDouble[i] = paramDouble;
      i++;
    }
  }


  public static void fill(double[] paramArrayOfDouble, int paramInt1, int paramInt2, double paramDouble)
  {
    rangeCheck(paramArrayOfDouble.length, paramInt1, paramInt2);
    for (int i = paramInt1; i < paramInt2; i++)
      paramArrayOfDouble[i] = paramDouble;
  }


  public static void fill(float[] paramArrayOfFloat, float paramFloat)
  {
    int i = 0;
    int j = paramArrayOfFloat.length;
    while (i < j)
    {
      paramArrayOfFloat[i] = paramFloat;
      i++;
    }
  }


  public static void fill(float[] paramArrayOfFloat, int paramInt1, int paramInt2, float paramFloat)
  {
    rangeCheck(paramArrayOfFloat.length, paramInt1, paramInt2);
    for (int i = paramInt1; i < paramInt2; i++)
      paramArrayOfFloat[i] = paramFloat;
  }


  public static void fill(Object[] paramArrayOfObject, Object paramObject)
  {
    int i = 0;
    int j = paramArrayOfObject.length;
    while (i < j)
    {
      paramArrayOfObject[i] = paramObject;
      i++;
    }
  }


  public static void fill(Object[] paramArrayOfObject, int paramInt1, int paramInt2, Object paramObject)
  {
    rangeCheck(paramArrayOfObject.length, paramInt1, paramInt2);
    for (int i = paramInt1; i < paramInt2; i++)
      paramArrayOfObject[i] = paramObject;
  }


  public static <T> T[] copyOf(T[] paramArrayOfT, int paramInt)
  {
    return (Object[])copyOf(paramArrayOfT, paramInt, paramArrayOfT.getClass());
  }


  public static <T, U> T[] copyOf(U[] paramArrayOfU, int paramInt, Class<? extends T[]> paramClass)
  {
    Object[] arrayOfObject = paramClass == [Ljava.lang.Object.class ? (Object[])new Object[paramInt] : (Object[])(Object[])Array.newInstance(paramClass.getComponentType(), paramInt);
    System.arraycopy(paramArrayOfU, 0, arrayOfObject, 0, Math.min(paramArrayOfU.length, paramInt));
    return arrayOfObject;
  }


  public static byte[] copyOf(byte[] paramArrayOfByte, int paramInt)
  {
    byte[] arrayOfByte = new byte[paramInt];
    System.arraycopy(paramArrayOfByte, 0, arrayOfByte, 0, Math.min(paramArrayOfByte.length, paramInt));
    return arrayOfByte;
  }


  public static short[] copyOf(short[] paramArrayOfShort, int paramInt)
  {
    short[] arrayOfShort = new short[paramInt];
    System.arraycopy(paramArrayOfShort, 0, arrayOfShort, 0, Math.min(paramArrayOfShort.length, paramInt));
    return arrayOfShort;
  }


  public static int[] copyOf(int[] paramArrayOfInt, int paramInt)
  {
    int[] arrayOfInt = new int[paramInt];
    System.arraycopy(paramArrayOfInt, 0, arrayOfInt, 0, Math.min(paramArrayOfInt.length, paramInt));
    return arrayOfInt;
  }


  public static long[] copyOf(long[] paramArrayOfLong, int paramInt)
  {
    long[] arrayOfLong = new long[paramInt];
    System.arraycopy(paramArrayOfLong, 0, arrayOfLong, 0, Math.min(paramArrayOfLong.length, paramInt));
    return arrayOfLong;
  }


  public static char[] copyOf(char[] paramArrayOfChar, int paramInt)
  {
    char[] arrayOfChar = new char[paramInt];
    System.arraycopy(paramArrayOfChar, 0, arrayOfChar, 0, Math.min(paramArrayOfChar.length, paramInt));
    return arrayOfChar;
  }


  public static float[] copyOf(float[] paramArrayOfFloat, int paramInt)
  {
    float[] arrayOfFloat = new float[paramInt];
    System.arraycopy(paramArrayOfFloat, 0, arrayOfFloat, 0, Math.min(paramArrayOfFloat.length, paramInt));
    return arrayOfFloat;
  }


  public static double[] copyOf(double[] paramArrayOfDouble, int paramInt)
  {
    double[] arrayOfDouble = new double[paramInt];
    System.arraycopy(paramArrayOfDouble, 0, arrayOfDouble, 0, Math.min(paramArrayOfDouble.length, paramInt));
    return arrayOfDouble;
  }


  public static boolean[] copyOf(boolean[] paramArrayOfBoolean, int paramInt)
  {
    boolean[] arrayOfBoolean = new boolean[paramInt];
    System.arraycopy(paramArrayOfBoolean, 0, arrayOfBoolean, 0, Math.min(paramArrayOfBoolean.length, paramInt));
    return arrayOfBoolean;
  }


  public static <T> T[] copyOfRange(T[] paramArrayOfT, int paramInt1, int paramInt2)
  {
    return copyOfRange(paramArrayOfT, paramInt1, paramInt2, paramArrayOfT.getClass());
  }


  public static <T, U> T[] copyOfRange(U[] paramArrayOfU, int paramInt1, int paramInt2, Class<? extends T[]> paramClass)
  {
    int i = paramInt2 - paramInt1;
    if (i < 0)
      throw new IllegalArgumentException(paramInt1 + " > " + paramInt2);
    Object[] arrayOfObject = paramClass == [Ljava.lang.Object.class ? (Object[])new Object[i] : (Object[])(Object[])Array.newInstance(paramClass.getComponentType(), i);
    System.arraycopy(paramArrayOfU, paramInt1, arrayOfObject, 0, Math.min(paramArrayOfU.length - paramInt1, i));
    return arrayOfObject;
  }


  public static byte[] copyOfRange(byte[] paramArrayOfByte, int paramInt1, int paramInt2)
  {
    int i = paramInt2 - paramInt1;
    if (i < 0)
      throw new IllegalArgumentException(paramInt1 + " > " + paramInt2);
    byte[] arrayOfByte = new byte[i];
    System.arraycopy(paramArrayOfByte, paramInt1, arrayOfByte, 0, Math.min(paramArrayOfByte.length - paramInt1, i));
    return arrayOfByte;
  }


  public static short[] copyOfRange(short[] paramArrayOfShort, int paramInt1, int paramInt2)
  {
    int i = paramInt2 - paramInt1;
    if (i < 0)
      throw new IllegalArgumentException(paramInt1 + " > " + paramInt2);
    short[] arrayOfShort = new short[i];
    System.arraycopy(paramArrayOfShort, paramInt1, arrayOfShort, 0, Math.min(paramArrayOfShort.length - paramInt1, i));
    return arrayOfShort;
  }


  public static int[] copyOfRange(int[] paramArrayOfInt, int paramInt1, int paramInt2)
  {
    int i = paramInt2 - paramInt1;
    if (i < 0)
      throw new IllegalArgumentException(paramInt1 + " > " + paramInt2);
    int[] arrayOfInt = new int[i];
    System.arraycopy(paramArrayOfInt, paramInt1, arrayOfInt, 0, Math.min(paramArrayOfInt.length - paramInt1, i));
    return arrayOfInt;
  }


  public static long[] copyOfRange(long[] paramArrayOfLong, int paramInt1, int paramInt2)
  {
    int i = paramInt2 - paramInt1;
    if (i < 0)
      throw new IllegalArgumentException(paramInt1 + " > " + paramInt2);
    long[] arrayOfLong = new long[i];
    System.arraycopy(paramArrayOfLong, paramInt1, arrayOfLong, 0, Math.min(paramArrayOfLong.length - paramInt1, i));
    return arrayOfLong;
  }


  public static char[] copyOfRange(char[] paramArrayOfChar, int paramInt1, int paramInt2)
  {
    int i = paramInt2 - paramInt1;
    if (i < 0)
      throw new IllegalArgumentException(paramInt1 + " > " + paramInt2);
    char[] arrayOfChar = new char[i];
    System.arraycopy(paramArrayOfChar, paramInt1, arrayOfChar, 0, Math.min(paramArrayOfChar.length - paramInt1, i));
    return arrayOfChar;
  }


  public static float[] copyOfRange(float[] paramArrayOfFloat, int paramInt1, int paramInt2)
  {
    int i = paramInt2 - paramInt1;
    if (i < 0)
      throw new IllegalArgumentException(paramInt1 + " > " + paramInt2);
    float[] arrayOfFloat = new float[i];
    System.arraycopy(paramArrayOfFloat, paramInt1, arrayOfFloat, 0, Math.min(paramArrayOfFloat.length - paramInt1, i));
    return arrayOfFloat;
  }


  public static double[] copyOfRange(double[] paramArrayOfDouble, int paramInt1, int paramInt2)
  {
    int i = paramInt2 - paramInt1;
    if (i < 0)
      throw new IllegalArgumentException(paramInt1 + " > " + paramInt2);
    double[] arrayOfDouble = new double[i];
    System.arraycopy(paramArrayOfDouble, paramInt1, arrayOfDouble, 0, Math.min(paramArrayOfDouble.length - paramInt1, i));
    return arrayOfDouble;
  }


  public static boolean[] copyOfRange(boolean[] paramArrayOfBoolean, int paramInt1, int paramInt2)
  {
    int i = paramInt2 - paramInt1;
    if (i < 0)
      throw new IllegalArgumentException(paramInt1 + " > " + paramInt2);
    boolean[] arrayOfBoolean = new boolean[i];
    System.arraycopy(paramArrayOfBoolean, paramInt1, arrayOfBoolean, 0, Math.min(paramArrayOfBoolean.length - paramInt1, i));
    return arrayOfBoolean;
  }


  @SafeVarargs
  public static <T> List<T> asList(T[] paramArrayOfT)
  {
    return new ArrayList(paramArrayOfT);
  }


  public static int hashCode(long[] paramArrayOfLong)
  {
    if (paramArrayOfLong == null)
      return 0;
    int i = 1;
    for (long l : paramArrayOfLong)
    {
      int m = (int)(l ^ l >>> 32);
      i = 31 * i + m;
    }
    return i;
  }


  public static int hashCode(int[] paramArrayOfInt)
  {
    if (paramArrayOfInt == null)
      return 0;
    int i = 1;
    for (int m : paramArrayOfInt)
      i = 31 * i + m;
    return i;
  }


  public static int hashCode(short[] paramArrayOfShort)
  {
    if (paramArrayOfShort == null)
      return 0;
    int i = 1;
    for (int m : paramArrayOfShort)
      i = 31 * i + m;
    return i;
  }


  public static int hashCode(char[] paramArrayOfChar)
  {
    if (paramArrayOfChar == null)
      return 0;
    int i = 1;
    for (int m : paramArrayOfChar)
      i = 31 * i + m;
    return i;
  }


  public static int hashCode(byte[] paramArrayOfByte)
  {
    if (paramArrayOfByte == null)
      return 0;
    int i = 1;
    for (int m : paramArrayOfByte)
      i = 31 * i + m;
    return i;
  }


  public static int hashCode(boolean[] paramArrayOfBoolean)
  {
    if (paramArrayOfBoolean == null)
      return 0;
    int i = 1;
    for (int m : paramArrayOfBoolean)
      i = 31 * i + (m != 0 ? 1231 : 1237);
    return i;
  }


  public static int hashCode(float[] paramArrayOfFloat)
  {
    if (paramArrayOfFloat == null)
      return 0;
    int i = 1;
    for (float f : paramArrayOfFloat)
      i = 31 * i + Float.floatToIntBits(f);
    return i;
  }


  public static int hashCode(double[] paramArrayOfDouble)
  {
    if (paramArrayOfDouble == null)
      return 0;
    int i = 1;
    for (double d : paramArrayOfDouble)
    {
      long l = Double.doubleToLongBits(d);
      i = 31 * i + (int)(l ^ l >>> 32);
    }
    return i;
  }


  public static int hashCode(Object[] paramArrayOfObject)
  {
    if (paramArrayOfObject == null)
      return 0;
    int i = 1;
    for (Object localObject : paramArrayOfObject)
      i = 31 * i + (localObject == null ? 0 : localObject.hashCode());
    return i;
  }


  public static int deepHashCode(Object[] paramArrayOfObject)
  {
    if (paramArrayOfObject == null)
      return 0;
    int i = 1;
    for (Object localObject : paramArrayOfObject)
    {
      int m = 0;
      if ((localObject instanceof Object[]))
        m = deepHashCode((Object[])(Object[])localObject);
      else if ((localObject instanceof byte[]))
        m = hashCode((byte[])(byte[])localObject);
      else if ((localObject instanceof short[]))
        m = hashCode((short[])(short[])localObject);
      else if ((localObject instanceof int[]))
        m = hashCode((int[])(int[])localObject);
      else if ((localObject instanceof long[]))
        m = hashCode((long[])(long[])localObject);
      else if ((localObject instanceof char[]))
        m = hashCode((char[])(char[])localObject);
      else if ((localObject instanceof float[]))
        m = hashCode((float[])(float[])localObject);
      else if ((localObject instanceof double[]))
        m = hashCode((double[])(double[])localObject);
      else if ((localObject instanceof boolean[]))
        m = hashCode((boolean[])(boolean[])localObject);
      else if (localObject != null)
        m = localObject.hashCode();
      i = 31 * i + m;
    }
    return i;
  }


  public static boolean deepEquals(Object[] paramArrayOfObject1, Object[] paramArrayOfObject2)
  {
    if (paramArrayOfObject1 == paramArrayOfObject2)
      return true;
    if ((paramArrayOfObject1 == null) || (paramArrayOfObject2 == null))
      return false;
    int i = paramArrayOfObject1.length;
    if (paramArrayOfObject2.length != i)
      return false;
    for (int j = 0; j < i; j++)
    {
      Object localObject1 = paramArrayOfObject1[j];
      Object localObject2 = paramArrayOfObject2[j];
      if (localObject1 == localObject2)
        continue;
      if (localObject1 == null)
        return false;
      boolean bool = deepEquals0(localObject1, localObject2);
      if (!bool)
        return false;
    }
    return true;
  }


  static boolean deepEquals0(Object paramObject1, Object paramObject2)
  {
    assert (paramObject1 != null);
    boolean bool;
    if (((paramObject1 instanceof Object[])) && ((paramObject2 instanceof Object[])))
      bool = deepEquals((Object[])(Object[])paramObject1, (Object[])(Object[])paramObject2);
    else if (((paramObject1 instanceof byte[])) && ((paramObject2 instanceof byte[])))
      bool = equals((byte[])(byte[])paramObject1, (byte[])(byte[])paramObject2);
    else if (((paramObject1 instanceof short[])) && ((paramObject2 instanceof short[])))
      bool = equals((short[])(short[])paramObject1, (short[])(short[])paramObject2);
    else if (((paramObject1 instanceof int[])) && ((paramObject2 instanceof int[])))
      bool = equals((int[])(int[])paramObject1, (int[])(int[])paramObject2);
    else if (((paramObject1 instanceof long[])) && ((paramObject2 instanceof long[])))
      bool = equals((long[])(long[])paramObject1, (long[])(long[])paramObject2);
    else if (((paramObject1 instanceof char[])) && ((paramObject2 instanceof char[])))
      bool = equals((char[])(char[])paramObject1, (char[])(char[])paramObject2);
    else if (((paramObject1 instanceof float[])) && ((paramObject2 instanceof float[])))
      bool = equals((float[])(float[])paramObject1, (float[])(float[])paramObject2);
    else if (((paramObject1 instanceof double[])) && ((paramObject2 instanceof double[])))
      bool = equals((double[])(double[])paramObject1, (double[])(double[])paramObject2);
    else if (((paramObject1 instanceof boolean[])) && ((paramObject2 instanceof boolean[])))
      bool = equals((boolean[])(boolean[])paramObject1, (boolean[])(boolean[])paramObject2);
    else
      bool = paramObject1.equals(paramObject2);
    return bool;
  }


  public static String toString(long[] paramArrayOfLong)
  {
    if (paramArrayOfLong == null)
      return "null";
    int i = paramArrayOfLong.length - 1;
    if (i == -1)
      return "[]";
    StringBuilder localStringBuilder = new StringBuilder();
    localStringBuilder.append('[');
    for (int j = 0; ; j++)
    {
      localStringBuilder.append(paramArrayOfLong[j]);
      if (j == i)
        return ']';
      localStringBuilder.append(", ");
    }
  }


  public static String toString(int[] paramArrayOfInt)
  {
    if (paramArrayOfInt == null)
      return "null";
    int i = paramArrayOfInt.length - 1;
    if (i == -1)
      return "[]";
    StringBuilder localStringBuilder = new StringBuilder();
    localStringBuilder.append('[');
    for (int j = 0; ; j++)
    {
      localStringBuilder.append(paramArrayOfInt[j]);
      if (j == i)
        return ']';
      localStringBuilder.append(", ");
    }
  }


  public static String toString(short[] paramArrayOfShort)
  {
    if (paramArrayOfShort == null)
      return "null";
    int i = paramArrayOfShort.length - 1;
    if (i == -1)
      return "[]";
    StringBuilder localStringBuilder = new StringBuilder();
    localStringBuilder.append('[');
    for (int j = 0; ; j++)
    {
      localStringBuilder.append(paramArrayOfShort[j]);
      if (j == i)
        return ']';
      localStringBuilder.append(", ");
    }
  }


  public static String toString(char[] paramArrayOfChar)
  {
    if (paramArrayOfChar == null)
      return "null";
    int i = paramArrayOfChar.length - 1;
    if (i == -1)
      return "[]";
    StringBuilder localStringBuilder = new StringBuilder();
    localStringBuilder.append('[');
    for (int j = 0; ; j++)
    {
      localStringBuilder.append(paramArrayOfChar[j]);
      if (j == i)
        return ']';
      localStringBuilder.append(", ");
    }
  }


  public static String toString(byte[] paramArrayOfByte)
  {
    if (paramArrayOfByte == null)
      return "null";
    int i = paramArrayOfByte.length - 1;
    if (i == -1)
      return "[]";
    StringBuilder localStringBuilder = new StringBuilder();
    localStringBuilder.append('[');
    for (int j = 0; ; j++)
    {
      localStringBuilder.append(paramArrayOfByte[j]);
      if (j == i)
        return ']';
      localStringBuilder.append(", ");
    }
  }


  public static String toString(boolean[] paramArrayOfBoolean)
  {
    if (paramArrayOfBoolean == null)
      return "null";
    int i = paramArrayOfBoolean.length - 1;
    if (i == -1)
      return "[]";
    StringBuilder localStringBuilder = new StringBuilder();
    localStringBuilder.append('[');
    for (int j = 0; ; j++)
    {
      localStringBuilder.append(paramArrayOfBoolean[j]);
      if (j == i)
        return ']';
      localStringBuilder.append(", ");
    }
  }


  public static String toString(float[] paramArrayOfFloat)
  {
    if (paramArrayOfFloat == null)
      return "null";
    int i = paramArrayOfFloat.length - 1;
    if (i == -1)
      return "[]";
    StringBuilder localStringBuilder = new StringBuilder();
    localStringBuilder.append('[');
    for (int j = 0; ; j++)
    {
      localStringBuilder.append(paramArrayOfFloat[j]);
      if (j == i)
        return ']';
      localStringBuilder.append(", ");
    }
  }


  public static String toString(double[] paramArrayOfDouble)
  {
    if (paramArrayOfDouble == null)
      return "null";
    int i = paramArrayOfDouble.length - 1;
    if (i == -1)
      return "[]";
    StringBuilder localStringBuilder = new StringBuilder();
    localStringBuilder.append('[');
    for (int j = 0; ; j++)
    {
      localStringBuilder.append(paramArrayOfDouble[j]);
      if (j == i)
        return ']';
      localStringBuilder.append(", ");
    }
  }


  public static String toString(Object[] paramArrayOfObject)
  {
    if (paramArrayOfObject == null)
      return "null";
    int i = paramArrayOfObject.length - 1;
    if (i == -1)
      return "[]";
    StringBuilder localStringBuilder = new StringBuilder();
    localStringBuilder.append('[');
    for (int j = 0; ; j++)
    {
      localStringBuilder.append(String.valueOf(paramArrayOfObject[j]));
      if (j == i)
        return ']';
      localStringBuilder.append(", ");
    }
  }


  public static String deepToString(Object[] paramArrayOfObject)
  {
    if (paramArrayOfObject == null)
      return "null";
    int i = 20 * paramArrayOfObject.length;
    if ((paramArrayOfObject.length != 0) && (i <= 0))
      i = 2147483647;
    StringBuilder localStringBuilder = new StringBuilder(i);
    deepToString(paramArrayOfObject, localStringBuilder, new HashSet());
    return localStringBuilder.toString();
  }


  private static void deepToString(Object[] paramArrayOfObject, StringBuilder paramStringBuilder, Set<Object[]> paramSet)
  {
    if (paramArrayOfObject == null)
    {
      paramStringBuilder.append("null");
      return;
    }
    int i = paramArrayOfObject.length - 1;
    if (i == -1)
    {
      paramStringBuilder.append("[]");
      return;
    }
    paramSet.add(paramArrayOfObject);
    paramStringBuilder.append('[');
    for (int j = 0; ; j++)
    {
      Object localObject = paramArrayOfObject[j];
      if (localObject == null)
      {
        paramStringBuilder.append("null");
      }
      else
      {
        Class localClass = localObject.getClass();
        if (localClass.isArray())
        {
          if (localClass == [B.class)
            paramStringBuilder.append(toString((byte[])(byte[])localObject));
          else if (localClass == [S.class)
            paramStringBuilder.append(toString((short[])(short[])localObject));
          else if (localClass == [I.class)
            paramStringBuilder.append(toString((int[])(int[])localObject));
          else if (localClass == [J.class)
            paramStringBuilder.append(toString((long[])(long[])localObject));
          else if (localClass == [C.class)
            paramStringBuilder.append(toString((char[])(char[])localObject));
          else if (localClass == [F.class)
            paramStringBuilder.append(toString((float[])(float[])localObject));
          else if (localClass == [D.class)
            paramStringBuilder.append(toString((double[])(double[])localObject));
          else if (localClass == [Z.class)
            paramStringBuilder.append(toString((boolean[])(boolean[])localObject));
          else if (paramSet.contains(localObject))
            paramStringBuilder.append("[...]");
          else
            deepToString((Object[])(Object[])localObject, paramStringBuilder, paramSet);
        }
        else
          paramStringBuilder.append(localObject.toString());
      }
      if (j == i)
        break;
      paramStringBuilder.append(", ");
    }
    paramStringBuilder.append(']');
    paramSet.remove(paramArrayOfObject);
  }


  private static class ArrayList<E> extends AbstractList<E>
    implements RandomAccess, Serializable
  {
    private static final long serialVersionUID = -2764017481108945198L;
    private final E[] a;


    ArrayList(E[] paramArrayOfE)
    {
      if (paramArrayOfE == null)
        throw new NullPointerException();
      this.a = paramArrayOfE;
    }


    public int size()
    {
      return this.a.length;
    }


    public Object[] toArray()
    {
      return (Object[])this.a.clone();
    }


    public <T> T[] toArray(T[] paramArrayOfT)
    {
      int i = size();
      if (paramArrayOfT.length < i)
        return Arrays.copyOf(this.a, i, paramArrayOfT.getClass());
      System.arraycopy(this.a, 0, paramArrayOfT, 0, i);
      if (paramArrayOfT.length > i)
        paramArrayOfT[i] = null;
      return paramArrayOfT;
    }


    public E get(int paramInt)
    {
      return this.a[paramInt];
    }


    public E set(int paramInt, E paramE)
    {
      Object localObject = this.a[paramInt];
      this.a[paramInt] = paramE;
      return localObject;
    }


    public int indexOf(Object paramObject)
    {
      int i;
      if (paramObject == null)
        for (i = 0; i < this.a.length; i++)
          if (this.a[i] == null)
            return i;
      else
        for (i = 0; i < this.a.length; i++)
          if (paramObject.equals(this.a[i]))
            return i;
      return -1;
    }


    public boolean contains(Object paramObject)
    {
      return indexOf(paramObject) != -1;
    }
  }


  static final class LegacyMergeSort
  {
    private static final boolean userRequested = ((Boolean)AccessController.doPrivileged(new GetBooleanAction("java.util.Arrays.useLegacyMergeSort"))).booleanValue();
  }
}


ArrayList.java

package java.util;


import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;


public class ArrayList<E> extends AbstractList<E>
  implements List<E>, RandomAccess, Cloneable, Serializable
{
  private static final long serialVersionUID = 8683452581122892189L;
  private static final int DEFAULT_CAPACITY = 10;
  private static final Object[] EMPTY_ELEMENTDATA = new Object[0];
  private transient Object[] elementData;
  private int size;
  private static final int MAX_ARRAY_SIZE = 2147483639;


  public ArrayList(int paramInt)
  {
    if (paramInt < 0)
      throw new IllegalArgumentException("Illegal Capacity: " + paramInt);
    this.elementData = new Object[paramInt];
  }


  public ArrayList()
  {
    this.elementData = EMPTY_ELEMENTDATA;
  }


  public ArrayList(Collection<? extends E> paramCollection)
  {
    this.elementData = paramCollection.toArray();
    this.size = this.elementData.length;
    if (this.elementData.getClass() != [Ljava.lang.Object.class)
      this.elementData = Arrays.copyOf(this.elementData, this.size, [Ljava.lang.Object.class);
  }


  public void trimToSize()
  {
    this.modCount += 1;
    if (this.size < this.elementData.length)
      this.elementData = Arrays.copyOf(this.elementData, this.size);
  }


  public void ensureCapacity(int paramInt)
  {
    int i = this.elementData != EMPTY_ELEMENTDATA ? 0 : 10;
    if (paramInt > i)
      ensureExplicitCapacity(paramInt);
  }


  private void ensureCapacityInternal(int paramInt)
  {
    if (this.elementData == EMPTY_ELEMENTDATA)
      paramInt = Math.max(10, paramInt);
    ensureExplicitCapacity(paramInt);
  }


  private void ensureExplicitCapacity(int paramInt)
  {
    this.modCount += 1;
    if (paramInt - this.elementData.length > 0)
      grow(paramInt);
  }


  private void grow(int paramInt)
  {
    int i = this.elementData.length;
    int j = i + (i >> 1);
    if (j - paramInt < 0)
      j = paramInt;
    if (j - 2147483639 > 0)
      j = hugeCapacity(paramInt);
    this.elementData = Arrays.copyOf(this.elementData, j);
  }


  private static int hugeCapacity(int paramInt)
  {
    if (paramInt < 0)
      throw new OutOfMemoryError();
    return paramInt > 2147483639 ? 2147483647 : 2147483639;
  }


  public int size()
  {
    return this.size;
  }


  public boolean isEmpty()
  {
    return this.size == 0;
  }


  public boolean contains(Object paramObject)
  {
    return indexOf(paramObject) >= 0;
  }


  public int indexOf(Object paramObject)
  {
    int i;
    if (paramObject == null)
      for (i = 0; i < this.size; i++)
        if (this.elementData[i] == null)
          return i;
    else
      for (i = 0; i < this.size; i++)
        if (paramObject.equals(this.elementData[i]))
          return i;
    return -1;
  }


  public int lastIndexOf(Object paramObject)
  {
    int i;
    if (paramObject == null)
      for (i = this.size - 1; i >= 0; i--)
        if (this.elementData[i] == null)
          return i;
    else
      for (i = this.size - 1; i >= 0; i--)
        if (paramObject.equals(this.elementData[i]))
          return i;
    return -1;
  }


  public Object clone()
  {
    try
    {
      ArrayList localArrayList = (ArrayList)super.clone();
      localArrayList.elementData = Arrays.copyOf(this.elementData, this.size);
      localArrayList.modCount = 0;
      return localArrayList;
    }
    catch (CloneNotSupportedException localCloneNotSupportedException)
    {
    }
    throw new InternalError();
  }


  public Object[] toArray()
  {
    return Arrays.copyOf(this.elementData, this.size);
  }


  public <T> T[] toArray(T[] paramArrayOfT)
  {
    if (paramArrayOfT.length < this.size)
      return (Object[])Arrays.copyOf(this.elementData, this.size, paramArrayOfT.getClass());
    System.arraycopy(this.elementData, 0, paramArrayOfT, 0, this.size);
    if (paramArrayOfT.length > this.size)
      paramArrayOfT[this.size] = null;
    return paramArrayOfT;
  }


  E elementData(int paramInt)
  {
    return this.elementData[paramInt];
  }


  public E get(int paramInt)
  {
    rangeCheck(paramInt);
    return elementData(paramInt);
  }


  public E set(int paramInt, E paramE)
  {
    rangeCheck(paramInt);
    Object localObject = elementData(paramInt);
    this.elementData[paramInt] = paramE;
    return localObject;
  }


  public boolean add(E paramE)
  {
    ensureCapacityInternal(this.size + 1);
    this.elementData[(this.size++)] = paramE;
    return true;
  }


  public void add(int paramInt, E paramE)
  {
    rangeCheckForAdd(paramInt);
    ensureCapacityInternal(this.size + 1);
    System.arraycopy(this.elementData, paramInt, this.elementData, paramInt + 1, this.size - paramInt);
    this.elementData[paramInt] = paramE;
    this.size += 1;
  }


  public E remove(int paramInt)
  {
    rangeCheck(paramInt);
    this.modCount += 1;
    Object localObject = elementData(paramInt);
    int i = this.size - paramInt - 1;
    if (i > 0)
      System.arraycopy(this.elementData, paramInt + 1, this.elementData, paramInt, i);
    this.elementData[(--this.size)] = null;
    return localObject;
  }


  public boolean remove(Object paramObject)
  {
    int i;
    if (paramObject == null)
      for (i = 0; i < this.size; i++)
      {
        if (this.elementData[i] != null)
          continue;
        fastRemove(i);
        return true;
      }
    else
      for (i = 0; i < this.size; i++)
      {
        if (!paramObject.equals(this.elementData[i]))
          continue;
        fastRemove(i);
        return true;
      }
    return false;
  }


  private void fastRemove(int paramInt)
  {
    this.modCount += 1;
    int i = this.size - paramInt - 1;
    if (i > 0)
      System.arraycopy(this.elementData, paramInt + 1, this.elementData, paramInt, i);
    this.elementData[(--this.size)] = null;
  }


  public void clear()
  {
    this.modCount += 1;
    for (int i = 0; i < this.size; i++)
      this.elementData[i] = null;
    this.size = 0;
  }


  public boolean addAll(Collection<? extends E> paramCollection)
  {
    Object[] arrayOfObject = paramCollection.toArray();
    int i = arrayOfObject.length;
    ensureCapacityInternal(this.size + i);
    System.arraycopy(arrayOfObject, 0, this.elementData, this.size, i);
    this.size += i;
    return i != 0;
  }


  public boolean addAll(int paramInt, Collection<? extends E> paramCollection)
  {
    rangeCheckForAdd(paramInt);
    Object[] arrayOfObject = paramCollection.toArray();
    int i = arrayOfObject.length;
    ensureCapacityInternal(this.size + i);
    int j = this.size - paramInt;
    if (j > 0)
      System.arraycopy(this.elementData, paramInt, this.elementData, paramInt + i, j);
    System.arraycopy(arrayOfObject, 0, this.elementData, paramInt, i);
    this.size += i;
    return i != 0;
  }


  protected void removeRange(int paramInt1, int paramInt2)
  {
    this.modCount += 1;
    int i = this.size - paramInt2;
    System.arraycopy(this.elementData, paramInt2, this.elementData, paramInt1, i);
    int j = this.size - (paramInt2 - paramInt1);
    for (int k = j; k < this.size; k++)
      this.elementData[k] = null;
    this.size = j;
  }


  private void rangeCheck(int paramInt)
  {
    if (paramInt >= this.size)
      throw new IndexOutOfBoundsException(outOfBoundsMsg(paramInt));
  }


  private void rangeCheckForAdd(int paramInt)
  {
    if ((paramInt > this.size) || (paramInt < 0))
      throw new IndexOutOfBoundsException(outOfBoundsMsg(paramInt));
  }


  private String outOfBoundsMsg(int paramInt)
  {
    return "Index: " + paramInt + ", Size: " + this.size;
  }


  public boolean removeAll(Collection<?> paramCollection)
  {
    return batchRemove(paramCollection, false);
  }


  public boolean retainAll(Collection<?> paramCollection)
  {
    return batchRemove(paramCollection, true);
  }


  private boolean batchRemove(Collection<?> paramCollection, boolean paramBoolean)
  {
    Object[] arrayOfObject = this.elementData;
    int i = 0;
    int j = 0;
    int k = 0;
    try
    {
      while (i < this.size)
      {
        if (paramCollection.contains(arrayOfObject[i]) == paramBoolean)
          arrayOfObject[(j++)] = arrayOfObject[i];
        i++;
      }
      if (i != this.size)
      {
        System.arraycopy(arrayOfObject, i, arrayOfObject, j, this.size - i);
        j += this.size - i;
      }
      if (j != this.size)
      {
        for (int m = j; m < this.size; m++)
          arrayOfObject[m] = null;
        this.modCount += this.size - j;
        this.size = j;
        k = 1;
      }
    }
    finally
    {
      if (i != this.size)
      {
        System.arraycopy(arrayOfObject, i, arrayOfObject, j, this.size - i);
        j += this.size - i;
      }
      if (j != this.size)
      {
        for (int n = j; n < this.size; n++)
          arrayOfObject[n] = null;
        this.modCount += this.size - j;
        this.size = j;
        k = 1;
      }
    }
    return k;
  }


  private void writeObject(ObjectOutputStream paramObjectOutputStream)
    throws IOException
  {
    int i = this.modCount;
    paramObjectOutputStream.defaultWriteObject();
    paramObjectOutputStream.writeInt(this.size);
    for (int j = 0; j < this.size; j++)
      paramObjectOutputStream.writeObject(this.elementData[j]);
    if (this.modCount != i)
      throw new ConcurrentModificationException();
  }


  private void readObject(ObjectInputStream paramObjectInputStream)
    throws IOException, ClassNotFoundException
  {
    this.elementData = EMPTY_ELEMENTDATA;
    paramObjectInputStream.defaultReadObject();
    paramObjectInputStream.readInt();
    if (this.size > 0)
    {
      ensureCapacityInternal(this.size);
      Object[] arrayOfObject = this.elementData;
      for (int i = 0; i < this.size; i++)
        arrayOfObject[i] = paramObjectInputStream.readObject();
    }
  }


  public ListIterator<E> listIterator(int paramInt)
  {
    if ((paramInt < 0) || (paramInt > this.size))
      throw new IndexOutOfBoundsException("Index: " + paramInt);
    return new ListItr(paramInt);
  }


  public ListIterator<E> listIterator()
  {
    return new ListItr(0);
  }


  public Iterator<E> iterator()
  {
    return new Itr(null);
  }


  public List<E> subList(int paramInt1, int paramInt2)
  {
    subListRangeCheck(paramInt1, paramInt2, this.size);
    return new SubList(this, 0, paramInt1, paramInt2);
  }


  static void subListRangeCheck(int paramInt1, int paramInt2, int paramInt3)
  {
    if (paramInt1 < 0)
      throw new IndexOutOfBoundsException("fromIndex = " + paramInt1);
    if (paramInt2 > paramInt3)
      throw new IndexOutOfBoundsException("toIndex = " + paramInt2);
    if (paramInt1 > paramInt2)
      throw new IllegalArgumentException("fromIndex(" + paramInt1 + ") > toIndex(" + paramInt2 + ")");
  }


  private class Itr
    implements Iterator<E>
  {
    int cursor;
    int lastRet = -1;
    int expectedModCount = ArrayList.this.modCount;


    private Itr()
    {
    }


    public boolean hasNext()
    {
      return this.cursor != ArrayList.this.size;
    }


    public E next()
    {
      checkForComodification();
      int i = this.cursor;
      if (i >= ArrayList.this.size)
        throw new NoSuchElementException();
      Object[] arrayOfObject = ArrayList.this.elementData;
      if (i >= arrayOfObject.length)
        throw new ConcurrentModificationException();
      this.cursor = (i + 1);
      return arrayOfObject[(this.lastRet = i)];
    }


    public void remove()
    {
      if (this.lastRet < 0)
        throw new IllegalStateException();
      checkForComodification();
      try
      {
        ArrayList.this.remove(this.lastRet);
        this.cursor = this.lastRet;
        this.lastRet = -1;
        this.expectedModCount = ArrayList.this.modCount;
      }
      catch (IndexOutOfBoundsException localIndexOutOfBoundsException)
      {
        throw new ConcurrentModificationException();
      }
    }


    final void checkForComodification()
    {
      if (ArrayList.this.modCount != this.expectedModCount)
        throw new ConcurrentModificationException();
    }
  }


  private class ListItr extends ArrayList<E>.Itr
    implements ListIterator<E>
  {
    ListItr(int arg2)
    {
      super(null);
      int i;
      this.cursor = i;
    }


    public boolean hasPrevious()
    {
      return this.cursor != 0;
    }


    public int nextIndex()
    {
      return this.cursor;
    }


    public int previousIndex()
    {
      return this.cursor - 1;
    }


    public E previous()
    {
      checkForComodification();
      int i = this.cursor - 1;
      if (i < 0)
        throw new NoSuchElementException();
      Object[] arrayOfObject = ArrayList.this.elementData;
      if (i >= arrayOfObject.length)
        throw new ConcurrentModificationException();
      this.cursor = i;
      return arrayOfObject[(this.lastRet = i)];
    }


    public void set(E paramE)
    {
      if (this.lastRet < 0)
        throw new IllegalStateException();
      checkForComodification();
      try
      {
        ArrayList.this.set(this.lastRet, paramE);
      }
      catch (IndexOutOfBoundsException localIndexOutOfBoundsException)
      {
        throw new ConcurrentModificationException();
      }
    }


    public void add(E paramE)
    {
      checkForComodification();
      try
      {
        int i = this.cursor;
        ArrayList.this.add(i, paramE);
        this.cursor = (i + 1);
        this.lastRet = -1;
        this.expectedModCount = ArrayList.this.modCount;
      }
      catch (IndexOutOfBoundsException localIndexOutOfBoundsException)
      {
        throw new ConcurrentModificationException();
      }
    }
  }


  private class SubList extends AbstractList<E>
    implements RandomAccess
  {
    private final AbstractList<E> parent;
    private final int parentOffset;
    private final int offset;
    int size;


    SubList(int paramInt1, int paramInt2, int arg4)
    {
      this.parent = paramInt1;
      int i;
      this.parentOffset = i;
      this.offset = (paramInt2 + i);
      int j;
      this.size = (j - i);
      this.modCount = ArrayList.this.modCount;
    }


    public E set(int paramInt, E paramE)
    {
      rangeCheck(paramInt);
      checkForComodification();
      Object localObject = ArrayList.this.elementData(this.offset + paramInt);
      ArrayList.this.elementData[(this.offset + paramInt)] = paramE;
      return localObject;
    }


    public E get(int paramInt)
    {
      rangeCheck(paramInt);
      checkForComodification();
      return ArrayList.this.elementData(this.offset + paramInt);
    }


    public int size()
    {
      checkForComodification();
      return this.size;
    }


    public void add(int paramInt, E paramE)
    {
      rangeCheckForAdd(paramInt);
      checkForComodification();
      this.parent.add(this.parentOffset + paramInt, paramE);
      this.modCount = this.parent.modCount;
      this.size += 1;
    }


    public E remove(int paramInt)
    {
      rangeCheck(paramInt);
      checkForComodification();
      Object localObject = this.parent.remove(this.parentOffset + paramInt);
      this.modCount = this.parent.modCount;
      this.size -= 1;
      return localObject;
    }


    protected void removeRange(int paramInt1, int paramInt2)
    {
      checkForComodification();
      this.parent.removeRange(this.parentOffset + paramInt1, this.parentOffset + paramInt2);
      this.modCount = this.parent.modCount;
      this.size -= paramInt2 - paramInt1;
    }


    public boolean addAll(Collection<? extends E> paramCollection)
    {
      return addAll(this.size, paramCollection);
    }


    public boolean addAll(int paramInt, Collection<? extends E> paramCollection)
    {
      rangeCheckForAdd(paramInt);
      int i = paramCollection.size();
      if (i == 0)
        return false;
      checkForComodification();
      this.parent.addAll(this.parentOffset + paramInt, paramCollection);
      this.modCount = this.parent.modCount;
      this.size += i;
      return true;
    }


    public Iterator<E> iterator()
    {
      return listIterator();
    }


    public ListIterator<E> listIterator(int paramInt)
    {
      checkForComodification();
      rangeCheckForAdd(paramInt);
      int i = this.offset;
      return new ListIterator(paramInt, i)
      {
        int cursor = this.val$index;
        int lastRet = -1;
        int expectedModCount = ArrayList.this.modCount;


        public boolean hasNext()
        {
          return this.cursor != ArrayList.SubList.this.size;
        }


        public E next()
        {
          checkForComodification();
          int i = this.cursor;
          if (i >= ArrayList.SubList.this.size)
            throw new NoSuchElementException();
          Object[] arrayOfObject = ArrayList.this.elementData;
          if (this.val$offset + i >= arrayOfObject.length)
            throw new ConcurrentModificationException();
          this.cursor = (i + 1);
          return arrayOfObject[(this.val$offset + (this.lastRet = i))];
        }


        public boolean hasPrevious()
        {
          return this.cursor != 0;
        }


        public E previous()
        {
          checkForComodification();
          int i = this.cursor - 1;
          if (i < 0)
            throw new NoSuchElementException();
          Object[] arrayOfObject = ArrayList.this.elementData;
          if (this.val$offset + i >= arrayOfObject.length)
            throw new ConcurrentModificationException();
          this.cursor = i;
          return arrayOfObject[(this.val$offset + (this.lastRet = i))];
        }


        public int nextIndex()
        {
          return this.cursor;
        }


        public int previousIndex()
        {
          return this.cursor - 1;
        }


        public void remove()
        {
          if (this.lastRet < 0)
            throw new IllegalStateException();
          checkForComodification();
          try
          {
            ArrayList.SubList.this.remove(this.lastRet);
            this.cursor = this.lastRet;
            this.lastRet = -1;
            this.expectedModCount = ArrayList.this.modCount;
          }
          catch (IndexOutOfBoundsException localIndexOutOfBoundsException)
          {
            throw new ConcurrentModificationException();
          }
        }


        public void set(E paramE)
        {
          if (this.lastRet < 0)
            throw new IllegalStateException();
          checkForComodification();
          try
          {
            ArrayList.this.set(this.val$offset + this.lastRet, paramE);
          }
          catch (IndexOutOfBoundsException localIndexOutOfBoundsException)
          {
            throw new ConcurrentModificationException();
          }
        }


        public void add(E paramE)
        {
          checkForComodification();
          try
          {
            int i = this.cursor;
            ArrayList.SubList.this.add(i, paramE);
            this.cursor = (i + 1);
            this.lastRet = -1;
            this.expectedModCount = ArrayList.this.modCount;
          }
          catch (IndexOutOfBoundsException localIndexOutOfBoundsException)
          {
            throw new ConcurrentModificationException();
          }
        }


        final void checkForComodification()
        {
          if (this.expectedModCount != ArrayList.this.modCount)
            throw new ConcurrentModificationException();
        }
      };
    }


    public List<E> subList(int paramInt1, int paramInt2)
    {
      ArrayList.subListRangeCheck(paramInt1, paramInt2, this.size);
      return new SubList(ArrayList.this, this, this.offset, paramInt1, paramInt2);
    }


    private void rangeCheck(int paramInt)
    {
      if ((paramInt < 0) || (paramInt >= this.size))
        throw new IndexOutOfBoundsException(outOfBoundsMsg(paramInt));
    }


    private void rangeCheckForAdd(int paramInt)
    {
      if ((paramInt < 0) || (paramInt > this.size))
        throw new IndexOutOfBoundsException(outOfBoundsMsg(paramInt));
    }


    private String outOfBoundsMsg(int paramInt)
    {
      return "Index: " + paramInt + ", Size: " + this.size;
    }


    private void checkForComodification()
    {
      if (ArrayList.this.modCount != this.modCount)
        throw new ConcurrentModificationException();
    }
  }
}










  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【优质项目推荐】 1、项目代码均经过严格本地测试,运行OK,确保功能稳定后才上传平台。可放心下载并立即投入使用,若遇到任何使用问题,随时欢迎私信反馈与沟通,博主会第一时间回复。 2、项目适用于计算机相关专业(如计科、信息安全、数据科学、人工智能、通信、物联网、自动化、电子信息等)的在校学生、专业教师,或企业员工,小白入门等都适用。 3、该项目不仅具有很高的学习借鉴价值,对于初学者来说,也是入门进阶的绝佳选择;当然也可以直接用于 毕设、课设、期末大作业或项目初期立项演示等。 3、开放创新:如果您有一定基础,且热爱探索钻研,可以在此代码基础上二次开发,进行修改、扩展,创造出属于自己的独特应用。 欢迎下载使用优质资源!欢迎借鉴使用,并欢迎学习交流,共同探索编程的无穷魅力! 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值