java集合部分面试题目整理总结

1.Map 和 ConcurrentHashMap 的区别?

hashmap 是线程不安全的,put 时在多线程情况下,会形成环从而导致死循环。
ConcurrentHashMap 是线程安全的,采用分段锁机制,减少锁的粒度。

2.如果 hashMap 的 key 是一个自定义的类,怎么办?

使用 HashMap,如果 key 是自定义的类,就必须重写 hashcode()和 equals()。 # 3.ArrayList 和 LinkedList 的区别,如果一直在 list 的尾部添加元素,用哪个效率高?
ArrayList 采用数组实现的,查找效率比 LinkedList 高。LinkedList 采用双向链表实现的,插入和删除的效率比 ArrayList 要高。一直在 list 的尾部添加元素,LinkedList 效率要高。

3.HashMap 底层,负载因子,为啥是 2^n?

负载因子默认是 0.75, 2^n 是为了让散列更加均匀,例如出现极端情况都散列在数组中的 一个下标,那么 hashmap 会由 O(1)复杂退化为 O(n)的。

4.TreeMap 底层,红黑树原理?

TreeMap 的实现就是红黑树数据结构,也就说是一棵自平衡的排序二叉树,这样就可以保证 当需要快速检索指定节点。 红黑树的插入、删除、遍历时间复杂度都为 O(lgN),所以性能上低于哈希表。但是哈希表 无法提供键值对的有序输出,红黑树因为是排序插入的,可以按照键的值的大小有序输出。
红黑树性质:
性质 1:每个节点要么是红色,要么是黑色。
性质 2:根节点永远是黑色的。
性质 3:所有的叶节点都是空节点(即 null),并且是黑色的。
性质 4:每个红色节点的两个子节点都是黑色。(从每个叶子到根的路径上不会有两个连续的红色节点)
性质 5:从任一节点到其子树中每个叶子节点的路径都包含相同数量的黑色节点。

5.ArrayList 是否会越界?

ArrayList 是实现了基于动态数组的数据结构,而 LinkedList 是基于链表的数据结构 。对 于随机访问get 和 set,ArrayList 要优于 LinkedList,因为 LinkedList 要移动指针;ArrayList 并发 add()可能出现数组下标越界异常。

6.什么是 TreeMap?

TreeMap 是一个有序的 key-value 集合,基于红黑树(Red-Black tree)的 NavigableMap 实现。该映射根据其键的自然顺序进行排序,或者根据创建映射时提供的 Comparator 进行排序, 具体取决于使用的构造方法。

7.Java集合类框架的基本接口有哪些?

集合类接口指定了一组叫做元素的对象。集合类接口的每一种具体的实现类都可以选择以它自己的方式对元素进行保存和排序。有的集合类允许重复的键,有些不允许。 Java 集合类提供了一套设计良好的支持对一组对象进行操作的接口和类。Java 集合类里面最基本的接口有:
Collection:代表一组对象,每一个对象都是它的子元素。
Set:不包含重复元素的 Collection。
List:有顺序的 collection,并且可以包含重复元素。
Map:可以把键(key)映射到值(value)的对象,键不能重复。

8.什么是迭代器?

Iterator 提供了统一遍历操作集合元素的统一接口, Collection 接口实现 Iterable 接口,每个集合都通过实现 Iterable 接口中 iterator()方法返回 Iterator 接口的实例, 然后对集合的元素进行迭代操作。
注意:在迭代元素的时候不能通过集合的方法删除元素, 否则会抛出 ConcurrentModificationException 异常. 但是可以通过 Iterator 接口中的 remove()方法进行删除。

9.Iterator 和 ListIterator 的区别是什么?

Iterator 和 ListIterator 的区别是: Iterator 可用来遍历 Set 和 List 集合,但是 ListIterator 只能用来遍历 List。 Iterator 对集合只能是前向遍历,ListIterator 既可以前向也可以后向。 ListIterator 实现了 Iterator 接口,并包含其他的功能,比如:增加元素,替换元素,获取前 一个和后一个元素的索引等等。

