java集合之ArrayList

硅谷探秘者 1591 0 1

        ArrayList的实现是一个动态数组,从源码中也可以看出。这就决定了他的查找效率高,可以直接通过下标访问。但是对于删除和增加元素,需要大量的移动元素,所以插入和删除的效率就很低。


a1.png


ArrayList不是线程安全的,只能用在单线程环境下,多线程环境下可以考虑用Collections.synchronizedList(List l)函数返回一个线程安全的ArrayList类。

 

构造方法:

ArrayList(int initialCapacity) 构造具有指定初始容量的空列表

ArrayList() 默认容量是10

ArrayList(Collection<? extends E> c)  构造包含指定集合的元素的列表,按集合的迭代器返回元素的顺序排列


重点看看添加方法是如何扩容的

a2.png

    跟随方法的调用发现了扩容的时机:

    如果添加元素以后的容量大于当前数组的长度了,则会执行扩容方法

a3.png


扩容方法:

a4.png


int newCapacity = oldCapacity + (oldCapacity >> 1);

已经很明确的告诉我们数组扩容后的容量是原数组的1.5倍。右移一位就相当于除以2,再加上原来数组的长度。即为原来的1.5倍

接着Arrays.copyOf(elementData, newCapacity);方法追踪下去会发现,底层调用的是System类的arraycopy(Object src, int srcPos, Object dest, int destPos, int length)方法。这也说明了ArrayList的扩容是浅拷贝。


浅拷贝和深拷贝

浅拷贝说白了就是把数组的引用拷贝一份。拷贝的数组元素,和被拷贝的数组元素还是指向同一个对象。

a6.png

深拷贝和浅拷贝的区别是深拷贝连同数据一块复制了一份,两个数组之间没有关系

a8.png



移除方法

a9.png


第一步是先检查范围。

源码中可以看出System.arraycopy(elementData, index+1, elementData, index,  numMoved);就是在移动元素,然后将最后一个元素空出来置为null



猜你喜欢
java基础 259 javaHashtable一、构造方法1.publicHashtable()publicHashtable(){this(11,0.75f);}无参构造,初始化一个容量为11,负载因子为
java基础 1123 1.linkedList的实现linkedlist的实现是基于数据结构:双向链表。模型图如对于linkedList没有像arrayList一样有扩容的概念。也不需要移动数据。所以对于新增和删除操作
java基础 214 一、HashSet底层实现从HashSet的源码中可以发现,它的底层维护了一个HashMap,在newHashSet的时候,构造方法中其实是new了一个HashMap。privatetransientHashMapE,Objectmap;publicHashSet(){map=newHashMap();}publicHashSet(Collection?extendsEc){map=newHash
java基础 363 javaTreeMap实现原理TreeMap的实现其实说简单也简单说复杂也复杂,说简单是因为TreeMap底层实现完全依靠红黑树这个数据结构,相比与HashMap来说TreeMap不用考虑
java基础 162 1.HashMap的构造函数1.publicHashMap()publicHashMap(){this.loadFactor=DEFAULT_LOAD_FACTOR;//allotherfieldsdefaulted}构造一个空的HashMap,初始容量为16,负载因子为0.75,负载因子和它的作用将会在下方解释。2.publicHashMap(intinitialCapacity)publicH
java基础 1264 Java框架数据结构是以某种形式将数据组织在一起的,它不仅存储数据,还支持访问和处理数据的操作。Java提供了几个能有效地组织和操作数据的数据结构,这些数据结构通常称为Java框架。在平
java基础 2411 有Student类,一个List中有若干Student对象,对此按分数排序Studentpackagecom.example.demo.entity;@SuppressWarnings
算法基础 8 Java中遍历的方式以list为例,有三种遍历方式。ListStringlist=newArrayList(); list.add("2"); list.add("2"); list.add
归档
2018年11月  12 2018年12月  33 2019年01月  28 2019年02月  28 2019年03月  32 2019年04月  27 2019年05月  33 2019年06月  6 2019年07月  12 2019年08月  12 2019年09月  21 2019年10月  8 2019年11月  15 2019年12月  25 2020年01月  9 2020年02月  5 2020年03月  16 2020年04月  4 2020年06月  1 2020年07月  7 2020年08月  13 2020年09月  9 2020年10月  5 2020年12月  3 2021年01月  1 2021年02月  5 2021年03月  7
标签
算法基础 linux 前端 c++ 数据结构 框架 数据库 计算机基础 储备知识 java基础 ASM 其他 深入理解java虚拟机 nginx git 消息中间件 搜索 maven redis docker dubbo
目录