ホームページ  >  記事  >  Java  >  Java での ArrayList カスタム模倣ソース コードの例

Java での ArrayList カスタム模倣ソース コードの例

黄舟
黄舟オリジナル
2017-03-27 10:13:461315ブラウズ

この記事は主にJavaでソースコードのカスタマイズを模倣するArrayListの関連情報を紹介しますので、必要な友人はそれを参照してください

JavaでArrayListのソースコードのカスタマイズを模倣する

最近ソースを見ました。 ArrayList のコード。ArrayList: をよりよく理解できるように、ArrayList の基になる構造に基づいて、ジェネリックを持たない単純な関数を使用してカスタム ArrayLsit を作成しました。コードは、ArrayList のコードです。は次のとおりです:

/** 
 * 自己实现一个ArrayList 
 * 
 */ 
public class MyArrayList { 
   
  private Object[] elementData; 
  private int size; 
   
   
  public int size(){ 
    return size; 
  } 
   
  public boolean isEmpty(){ 
    return size==0; 
  } 
  //默认容量为10 
  public MyArrayList(){ 
    this(10); 
  } 
  /** 
   * 自定义容量 
   * @param initialCapacity 
   */ 
  public MyArrayList(int initialCapacity){ 
    if(initialCapacity<0){ 
      try { 
        throw new Exception(); 
      } catch (Exception e) { 
        e.printStackTrace(); 
      } 
    } 
    elementData = new Object[initialCapacity]; 
  } 
  /** 
   * 添加一个元素 
   * @param obj 
   */ 
  public void add(Object obj){ 
    //数组扩容和数据的拷贝,重新new一个数组 
    if(size==elementData.length){ 
      Object[] newArray = new Object[size*2+1]; 
      System.arraycopy(elementData, 0, newArray, 0, elementData.length); 
 
      elementData = newArray; 
    } 
     
    elementData[size++]=obj; 
//   size++; 
  } 
  /** 
   * 通过索引获取元素 
   * @param index 
   * @return 
   */ 
  public Object get(int index){ 
    rangeCheck(index); 
     
    return elementData[index]; 
  } 
  /** 
   * 通过索引删除元素 
   * @param index 
   */ 
  public void remove(int index){ 
    rangeCheck(index); 
     
    int numMoved = size - index - 1; 
    if (numMoved > 0){ 
      System.arraycopy(elementData, index+1, elementData, index, 
          numMoved); 
    } 
    elementData[--size] = null; // Let gc do its work 
  } 
  /** 
   * 删除对应的元素(利用equal判断元素是否一致) 
   * @param obj 
   */ 
  public void remove(Object obj){ 
    for(int i=0;i<size;i++){ 
      if(get(i).equals(obj)){ //注意:底层调用的equals方法而不是==. 
        remove(i); 
      } 
    } 
  } 
  /** 
   * 设置索引对应的元素 
   * @param index 
   * @param obj 
   * @return 
   */ 
  public Object set(int index,Object obj){ 
    rangeCheck(index); 
 
    Object oldValue = elementData[index]; 
    elementData[index] = obj; 
    return oldValue; 
  } 
  /** 
   * 将元素插入对应的位置 
   * @param index 
   * @param obj 
   */ 
  public void add(int index,Object obj){ 
    rangeCheck(index); 
     
    ensureCapacity(); //数组扩容 
     
    System.arraycopy(elementData, index, elementData, index + 1, 
         size - index); 
    elementData[index] = obj; 
    size++; 
  } 
  /** 
   * 数组扩容 
   */ 
  private void ensureCapacity(){ 
    //数组扩容和数据的拷贝 
        if(size==elementData.length){ 
          Object[] newArray = new Object[size*2+1]; 
          System.arraycopy(elementData, 0, newArray, 0, elementData.length); 
//             for(int i=0;i<elementData.length;i++){ 
//               newArray[i] = elementData[i]; 
//             } 
          elementData = newArray; 
        } 
  } 
   
  /** 
   * 数组下标检查 
   * @param index 
   */ 
  private void rangeCheck(int index){ 
    if(index<0||index>=size){ 
      try { 
        throw new Exception(); 
      } catch (Exception e) { 
        e.printStackTrace(); 
      } 
    } 
  } 
   
   
  public static void main(String[] args) { 
    MyArrayList list = new MyArrayList(3); 
    list.add("333"); 
    list.add("444"); 
    list.add("5"); 
    list.add("344433"); 
    list.add("333"); 
    list.add("333"); 
    for (int i = 0; i < list.size(); i++) { 
      System.out.println(list.get(i));  
    } 
    System.out.println("------------------------------");  
    list.remove("444"); 
    list.add(2, "a"); 
    for (int i = 0; i < list.size(); i++) { 
      System.out.println(list.get(i));  
    } 
  } 
 
}

テスト結果:

333

444

5

344433

333

333

------------------------------

333

5

a

344433

333

333

以上がJava での ArrayList カスタム模倣ソース コードの例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。