当前位置: 首页 > 编程日记 > 正文

Java 集合框架(二)—— ArrayList

二、数组列表 —— ArrayList

1、构造方法

ArrayList 是 Java 中的动态数组,底层实现就是对象数组,只不过数组的容量会根据情况来改变。

它有个带 int 类型参数的构造方法,根据传入的参数,扩展初始化的数组容量,这个方法是推荐使用的,因为如果预先知道数组的容量,可以设置好初始值,而不用等每次容量不够而扩容,减少 Arrays.copyOf 的次数:

它的很多方法的实现都是依靠 Arrays 这个工具类完成的,足以体现它与数组之间的密切关系。

比如有个带 Collection 类型的构造方法,实现如下:

  2、常用方法

1)  trimToSize 方法

Trims the capacity of this ArrayList instance to be the list's current size.

An application can use this operation to minimize the storage of an ArrayList instance.

该方法可以去掉 ArrayList 占用的多余的空间或内存,因为 ArrayList 每次扩容后总会有所剩余,如果数组很大,占用的多余的空间会比较大,内存不够时可以使用此方法。

2)ensureCapacity 方法

public void ensureCapacity(int minCapacity)

Increases the capacity of this ArrayList instance, if necessary, to ensure that it can hold at least the number of elements specified by the minimum capacity argument.

除了在初始化 ArrayList 的时候可以事先定义一个给定的容量之外,还可以用此方法提高 ArrayList 的初始化速度。看下面的例子:

 1 public static void main(String[] args) {
 2         int n = 100000;
 3         String str = "hello google";
 4 
 5         // 没有调用 ensureCapacity() 方法初始化 ArrayList 对象
 6         ArrayList<String> list = new ArrayList<>();
 7         long startTime = System.currentTimeMillis();
 8         for (int i = 0; i <= n; i++) {
 9             list.add(str);
10         }
11         long endTime = System.currentTimeMillis();
12         System.out.println("time: " + (endTime - startTime) + " ms");
13 
14         // 调用 ensureCapacity() 方法初始化 ArrayList 对象
15         list = new ArrayList<>();
16         startTime = System.currentTimeMillis();
17         list.ensureCapacity(n);
18         for (int i = 0; i < n; i++) {
19             list.add(str);
20         }
21         endTime = System.currentTimeMillis();
22         System.out.println("time: " + (endTime - startTime) + " ms");
23     }

结果为:

  3)isEmpty 方法

注意此方法是判断是否为空,不是是否为 null

public boolean isEmpty() {return size == 0;
}

4)indexOf 、lastIndexOf 和 contain 方法

indexOf 方法返回 list 中首次出现给定对象的索引值(从 0 开始),如果不存在则返回 -1。

lastIndexOf 方法返回 list 中最后一次出现给定对象的索引值(从 size - 1 开始),如果不存在则返回 -1。

contain 方法 参数为 Object o,判断 list 中是否包含给定的对象,存在则返回 true,源码如下:

5)add,get 和 set 方法

三个很简单的方法,区别在于:add 方法是数组长度 +1,将给定对象放在最后的位置,set 方法是替换指定索引位置的元素,get 方法则是获取指定索引位置的元素。

6)remove 方法

删除指定索引位置的元素或者指定元素,不推荐使用,对数组操作比较复杂,如果你使用了此方法,说明你应该考虑用 LinkedList 了。

3、最佳使用建议

1)ArrayList 是 Array 的复杂版本

ArrayList 内部封装了一个 Object 类型的数组,从一般的意义来说,它和数组没有本质的差别,甚至于 ArrayList 的许多方法,如 Index、IndexOf、Contains、Sort 等都是在内部数组的基础上直接调用 Array 的对应方法。

2)内部的 Object 类型的影响

对于一般引用类型来说,这部分的影响不大,但是对于值类型,往 ArrayList 里面添加和修改元素,都会引起装箱和拆箱操作,频繁的操作可能会影响一部分效率。

3)数组扩容

这是对 ArrayList 效率影响比较大的一个因素。

