20个Java ArrayList面试问题及答案

547 阅读9分钟

大家好,如果你准备参加Java面试,那么你就来对地方了。在这篇文章中,我将分享一些基于ArrayList类的优秀Java面试问题。我几乎没见过在Java面试中不问ArrayList的问题,为什么不问呢,因为ArrayList是最受欢迎的集合类之一,每个Java开发人员在日常工作中都会用到它。问与ArrayList有关的问题的另一个原因是,你可以问各种各样的问题,以真正检查候选人的知识广度和深度。

为了让你对ArrayList有一些了解,它是一个实现了List接口的集合类。它是数组数据结构的替代物,数组的大小一旦创建就无法改变。ArrayList是一个动态数组,它可以自己增长和调整大小。

通过实现List接口,它也得到了一些属性,如排序,ArrayList保持元素的插入顺序,如果你知道元素的索引,它也提供了恒定时间的搜索操作,如 get(index)是O(1)操作。

这使得ArrayList成为你希望根据索引检索数值的理想选择。

与搜索相反,在ArrayList中添加和删除的成本有点高,因为它可以触发重新调整大小,这涉及到创建一个新的数组,并将旧数组中的所有元素复制到新数组中。

我相信你已经知道了这些基础知识,但通过对这些常见的Java ArrayList问题的了解,你会学到更多。

Java面试中的20多个ArrayList问题及答案

所以不要再浪费时间了,让我们开始做题。问题主要分为两类,一类是基于事实的问题,检查你对ArrayList的了解程度,另一类是基于任务的问题,评估你在使用ArrayList做事方面的能力。在我的列表中,我将这两类问题结合起来。

1.如何在Java中删除ArrayList中的重复部分? (答案)
这是一个基于任务的问题。由于List接口允许重复,ArrayList也允许,但如果你记得Set接口不允许重复,这意味着你可以通过将ArrayList转换为Set,然后再转回ArrayList来删除重复的内容,但你将如何保持顺序的完整?请看答案中更详细的解释。

2.如何在Java中反转ArrayList? (答案)
你可以通过使用Collections.reverse()方法来反转ArrayList。 还有一些方法,如迭代列表和复制元素到一个新的列表。更多的方法请看答案,以了解完成这项任务的方法。

3.Java中的数组和ArrayList的区别? (答案)
这是一个应届生级别的面试问题,数组和ArrayList的主要区别是前者是静态的,后者是动态的。数组一旦创建就不能改变其大小,但ArrayList可以自动增长和增加其大小。

4.如何在Java中同步化ArrayList?(答案)
这是一个非常好的任务型问题。如果你还记得,ArrayList不是线程安全的,它也不是同步的,这意味着你不能在多个线程之间分享它,如果其中一个线程修改了它。别担心,你可以通过使用Collections.synchronizedList()方法来同步ArrayList。检查答案以了解步骤。

5.在Java中何时使用ArrayList和LinkedList?(答案)
这是迄今为止Java面试中最受欢迎的基于ArrayList的问题,如果你熟悉两个关键的数据结构,即数组和链表,你可以很容易地回答它。

由于数组提供了恒定时间的搜索操作,如果搜索操作超过了添加和删除操作,最好使用ArrayList,否则就使用LinkedList ,它提供了恒定的添加和删除操作。关于这个话题的详细讨论,请看答案。

Java ArrayList Interview Questions and Answers

6.Java中ArrayList和HashSet的区别? (答案)
在Java面试中,你会看到最简单的问题之一。主要区别在于前者是List,而后者是Set,这意味着ArrayList允许重复,保持元素的顺序,而HashSet不允许重复,并且不提供排序保证。

7.如何在Java中对ArrayList进行循环?(答案)
有很多方法可以遍历ArrayList,你可以使用带有索引的经典for循环,或者你可以从ArrayList中获取迭代器,并结合Iterator.hasNext()方法使用while循环,或者你可以使用Java 5中引入的新foreach循环,它不需要索引。请看现场例子的答案。

8.Java中Vector和ArrayList的区别?(答案)
这是基于Java中ArrayList的第二大热门问题。虽然Vector和ArrayList都实现了List接口,但Vector是同步的,而ArrayList是不同步的,这意味着前者是线程安全的,速度快,而后者是不线程安全的,速度慢。

