Java集合之ArrayList源码分析

概述

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

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

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

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

ArrayList原理

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

Java集合之ArrayList

 

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

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

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

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

1.ArrayLIst底层用数组实现

Java集合之ArrayList

 

其他字段:

Java集合之ArrayList

 

2.构造函数

Java集合之ArrayList

 

Java集合之ArrayList

 

Java集合之ArrayList

 

3.存储

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

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

Java集合之ArrayList

 

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

Java集合之ArrayList

 

Java集合之ArrayList

 

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

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

Java集合之ArrayList

 

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

Java集合之ArrayList

 

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

Java集合之ArrayList

 

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

Java集合之ArrayList

 

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

4.读取

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

Java集合之ArrayList

 

5.删除

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

Java集合之ArrayList

 

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

Java集合之ArrayList

 

Java集合之ArrayList

 

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

6.调整数组容量

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

Java集合之ArrayList

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/508600.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

视频业务原理

最近要学习如何进行视频的用户体验测量,首先学习最基础的知识,视频业务的原理是什么。 研究的视频的应用层协议是HTTP,使用的传输层协议是TCP。 工作过程如下:客户端向服务器请求相应的视频信息;服务器响应请求发回视…

Java集合之Hashtable源码分析

概述 Hashtable也是基于哈希表实现的, 与map相似, 不过Hashtable是线程安全的, Hashtable不允许 key或value为null. 成员变量 Hashtable的数据结构和HashMap一样, 采用 数组加链表的方式实现. 几个成员变量与HashMap一样: 方法 Hashtable的方法与HashMap基本一样, 只是 Ha…

视频质量检测中的TP、FP、Reacll、Precision

在看论文《Measuring Vedio QoE from Encrypted Traffic》的时候看到TP(True Positives)、FP(False Positives)、Precison、Recall的概念,这属于数据挖掘方面的内容,学习之后特来记录。 首先,下…

Java集合之LinkedHashMap源码分析

概述 HashMap是无序的, 即put的顺序与遍历顺序不保证一样. LinkedHashMap是HashMap的一个子类, 它通过重写父类的相关方法, 实现自己的功能. 它保留插入的顺序. 如果需要输出和输入顺序相同时, 就选用此类. LinkedHashMap原理 LinkedHashMap是如何保证输入输出顺序的呢? L…

视频流传输协议RTP/RTCP/RTSP/HTTP的区别

在转载之前:我研究主要是基于HTTP的视频流,正在研读的论文名:“Modeling and Analyzing the Influence of Chunk Size Variation on Bitrate Adaptation in DASH”,里面有一句话,“Compared with early connection-ori…

Java集合之HashSet源码分析

概述 HashSet是基于HashMap来实现的, 底层采用HashMap的key来保存数据, 借此实现元素不重复, 因此HashSet的实现比较简单, 基本上的都是直接调用底层HashMap的相关方法来完成. HashSet的构造方法就是创建HashMap: 基本操作 1.添加操作 2.删除操作 3.迭代器 其他方法基本也是调…

三次握手wireshark抓包分析,成功握手和失败握手

转载之前:基于HTTP的视频流中,客户端有时会打开使用多条TCP与服务器连接,为了验证每一对话的sessionID是否相同,使用wireshark进行了抓包分析(抓到的都是加密的包,无卵用orz....),这…

Java 内部类及其原理

Java中实现内部类 内部类相信大家都用过很多次了,就不说它是怎么用的了。 内部类 1.成员内部类 需要注意的是, 当成员内部类拥有和外部类同名的成员变量或这方法时, 默认情况下访问的是内部类的成员, 如要访问外部类的同名成员&…

西游日记7/27

已经到第四天了,觉得需要写一些进展来督促一下自己。 早上8点钟左右到的实验室,将昨天没有回顾完的论文再次回顾一遍,又重新发现了一些点,确实,在完全明白之前,一篇好的论文是常读常新的。在吃午饭之前&am…

JVM 垃圾回收机制

首先JVM的内存结构包括五大区域: 程序计数器、虚拟机栈、本地方法栈、方法区、堆区。其中程序计数器、虚拟机栈和本地方法栈3个区域随线程启动与销毁, 因此这几个区域的内存分配和回收都具有确定性,不需要过多考虑回收的问题。而Java堆区和方法区则不一样…

Modeling and Analyzing the Influence of Chunk Size Variation on Bitrate Adaptation in DASH 名字解释0728

在看“Modeling and Analyzing the Influence of Chunk Size Variation on Bitrate Adaptation in DASH”的时候遇到挺多的名词不是很明白,在这里做一下学习笔记(按照论文顺序)。 1、CDN server:“CDN将源站内容分发至最接近用户的…

Java8 Lambda表达式

概述 lambda表达式, 是Java8中的一个新特性。可以理解为一个匿名函数。 lambda表达式可以理解为将一个函数浓缩为一行代码,使代码更加简洁紧凑。 lambda表达式语法: (parameters) -> statement; 或 (parameters) -> {statements;} 参…

西游日记0728

今天要早点翘班儿,请表妹儿吃饭,现在来总结一下我今天的干活吧。 早上8点钟到的实验室,私以为还可以提早一点,确实是一个人的时候比较容易狂欢,早上的工作效率有点低啊。早上嘛,就是看论文诺,看…

Java8 方法引用

概述 方法引用是用来直接访问类或实例阴茎存在的方法或者构造方法.它需要由兼容的函数式接口(lambda表达式中用到的接口)构成的目标类型上下文. 有时候, 当我们想要实现一个函数式接口的方法, 但是已经由类实现了我们想要的功能, 这时可以使用方法引用来直接使用现有的功能实现…

配置过程中的一些问题

一、 Tomcat相关问题 1、百度经验有设置用户名密码,但是按照步骤进行,到测试的时候发现还是错误的。 解决:在设置的时候应该stop Tomcat,在设置好之后再重新开启Tomcat,发现可以。 2、把web项目加入Tomcat&#xff0…

流媒体通信协议HLS与DASH的对比

简单了解 HLS(HTTP Live Streaming)协议 是由苹果公司实现的基于HTTP的流媒体通信协议,并成为Quick TIme X和IPhone软件系统的一部分。苹果的IPad也有支持HLS的能力。 HLS传出的视频文件为基于MPEG2文件的切片,每个媒体切片在服务器上单独存放。在一个流…

Java8 Optional类

概述 到目前为止,著名的NullPointerException是导致Java应用程序失败的最常见原因。过去,为了解决空指针异常,Google公司著名的Guava项目引入了Optional类,Guava通过使用检查空值的方式来防止代码污染,它鼓励程序员写…

Activity的四种启动模式和onNewIntent()

Android中Activity启动模式详解 在Android中每个界面都是一个Activity,切换界面操作其实是多个不同Activity之间的实例化操作。在Android中Activity的启动模式决定了Activity的启动运行方式。 Android总Activity的启动模式分为四种: Activity启动模式设置…

Java8 默认方法

概述 Java8新增了接口的默认方法。使用default关键字。 默认方法就是接口可以有实现方法,而且不需要实现类来实现其方法。相对于JDK1.8之前的接口来说,新增了可以接口中实现方法。 可以说在接口中实现方法一部分原因是为了lambda表达式服务的&#xf…

Android Activity 生命周期中onStart()和onResume()的区别

首先了解Activity的四种状态 Running状态:一个新的Activity启动入栈后,它在屏幕最前端,处于栈的最顶端,此时它处于可见并可和用户交互的激活状态。 Paused状态:当Activity被另一个透明或者Dialog样式的Activity覆盖时的…