管中窥豹:ArrayList源码学习

学习自:

http://www.cnblogs.com/skywang12345/p/3308556.html

removeAllretainAll()看这里https://lizhongzhen11.github.io/2018/03/20/thinkingInJava/#1571

问题及注意点

1.本文一开头给出的第一个链接里面关于容量自增讲的是 新的容量=“(原始容量x3)/2 + 1”,但阅读1.8版本的源码会发现,容量自增方式改变了。

1.8版本通过grow()进行容量自增。其中int newCapacity = oldCapacity + (oldCapacity >> 1)这段代码的意思是新容量 = 旧容量的1.5倍
研究1.6版本的应该知道,以前容量自增是int newCapacity = (oldCapacity * 3)/2 + 1即1.5倍 + 1,为何会对自增算法进行修改呢?
网上找了下,一个说法是自增算法改为位运算效率更高。至于为什么舍去了加1或许也是从效率上考虑的吧。
还有,1.6版本并没有对容量进行限制,但是1.7及以后的版本都限制了最大的容量:Integer.MAX_VALUE - 8,防止容量越界。


2.初始容量为何是10?
      暂时不清楚。。。


3.ArrayList是有序的,先进先出。同时,它也是非线程安全的。


4.ArrayList 实现了 RandomAccess 接口,支持快速随机访问,实际上就是通过下标序号进行快速访问。


5.ArrayListLinkedList的对比

  • 顺序插入速度ArrayList会比较快,因为ArrayList是基于数组实现的,数组是事先new好的,只要往指定位置塞一个数据就好了;LinkedList则不同,每次顺序插入的时候LinkedListnew一个对象出来,如果对象比较大,那么new的时间势必会长一点,再加上一些引用赋值的操作,所以顺序插入LinkedList必然慢于ArrayList
  • 基于上一点,因为LinkedList里面不仅维护了待插入的元素,还维护了Entry前置Entry和后继Entry,如果一个LinkedList中的Entry非常多,那么LinkedList将比ArrayList更耗费一些内存。
  • 使用各自遍历效率最高的方式,ArrayList的遍历效率会比LinkedList的遍历效率高一些。
  • 有些说法认为LinkedList做插入和删除更快,这种说法其实是不准确的:
    1)LinkedList做插入、删除的时候,慢在寻址,快在只需要改变前后Entry的引用地址
    2)ArrayList做插入、删除的时候,慢在数组元素的批量copy,快在寻址
Newer Post

管中窥豹:LinkedList源码学习

一、学习自: http://www.cnblogs.com/skywang12345/p/3308807.html https://www.cnblogs.com/ITtangtang/p/3948610.html https://www.cnblogs.com/xrq730/p/5005347.h …

继续阅读
Older Post

管中窥豹:HashSet源码学习

学习自:http://www.cnblogs.com/skywang12345/p/3311252.html       阅读HashSet的源码发现很有意思,四个`public修饰的构造函数内部全是new一个HashMap的实例,还有一个 …

继续阅读