文章目录
1、ArrayList 底层结构和源码分析
1.1、ArrayList 的注意事项
package collection_;
import java.util.ArrayList;
@SuppressWarnings({"all"})
public class ArrayListDetail {
public static void main(String[] args) {
// ArrayList 是线程不安全的, 可以看源码 没有 synchronized
/*
public boolean add(E e) {
ensureCapacityInternal(size + 1); // Increments modCount!!
elementData[size++] = e;
return true;
}
*/
ArrayList arrayList = new ArrayList();
arrayList.add(null);
arrayList.add("jack");
arrayList.add(null);
arrayList.add("tom");
System.out.println("arrayList=" + arrayList); // arrayList=[null, jack, null, tom]
}
}
1.2、ArrayList 的底层操作机制源码分析
package list_;
import java.util.ArrayList;
@SuppressWarnings({"all"})
public class ArrayListSource {
public static void main(String[] args) {
// Idea 默认情况下, Debug 显示的数据是简化后的, 如果希望看到完整的数据需要做设置
// 使用无参构造器创建 ArrayList 对象
ArrayList list = new ArrayList();
// ArrayList list = new ArrayList(8);
// 使用 for 给 list 集合添加 1-10 数据
for (int i = 0; i <= 10; i++) {
list.add(i);
}
// 使用 for 给 list 集合添加 11-15 数据
for (int i = 11; i <= 15; i++) {
list.add(i);
}
list.add(100);
list.add(200);
list.add(null);
System.out.println("list=" + list); // list=[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 100, 200, null]
}
}
2、Vector 底层结构和源码剖析
2.1、Vector 的基本介绍
2.2、Vector 的底层操作机制源码分析
package list_;
import java.util.Vector;
@SuppressWarnings({"all"})
public class Vector_ {
public static void main(String[] args) {
// 无参构造器
// 有参数的构造
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);
}
// 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.length>0
private void ensureCapacityHelper(int minCapacity) {
// overflow-conscious code
if (minCapacity - elementData.length > 0)
grow(minCapacity);
}
2.3 如果 需要的数组大小 不够用, 就扩容, 扩容的算法
// newCapacity = oldCapacity + ((capacityIncrement > 0) ? capacityIncrement : oldCapacity); // 就是扩容两倍
private void grow(int minCapacity) {
// overflow-conscious code
int 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);
}
*/
}
}
3、Vector 和 ArrayList 的比较
4、Idea 的重要配置
Idea 默认情况下,Debug 显示的数据是简化后的,如果希望看到完整的数据需要做设置