集合常见面试题

2020-07-08  本文已影响0人  一直想上树的猪

一、List

List接口下的实现类有ArrayList,linkedlist,vector等等,一般就是用这两个,用法不多说,老生常谈。

ArrayList的扩容方式是1.5倍扩容,这样扩容避免2倍扩容可能浪费空间,是一种折中的方案。 另外他不是线程安全,vector则是线程安全的,它是两倍扩容的。

linkedlist是双链表,Java里的linkedlist自带按索引访问的api

除此之外还有一个copyonwritelist,用于线程安全的场景。

ArrayList和Vector的区别(是否有序、是否重复、数据结构、底层实现)

ArrayList和Vector都实现了List接口,他们都是有序集合,并且存放的元素是允许重复的。它们的底层都是通过数组来实现的,因此列表这种数据结构检索数据速度快,但增删改速度慢。
而ArrayList和Vector的区别主要在两个方面:

二、Map

三、CHM

concurrenthashmap也稍微提一下把,chm1.7使用分段锁来控制并发,每个segment对应一个segmentmask,通过key的hash值相与这个segmentmask得到segment位置,然后再找到具体的entry数组下标。

所以chm需要维护多个segment,每个segment对应一段数组。分段锁使用的是reetreetlock可重入锁实现,查询时不加锁。

1.8则放弃使用分段锁,改用cas+synchronized方式实现并发控制,查询时不加锁,插入时如果没有冲突直接cas到成功为止,有冲突则使用synchronized插入。

四、Linkedhashmap

在原来hashmap基础上将所有的节点依据插入的次序另外连成一个链表。用来保持顺序,可以使用它实现lru缓存,当访问命中时将节点移到队头,当插入元素超过长度时,删除队尾元素即可。

使用的时候先继承linkedhashmap或者直接使用linkedhashmap作为成员变量,然后重写removeEldestEntry方法即可,注意传入size参数,判断当元素个数超过size时返回true,表示可以删除就行了。

上一篇 下一篇

猜你喜欢

热点阅读