每当执行 Add、AddRange、Insert、InsertRange 等添加元素的方法,都会检查内部数组的容量是否不够了,如果是,它就会以当前容量的两倍来重新构建一个数组,将旧元素 Copy 到新数组中,然后丢弃旧数组,在这个临界点的扩容操作,应该来说是比较影响效率的。 
  例 1:比如,一个可能有 200 个元素的数据动态添加到一个以默认 16 个元素大小创建的 ArrayList 中,将会经过: 
  16*2*2*2*2 = 256 
  四次的扩容才会满足最终的要求,那么如果一开始就以 ArrayList list = new ArrayList(210) 的方式创建 ArrayList,不仅会减少 4 次数组创建和 Copy 的操作,还会减少内存使用。

例 2:预计有 30 个元素而创建了一个 ArrayList: 
  ArrayList List = new ArrayList(30); 
  在执行过程中,加入了 31 个元素,那么数组会扩充到 60 个元素的大小,而这时候不会有新的元素再增加进来,而且有没有调用 TrimSize 方法,那么就有 1 次扩容的操作,并且浪费了 29 个元素大小的空间。如果这时候,用 ArrayList list = new ArrayList(40) 那么一切都解决了。 
  所以说,正确的预估可能的元素,并且在适当的时候调用 TrimSize 方法是提高 ArrayList 使用效率的重要途径。

特别感谢:

1、Java 中 ArrayList 类的用法

2、《Thinking In Java》

3、《Core Java Volume I》

转载于:https://www.cnblogs.com/JavaSubin/p/5539430.html

相关文章:

Linux X Window System运行原理和启动过程

本文主要说明X Window System的基本运行原理&#xff0c;其启动过程&#xff0c;及常见的跨网络运行X Window System。 一) 基本运行原理 X Window System采用C/S结构&#xff0c;但和我们常见的C/S不同。常见的C/S结构中&#xff0c;称提供服务的一方为server&#xff0c;即服…

悬浮球 / 悬浮按钮 / 辅助按钮

原文链接&#xff1a;https://github.com/jinht/FloatingBall类似于 iOS 系统自带的 AssistiveTouch / 京东 / 聚划算 / 建行等的辅助按钮 —— 由anticipate_91分享FloatingBall Function Description 这是一个类似于iOS系统自带的AssistiveTouch/京东《我的》部分的悬浮按钮等…

手动部署OpenStack环境(四:安装控制器必备软件)

任务四、安装控制器必备组件 4.1、安装MySQL服务&#xff08;controller0&#xff09; 4.2、安装Rabbitmq消息队列&#xff08;controller0&#xff09; 4.3、Keystone认证&#xff08;controller0&#xff09; 4.4、glance的安装与配置&#xff08;controller0&#xff09; 4.…

cocoaPods安装、更新第三方库

pod install 换成 pod install --verbose --no-repo-update pod update 换成 pod update --verbose --no-repo-update这是因为&#xff1a;目前&#xff0c;cocoaPods正在被墙中......转载于:https://www.cnblogs.com/hello-Huashan/p/5542456.html

iOS 性能优化总结

原文链接&#xff1a;https://github.com/skyming/iOS-Performance-Optimization关于 iOS 性能优化梳理&#xff1a; 基本工具、业务优化、内存优化、卡顿优化、布局优化、电量优化、 安装包瘦身、启动优化、网络优化等 —— 由_skyming_分享关于iOS 性能优化梳理&#xff1a; …

TCP/IP协议分析

一;前言 学习过TCP/IP协议的人多有一种感觉&#xff0c;这东西太抽象了&#xff0c;没有什么数据实例&#xff0c;看完不久就忘了。本文将介绍一种直观的学习方法&#xff0c;利用协议分析工具学习TCP/IP&#xff0c;在学习的过程中能直观的看到数据的具体传输过程。 为了初学者…

手动部署OpenStack环境(五:新建网络及部署虚拟机)

任务五、新建网络及部署虚拟机 5.1、配置安全组规则 5.2、新建网络 5.3、创建云主机 任务五、新建网络及部署虚拟机 5.1、配置安全组规则 5.1.1、配置安全组&#xff1b; 5.2、新建网络。 5.2.1、创建外部网络&#xff1b; 5.2.2、网络地址为外部网络连接的子网地址&#xff1b…

C++基础day01 程序设计方法的发展历程

