Android题库源码分析

ArrayList

2022-02-24  本文已影响0人  Alsan_L3

实现:

 ArrayList内部实现是由一个数组实现的,我们增加、删除都是操作该数据,所以他继承了数组的一些优缺点。

优点:

  1. 查询速度快

缺点

  1. 增加到一定大小时,会触发数组的扩容,而且当前数组的默认长度是实际长度的1.5倍,存在额外的内存开销
  2. add和remove操作都是通过数组的复制来实现的,这两种操作太多,也会有一定的性能问题
  3. 线程不安全

实现类图:

微信截图_20220222113417

如何实现一个简单的ArrayList:

  1. 自定义一个类:CustomArrayList
  2. 创建一个数组,定义数组默认大小和扩容策略
  3. 实现方法:add、get、remove、size、iterator等方法
  4. 这样一个简单的ArrayList就实现了
代码实现如下:
public class CustomArrayList<T> {
    private Object[] elementArr;
    private int size;

    public CustomArrayList(int initialCapacity) {
        if(initialCapacity < 0){
            throw new IllegalArgumentException("初始大小不能小于0");
        }
        elementArr = new Object[initialCapacity];
    }

    public CustomArrayList() {
        this(10);
    }

    public boolean add(T t){
        if(size == elementArr.length){
            Object[] temp = new Object[size*2 + 1];
            System.arraycopy(elementArr, 0, temp, 0, elementArr.length);
            elementArr = temp;
        }
        elementArr[size ++] = t;
        return true;
    }

    public void remove(int index){
        if(index < 0 || index >= size){
            throw new ArrayIndexOutOfBoundsException("索引超出数组边界");
        }

        int m = size - index - 1;
        if(m > 0){
            System.arraycopy(elementArr, index + 1, elementArr, index, m);
        }
        elementArr[--size] = null;
    }

    public void remove(T t){
        if(t != null){
            for(int i = 0; i < size; i ++){
                if(elementArr[i] == t){
                    remove(i);
                }
            }
        }
    }

    public T get(int index){
        if(index < 0 || index >= size){
            throw new ArrayIndexOutOfBoundsException("索引超出数组边界");
        }
        return (T) elementArr[index];
    }

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

    public static void main(String[] args) {
        CustomArrayList<Integer> s=new CustomArrayList();
        s.add(1);
        s.add(2);
        s.add(3);
        s.add(4);
        System.out.println("集合长度:"+s.size());
        s.remove(1);
        for (int i = 0; i < s.size(); i++) {
            System.out.println(s.get(i));
        }
    }

}
上一篇下一篇

猜你喜欢

热点阅读