java集合之ArrayList

硅谷探秘者 2894 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基础 1665 javaHashtable一、构造方法1.publicHashtable()publicHashtable(){this(11,0.75f);}无参构造,初始化一个容量为11,负载因子为
java基础 2397 1.linkedList的实现linkedlist的实现是基于数据结构:双向链表。模型图如对于linkedList没有像arrayList一样有扩容的概念。也不需要移动数据。所以对于新增和删除操作
java基础 1514 一、HashSet底层实现从HashSet的源码中可以发现,它的底层维护了一个HashMap,在newHashSet的时候,构造方法中其实是new了一个HashMap。privatetransientHashMapE,Objectmap;publicHashSet(){map=newHashMap();}publicHashSet(Collection?extendsEc){map=newHash
java基础 2039 javaTreeMap实现原理TreeMap的实现其实说简单也简单说复杂也复杂,说简单是因为TreeMap底层实现完全依靠红黑树这个数据结构,相比与HashMap来说TreeMap不用考虑
java基础 1378 1.HashMap的构造函数1.publicHashMap()publicHashMap(){this.loadFactor=DEFAULT_LOAD_FACTOR;//allotherfieldsdefaulted}构造一个空的HashMap,初始容量为16,负载因子为0.75,负载因子和它的作用将会在下方解释。2.publicHashMap(intinitialCapacity)publicH
java基础 2896 Java框架数据结构是以某种形式将数据组织在一起的,它不仅存储数据,还支持访问和处理数据的操作。Java提供了几个能有效地组织和操作数据的数据结构,这些数据结构通常称为Java框架。在平
算法基础 1878 Java中遍历的方式以list为例,有三种遍历方式。ListStringlist=newArrayList(); list.add("2"); list.add("2"); list.add
数据结构,算法基础 840 代表来表示属于这个.当set[i]==i是表明i是一个根节点。set[i]==k可以理解为i,k间有一条连通的路线,被称为链接。 初始化让所有元素指向自己,表示属于不同的,此时中每个元素
归档
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 2021-04  4 2021-05  4 2021-06  1 2021-07  7 2021-08  2 2021-09  8 2021-10  9 2021-11  16 2021-12  14 2022-01  7 2022-05  1 2022-08  3 2022-09  2 2022-10  2 2022-12  5 2023-01  3 2023-02  1 2023-03  4 2023-04  2 2023-06  3 2023-07  4 2023-08  1 2023-10  1 2024-02  1 2024-03  1 2024-04  1 2024-08  1
标签
算法基础 linux 前端 c++ 数据结构 框架 数据库 计算机基础 储备知识 java基础 ASM 其他 深入理解java虚拟机 nginx git 消息中间件 搜索 maven redis docker dubbo vue 导入导出 软件使用 idea插件 协议 无聊的知识 jenkins springboot mqtt协议 keepalived minio mysql ensp 网络基础 xxl-job rabbitmq haproxy srs 音视频 webrtc javascript 加密算法
目录
没有一个冬天不可逾越,没有一个春天不会来临。最慢的步伐不是跬步,而是徘徊,最快的脚步不是冲刺,而是坚持。