package com.collection;
import java.util.ArrayList;
import org.junit.Test;
/*
集合的体系:
----| Collection: 单例集合的根接口
-------| List:实现了List接口的集合类,具备的特点:有序,可重复;
----------| ArrayList:
笔试题:使用ArrayList无参的构造函数创建一个对象时,默认的容量是多少?如果长度不够时,每次增加多少?
从ArrayList的源码可以看出:
ArrayList是底层维护了一个Object数组实现的;在JDK1.7以前,使用无参构造函数时,
Object默认的容量是10;在1.7以后,进行了优化,初始化时,Object数组的容量为0,
当需要添加元素的时候再给数组增加容量;如果数组长度不够使用时,会自动增长0.5倍;
原理:ArrayList是在底层维护了一个Object数组实现的,所以可以添加任意类型的元素;
特点:查询速度快,增删慢;
特点分析:
因为ArrayList底层是维护了一个Object数组实现的,而数组的特点是元素与元素之间的内存地址是连续的;
那么当有多条数据的时候,假设第一个元素的内存地址是0x01,那么第二个元素的内存地址就是0x02,同理
当需要获取第88个元素的时候,只需要把内存地址指向0x88,就可以直接获取到;所以查询速度快;
根据ArrayList的源码可以看出,当向ArrayList增加元素的时候,首先要判断数组的长度是否足够,
如果不够,就需要重新创建一个新的数组对象,新数组的容量是原数组容量的1.5倍,然后将原数组中的所有
元素全部拷贝到新的数组中,再在新数组中添加元素;当数据量比较大的时候,这个过程会非常耗时间,所以
说增加数据慢;
当从ArrayList中删除元素的时候,删除掉元素的内存位置会空出来,那么后面的元素就会全部往前移动一位,
填补删除元素的空位,以保证元素与元素之间的内存地址是连续的;当后面的元素数量比较大的时候,这个移动的
过程也是非常耗时间的,所以说删除数据慢;
什么时候使用ArrayList:
如果对数据的操作是查询比较多,增删比较少,就可以选择用ArrayList;
比如:学习的图书馆;
----------| LinkedList:
----------| Vector:
-------| Set:实现了Set接口的集合类,具备的特点:无序,不可重复;
*/
public class Demo3 {
@SuppressWarnings({ "rawtypes", "unchecked" })
@Test
public void test1(){
ArrayList arr = new ArrayList();
arr.add("张三");
arr.add("李四");
arr.add("王五");
}
}
ArrayList源码分析增加元素慢的原因:
ArrayList源码分析删除元素慢的原因: