问题一: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慢?