Java Collection
是一个框架,提供了存储和操作对象集合的机制。它允许开发人员访问预先打包的数据结构和算法来操作数据。
在本文中,我们涵盖了前 50 个 Java 集合面试问题,其答案涵盖了从基本 Java 集合到高级 Java 集合概念(例如导航集合、WeakHashMap、流和 Lambda
等)的所有内容。
无论您是新手还是经验丰富的人Java 开发人员,本文为您提供了在下一次基于 Java 的技术面试中取得好成绩所需的全部信心。
新手 Java 面试题集
11.迭代器和枚举有什么区别?
迭代器和枚举之间的主要区别是迭代器有remove()方法,而枚举没有。因此,使用 Iterator 我们可以通过在集合中添加和删除对象来操作对象。由于枚举只能遍历对象并获取它们,因此它的行为类似于只读接口。
12. Java中List和Set有什么区别
列表和集合之间的主要区别在于列表可以包含重复的元素,而集合仅包含唯一元素。该列表是有序的,并维护它们所添加到的对象的顺序。该集合是无序的。
列表 List | Set |
List 是一个索引序列。 | Set 是一个非索引序列。 |
列表允许重复元素 | 该集合不允许有重复的元素。 |
可以按元素的位置来访问元素。 | 不允许对元素进行位置访问。 |
可以存储多个空元素。 | 空元素只能存储一次。 |
列表的实现有 | Set的实现有 |
13. Java Collections Framework 的最佳实践是什么?
以下是使用 Java 集合的一些最佳实践:
- 程序应该写成接口,而不是实现,这样我们就可以稍后修改实现。
- 只要有可能,就使用泛型来确保类型安全并避免
ClassCastExceptions
。 - 根据需要选择合适的集合类型。例如,如果大小是固定的,我们可能想使用 Array 而不是 ArrayList。当迭代Map时,我们应该使用LinkedHashMap。Set 是避免重复的最好方法。
- 使用 JDK 提供的不可变类作为 Map 中的键,以避免实现 hashCode() 和 equals()。
- 为了增加代码的可读性,我们应该使用 isEmpty(),而不是查找集合的大小并将其与零进行比较。
- 不要编写自己的实现,而是使用
Collections
实用程序类来获取只读、同步或空集合。它增强了代码重用,同时提高了稳定性。
14.Java中什么是优先级队列?
PriorityQueues 用于根据对象的优先级来处理对象。队列遵循先进先出算法,但有时队列中的元素需要根据其优先级进行处理,这就是 PriorityQueue 发挥作用的地方。优先级队列基于优先级堆。优先级队列的元素根据自然顺序排序,或者通过队列构造时提供的比较器排序,具体取决于使用的构造函数。
公共类 PriorityQueue<E> 扩展 AbstractQueue<E> 实现 Serialized
其中 E 是该队列中保存的元素的类型
该类实现 Serialized、Iterable<E>、Collection<E> 和 Queue<E> 接口。
15.java中List、Set、Map有什么区别?
List | Set | Map |
列表接口允许重复元素 | 该集合不允许有重复的元素。 | Map不允许重复元素 |
该列表保持插入顺序。 | 该集合不维护任何插入顺序。 | Map也不维护任何插入顺序。 |
我们可以添加任意数量的空值。 | 但集合中几乎只有一个空值。 | 该映射最多允许单个空键和任意数量的空值。 |
列表的实现类有 | Set的实现类有 | Map 实现类有 |
16. 队列和堆栈有什么区别?
Stack 栈 | queue 队列 |
堆栈遵循 LIFO 原则,这意味着最后插入的元素将是第一个被取出的元素。 | 队列按照先进先出原则工作,这意味着首先插入的元素将是第一个被取出的元素。 |
在堆栈中,插入和删除仅从顶部进行。 | 在队列中,插入发生在列表的后面,删除发生在列表的前面。 |
插入操作称为推操作。 | 插入操作称为入队操作。 |
删除操作称为弹出操作。 | 删除操作称为出队操作。 |
堆栈的顶部始终指向列表中的最后一个元素,这是用于访问列表的唯一指针。 | 维护两个指针用于访问队列。front指针指向第一个插入的元素,rear指针指向最后插入的元素。 |
17.什么是枚举集?
EnumSet
是专门针对枚举类型对象的 Set 接口的实现。Enumset 扩展了 AbstractSet 类并实现了 Java 中的 Set 接口。EnumSet
类是 Java Collections Framework
的成员,并且不同步。迭代器永远不会抛出 ConcurrentModificationException
等异常,这是弱一致的。
17. Java中的BlockingQueue是什么?
Java
中的 BlockingQueue
接口与各种其他并发实用程序类(如 ConcurrentHashMap
、Counting Semaphore
、CopyOnWriteArrrayList
等)一起添加到 Java 1.5 中。BlockingQueue
接口通过在 BlockingQueue
已满或为空时引入阻塞来支持流量控制(除了队列之外)。尝试将元素加入已满队列的线程会被阻塞,直到其他线程通过使一个或多个元素出列或完全清除队列来在队列中腾出空间。类似地,它会阻塞尝试从空队列中删除的线程,直到其他线程插入项目为止。BlockingQueue 不接受空值。如果我们尝试将 null 项放入队列,则会抛出 NullPointerException
。
阻塞队列的使用
BlockingQueue的层次结构
18. hashCode()
是什么?
hashCode() 方法以整数形式返回哈希码值。它在 Java Object 类中定义,用于计算给定输入对象的哈希值。Hashcode 值主要用于基于哈希的集合,如 HashMap、HashSet、HashTable…等。必须在每个重写 equals() 方法的类中重写此方法。
语法:
public int hashCode()
// 此方法返回调用此方法的对象的哈希码值。
19.区分Java集合框架中的ArrayList和Vector
。
在藏品访谈中,这个问题经常被问到;然而,Vector 是同步的,而 ArrayList 不是。ArrayList 比 Vector 更快。ArrayList的Array大小在需要时增加50%,而Vector的容量在需要时增加一倍。
|
|
ArrayList 不同步 | Vector是同步的。 |
如果元素数量超过其容量,ArrayList 的大小将增加到当前数组大小的 50%。 | 如果元素数量超过其容量,ArrayList 的大小将增加到当前数组大小的 100%。 |
ArrayList 速度很快,因为它是非同步的。 | Vector 速度较慢,因为它是同步的。 |
迭代器接口用于遍历元素 | 可以使用迭代器接口或枚举来遍历向量。 |
20.区分Iterator 和 ListIterator
。
Iterator 迭代器 | ListIterator 列表迭代器 |
只能向前遍历 Collection 中存在的元素。 | 可以向前和向后遍历 Collection 中存在的元素。 |
有助于遍历Map、List和Set。 | 只能遍历List,不能遍历其他两个。 |
使用Iterator无法获取索引。 | 它有像 nextIndex() 和 previousIndex() 这样的方法,可以在遍历 List 时随时获取元素的索引。 |
无法修改或替换集合中存在的元素 | 我们可以借助 set(E e) 修改或替换元素 |