Java学习笔记之集合(三):ArrayList集合的原理和特点

来源:互联网 发布:全球大数据峰会 编辑:程序博客网 时间:2024/05/29 19:15

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" })@Testpublic void test1(){ArrayList arr = new ArrayList();arr.add("张三");arr.add("李四");arr.add("王五");}}

ArrayList源码分析增加元素慢的原因:









ArrayList源码分析删除元素慢的原因:







原创粉丝点击