java常用类--List类
java常用类--List类
1、ArrayList类
ArrayList的性质:
1、ArrayList的实质是一个数组,添加是对数组的动态扩容
2、ArrayList的数组容易查找,但是不方便频繁的增加和删除
ArrayList初始化源码分析:
ArrayList<String> list = new ArrayList<>()
/**
* 这样创建的一个ArrayList对象,它的长度为多大呢?
* 通过查看源码我们可以得到,刚开始new对象的时候长度为0
*/
//1、查看空参后构造方法
public ArrayList() {
this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}
//2、查看DEFAULTCAPACITY_EMPTY_ELEMENTDATA这个默认值
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
/**
* 得出结论:刚开始创建空参ArrayList的长度默认为0
*/
但是java中的Api说ArrayList空参构造后长度默认为10,这是怎么回事呢?
//3、我们继续查看源码,查看它的add方法
private void add(E e, Object[] elementData, int s) {
if (s == elementData.length)
elementData = grow();
elementData[s] = e;
size = s + 1;
}
//4、通过这个源码发现,有一个grow()方法,我们继续往下查看
private Object[] grow(int minCapacity) {
return elementData = Arrays.copyOf(elementData,
newCapacity(minCapacity));
}
//5、通过这个源码我们发现这个扩容数组的方法中有newCapacity(minCapacity)这样一个方法,我们继续往下查看源代码
private int newCapacity(int minCapacity) {
// overflow-conscious code
int oldCapacity = elementData.length;
int newCapacity = oldCapacity + (oldCapacity >> 1);
if (newCapacity - minCapacity <= 0) {
if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA)
return Math.max(DEFAULT_CAPACITY, minCapacity);
if (minCapacity < 0) // overflow
throw new OutOfMemoryError();
return minCapacity;
}
return (newCapacity - MAX_ARRAY_SIZE <= 0)
? newCapacity
: hugeCapacity(minCapacity);
}
/**
* 终于在这个源代码中,我们发现一个默认参数,DEFAULT_CAPACITY,当oldCapacity=0的时候
* 会运行return Math.max(DEFAULT_CAPACITY, minCapacity)这个代码,因此我们继续点击查看
* DEFAULT_CAPACITY的值
*/
private static final int DEFAULT_CAPACITY = 10;
从上面的源码得出结论:
1、开始创建ArrayList对象的时候,数组长度为0;
2、当开始使用add方法的时候,会把长度设置为10;
3、并且ArrayList在扩容的时候,每次扩容1.5倍;
2、Vector类
1、和ArrayList实现的功能类似
2、Vector的线程是同步的,ArrayList的线程是异步的
3、Vector的的初始和ArrayList一样,但是ArrayList扩容是固定的1.5倍,Vector是指定的扩容增量
3、LinkedList类
1、操作和ArrayList没什么区别,但是这个是用双向链表实现的,ArrayList是用数组实现的
2、LinkedList适合增删数据,但是不适合频繁查找数据
浙公网安备 33010602011771号