【面试题】集合类的基本知识点

时间:2022-07-25 16:59:58

1.HashMap的键值允许为空吗?

集合类 Key Value Super 线程
Hashtable 非null 非null Dictionary 安全
ConcurrentHashMap 非null 非null AbstractMap 安全
TreeMap 非null 可null AbstractMap 不安全
HashMap 可null 可null AbstractMap 不安全
WeakHashMap 可null 可null AbstractMap 不安全

注:List、Set、Queue继承于Collection接口,

2.HashMap和HashTable的区别?

  • 历史原因
    Hashtable是基于陈旧的Dictionary类的,HashMap是Java 1.2引进的Map接口的一个实现

  • 同步性
    Hashtable是线程安全的(加锁了),而HashMap是线程序不安全的,不是同步的


  • 只有HashMap可以让你将空值作为一个表的条目的key或value,而HashTable不允许有null的键和值,HashMap效率高

3.ArrayList和Vector的区别

  • 同步性:
    Vector是线程安全的,而ArrayList是非线程安全的

  • 数据增长:
    ArrayList与Vector都有一个初始的容量大小,需要扩容时Vector默认增长为原来两倍,而ArrayList增长为原来的1.5倍。

4.List、Map、Set三个接口,存取元素时,各有什么特点?

  • List与Set都继承于Collection接口,它们都是单列元素的集合,

  • Set里面不允许有重复的元素,List表示有先后顺序的集合,即先来后到的顺序。

  • Map与List和Set不同,它是双列的集合,Map保存key-value值,value可多值。可以存储重复元素,但重复元素只有一份。

  • Collection接口与Collections类

    • Collection是集合类的上级接口,继承与他的接口主要有Set和List.
    • Collections是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作

5.ArrayList和LinkedList的区别?

  • ArrayList和LinkedList都实现了List接口,它们的区别如下

  • ArrayList是基于索引的数据接口,它的底层是数组。它可以以O(1)时间复杂度对元素进行随机访问。与此对应,LinkedList是以元素列表的形式存储它的数据,每一个元素都和它的前一个和后一个元素链接在一起,查找某个元素的时间复杂度是O(n)。

  • LinkedList的插入,添加,删除操作速度更快,因为当元素被添加到集合任意位置的时候,不需要像数组那样重新计算大小或者是更新索引。而ArrayList的随机访问速度更快。

  • LinkedList比ArrayList更占内存,因为LinkedList为每一个节点存储了两个引用,一个指向前一个元素,一个指向下一个元素。

6.Comparable和Comparator接口的区别?

  • Comparable接口用于定义对象的自然顺序,只包含一个compareTo()方法。可以给两个对象排序。即它返回负数,0,正数来表明输入对象小于,等于,大于已经存在的对象。

  • Comparator接口用于定义用户定制的顺序,包含compare()和equals()等多个方法。compare()方法用来给两 个输入参数排序,返回负数,0,正数表明第一个参数是小于,等于,大于第二个参数。equals()方法需要一个对象作为参数,它用来决定输入参数是否和comparator相等。只有当输入参数也是一个comparator并且输入参数和当前comparator的排序结果是相同的时候,这个方法才返回true

7.HashSet和TreeSet的区别?

  • HashSet底层由HashMap来实现的,因此,它的元素是无序的。add(),remove(),contains()方法的时间复杂度是O(1)。

  • TreeSet底层由TreeMap的红黑树来实现的,它里面的元素是有序的。因此,add(),remove(),contains()方法的时间复杂度是O(logn)。

8.poll() 方法和 remove() 方法的区别?

  • poll() 和 remove() 都是从队列中取出一个元素

  • poll() 在获取元素失败的时候会返回空,但是 remove() 失败的时候会抛出异常。

9.LinkedHashMap 和 PriorityQueue 的区别?

  • PriorityQueue 保证最高或者最低优先级的的元素总是在队列头部

  • LinkedHashMap 维持的顺序是元素插入的顺序。

  • WeakHashMap 是以弱键 实现的基于哈希表的 Map,当某个键不再正常使用时,将自动移除其条目。键映射的存在并不阻止垃圾回收器对该键的丢弃

  • TreeSet继承于AbstractSet,非线程安全,一种有序集,元素必须实现Comparable接口

  • HashSet继承于AbstractSet,非线程安全,可为空,一种没有重复元素的无序集合,存入HashSet的元素必须定义hashCode()

  • LinkedHashSet继承于HashSet,维护着一个运行于所有条目的双重链接列表, 一种可以记住元素插入次序的集合,

  • ArrayDeque : 一种用循环数组实现的双端队列,可以在任何一端添加或移除元素

10.对Iterator的理解

  • Iterator是迭代器设计模式,它是一个对象,它可以遍历并选择序列中的对象

  • ListIterator接口 继承了Iterator接口,允许按照任意方向遍历列表,迭代期间修改列表,并获得迭代器在列表中的当前位置

  • 循环效率for>Iterator>foreach,因为foreach底层还是调用了for循环,在集合中调用的是Iterator。



本人才疏学浅,若有错,请指出,谢谢!
如果你有更好的建议,可以留言我们一起讨论,共同进步!
衷心的感谢您能耐心的读完本篇博文!