博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
集合—ArrayList
阅读量:4316 次
发布时间:2019-06-06

本文共 3626 字,大约阅读时间需要 12 分钟。

ArrayList也叫作数组列表

public static void main(String[] args) {        List list1 = new ArrayList
(); list1.add("a"); //0100=4 右移1位 0010=2 System.out.println(4>>1); //相当于 4/2 //0010=2 左移1位 0100=4 System.out.println(2<<1); //相当于 2*2 } transient Object[] elementData; private int size; private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {}; /** * Default initial capacity. */ private static final int DEFAULT_CAPACITY = 10; protected transient int modCount = 0; private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8; public boolean add(E e) { // 保证数组的容量始终够用 ensureCapacityInternal(size + 1); // Increments modCount!! // size是elementData数组中元素的个数,初始化为0 elementData[size++] = e; return true; } private void ensureCapacityInternal(int minCapacity) { // 如果数组没有元素,给数组一个默认大小,会选择实例化时的值与默认大小中较大值 if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) { minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity); } // 保证容量够用 ensureExplicitCapacity(minCapacity); } private void ensureExplicitCapacity(int minCapacity) { // modCount是elementData数组发生size更改的次数 modCount++; // 如果当前数组长度比原数组长度大,则进行扩容 if (minCapacity - elementData.length > 0) grow(minCapacity); } private void grow(int minCapacity) { int oldCapacity = elementData.length; // 新的数组长度 会进行行1.5倍扩容,通过向右移位实现/2操作 int newCapacity = oldCapacity + (oldCapacity >> 1); if (newCapacity - minCapacity < 0) newCapacity = minCapacity; if (newCapacity - MAX_ARRAY_SIZE > 0) newCapacity = hugeCapacity(minCapacity); // minCapacity is usually close to size, so this is a win:这里只用Arrays.copyOf elementData = Arrays.copyOf(elementData, newCapacity); } public void add(int index, E element) { // 判断index的值是否合法,如果不合法则抛出异常 rangeCheckForAdd(index); // 保证容量够用 ensureCapacityInternal(size + 1); // Increments modCount!! // 从第index位置开始,将元素往后移一个位置 System.arraycopy(elementData, index, elementData, index + 1, size - index); // 把要插入的元素e放在第index的位置 elementData[index] = element; // 数组的元素个数加1 size++; } /** * A version of rangeCheck used by add and addAll. */ private void rangeCheckForAdd(int index) { if (index > size || index < 0) throw new IndexOutOfBoundsException(outOfBoundsMsg(index)); } /** * Constructs an IndexOutOfBoundsException detail message. * Of the many possible refactorings of the error handling code, * this "outlining" performs best with both server and client VMs. */ private String outOfBoundsMsg(int index) { return "Index: "+index+", Size: "+size; }

ArrayList是基于数组实现的,是一个动态数组,其容量能够自动增长 ArrayList不是线程安全的,只能用在单线程环境下,多线程环境需要使用Collections同步方法。Collections.synchronizedList(List l)返回一个线程安全的ArrayList。如果是读写比例比较大的话(锁粒度降级),则可以考虑CopyOnwriteArrayList。

  1. 默认容量是10
  2. ArrayList每次增加元素的时候,都需要调用ensureCapacity方法来确保足够的容量。当容量不足的时候,就设置新的容量为旧的的容量的1.5倍加1,如果设置的容量仍然不够,那么直接设置为传入的参数,而后用Arrays.copyOf方法将元素拷贝到新的数组。建议:在能够实现确定元素数量的情况下使用ArrayList,否则使用LinkedList。
  3. Arrays.copy()方法在方法的内部又创建了一个长度等长的数组,调用System.arraycopy方法完成新数组元素的复制。该方法的实际上调用native方法中C的memmove函数,在复制大数组的时候强烈建议使用该方法进行数组的复制。效率高。
  4. ArrayList是基于数组实现的,支持随机访问,查找效率高,但是插入删除效率低。
  5. ArrayList一般应用于查询较多但插入以及删除较少情况,如果插入以及从删除较多则建议使用LinkedList.
  6. ArrayList在知道长度范围实例化的时候带上长度 new ArrayList(128),这样降低了内存碎片和内存拷贝的次数.

转载于:https://www.cnblogs.com/atomicbomb/p/9917076.html

你可能感兴趣的文章
SQL 排名函数
查看>>
IIS与ApplicationPool重启检测自动化解决方案
查看>>
zabbix3.4实现邮件报警
查看>>
Xpath提取一个标签里的所有文本
查看>>
11 吐司 Toast 代码案例
查看>>
CKplayer:视频推荐和分享插件设置
查看>>
通过服务修改widgetUI
查看>>
win10连接无线网,开启移动热点,手机连接它手机一直显示获取ip地址中。
查看>>
MapReduce的倒排索引
查看>>
Heterogeneity Activity Recognition Data Set类别
查看>>
服务中的 API 网关(API Gateway)
查看>>
Android--TextView第一个单词大写
查看>>
网友给的链接
查看>>
《2017011.17-构建之法:现代软件工程-阅读笔记3》
查看>>
sourceinsight4
查看>>
C#实现四部电梯的调度
查看>>
Android SDK版本和ADT版本
查看>>
TCL的艰难生存之路
查看>>
Flask最强攻略 - 跟DragonFire学Flask - 第五篇 做一个用户登录之后查看学员信息的小例子...
查看>>
Android笔记(四十) Android中的数据存储——SQLite(二) insert
查看>>