9.如何在一行中创建和初始化ArrayList?(答案)
有一个很好的小技巧,通过使用Arrays.asList()方法来做到这一点,但是请记住这个类所返回的List与ArrayList有一些区别,请查看答案来了解这些区别是什么。

10.如何在Java中对ArrayList进行排序?(答案)
另一道基于任务的ArrayList面试题。你可以通过使用Collections.sort()方法轻松地对ArrayList进行排序,你所需要确保的是元素实现了Comparable或Comparator接口。前者用于按自然顺序排序,而后者则用于按自定义顺序排序。

11.Java中HashMap和ArrayList的区别?(答案)
HashMap和ArrayList之间有很大的区别,最根本的是前者是一个存储键值对的Map数据结构,而后者只存储一个对象。HashMap使用键访问对象,而ArrayList使用索引访问元素。尽管两者都提供了O(1)的搜索性能,但ArrayList的性能是有保证的,而HashMap则可以根据碰撞程度而变化。

12.如何在Java中使用ArrayList? (答案)
请看这篇文章,了解在Java中使用这个流行类的不同方法。

13.如何在Java中把ArrayList转换为String?(答案)
很简单,只要调用toString()就可以了吧?不幸的是,String的表示方法不是很有用。如果你想找一个包含ArrayList所有元素的逗号分隔的String,那么你可以使用Java 8 String joiner或一些旧的库方法,如答案页所示。

14.如何在Java中从ArrayList中获得一个子列表?(答案)
这又是一个基于任务的问题,但如果你记住了API,你可以很容易做到。你可以通过使用ArrayList类中的subList()方法获得一个范围内的元素列表。这在排序列表的情况下会很有帮助。

15.在Java中,数组的length()和ArrayList的size()有什么区别?(答案)
这是一个棘手的问题,如果你得到后退的数组并调用length(),它将返回你能在这个数组中存储多少个元素,也称为容量,但如果你调用ArrayList类的size()函数,那么它将返回当前存储在ArrayList中的元素总数,这总是小于或等于容量。

16、什么是Java中的CopyOnWriteArrayList?(答案)
这是一个并发的集合类,是作为Java中同步List的替代品而引入的。这个类利用了先进的线程安全技术而不是锁。如果ArrayList主要用于读取数据,它是非常有效的,因为它允许多个线程在不加锁的情况下读取数据,而同步ArrayList是不可能的。请看答案,了解更多关于CopyOnWriteArrayList类的信息。

17.如何在Java中从ArrayList中删除对象? (答案)
有两种方法可以从ArrayList中删除元素,第一,可以调用remove(int index)方法,并传入你要删除的元素的索引;第二,可以调用remove(Object obj) 方法,并传入你要删除的元素。顺便说一下,在处理整数的ArrayList时要小心,因为autoboxing会在两个remove方法之间产生歧义而导致问题。关于这个问题的更详细讨论,请看答案。

18.如何在Java中使ArrayList成为只读的? (答案)
另一个基于任务和API的面试问题。如果你是关于Collections实用类的,你可以很容易地回答它,它提供了标准ArrayList类的几个包装器,例如,你可以使用Collections在Java中创建一个同步版本或只读版本的ArrayList。

19.如何在Java中对ArrayList进行降序排序? (答案)
这是之前一个与排序有关的问题的后续问题。默认情况下,元素是按递增顺序排序的,因为它们的compareTo()或compare()方法就是这样进行比较的。如果你想按降序排序,只需使用Collections.reverseComparator()方法将比较逻辑倒置即可。

以上就是关于Java面试中ArrayList问题的全部内容。我几乎涵盖了我所知道的所有以前被问到的Java程序员的问题,包括应届生和有2-5年经验的人。有些公司更看重编码技能,也会要求你用Java实现自己的ArrayList类,所以也要做好准备。

这门课程最好的一点是他们对答案的解释很到位。你甚至会从这本书中学习,并能填补你理解上的空白。

来自Java67博客的相关面试问题

感谢你到目前为止阅读这篇文章。如果您喜欢这些Java ArrayList面试问题,或者在电话面试中看到过这些问题,那么请在Facebook、Twitter、Email等平台上与您的朋友和同事分享此文。如果您有任何问题或反馈,请留言。