Maison  >  Article  >  Java  >  Exemple de code source d'imitation personnalisé ArrayList en Java

Exemple de code source d'imitation personnalisé ArrayList en Java

黄舟
黄舟original
2017-03-27 10:13:461209parcourir

Cet article présente principalement les informations pertinentes sur l'imitation de la personnalisation du code source ArrayList en Java Les amis dans le besoin peuvent se référer à

Java Imitate the. code source pour personnaliser ArrayList

J'ai récemment regardé le code source d'ArrayList et j'ai pris le temps d'écrire un ArrayLsit personnalisé avec des fonctions simples et aucun générique basé sur la structure sous-jacente d'ArrayList pour m'aider à mieux comprendre ArrayList :. La structure de données sous-jacente implémentée est un groupe de Objet, et le code est le suivant :

/** 
 * 自己实现一个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));  
    } 
  } 
 
}

Résultats du test :

333

444

5

344433

333

333

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

333

5

a

344433

333

333

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn