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)方法 ...
随机推荐
- csharp: Request.Form,Request.QueryString,Request.Params,Request.Cookies
/// <summary> /// Request.Form,Request.QueryString,Request.Params /// http://msdn.microsoft.co ...
- SQL Server中建立自定义函数
在SQL Server中用户可以自定义函数,像内置函数一样返回标量值,也可以将结果集用表格变量返回.用户自定义函数的2种类型:1.标量函数:返回一个标量值:2.表格值函数{内联表格值函数.多表格值函数 ...
- 建立makefile
一.目的 1.1 熟悉makefile的基本规则,学会建立自己的makefile,通过makefile提高编程效率 1.2 学会通过autotools建立makefile来更好更高效地管理软件项目工程 ...
- android启动应用
private void openApp(String packageName) { PackageInfo pi = getPackageManager().getPackageInfo(packa ...
- react-native-splash-screen
react-native-splash-screen在GitHub上的地址:https://github.com/crazycodeboy/react-native-splash-screen rea ...
- 使用POI解析Excel时,出现org.xml.sax.SAXParseException: duplicate attribute 'o:relid'的解决办法
1.使用org.apache.poi解析excle,.xlsx类型文件InputStream is = new FileInputStream(strFileName);XSSFWorkbook wb ...
- Windows10 IIS配置PHP运行环境(原创)
在Windows 10/8 的IIS(8.0)中搭建PHP运行环境: 如果解决了您的问题,文章底部点击下关注,做原创内容不容易,谢谢.转载请注明出处 PS:顺便推荐下自己写的,开源PHP极速后台开发框 ...
- 【Leetcode】【Easy】Merge Two Sorted Lists .
Merge two sorted linked lists and return it as a new list. The new list should be made by splicing t ...
- 【Leetcode】【Medium】3Sum
Given an array S of n integers, are there elements a, b, c in S such that a + b + c = 0? Find all un ...
- 取多个name值相同的input里面的值
html 中是允许多个具有相同name属性的元素的,例如服务器端读取的常规做法是: string name = Request.Params["txtName"]; 得到的将是一串 ...