ArrayList源码阅读体会
在无数次面试中被问及Collection集合框架的问题之后,我决定看看源码;对我的目的性就是这么强! 有错误希望各位能指正!不胜感激
1.ArrayList的底层实现是Object[],在内部定义了一个私有的size属性,用来记录ArrayList的长度,
private int size;
private transient Object[] elementData;
2.当new一个不限定长度的ArrayList的时候 他的默认长度为10;
/*
* 默认初始容量
*/
private static final int DEFAULT_CAPACITY = 10;
3.当list已经满了,再放入数据的时候,ArrayList会对elementData进行扩容,每次扩容之后的大小是原大小的1.5倍
int oldCapacity = elementData.lengh;
//看到这个地方我还不会>> 1是什么意思(比较悲哀-_-!)
// >> 1 向右移动意味相当于/2; << 1 向左移动一位相当于乘以2
int newCapacity = oldCapacity + (oldCapacity >> 1);
elementData = Arrays.copyOf(elementData,newCapacity );
4.当我们使用remove(index)方法的时候只会修改size的值,但是并不会对elementData进行容量的减少;
但是他提供了trimToSize()方法,这个方法也就是如果size<elementData.length时将elementData的长度缩小为size
elementData = Arrays.copyOf(elementData, size);
5.在看到transient修饰符的时候我不太明白的,特意查了下,解释大概如下:当一个类实现了serializable接口,那么在序列化的时候会将所有属性自动的序列化,当加上transient修饰符那将会忽略掉这个属性;
我对序列化的理解是后台程序以json的格式返回给前台一个ArrayList集合,这个list编程json的过程就是序列化的过程;之后在网上看见一个解释序列化是将对象状态转换为可保持或可传输的格式的过程。与序列化相对的是反序列化,它将流转换为对象。
6.在理解transient和序列化之后,就想那么ArrayList是如何将数据序列化和反序列化的呢?答案是writeObject方法和readObject方法;这两个方法是如何调到的我还没看明白;这样做的目的是避免elementData中有null数据也会被序列化;
格式这么乱,真不知道过段时间自己看会不会看不懂!