类把属性和方法作了封装&#xff01; 总结&#xff1a; 面向过程程序设计&#xff1a;数据结构 算法 主要解决科学计算问题&#xff0c;用户需求简单而固定 特点&#xff1a; 分析解决问题所需要的步骤 利用函数实现各个步骤 依次调用函数解决问题 问题&#xff1a; 软件可重用…

【android】android中activity的生命周期

activity生命周期&#xff1a; 实例代码&#xff1a; 1 public class DemoActivity extends Activity {2 3 //1、activity第一次被创建的时候&#xff0c;执行4 Override5 public void onCreate(Bundle savedInstanceState) {6 super.onCreate(savedIn…

Xcode消除编译器警告

Whenever&#xff0c;Xcode警告对于我们来说都相当重要&#xff0c;提醒我们可能存在的错误。但是有时候&#xff0c;我们知道一切都好&#xff0c;everything is in the palm of my hand&#xff0c;我们想要消除那些警告。自己项目的警告 比如我们定义一个designated initial…

手动部署OpenStack环境(六:出现的问题与解决方案总结)

排错一&#xff1a;keystone服务安装中demo用户表单没信息。 排错思路&#xff1a; 组件安装是否有问题&#xff1b;用户创建畲缶有问题&#xff1b;用户认证信息是否合适&#xff1b;原因&#xff1a;用户的认证信息配置错误。 解决方案&#xff1a; a)删除有关demo用户的所有…

一劳永逸,iOS 自定义 ActionSheet 封装流程

原文链接&#xff1a;http://www.jianshu.com/p/cfb87a7db7b1本文为 iOS 自定义视图封装《一劳永逸》系列的第四期&#xff0c;旨在提供封装思路&#xff0c;结果固然重要&#xff0c;但理解过程才最好。授人以鱼不如授人以渔。 —— 由卖报的小画家Sure分享前言 本文为iOS自定…

cocoapods更新

使用sudo gem install cocoapods更新提示&#xff1a; ERROR: While executing gem ... (Errno::EPERM) Operation not permitted 改为&#xff1a;sudo gem install -n /usr/local/bin cocoapods --pre刷刷刷完成更新。但是马上发下更新后使用pod install又发现一个问题 The …

创建对象_工厂方法(Factory Method)模式 与 静态工厂方法

工厂方法模式&#xff1a; 定义&#xff1a;为创建对象定义一个接口&#xff0c;让子类决定实例化哪个类。工厂方法让一个类的实例化延迟至子类。应用场景&#xff1a;客户类不关心使用哪个具体类&#xff0c;只关心该接口所提供的功能&#xff1b;创建过程比较复杂&#xff0c…

数据通信技术(一:IP划分)

一、某公司生产部有50人&#xff0c;销售部有100人&#xff0c;财务部有25人&#xff0c;客服部有12人&#xff0c;没个员工配置一台主机&#xff0c;该公司有192.168.100.1/24的网段可用&#xff0c;应该如何划分子网。 销售部&#xff08;100&#xff09;台&#xff1a;/25 …

团队作业—第二阶段06

站立会议&#xff1a; 继续数据库的连接编程。 任务进度&#xff1a; 实现数据的输出。 站立会议照片&#xff1a; 任务看板&#xff1a; 燃尽图&#xff1a; 转载于:https://www.cnblogs.com/cpljlgs/p/5546157.html

Fade 数字切换动效

原文链接&#xff1a;http://www.jianshu.com/p/983674e6f4ef根据原型高度还原的一个动效作品。希望可以通过审核。谢谢。 —— 由Bear1494735376123分享欢迎同样喜爱动效的你加入 iOS动效特攻队–>QQ群&#xff1a;547897182 iOS动效特攻队–>熊熊&#xff1a;64807025…

fieldset 使用小案例

有初学者问到如何做出如下页面: 对应的代码如下: <fieldset><legend>★审核状态</legend><input name"state" type"radio" class"input1" value"1" />已审核<input name"state" type"radio…

数据通信技术(二:交换机配置管理)

交换机配置与管理&#xff08;思科模拟器&#xff09; 1.从用户模式进入特权模式,并进入配置模式设置进入特权模式的密码; 2.进入交换机的端口模式并进行端口状态的设置; 用新密码登录并查看接口状态信息,重启交换机;4.硬件和软件版本查询: 5.设备CPU的利用率: 6.检查设备的MA…

