集合面试题Ⅰ

1、集合类都有哪些?主要方法

  最常用的集合类是 List 和 Map。List 的具体实现包括 ArrayList 和Vector,它们是可变大小的列表,比较适合构建、存储和操作任何类型对象的元素列表。 List 适用于按数值索引访问元素的情形。 Map 提供了一个更通用的元素存储方法。 Map 集合类用于存储元素对(称作“键”和“值”),其中每个键映射到一个值。

2、ArrayList,Vector, LinkedList 的存储性能和特性

  ArrayList 和 Vector 都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢,Vector 由于使用了 synchronized 方法(线程安全),通常性能上较 ArrayList 差。

  LinkedList 使用双向链表实现存储,按序号索引数据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快查找速度慢。

3、HashMap 和 Hashtable 的区别

  二者都实现了 Map 接口,是将惟一键映射到特定的值上;主要区别在于:

    1)HashMap 没有排序,允许一个 null 键和多个 null 值,而 Hashtable 不允许;

    2)HashMap 把 Hashtable 的 contains 方法去掉了,改成 containsvalue 和containsKey,因为 contains 方法容易让人引起误解;

    3)Hashtable 继承自 Dictionary 类,HashMap 是 Java1.2 引进的 Map 接口的实现;

    4)Hashtable 的方法是 Synchronize 的,而 HashMap 不是,在多个线程访问Hashtable 时,不需要自己为它的方法实现同步,而 HashMap 就必须为之提供外同步。

    Hashtable 和 HashMap 采用的 hash/rehash 算法大致一样,所以性能不会有很大的差异

 4、Arraylist 与 Vector 区别

  1)同步性:Vector 是线程安全的(同步),而 ArrayList 是线程序不安全的;

  2)数据增长:当需要增长时,Vector 默认增长一倍,而 ArrayList 却是一半。

5、List、Set、Map 之间的区别是什么

  List、Set、Map 的区别主要体现在两个方面:元素是否有序、是否允许元素重复。

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

  List 以特定次序来持有元素,可有重复元素。Set 无法拥有重复元素,内部排序。Map 保存 key-value 值,value 可多值(MultiValueMap)。

7、如何决定使用 HashMap 还是 TreeMap

  对于在 Map 中插入、删除、定位一个元素这类操作,HashMap 是最好的选择,因为相对而言 HashMap 的插入会更快,但如果你要对一个 key 集合进行有序的遍历,那 TreeMap 是更好的选择。

8、HashMap 的实现原理

  HashMap 基于 Hash 算法实现的,我们通过 put(key,value)存储,get(key)来获取。当传入 key 时,HashMap 会根据 key. hashCode() 计算出 hash 值,根据 hash 值将 value 保存在 bucket 里。当计算出的 hash 值相同时,我们称之为 hash 冲突,HashMap 的做法是用链表和红黑树存储相同 hash 值的 value。当 hash 冲突的个数比较少时,使用链表否则使用红黑树。

9、HashSet 的实现原理

  HashSet 是基于 HashMap 实现的,HashSet 底层使用 HashMap 来保存所有元素,因此 HashSet 的实现比较简单,相关 HashSet 的操作,基本上都是直接调用底层 HashMap 的相关方法来完成,HashSet 不允许重复的值。

10、ArrayList 和 LinkedList 的区别是什么

  数据结构实现:ArrayList 是动态数组的数据结构实现,而 LinkedList 是双向链表的数据结构实现。

  随机访问效率:ArrayList 比 LinkedList 在随机访问的时候效率要高,因为 LinkedList 是线性的数据存储方式,所以需要移动指针从前往后依次查找。

  增加和删除效率:在非首尾的增加和删除操作,LinkedList 要比 ArrayList 效率要高,因为 ArrayList 增删操作要影响数组内的其他数据的下标。

  综合来说,在需要频繁读取集合中的元素时,更推荐使用 ArrayList,而在插入和删除操作较多时,更推荐使用 LinkedList。

posted @ 2020-05-19 16:02  朝暮的小知识  阅读(374)  评论(0)    收藏  举报