ArrayList源码(一)
来源:互联网 发布:中航微电子重庆 知乎 编辑:程序博客网 时间:2024/06/17 04:18
public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable底层使用数组private transient Object[] elementData;java 的transient关键字为我们提供了便利,你只需要实现Serilizable接口,将不需要序列化的属性前添加关键字transient,
序列化对象的时候,这个属性就不会序列化到指定的目的地中。
transient关键字只能修饰变量,而不能修饰方法和类。一个静态变量不管是否被transient修饰,均不能被序列化private static final int DEFAULT_CAPACITY = 10;
默认的初始容量为10有三个构造函数,
一。自定义长度的 public ArrayList(initialCapacity)
二。默认长度10, public ArrayList()
三。构造一个包含指定 collection 的元素的列表,这些元素是按照该 collection 的迭代器返回它们的顺序排列的
public ArrayList(Collection<? extends E> c) { elementData = c.toArray(); size = elementData.length; // c.toArray might (incorrectly) not return Object[] (see 6260652) if (elementData.getClass() != Object[].class) elementData = Arrays.copyOf(elementData, size, Object[].class); }
重点聊一下这个吧,这边我看到有人说不懂为什么这边要判断
是因为toArray返回的不一定是一个object的,
如:List<String> strList= Arrays.asList("abc")
Object[] strList=stringList.toArray();
System.out.println(strList.getClass());
这边返回的是class java.lang.String
判断以后复制数组
延伸:System.arraycopy() 和 Arrays.copyOf()的区别数组扩容
private void ensureExplicitCapacity(int minCapacity) { modCount++; // overflow-conscious code if (minCapacity - elementData.length > 0) grow(minCapacity); } private void grow(int minCapacity) { // overflow-conscious code int oldCapacity = elementData.length; 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: elementData = Arrays.copyOf(elementData, newCapacity); } private static int hugeCapacity(int minCapacity) { if (minCapacity < 0) // overflow throw new OutOfMemoryError(); return (minCapacity > MAX_ARRAY_SIZE) ? Integer.MAX_VALUE : MAX_ARRAY_SIZE; }
grow中有这样的一行
int newCapacity = oldCapacity + (oldCapacity >> 1);位移运算符:>>(带符号右移),
表示的是新的数组扩容为原来的1.5倍的大小
但是有一个限制,表示的是要分配的数组的最大大小;private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
如果超过这个大小,会报OutOfMemoryError的异常。那么就要使用MAX_ARRAY_SIZE的长度
在方法里面有一个modCount++,
这个属性是AbstractList中的
protected transient int modCount = 0;
表示的是这个list的结构已经被修改过的次数; 具体解释ArrayList 还给我们提供了将底层数组的容量调整为当前列表保存的实际元素的大小的功能。
它可以通过 trimToSize() 方法来实现。该方法可以最小化 ArrayList 实例的存储量public void trimToSize() { modCount++; if (size < elementData.length) { elementData = Arrays.copyOf(elementData, size); } }
阅读全文
1 0
- ArrayList源码(一)
- 了解 ArrayList 源码(一)
- ArrayList(一)源码分析
- ArrayList源码解析(一)
- java源码之ArrayList(一)
- 【Java深入】ArrayList源码剖析(一)
- JDK源码分析之ArrayList(一)
- 一、ArrayList源码分析
- ArrayList集合(一)--源码
- Java集合源码解析(一)ArrayList源码解析
- Java集合源码分析系列-(一)ArrayList源码剖析
- jdk源码阅读一:ArrayList
- 集合类源码简单阅读(一)(ArrayList)
- java源码解读——ArrayList(一)
- 浅析Java集合类源码(一)--- Vector, ArrayList, LinkedList
- Java源码解读——ArrayList(一)
- ArrayList源码剖析,解开神秘面纱之扩容(一)
- [Java]JDK1.8 ArrayList源码剖析(一)
- .NET微信扫码支付接入(模式二-NATIVE)
- strong和em的异同
- 机器学习面试系列二
- leetcode: 79. Word Search
- mybatis mysql 日期比较
- ArrayList源码(一)
- 网络协议实例讲解(配抓包图)
- 关于jdk8的一些笔记(上)
- 磁盘分区和磁盘配额
- 机器学习面试系列三
- mongo $addToSet获取唯一值实例
- JavaScript 中的 this 机制
- Aspose.Cells 11月新版V17.11发布 | 附下载
- ThreadPoolExecutor机制