ArrayList底层结构和源码分析以及Vector 底层结构和源码分析
【摘要】 ArrayList底层结构和源码分析ArrayList的注意事项(1)permits all elements , including null , ArrayList可以加入null,并且多个(2)ArrayList是由数组来实现数据存储的(3)ArrayList基本等同于Vector,出了ArrayList是线程不安全(执行效率高)看源码,在多线程情况下,不建议使用ArrayListAr...
ArrayList底层结构和源码分析
ArrayList的注意事项
(1)permits all elements , including null , ArrayList可以加入null,并且多个
(2)ArrayList是由数组来实现数据存储的
(3)ArrayList基本等同于Vector,出了ArrayList是线程不安全(执行效率高)看源码,在多线程情况
下,不建议使用ArrayList
ArrayList 的底层操作机制源码分析
(1)ArrayList中维护了一个Object类型的数组elementData。
transient Object[] elementData; //transient 表示瞬间,短暂的,表示该属性不会被序列号
复制代码
(2)当创建ArrayList对象时,如果使用的是无参构造器,则初始elementData的容量为0,第一次添
加,则扩容elementDate为10,如需要再次扩容,则扩容elementData为1.5倍。
(3)如果使用的是指定大小的构造器,则初始elementData容量为指定大小,如果需要扩容,则直接扩
容elementData为1.5倍。
解读源码
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 = 1; 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);
}
}
Vector 底层结构和源码分析
Vector 的基本介绍
(1)Vector类的定义说明
public class Vector<E>
extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, Serializable
复制代码
(2)Vector底层也是一个对象数组,protected Object[] elementData;
(3)Vector是线程同步的,即线程安全,Vector类的操作方法带有synchronized
public synchronized E get(int index) {
if(index >= elementCount)
throw new ArrayIndexOutOfBoundsException(index);
return elementData(index);
}
复制代码
(4)在开发中,需要线程同步安全时,考虑使用Vector
解读源码
import java.util.Vector;
@SuppressWarnings({"all"})
public class Vector_ {
public static void main(String[] args) {
//无参构造器
//有参数的构造
Vector vector = new Vector(8);
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.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);
}
*/
}
}
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)