10.HashMap 和 Hashtable 有什么区别?

HashMap 和 Hashtable 都实现了 Map 接口,因此很多特性非常相似。
不同点:HashMap 允许键和值是 null,而 Hashtable 不允许键或者值是 null。 Hashtable 是同步的,而 HashMap 不是同步的。因此,HashMap 更适合于单线程环境,而 Hashtable 适合于多线程环境。

11.ArrayList 和 LinkedList 有什么区别?

ArrayList 和 LinkedList 都实现了 List 接口。
不同点: ArrayList 是基于索引的数据接口,它的底层是数组。它可以以 O(1)时间复杂度对元素进行随机访问。LinkedList 是以元素列表的形式存储它的数据,每一个元素都和它的前一个和后一个元素链接在一起,在这种情况下,查找某个元素的时间复杂度是 O(n)。 相对于 ArrayList,LinkedList 的插入,添加,删除操作速度更快,因为当元素被添加到集合任意位置的时候,不需要像数组那样重新计算大小或者是更新索引。 LinkedList 比 ArrayList 更占内存,因为 LinkedList 为每一个节点存储了两个引用,一个指向前一个元素,一个指向下一个元素。

12.ArrayList,Vector,LinkedList 的存储性能和特性是什么?

ArrayList 和 Vector 都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢,Vector 由于使用了 synchronized 方法(线程安全),通常性能上较 ArrayList 差,而 LinkedList 使用双向链表实现存储,按序号索引数据 需要进行前向或后向遍历,但是插入数 据时只需要记录本项的前后项即可,所以插入速度较快。

13.Collection 和 Collections 的区别。

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

14.你所知道的集合类都有哪些?主要方法?

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

15,List、Set、Map 是否继承自 Collection 接口?

List、Set 是,Map 不是。Map 是键值对映射容器,与 List 和 Set 有明显的区别,而 Set 存储的零散的元素且不允许有重复元素,List 是线性结构的容器, 适用于按数值索引访问元素的情形。

16.阐述 ArrayList、Vector、LinkedList 的存储性能和特性。

ArrayList 和 Vector 都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便 增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操 作,所以索引数据快而插入数据慢,Vector 中的方法由于添加了 synchronized 修饰,因此 Vector 是线程安全的容器,但性能上较 ArrayList 差,因此已经是 Java 中的遗留容器。LinkedList 使 用双向链表实现存储(将内存中零散的内存单元通过附加的引用关联起来,形成一个可以按序号 索引的线性结构,这种链式存储方式与数组的连续存储方式相比,内存的利用率更高),按序号 索引数据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速 度较快。Vector 属于遗留容器(Java 早期的版本中提供的容器,除此之外,Hashtable、Dictionary、 BitSet、Stack、Properties 都是遗留容器),已经不推荐使用,但是由于 ArrayList 和 LinkedListed 都是非线程安全的,如果遇到多个线程操作同一个容器的场景,则可以通过工具 类 Collections 中的 synchronizedList 方法将其转换成线程安全的容器后再使用(这是对装潢模式的应用,将已有对象传入另一个类的构造器中创建新的对象来增强实现)。

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

List 以特定索引来存取元素,可以有重复元素。Set 不能存放重复元素(用对象的 equals() 方法来区分元素是否重复)。Map 保存键值对(key-value pair)映射,映射关系可以是一对一 或多对一。Set 和 Map 容器都有基于哈希存储和排序树的两种实现版本,基于哈希存储的版本理 论存取时间复杂度为 O(1),而基于排序树版本的实现在插入或删除元素时会按照元素或元素的 键(key)构成排序树从而达到排序和去重的效果。

猜你喜欢

转载自blog.csdn.net/ChenBinBini/article/details/106819897