List接口
1、体系:
2、ArrayList和Vector底层都是用数组实现,唯一区别是Vector是一种线程安全的实现。
3、LinkedList底层使用双向循环链表实现,无论LinkedList是否为空,链表内都有一个header节点,header的后驱节点是链表第一个元素,前驱节点是链表的最后一个元素。
4、ArrayList内部的数组初始化大小为10,每次扩容会将新数组大小设置为原来的1.5倍。在能有效评估ArrayList数组大小初始值的情况下,指定容量大小能对其性能有较大的提升。
5、LinkedList由于使用了链表的结构,因此不需要维护容量的大小。但是每次元素新增都需要创建一个Entry对象,并进行更多的赋值操作,会比较占用内存空间,对堆内存和GC的要求比较高。
6、List的遍历通常有3种方式:ForEach操作、迭代器和for循环。
7、集合遍历代码优化方案:
(1)分离循环中被重复调用的代码。
//优化前代码 for (int i = 0;i < collection.size();i++) { ... } //优化后代码: int size = collection.size(); for (int i = 0;i < size;i++) { ... }
(2)减少函数的调用,函数调用是消耗系统堆栈资源的,直接访问元素会更高效。
8、RandomAccess接口是用来标记哪些是支持快速随机访问的List实现,如果list instanceof RandomAccess,则遍历方式使用随机访问,否则使用迭代器方式进行访问。