ArrayList详解
一、ArrayList类介绍:(这里给出jdk1.8源码上中文翻译)
ArrayList是List接口以可变数组方式实现的,实现了所有的lis接口中的操作,并容许有null等所有元素。除了实现了List接口之外,ArrayList还提供了巧妙控制存储在实例内部的数组大小的方法。(ArrayList大体上和Vector相同,除了它是不同步的之外。)
size(),isEmpty(),get(),set(),iterator(),listIterator()的时间复杂符是常量级别(constant time),add()方法的时间复杂度是可变常量级别(amortized constant time),即为O(n)。大致上说,剩余方法的时间复杂度都是线性时间(linear time)。相较于LinkedList的实现,ArrayList的常量因子(constant factor)较低。
每一个ArrayList实例都有一个容量(capacity),容量是存储在list中元素数组的大小。容量至少和list的大小是一样的。当添加元素时,容量自动增长。这种自增长策略的细节就不说了。
在增加大量元素之前使用ensureCapacity,就能扩大ArrayList的容量。这可能会减少添加重定位的数量。
提示:ArrayList是异步的。如果多个线程同步进入一个ArrayList实例,并且至少一个线程修改了list的结构,那么一定要在外部进行synchronized操作。(结构上的修改指的是增加或者删除一个或多个元素,或者明确的resize 内部数据的大小;仅仅改变一个元素的值并不是结构修改。)这通常是通过在自然封装列表的某个对象上进行同步来完成的。
如果没有这样的对象存在,list应该被“封装”通过使用Collections.synchronizedList方法。这个操作最好在创建时执行,以防止意外的异步的进入到list中:
List list = Collections.synchronizedList(new ArrayList(...));
通过ArrrayList的iterator()和listInterator()方法返回的iterator是fail-fast的(fail-fast是java集合(Collection)中的一种错误机制。当多个线程对同一个集合的内容进行操作时,就可能会产生fail-fast事件。
例如:当某一个线程A通过iterator去遍历某集合的过程中,若该集合的内容被其他线程所改变了;那么线程A访问集合时,就会抛出ConcurrentModificationException异常,产生fail-fast事件。)如果list在iterator创建后发生了结构上的修改,iterator会抛出ConcurrentModificationException异常。从而,面对同步修改操作,iterator将快速利落的失败,而不是冒着风险,在将来不确定的时间发生不确定的行为。
提示:iterator的fail-fast机制不能被保证像他自身一样,通常来讲,是不可能去做保证防止异步的同步修改。Fail-fast机制的Iterator尽最大努力抛出Concurrent-ModificationException。因此,通过写一个依靠这个异常来保障其正确性的程序是错误的:Iterator的fail-fast机制应该仅被用做检测BUG。
这个类是Java Collection FrameWork 的一个成员。
---------------------------- 以上便是jdk1.8中ArrayList的中文翻译 ----------------------------
二、ArrayList性能简介:
1.ArrayList 实现了 List 接口;
2.内部以数组形式存储;源码:Object[] elementData;
3.默认容量为10;
4.自增长50%; 源码:newCapacity = oldCapacity + ( oldCapacity>>1);
5.异步的;
6.使用索引来定位对象,取值相率高;
7.插入,删除操作消耗内存较大;
ArrayList详解的更多相关文章
- 【集合框架】JDK1.8源码分析之ArrayList详解(一)
[集合框架]JDK1.8源码分析之ArrayList详解(一) 一. 从ArrayList字表面推测 ArrayList类的命名是由Array和List单词组合而成,Array的中文意思是数组,Lis ...
- ArrayList详解-源码分析
ArrayList详解-源码分析 1. 概述 在平时的开发中,用到最多的集合应该就是ArrayList了,本篇文章将结合源代码来学习ArrayList. ArrayList是基于数组实现的集合列表 支 ...
- java集合类之ArrayList详解
一.ArrayList源码分析 1.全局变量 (1)默认容量(主要是通过无参构造函数创建ArrayList时第一次add执行扩容操作时指定的elementData的数组容量为10) private s ...
- Java.util.ArrayList详解
java.util.ArrayList就是传说中的动态数组. 继承了关系,有此可看出ArrayList与list的collection的关系 public class ArrayList<E&g ...
- 【Java集合类】ArrayList详解 (JDK7)
相信对于使用过Java的人来说,ArrayList这个类大家一定不会陌生. 数据结构课上讲过, Array是数组,它能根据下标直接找到相应的地址,所以索引速度很快,但是唯一的缺点是不能动态改变数组的长 ...
- Java ArrayList 详解
只记录目前为止关注的.JDK1.8 一.基础属性 1.1 内部参数 //空存储实例.直接new ArrayList()便是以该空数组作为实例 private static final Object[] ...
- Java 8 ArrayList 详解
GitHub Page: http://blog.cloudli.top/posts/Java-ArrayList/ ArrayList 继承于 AbstractList ,实现了 List.Rand ...
- 2 ArrayList 详解
List 是有序.可重复的容器.List中每个元素都有索引标记,可以根据元素的索引标记访问元素,从而精确控制这些元素. List 接口常用的实现类:ArrayList.LinkedList.Vecto ...
- ArrayList详解,底层是数组,实现Serializable接口
一.对于ArrayList需要掌握的七点内容 ArrayList的创建:即构造器往ArrayList中添加对象:即add(E)方法获取ArrayList中的单个对象:即get(int index)方法 ...
随机推荐
- 删除SVN版本信息 .svn文件夹
环境:MyEclipse.Windows 问题描述: 在MyEclipse中当我们需要将一个文件夹(包含若干文件或嵌套文件夹)拷贝到另一个文件夹时,此时文件内容虽然拷贝过去了,但其下面的 .svn文件 ...
- 【Python】回文palindrome——利用字符串反转
回文 palindrome Python 字符串反转string[::-1] Slice notation "[a : b : c]" means "count in i ...
- CSS布局之传统方法
传统的页面布局依赖于盒模型+流动模型(flow)+浮动模型(float)+层模型(layer)来实现页面的布局,具体方法是通过盒模型+display属性+float属性+position属性来加以实现 ...
- babel的使用以及安装配置
简介 babel是一个广泛使用的转码器,可以将ES6代码转化为ES5代码,从而在现有环境执行,这意味着,你可以现在就用ES6编写程序,而不用担心现有环境是否支持. 安装及配置 npm install ...
- ajax post data 获取不到数据,注意content-type的设置post/get
因为之前一直用jQuery ajax get的方式传递参数, 默认没有设置过 contentType 的值. $.ajax({ url: "/yuanjin/jianxiang", ...
- Linux下TC使用说明 & 使用备注 ZZ
一.TC原理介绍 Linux操作系统中的流量控制器TC(Traffic Control)用于Linux内核的流量控制,主要是通过在输出端口处建立一个队列来实现流量控制. Linux流量控制的基本原理如 ...
- 【Leetcode】【Medium】Best Time to Buy and Sell Stock II
Say you have an array for which the ith element is the price of a given stock on day i. Design an al ...
- cocos2d-x 3.1 编译脚本android-build.py
写在前面: 前段时间下载了cocos2d-x 3.1,按照官网的教程,配置环境,编译打包,走了一遍,感觉不错,顺便发现其中用了很多python的脚本文件,比如今天要说的android-build.py ...
- Hyperledger Fabric 1.0 学习搭建 (四)--- 创建Fabric多节点集群
4.1.配置说明 首先可以根据官方Fabric自带的e2e_cli列子中的集群方案来生成我们自己的集群,与案例不同的是我们需要把容器都分配到不同的服务器上,彼此之间通过网络来进行通信,网络构建完成后则 ...
- nginx导致的session丢失的解决方法
nginx把同一用户的请求分发到了不同的服务器,如果不做处理,就会导致session丢失. 1.粘性IP: 在nginx配置文件中,增加配置, 对IP进行HASH后,散列到服务器. 这个实现最简单.但 ...