list集合基础知识
list接口继承collection接口
list 接口是用于存储有序,可重复数据的动态数组
list接口主要有三种实现类 ArrayList LinkLinst vactor
现在用的比较多的是ArrayList 和 LinkList
先说说ArrayList
ArrayList 的默认大小为 10
在Util 包的ArrayList里定义的
private static final int DEFAULT_CAPACITY = 10;
底层用的是 Object 类型数组存储元素
底层数组不能存储基本数据类型 只能 存储引用数据类型 如果存储基本数据类型要将基本数据类型转换成对应的包装类
那么为什么ArrayList不能存储基本数据类型?
ArrayList数组列表为什么不能存储基本类型?_滕青山博客-CSDN博客_arraylist为什么不能存基本数据类型
看了这位老哥的我才知道是因为:
ArrayList带了泛型
泛型不能是基本数据类型
因为泛型会被虚拟机编译时转换为Object类型
基本数据类型不属于object类型
因为基本数据类型是在栈分配,object类型是在堆分配
(涨知识)
ArrayList 在长度不足时会自动扩容,扩容为当前长度的1.5倍(只管 add 就好了)
那问题又来了,为什么扩容是1.5倍呢?
ArrayList扩容机制 - 白春雨 - 博客园 (cnblogs.com)
这位老哥分析的很详细
简要来说,调用add方法
add方法里面调用ensureCapacityInternal(size+1)
size形参是指当前数组已经被使用的个数
ensureCapacityInternal方法里调用ensureExplicitCapacity(calculateCapacity(elementData,minCapacity))
这个minCapacity是上面是size+1,elementData有点问题
transient Object[] elementData; // non-private to simplify nested class access
在ArrayList空参构造器中
this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
直接将数组等于长度........姑且认为这个就是数组长度
calculateCapacity方法计算两个之间哪个大,并且返回一个较大值
如果长度不够调用grow方法增加长度
下面是grow方法
private void grow(int minCapacity) {
// overflow-conscious code
int oldCapacity = elementData.length;
int newCapacity = oldCapacity + (oldCapacity >> 1);
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
// minCapacity is usually close to size, so this is a win:
elementData = Arrays.copyOf(elementData, newCapacity);
}
最重要的是
int newCapacity = oldCapacity + (oldCapacity >> 1);
新长度 = 旧长度 + 旧长度右移一位,简单来说就是除2,位运算大大快与除法运算,可以了解一下二进制运算
ArrayList是线程不安全的
然后就是一些api调用了 增 删 改 查
再说说LinkList大概和ArrayList差不多,底层用的是双向链表
vector , list 的古老实现类 ,线程安全的,主要就是add方法加了一个同步关键字
每次扩容2倍

浙公网安备 33010602011771号