随后而来的就是六月毕业季,一大批应届毕业生准备进军招聘市场,其中不乏有一大批计算机软件专业的学生选择进入java领域,但无论你是应届生找工作还是打算跳槽的java工程师面试是必须经过的过程,不仅要掌握一些java程序员的就业面试技巧,更重要的是面试官对java专业知识的考察。本人通过最近面试遇到的问题,今天整理常见的java集合类面试题以及答案分享给大家。

1、Java集合框架是什么?

答:每种编程语言中都有集合,最初的Java版本包含几种集合类:Vector、Stack、Hash Table和Array。随着集合的广泛使用,Java1.2提出了囊括所有集合接口、实现和算法的集合框架。在保证线程安全的情况下使用泛型和并发集合类,Java已经经历了很久。它还包括在Java并发包中,阻塞接口以及它们的实现。

2、集合框架的优点是什么?

答:集合框架的部分优点如下:

(1)使用核心集合类降低开发成本,而非实现我们自己的集合类;

(2)随着使用经过严格测试的集合框架类,代码质量会得到提高;

(3)通过使用JDK附带的集合类,可以降低代码维护成本;

(4)复用性和可操作性。

3、并发集合和普通集合如何区别?

答:并发集合常见的有Concurrent Hash Map、Concurrent Linked Queue、Concurrent Linked Deque等。并发集合位于java.util.concurrent包下,是jdk1.5之后才有的,在 java 中有普通集合、同步(线程安全)的集合、并发集合。

4、Java集合框架的基础接口有哪些?

答:Collection为集合层级的根接口。一个集合代表一组对象,这些对象即为它的元素。Java平台不提供这个接口任何直接的实现。Set是一个不能包含重复元素的集合,这个接口对数学集合抽象进行建模,被用来代表集合;List是一个有序集合,可以包含重复元素,可以通过它的索引来访问任何元素,List更像长度动态变换的数组;Map是一个将key映射到value的对象,一个Map不能包含重复的key,每个key最多只能映射一个value。

一些其它的接口有Queue、Dequeue、SortedSet、SortedMap和ListIterator。

5、fail-fast与fail-safe有什么区别?

答:Iterator的fail-fast属性与当前的集合共同起作用,因此它不会受到集合中任何改动的影响。Java.util包中的所有集合类都被设计为fail-fast的,而java.util.concurrent中的集合类都为fail-safe的。Fail-fast迭代器抛出Concurrent Modification Exception,而fail-safe迭代器从不抛出Concurrent Modification Exception。

6、请问 Array List、Hash Set、Hash Map 是线程安全的吗?如果不是怎么获取线程安全的集合?

答:通过以上类的源码进行分析,每个方法都没有加锁,显然都是非线程安全的。在集合中Vector 和Hash Table是线程安全的。打开源码会发现其实就是把各自核心方法添加上了synchronized 关键字。Collections工具类提供了相关的 API,可以让上面那3个不安全的集合变为安全的。

关于javaio的面试题 java面试题以及答案_集合类

上面几个函数都有对应的返回值类型,传入什么类型返回什么类型。打开源码其实原理非常简单,就是将集合的核心方法添加上了synchronized关键字。

7、HashMap和Hashtable有什么区别?

答:HashMap是非线程安全的,HashMap是Map的一个实现类,是将键映射到值的对象,不允许键值重复。允许空键和空值;由于非线程安全,HashMap的效率要较 Hashtable 的效率高一些。Hashtable 是线程安全的一个集合,不允许 null 值作为一个 key 值或者value 值;Hashtable是sychronized,多个线程访问时不需要自己为它的方法实现同步,而 HashMap 在被java多线程访问的时候需要自己为它的方法实现同步。

8、List a=new ArrayList()和ArrayList a =new ArrayList()的区别?

答:List list = new ArrayList();这句创建了一个 ArrayList 的对象后赋给了List。此时它是一个 List 对象了,有些ArrayList 有但是 List 没有的属性和方法,它就不能再用了。而ArrayList list=new ArrayList();创建一对象则保留了ArrayList 的所有属性。 所以需要用到 ArrayList 独有的方法的时候不能用前者。实例代码如下:

List list = new ArrayList();
ArrayList arrayList = new ArrayList();
list.trimToSize(); //错误,没有该方法。
arrayList.trimToSize();    //ArrayList 里有该方法。

9、数组和链表分别比较适合用于什么场景,为什么?

答:数组和链表的区别在于:

数组是将元素在内存中连续存储的;它的优点是因为数据是连续存储的,内存地址连续,所以在查找数据的时候效率比较高;它的缺点是在存储之前,我们需要申请一块连续的内存空间,并且在编译的时候就必须确定好它的空间的大小。在运行的时候空间的大小是无法随着你的需要进行增加和减少而改变的,当数据两比较大的时候,有可能会出现越界的情况,数据比较小的时候,又有可能会浪费掉内存空间。在改变数据个数时,增加、插入、删除数据效率比较低。链表是动态申请内存空间,不需要像数组需要提前申请好内存的大小,链表只需在用的时候申请就可以,根据需要来动态申请或者删除内存空间,对于数据增加和删除以及插入比数组灵活。还有就是链表中数据在内存中可以在任意的位置,通过应用来关联数据。

链表和数组使用场景:

数组应用场景:数据比较少;经常做的运算是按序号访问数据元素;数组更容易实现,任何高级语言都支持;构建的线性表较稳定;

链表应用场景:对线性表的长度或者规模难以估计;频繁做插入删除操作;构建动态性比较强的线性表。

10、在迭代一个集合的时候,如何避免Concurrent Modification Exception?

答:在遍历一个集合的时候,我们可以使用并发集合类来避免Concurrent Modification Exception,比如使用Copy On Write Array List,而不是Array List。

11、为何Iterator接口没有具体的实现?

答:Iterator接口定义了遍历集合的方法,但它的实现则是集合实现类的责任。每个能够返回用于遍历的Iterator的集合类都有它自己的Iterator实现内部类。这就允许集合类去选择迭代器是fail-fast还是fail-safe的。比如,Array List迭代器是fail-fast的,而Copy On Write Array List迭代器是fail-safe的。

12、并发集合类是什么?

答:Java1.5并发包(java.util.concurrent)包含线程安全集合类,允许在迭代时修改集合。迭代器被设计为fail-fast的,会抛出ConcurrentModification Exception。一部分类为:CopyOnWriteArrayList、 ConcurrentHashMap、CopyOnWriteArraySet。

13、Comparable和Comparator接口有何区别?

答:Comparable和Comparator接口被用来对对象集合或者数组进行排序。Comparable接口被用来提供对象的自然排序,我们可以使用它来提供基于单个逻辑的排序。Comparator接口被用来提供不同的排序算法,我们可以选择需要使用的Comparator来对给定的对象集合进行排序。

14、哪些集合类是线程安全的?

答:Vector、Hash Table、Properties和Stack是同步类,所以它们是线程安全的,可以在多线程环境下使用。Java1.5并发API包括一些集合类,允许迭代时修改,因为它们都工作在集合的克隆上,所以它们在多线程环境中是安全的。

15、EnumSet是什么?

答:java.util.EnumSet是使用枚举类型的集合实现。当集合创建时,枚举集合中的所有元素必须来自单个指定的枚举类型,可以是显示的或隐示的。EnumSet是不同步的,不允许值为null的元素。它也提供了一些有用的方法,比如copyOf(Collection c)、of(E first,E…rest)和complementOf(EnumSet s)。

上面的内容就是java面试中常考的题目了,相信大家掌握了这15道题后,在以后的java就业面试中可以轻松应对了。