当前位置: 首页 > 图灵资讯 > 技术篇> 14道题解决java面试中的集合类问题(附答案)

14道题解决java面试中的集合类问题(附答案)

来源:图灵教育
时间:2023-04-10 17:25:54

  现在2020年的春季招聘已基本结束,随后是6月毕业季,大量应届毕业生准备进入招聘市场,包括大量计算机软件专业学生选择进入但是java领域无论是应届毕业生找工作还是打算跳槽,java工程师面试是一个必须经过的过程,不仅要掌握一些java程序员就业面试技巧,更重要的是面试官是对的考察java专业知识。通过最近的面试,我整理了今天常见的问题java集合面试题和大家分享答案。

  1、什么是Java集合框架?

  答:每种编程语言都有集合,最初的Java版本包括几种集合类:Vector、Stack、Hash塔ble和Array。Java11随着集合的广泛应用.2提出了包括所有集合接口、实现和算法的集合框架。Java长期以来一直使用泛型和并发集合类,以确保线程安全。它还包括Java并发包、阻塞接口及其实现。

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

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

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

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

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

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

  3、并发集合和普通集合有什么区别?

  答:常见的并发集合有ConcurrentHashMap、ConcurrentLinkedQueue、ConcurrentLinkedDeque等。并发集位于java.util.jdk1.5后才有concurrent包, 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有什么区别?

  答:Iteratorfail-fast属性与当前的集合一起工作,因此它不会受到集合中任何变化的影响。Java.util包中的所有集合类都设计为fail-fast,而java.util.concurrent中的集合类都是fail-safe。Fail-fast迭代器抛出ConcurentModificationException,fail-safe迭代器从不抛出ConcurentModificationException。

  6、请问 ArrayList、HashSet、HashMap 是线程安全吗?如果不是如何获得线程安全集合?

  答:通过以上类别的源代码分析,每种方法都没有锁定,显然是非线程安全的。集合中Vector 和HashTable是线程安全的。打开源代码,你会发现它实际上是添加了synchronizeded各自的核心方法 关键字。collections工具类提供相关信息 API,上述三个不安全的集合可以变得安全。

  以上函数都有相应的返回值类型,传入什么类型,返回什么类型。事实上,打开源代码的原理非常简单,即添加集合的核心方法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 没有属性和方法,它就不能再使用了。ArrrayListt list=new ArrayList();创建一个对象保留了ArrayList 所有属性。 因此需要使用 ArrayList 前者不能用于独特的方法。实例代码如下:

  List list = new ArrayList();

  ArrayList arrayList = new ArrayList();

  list.trimToSize(); //错误,没有这种方法。

  arrayList.trimToSize(); //ArrayList 里面有这个方法。

  9、什么场景更适合数组和链表?为什么?

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

  数组连续存储内存中的元素;其优点是数据连续存储,内存地址连续,因此在搜索数据时效率较高;其缺点是在存储之前,我们需要申请一个连续的内存空间,并且在编译时必须确定其空间的大小。在运行过程中,空间的大小不能随着您需要的增加和减少而改变。当数据相对较大时,可能会越界。当数据相对较小时,可能会浪费内存空间。在改变数据数量时,增加、插入和删除数据的效率相对较低。链表是一个动态应用内存空间,不需要像数组那样提前申请内存大小。链表只需在使用时申请即可。根据需要动态应用或删除内存空间。数据添加、删除和插入比数组灵活。此外,链表中的数据可以在内存中的任何位置通过应用程序关联数据。

  链表和数组使用场景:

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

  链表应用场景:难以估计线性表的长度或规模;频繁插入和删除;构建动态线性表。

  10、如何避免Concurent在迭代一个集合时? Modification Exception?

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

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

  答:Iterator接口定义了遍历集合的方法,但其实现是集合实现的责任。每个可以返回到遍历的Iterator集合类都有自己的Iterator实现内部类。这允许集合类选择迭代器是fail-fast还是fail-safe。例如,ArrayList迭代器是fail-fast,CopyOnWriteArrayfail-safe是List迭代器。

  12、什么是并发集合类?

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

  13、Comparable和Comparator接口有什么区别?

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

  14、线程安全的集合类是什么?

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