ArrayList源码分析三

问题一:ArrayList如何扩容?

第一次扩容是10,后面扩容是原来集合大小的1.5倍

问题二:ArrayList添加海量数据

   ArrayList list  =new ArrayList();
   list.add("Android");
   list.add("Java");
   list.add("PHP");

   long startTime = System.currentTimeMillis();
   for (int i = 0; i < 100000; i++) {
       list.add(i+"");
   }
   long endTime = System.currentTimeMillis();
   long time = endTime - startTime;

存在的问题:1.扩容n次  2.性能低

解决方法:使用 ArrayList有参构造

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main8);
        ArrayList list  =new ArrayList();
        list.add("Android");
        list.add("Java");
        list.add("PHP");

        long startTime = System.currentTimeMillis();
        for (int i = 0; i < 100000; i++) {
            list.add(i+"");
        }
        long endTime = System.currentTimeMillis();
        System.out.println("增加10万条数据所用时间:"+(endTime - startTime));


        startTime = System.currentTimeMillis();
        ArrayList list1  =new ArrayList(100000);
        for (int i = 0; i < 100000; i++) {
            list1.add(i+"");
        }
        endTime = System.currentTimeMillis();
        System.out.println("优化后增加10万条数据所用时间:"+(endTime - startTime));
    }

 问题三:ArrayList插入数据和删除数据一定比LinkedList慢?

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main10);
        ArrayList<String> arrayList  =new ArrayList();
        //添加500w数据
        for (int i = 0; i < 500000; i++) {
            arrayList.add(i+"test");
        }
        long startTime = System.currentTimeMillis();
        arrayList.remove(500);
        long endTime = System.currentTimeMillis();
        System.out.println("ArrayList刪除元素所用时间:"+(endTime - startTime));

        LinkedList<String> linkedList =new LinkedList();
        //添加500w数据
        for (int i = 0; i < 500000; i++) {
            linkedList.add(i+"test");
        }
        startTime = System.currentTimeMillis();
        linkedList.remove(500);
        endTime = System.currentTimeMillis();
        System.out.println("LinkedList刪除元素所用时间:"+(endTime - startTime));

    }

 可以看到并不是绝对的

ArrayList的remove方法

    public E remove(int index) {
        if (index >= size)
            throw new IndexOutOfBoundsException(outOfBoundsMsg(index));

        modCount++;
        //将index对应的元素赋值给oldVale
        E oldValue = (E) elementData[index];
        //计算集合需要移动的元素个数
        int numMoved = size - index - 1;
        if (numMoved > 0)
            System.arraycopy(elementData, index+1, elementData, index,
                             numMoved);
        elementData[--size] = null; // clear to let GC do its work

        return oldValue;
    }

LinkedList的remove方法

 问题四:ArrayList插入数据和删除数据一定比LinkedList慢?

猜你喜欢

转载自blog.csdn.net/jingerlovexiaojie/article/details/109078721