前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java集合之ArrayList源码分析

Java集合之ArrayList源码分析

作者头像
烟草的香味
发布2019-07-25 10:58:59
4300
发布2019-07-25 10:58:59
举报
文章被收录于专栏:烟草的香味烟草的香味

概述

ArrayList可以理解为动态数组, 根据MSDN的说法, 就是Array的复杂版本. 与数组相比, 它的容量能动态增长. ArrayList是List接口的可变数组的实现. 实现了所有可选列表操作, 允许包括null在内的所有元素.

数组的特点, 查询快增删慢.

每个ArrayList实例都有一个容量, 该容量是指向用来存储列表元素的数组大小. 随着向ArrayList中不断添加元素, 其容量也自动增长, 自动增长会带来数据向新数组的重新拷贝, 因此, 如果可预知数据量的多少, 可在构造ArrayList时指定其容量. 在添加大量元素前, 应用程序也可以使用 ensureCapacity 方法来增加ArrayList实例的容量, 可以减少递增式再分配的数量.

注意: ArrayList不是线程安全的.

ArrayList原理

ArrayList实现了List接口、底层使用数组保存所有元素, 其操作基本上是对数组的操作.

ArrayList继承了AbstractList, 实现了List. 它是一个数组, 提供了相关的添加、删除、修改、遍历等.

ArrayList实现了RandmoAccess接口, 即提供了随机访问功能. RandmoAccess是java中用来被List实现的, 为List提供快速访问功能的. 在ArrayList中, 可以通过元素的序号快速获取元素对象, 这就是快速随机访问.

ArrayList实现了Cloneable接口, 即覆盖了函数clone(), 能被克隆.

ArrayList实现java.io.Serizlizable接口, 这意味着ArrayList支持序列化, 能通过序列化去传输.

1.ArrayLIst底层用数组实现

其他字段:

2.构造函数

3.存储

ArrayList提供了多种添加元素的方法.

(1)add(E e)方法, 将指定元素添加到列表的尾部. 当容量不足时, 调用 grow 增长容量.

可以看到, 方法核心内容就是 ensureCapacityInternal 方法. 用于调整数组容量, 这个函数就是 自动扩容机制的核心. 其实现如下:

也就是说, 当增加数据时, 若ArrayList大小不够了, 那么将数组扩容为原来的1.5倍.

(2)add(int, E)在指定位置插入元素

(3)set(int, E)将指定位置的元素替换, 返回旧的元素的值

(4)addAll(Collection)将指定Collection中的元素添加到末尾

(5)addAll(int, Collection)将指定Collection中的元素添加到指定位置

方法基本都大同小异, 重要的就是为数组扩容

4.读取

读取的方法就比较简单了, ArrayList 能够支持随机访问的原因也是很显然的, 因为它内部的数据结构是数组, 而数组本身就是支持随机访问

5.删除

(1)remove(int)删除指定下标的元素并返回

(2)remove(Object)删除指定的元素, 返回是否成功(布尔值)

删除数组中的元素, 会将元素后面的所有元素向左移动一个位置.

6.调整数组容量

ensureCapacity 方法用于调整数组的容量

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-01-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 烟草的香味 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 概述
  • ArrayList原理
相关产品与服务
文件存储
文件存储(Cloud File Storage,CFS)为您提供安全可靠、可扩展的共享文件存储服务。文件存储可与腾讯云服务器、容器服务、批量计算等服务搭配使用,为多个计算节点提供容量和性能可弹性扩展的高性能共享存储。腾讯云文件存储的管理界面简单、易使用,可实现对现有应用的无缝集成;按实际用量付费,为您节约成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档