Java Interview

C. Collections

2018-10-01  本文已影响0人  mitsuii

1.Java8中跟集合相关的特性有哪些?

Java8带来主要的变化在集合的API,一些变化如下:

∆ 1.Java Stream API提供集合类既支持序列也支持并发处理;

∆ 2.Iterable interface is extended with forEach()默认迭代集合的方法。在使用lambda expressions会非常有帮助,因为参数是function interface

∆ 3.混杂的集合API改进,例如Iterator接口的forEachRemaining(Consumer action)方法,Map的replaceAll(), compute(), merge()方法。

2.什么是Java集合框架?举例说些集合框架的好处?

集合广泛用在编程语言中,最初Java发布包含少有的几个集合类:Vector, Stack, Hashtable, Array。但从更广的角度和用途来看,Java1.2迎来了集合框架,使集合接口、实现、算法成为一体。

Java集合经历很长一段时间后才迎来泛型和并发集合类。它也包含阻塞接口和并发包里的相关实现。

集合框架的一些好处如下:

∆ 减少了开发使用核心集合类来实现自己的集合类,直接用就好了;

∆ 代码质量随着集合框架得到提升;

∆ 降低了JDK维护集合包的工作量;

∆ 可重用性和互操作性。

3.集合框架中泛型的好处有哪些?

Java1.5迎来了泛型,所有的集合接口和实现都强度依赖。泛型支持我们定义集合可以包含的类型,所以如果我们尝试添加任何其他类型的元素,它会编译报错。这样在编译时就报错避免了运行时ClassCastException。泛型也让代码定义清晰,我们不需要casting和instanceof操作。

强烈推荐阅读Java Generic Tutorial更好的了解泛型。

4.Java集合框架中基本接口有哪些?

Collection是所有集合基础的root。一个集合展示的一组对象称为它的元素。Java平台没有直接提供这个接口的实现。

Set是不含重复元素的集合。这个接口模型设计精确而抽象,用以展示sets集合,例如一副扑克牌。

List是排序的集合而且包含重复元素。你可以通过索引访问任意元素,List更像任意长度的数组。

Map是包含键值对的对象,一个map不能包含重复的键:每个键最多含一个值。

一些其他的接口有QueueDequeueIteratorSortedSetListIterator

5.为什么集合不继承Cloneable和Serializable接口?

集合接口里的对象叫做元素。如何保存它们留给具体的集合来实现。例如,有些集合像List允许重复元素而有些集合像Set则不允许。

大部分集合实现都有clone方法,但并不以为所有的集合实现都包含。是因为集合是抽象展现层,重要的是它的实现。当处理真正的实现类时,克隆和序列化的语义和实现才会被用起来。所以具体的实现应该定义它如何克隆和序列化和它是否支持克隆和序列化。

所以授权所有集合实现克隆和序列化非常不灵活而且限制性。具体的实现类需要决定它是否可以克隆或序列化。

6.为什么Map接口不继承Collection接口?

尽管Map接口和它的实现是集合框架的一部分,但Map不是集合,集合也不是Map,因此Map继承集合没有任何意义,反之亦然。

如果Map继承集合接口,那么它的元素是什么?Map包含key-value对,而且提供遍历键或值的方法,但并不适用“一组元素”的范例。

7.什么是Iterator?

Iterator接口提供方法迭代任何集合,我们可以通过iterator()方法来获取iterator实例。Iterator取代枚举(Java集合框架)。迭代中允许底层删除元素。Java集合iterator提供泛型方式来透传集合元素类型Iterator Design Pattern

8.Enumeration和Iterator接口有什么区别?

枚举要比Iterator快两倍也使用更少内存,枚举是非常基础的同时满足基本需求。但是Iterator比枚举更加安全,因为它不允许其他线程在迭代过程中修改集合对象。

Iterator在Java集合框架里取代枚举,Iterator允许底层集合删除元素而枚举不行。Iterator方法名称有些改进使得它功能更清晰。

9.为什么没有类似Iterator.add()的方法为集合添加元素?

在集合收缩时不能保证迭代顺序,因为语义不清晰。然后ListIterator提供add操作,,因为它保证迭代顺序。

10.为什么Iterator没有直接获取下一个元素的方法,非要用下标移动?

它可以在当前Iterator接口实现,但它被使用很少,所以接口包含这个方法没有意义,其他所有继承者都要去实现。

11.Iterator和ListIterator有什么区别?

∆ 我们可以在Set和List集合间使用Iterator,然而ListIterator只能用在Lists;

