网站推广广告词,wordpress阅读权限,安平网站建设优化,出台网站集约化建设通知List ArrayListArrayList注意事项ArrayList底层操作机制-源码分析#xff08;重点#xff09; VectorVector基本介绍 ——Vector和ArrayList比较Vector底层结构和源码分析 LinkedList基本介绍LinkedList的底层结构和操作机制LinkedList的增删改查 ——LinkedList和ArrayList比… List ArrayListArrayList注意事项ArrayList底层操作机制-源码分析重点 VectorVector基本介绍 ——Vector和ArrayList比较Vector底层结构和源码分析 LinkedList基本介绍LinkedList的底层结构和操作机制LinkedList的增删改查 ——LinkedList和ArrayList比较 ArrayList
ArrayList注意事项
permits all elements, including null 。ArrayList 可以加入null并且多个。ArrayList是由数组来实现数据存储的。ArrayList基本等同于Vector除了ArrayList是线程不安全(执行效率高)看源码在多线程情况下不建议使用ArrayList。 public static void main(String[] args) {ArrayList arrayList new ArrayList();arrayList.add(null);arrayList.add(2);arrayList.add(null);arrayList.add(hello);System.out.println(arrayList);}ArrayList底层操作机制-源码分析重点
ArrayList中维护了一个Object类型的数组elementData。[debug看源码] transient Object[] elementData; transient表示瞬间短暂的。表示该属性不会被序列化/串行化。当创建ArrayList对象时如果使用的是无参构造器则初始elementData容量为0第1次添加则扩容elementData为10如需要再次扩容则扩容elementData为1.5倍。如果使用的是指定大小的构造器则初始elementData容量为指定大小如果需要扩容则直接扩容 elementData为1.5倍。
点击链接跳转看韩顺平老师的视频讲解 注意IDEA 默认情况下Debug 显示的数据是简化后的如果希望看到完整的数据需要做设置。 Vector
Vector基本介绍 import java.util.Vector; Vector类的定义说明
public class VectorEextends AbstractListEimplements ListE, RandomAccess, Cloneable, java.io.SerializableVector底层也是一个对象数组 protected Object[] elementData;Vector是线程同步的即线程安全Vector类的操作方法带有synchronized
public synchronized E get(int index){if (index elementCount)throw new ArraylndexOutOfBoundsException(index);return elementData(index);}4)在开发中需要线程同步安全时考虑使用Vector
——Vector和ArrayList比较 Vector底层结构和源码分析
//无参构造器
//有参数的构造
Vector vector new Vector();
for (int i 0; i 10; i) {vector.add(i);
}
vector.add(100);
System.out.println(vector vector);1. new Vector() 底层public Vector() {this(10);}
补充如果是 Vector vector new Vector(8);走的方法:public Vector(int initialCapacity) {this(initialCapacity, 0);}
其中有一个装箱过程
2. vector.add(i)
2.1 //下面这个方法就添加数据到vector集合public synchronized boolean add(E e) {modCount;ensureCapacityHelper(elementCount 1);elementData[elementCount] e;return true;}2.2 //确定是否需要扩容 条件 minCapacity - elementData.length0private void ensureCapacityHelper(int minCapacity) {// overflow-conscious codeif (minCapacity - elementData.length 0)grow(minCapacity);}2.3 //如果 需要的数组大小 不够用就扩容 , 扩容的算法//newCapacity oldCapacity ((capacityIncrement 0) ?// capacityIncrement : oldCapacity);//就是扩容两倍.private void grow(int minCapacity) {// overflow-conscious codeint oldCapacity elementData.length;int newCapacity oldCapacity ((capacityIncrement 0) ?capacityIncrement : oldCapacity);if (newCapacity - minCapacity 0)newCapacity minCapacity;if (newCapacity - MAX_ARRAY_SIZE 0)newCapacity hugeCapacity(minCapacity);elementData Arrays.copyOf(elementData, newCapacity);}LinkedList
基本介绍
LinkedList底层实现了双向链表和双端队列特点可以添加任意元素(元素可以重复)包括null线程不安全没有实现同步
LinkedList的底层结构和操作机制
LinkedList底层维护了一个双向链表LinkedList中维护了两个属性 first和 last分别指向首节点和尾节点每个节点(Node对象)里面又维护了prev、next、item三个属性其中通过 prev指向前一个通过 next指向后一个节点。最终实现双向链表所以 LinkedList的元素的添加和删除不是通过数组完成的相对来说效率较高模拟一个简单的双向链表代码【代码】 见LinkedList01.java LinkedList的增删改查 见LinkedListCRUD.java public static void main(String[] args) {LinkedList linkedList new LinkedList();linkedList.add(1);linkedList.add(2);linkedList.add(3);System.out.println(linkedList linkedList);//演示一个删除结点的linkedList.remove(); // 这里默认删除的是第一个结点//linkedList.remove(2);System.out.println(linkedList linkedList);//修改某个结点对象linkedList.set(1, 999);System.out.println(linkedList linkedList);//得到某个结点对象//get(1) 是得到双向链表的第二个对象Object o linkedList.get(1);System.out.println(o);//999//因为LinkedList 是 实现了List接口, 遍历方式System.out.println(LinkeList遍历迭代器);Iterator iterator linkedList.iterator();while (iterator.hasNext()) {Object next iterator.next();System.out.println(next next);}System.out.println(LinkeList遍历增强for);for (Object o1 : linkedList) {System.out.println(o1 o1);}System.out.println(LinkeList遍历普通for);for (int i 0; i linkedList.size(); i) {System.out.println(linkedList.get(i));}
}debug查看源码学习 增 删 有很多种删除方式
linkedList.remove();//默认删除第一个节点改 查
——LinkedList和ArrayList比较 本笔记是对韩顺平老师的Java课程做出的梳理。方便本人和观看者进行复习。 课程请见 https://www.bilibili.com/video/BV1fh411y7R8/?spm_id_from333.999.0.0vd_sourceceab44fb5c1365a19cb488ab650bab03