iOS之各种区别

作者 APP叫我取个帅气的昵称 关注 2017.05.15 10:47* 字数 140 阅读 1273评论 7喜欢 51写在前面&#xff1a;本文持续更新&#xff0c;也欢迎简友提供更多的关于iOS&#xff08;包括swift&#xff09;中的区别 1. _ _block和 _ _weak修饰符的区别的&#xff1a; (1). _ _block不…

lightoj 1014

lightoj 1014 Ifter Party 链接&#xff1a;http://www.lightoj.com/volume_showproblem.php?problem1014 题意&#xff1a;给你两个数 p, l&#xff0c;求 cha&#xff08;cha p-l&#xff09;的约数&#xff0c;当约数大于 l 时&#xff0c;按从小到大输出 思路&#xff1a…

poj 2681 字符串

http://poj.org/problem?id2681 给你任意长度的字符串&#xff0c;找出两串字符中不相同的字符个数&#xff08;总数&#xff09; #include<string> #include<cstring> #include<iostream> #include<cstdio> using namespace std; int main() {int n;…

数据通信技术(三:VLAN划分)

VLAN划分 1.配置环境 &#xff1a;创建4台PC机&#xff0c;并为PC机配置IP PC0&#xff1a;192.168.1.1/24 PC1&#xff1a;192.168.1.2/24 PC2&#xff1a;192.168.1.3/24 PC3&#xff1a;192.168.1.4/24 2.修改交换机名称&#xff1a; 创建VLAN1和VLAN2&#xff1a;…

CSS(2 )-- CSS样式大全

常用css样式大全Author&#xff1a;xu_shuyi201504039.CSS颜色代码大全http://www.cnblogs.com/axing/archive/2011/04/09/CSS.html1.CSS文字属性color : #999999; /*文字颜色*/font-family : 宋体,sans-serif; /*文字字体*/font-size : 9pt; /*文字大小*/font-style:itelic; /…

java io读书笔记(6) Writing Arrays of Bytes

显而易见&#xff0c;一次性写出一堆数据&#xff0c;要比一个byte一个byte的写&#xff0c;快多了&#xff0c;因此&#xff0c;outputstream&#xff0c;给出了2个增强型的write&#xff1a; public void write(byte[] data) throws IOException public void write(byte[] da…

iOS 自定义双向滑块Slider

ZPSlider 一个双向滑块的Slider 前提 这个是在一次和朋友吃饭的时候&#xff0c;我们唠嗑的时候他说的一个需求。因为系统的Slider是只有一个滑块的&#xff0c;而且没有分段滑动的效果。 这不最近都在研究这么个需求。 How to use it -(instancetype)initWithFrame:(CGRec…

数据通信技术(四:链路聚合)

1、修改交换机名称 2、配置A交换机数据 3、配置B交换机数据 4、创建VLAN 5、互拼验证 6、去掉一条链路再进行验证 数据通信技术&#xff08;一&#xff1a;IP划分&#xff09; https://blog.csdn.net/qq_37823605/article/details/90345408 数据通信技术&#xff08;二&#xf…

iOS图片,视频上传视频内容旋转

#前言 我最近在接手一个智能盒子的iOS应用&#xff0c;上面有一个功能是这样的。把你本地的照片和视频可以甩屏到你绑定的盒子上。 我的上一位前辈做的时候必须要求再同一个局域网&#xff0c;但是当我做的时候要求不同的局域网也要实现这样的一个功能&#xff0c;优化用户的使…

jackson 解析json问题

1、json串中有key为A&#xff0c;但指定转换的mybean中未定义属性A&#xff0c;会抛异常。处理&#xff1a;mapper.configure(Feature.FAIL_ON_UNKNOWN_PROPERTIES, false)&#xff0c;加上这一条&#xff0c;就没问题了&#xff0c;正常转换。 2、 默认的json串&#xff0c;如…

【转】UIColor对颜色的自定义

原文网址&#xff1a;http://blog.sina.com.cn/s/blog_5f19ccb10101bhqh.html 在iOS开发中&#xff0c;我们使用UIColor来对我们的界面进行颜色设置&#xff0c;一般我们通过以下两种方法使用UIColor&#xff1a;1,label.textColor [UIColor blueColor];2,label.textColor [U…