java面试集合之List

现在面试面的的越来越深了,就整理了下自己被面到的面试题,组织下语言

常用集合类

Collection下的List,Set,Queue,以及Map

ArrayList

底层是动态数组实现(静态数组,内部容量有限。在实际使用的时候,我们往往无法预估要在这个数组中存入多少个元素。使得这个数组的容量是可伸缩的,也就是所谓的动态数组);

创建:

1.当不赋予初始值时构造一个初始容量为0的列表

2.当赋予值时,则根据值大小大于0时创建初始容量的数组,new Object[initialCapacity];等于0时就创建初始容量为0的列表;小于0抛出异常

add:

  • 判断是否需要扩容

    判断是否是初始的空数组,如果是就赋值为10,然后和size+1比较返回较大的值首先将结构性修改计数器加一;然后判断minCapacity与当前元素数组的长度的大小,如果minCapacity比当前元素数组的长度的大小大的时候需要扩容在扩容的时候,首先将原元素数组的长度增大1.5倍(oldCapacity + (oldCapacity >> 1)),然后对扩容后的容量与minCapacity进行比较:① 新容量小于minCapacity,则将新容量设为minCapacity;②新容量大于minCapacity,则指定新容量。最后将旧数组拷贝到扩容后的新数组中

LinkedList双向链表

从网上找到两张图片

假设需要被删除的节点称之为delNode.

1) 如果delNode为头节点,则将头指针指向后续的节点。

2) 如果delNode的前向节点存在,则将前向节点的后向指针置为delNode的后向指针。

3) 如果delNode的后向节点存在,则将后向节点的前向指针置为del的前向指针

————————————————

LinkedList的add()和addLast()执行的一个方法,都是尾插

 

get()

遍历到具体位置,获得节点的业务数据(element)并返回;所以查询慢

Vector
Vector和ArrayList的底层实现方式非常的相近,官方说少使用Vector,还是尽量少使用,通过源码可以看出,每个方法都添加了synchronized关键字来保证同步,所以它是线程安全的,但是正是这些方法的同步,让其效率大大的降低了。比ArrayList的效率要慢
因此,给出以下几点总结:
1、Vector有四个不同的构造函数。 无参构造的容量默认值为10
2、扩充容量的方法ensureCapacityHelper。与ArrayList不同的是,Vector在每次增加元素(可能是1个,也可能是一组)时,都要调用该方法来确保足够的容量。当容量不足以容纳当前的元素个数时,就看构造方法中传入的容量增长系数CapacityIncrement是否为0,如果不为0,就设置新的容量为     旧容量 + 容量增长量;如果为0,设置新的容量为旧的容量的2倍,如果设置后的容量还不够,则直接新的容量设置为 旧容量 + 传入参数所需要的容量 而后同样用Arrays.copyof()方法将元素拷贝到新的数组。
3、很多方法都加入了synchronized同步语句,来确保线程安全。
4、Vector在查找给定元素索引值等方法中,源码都将该元素的值分为null和不为null两种情况处理,Vector中允许元素为null
5、其他很多地方与ArrayList实现大同小异,Vector现在已经不再使用。
 
Collections.synchronizedList底层也是使用了Synchronized关键字修饰的。
 
HashSet
HashSet底层是创建一个新的HashMap
可以设置初始容量,负载因子
它的add方法实际是调用HashMap的put方法,add的值作为key,value是一个new的空对象
 
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值