∆ Iterator只能用在向后迭代,然而ListIterator可以向前、向后迭代;

∆ ListIterator继承Iterator接口,引入了些额外功能,像add元素,替换元素,获取前一个和后一个元素索引位置。

12.遍历list的方法有什么区别?

两种方法——用iterator和for-each循环。

使用iterator会线程安全,因为它确保当底层元素被修改,会抛出异常ConcurrentModificationException。

13.如何理解iterator“速错”机制(fail-fast)?

Iterator“速错”机制在每次我们试图获取下一个元素时,检查底层集合结构是否有任何修改。如果有,它会抛出ConcurrentModificationException异常。集合类的Iterator所有实现都是设计成“速错”除了线程集合类,例如ConcurrentHashMap和CopyOnWriteArrayList。

14.fail-fast和fail-safe有什么区别?

迭代“速错”机制通过底层集合克隆实现,因此它不会对集合产生任何修改影响。设计上,所有java.util包下的集合类都是“速错”,而java.util.concurrent包下的集合类都是“安全失败”机制。

“速错”机制迭代会抛出ConcurrentModificationException异常,“安全失败”机制不会抛出。

查看文章CopyOnWriteArrayList Example了解更多信息。

15.遍历集合时如何避免ConcurrentModificationException?

迭代集合时候可以使用并发集合类来避免ConcurrentModificationException,例如CopyOnWriteArrayList取代ArrayList。

查看文章ConcurrentHashMap Example了解更多信息。

16.Iterator接口为什么没有具体实现?

迭代接口为迭代集合声明方法,但其实现在具体的集合类中展示。每个集合类都返回一个迭代,为其迭代的内部内使用。

这样提供集合类是选择“速错”机制还是“安全失败”机制。例如ArrayList迭代是“速错”而CopyOnWriteArrayList是“安全失败”。

17.什么是UnsupportedOperationException?

UnsupportedOperationException是操作不被允许的异常,用于扩展JDK类集合框架中java.util.Collections.UnmodifiableCollection抛出的添加所有或删除所有的操作。

18.HashMap是如何实现的?

a

19.hashCode()和equals()的重要性有哪些?

HashMap使用Key对象的hashCode()方法和equals()来决定索引放在哪个键值对里,这个方法也用在从HashMap中取值时候。如果这两个方法没有实现正确,那么不同Key会产生同样的hashCode()和equals()的输出,这种情况下HashMap就不会把他们存在不同位置,而是认为是相同的覆盖掉。

类似的所有的集合类不允许通过这两个方法存取重复数据,所以正确实现它们非常重要。这两个方法实现必须遵循以下原则:

If o1.equals(o2), then o1.hashCode() == o2.hashCode() should always be true.

If o1.hashCode() == o2.hashCode is true, it does not mean that o1.equals(o2) will be true.

20.是否可以用任何class当成Map的键?

我们可以使用任何类来做Map的键,然而以下关键点需要考虑:

∆ 如果类重载equals()方法,那必须也重载hashCode()方法;

∆ 类必须遵守关联equals()、hashCode()的所有实例,所及尽早遵循这些原则;

∆ 

21.Map接口提供的集合视图有什么区别?

a

22.HashMap和Hashtable区别有哪些?

a

23.如何决定使用HashMap还是TreeMap?

a

24.ArrayList和Vector异同和区别有哪些?

a

25.Array和ArrayList区别有哪些?什么时候会用Array替代ArrayList?

a

26.ArrayList和LinkedList的区别有哪些?

a

27.哪一个集合类提供随机访问它的元素?

a

查看java collections pdf了解更多细节。

28.什么是EnumSet?

a

29.什么集合类是线程安全的?

s

30.什么是线程集合类?

a

31.什么是BlockingQueue?

a

32.列举出队列和栈的区别?

a

33.什么是Collections类?

a

34.Comparable和Comparator接口分别是什么?

a

35.Comparable和Comparator接口区别有哪些?

a

36.Objects的列表如何排序?

a。

37.如果给函数传递集合参数,如何确保函数不会修改该集合?

a

38.用所给的集合如何创建线程同步集合?

a

39.集合框架的通用算法有哪些?

a

40.什么是Big-O notation?举几个例子

a

41.集合框架的最佳实践例子有哪些?

a

42.PriorityQueue是什么?

a

43.为什么不能写这样的代码 List<Number> numbers = new ArrayList<Integer>();?

a

44.为什么不能创建泛型array?或者写这样的代码List<Integer>[] array = new ArrayList<Integer>[10];

上一篇下一篇

猜你喜欢

热点阅读