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倍

 

 

 

 

 

 

 



 

 

 


 

 






posted @ 2021-08-19 16:02  霸王龙168  阅读(85)  评论(0)    收藏  举报