手动实现ArrayList

来源:互联网 发布:阿里移动推荐算法代码 编辑:程序博客网 时间:2024/06/13 00:20
当我们创建一个数组对象的时候 必须要明确空间大小
   ArrayList底层基于Object[]实现的
   其实我们可以再创建ArrayList对象的时候 明确底层
   开辟多大的数组对象 再构造方法里面传参数
   参数:表示底层数组对象开辟多大空间
   当我们调用无参构造方法的时候 底层默认开辟10块内存空间
   但是不代表只能装10个元素
   集合会自动扩容:
   jdk6.0及之前 x*3/2+1 ->10 -> 16 -> 25....
   jdk7.0及之后 x+(x>>1)->10 -> 15 -> 22...
   但是再开发的时候 尽量避免扩容:
    1:创建新的数组对象
    2:将老数组里面的元素复制进新数组里面
    3:改变引用指向
    4:回收老数组对象
    5:继续添加元素
/ArrayList
 //属性:data   size
 //构造方法:有参  无参
 //普通方法:
  //size()
  //get()
  //add()
  //remove()
  //remove()
  //contains()
  //toString()
  //trimToSize()
  //ensureCapacity()


import java.util.*;public class TestArrayList8Plus{public static void main(String[] args){AList<Integer> list = new AList<Integer>();list.add(45);list.add(77);list.add(666);//Collections.addAll(list,56,77,90);System.out.println(list.size());System.out.println(list.get(2));System.out.println(list.contains(45));System.out.println(list);}}class AList<E>{//属性:private Object[] data;private int size;//构造方法public AList(int x){data = new Object[x];}public AList(){//[]:10data = new Object[10];}//方法://int x = list.size();public int size(){return size;//0}//Object obj = list.get(int x);public Object get(int x){return data[x];}//void -> list.add(Object obj);public void add(E obj){if(data.length == size){Object[] temp = new Object[size + (size >> 1)];//nullSystem.arraycopy(data,0,temp,0,size);data = temp;data[size] = obj;size++;}else{data[size] = obj;size++;}}//void -> list.remove(3);public void remove(int x){System.arraycopy(data,x+1,data,x,size-(x+1));size --;}public void remove(Object obj){//[]:10 -> 2for(int x = 0;x < size;x++){if(obj.equals(data[x])){remove(x);break;}}}//list.contains(元素)public boolean contains(Object obj){//obj调用equals方法和集合里面的每一个元素作比较//张三  李四  王五//list.contains("李四")for(int x = 0;x < size;x++){//10->2if(obj.equals(data[x])){return true;}}return false;}public void ensureCapacity(int x){if(x <= data.length){System.out.println("已经确保有" + x + "块容量");}else{Object[] temp = new Object[x];System.arraycopy(data,0,temp,0,size);data = temp;}}public void trimToSize(){Object[] temp = new Object[size];System.arraycopy(data,0,temp,0,size);data = temp;}@Overridepublic String toString(){//[元素1,元素2,元素3]StringBuffer buffer = new StringBuffer("[");for(int x = 0;x < size;x++){//x -> 下标//data[x] -> 元素buffer.append(data[x]);if(x != size - 1){buffer.append(",");}}buffer.append("]");return buffer.toString();}}