2019 Java面试问题及答案详解(二)Java容器

话不多说,直接上整理后的干货,希望对初学者或不熟悉这类问题的读者有些许帮助!

1.java 容器都有哪些?

数组,String,java.util下的集合容器(Collection和Map)

2.Collection 和 Collections 有什么区别?

Collections是个java.util下的类,它包含有各种有关集合操作的静态方法。

Collection是个java.util下的接口,它是各种集合结构的父接口。

3.List、Set、Map 之间的区别是什么?

List、Set是实现了Collection接口的子接口;而Map是另一个集合接口;(Collection接口和Map接口是平级的)

2019 Java面试问题及答案详解(二)Java容器/集合篇

三者之间的区别如下:

1) 元素重复性:

① List允许有重复的元素。任何数量的重复元素都可以在不影响现有重复元素的值及其索引的情况下插入到List集合中;

② Set集合不允许元素重复。Set以及所有实现了Set接口的类都不允许重复值的插入,若多次插入同一个元素时,在该集合中只显示一个;

③ Map以键值对的形式对元素进行存储。Map不允许有重复键,但允许有不同键对应的重复的值;

2) 元素的有序性:

① List及其所有实现类保持了每个元素的插入顺序;

② Set中的元素都是无序的;但是某些Set的实现类以某种殊形式对其中的元素进行排序,如:LinkedHashSet按照元素的插入顺序进行排序;

③ Map跟Set一样对元素进行无序存储,但其某些实现类对元素进行了排序。如:TreeMap根据键对其中的元素进行升序排序;

3) 元素是否为空值:

① List允许任意数量的空值;

② Set最多允许一个空值的出现;[ 当向Set集合中添加多个null值时,在该Set集合中只会显示一个null元素]

③ Map只允许出现一个空键,但允许出现任意数量的空值;

总结:

List中的元素,有序、可重复、可为空;

Set中的元素,无序、不重复、只有一个空元素;

Map中的元素,无序、键不重,值可重、可一个空键、多可空值;

实现类:

① List:ArrayList、LinkedList;

② Set:HashSet、LinkedHashSet、TreeSet、SortedSet等等;

③ Map:HashMap、TreeMap、WeakHashMap、LinkedHashMap、IdentityHashMap等等;

4.List集合的子类ArrayList、Vector、LinkedList之间的区别

ArrayList和Vector都是以数组的方式存储数据的,此数组长度大于实际存储元素个数,以方便插入元素;

它们都允许直接按索引获取元素;

由于在插入数据时,涉及到数组元素的移动等内存操作,所以在插入数据时执行速度较慢;

Vector是线程安全的(synchronized),所以性能上要比ArrayList差;

而LinkedList是以双向链表的形式存储数据的,在按索引获取数据时只需要向前或者向后进行遍历即可;

在插入数据时,只需要记录本项的前后项即可,所以插入速度较快。

5.HashMap和HashTable的区别:

HashMap是HashTable的轻量级实现(非线程安全的实现),它们都实现了Map接口,主要区别在于HashMap允许空(null)键值(key),由于非线程安全,效率上高于HashTable。

HashMap允许将null作为一个entry的key或者value,而HashTable不允许。

HashMap去掉了HashTable的contains方法,改成containsValue和containsKey方法。

二者最大的不同是,HashTable的方法是synchronized(线程安全的),而HashMap不是,在多个线程访问HashTable时,不需要自己为它的方法实现同步,而HashMap就必须为之提供外同步。

6.HashMap 的实现原理

HashMap是基于哈希表的Map接口的非同步实现。此实现提供所有可选的映射操作,并允许使用null值和null键。此类不保证映射的顺序,特别是它不保证该顺序恒久不变。

在java编程语言中,最基本的结构就是两种,一个是数组,另外一个是模拟指针(引用),所有的数据结构都可以用这两个基本结构来构造的,HashMap也不例外。HashMap实际上是一个“链表散列”的数据结构,即数组和链表的结合体。

HashMap底层就是一个数组结构,数组中的每一项又是一个链表。当新建一个HashMap的时候,就会初始化一个数组。

7.HashSet 的实现原理

对于HashSet而言,它是基于HashMap实现的,HashSet底层使用HashMap来保存所有元素,因此HashSet 的实现比较简单,相关HashSet的操作,基本上都是直接调用底层HashMap的相关方法来完成。

8.在 Queue 中 poll()和 remove()有什么区别

remove()和poll()方法删除并返回队列的头。

remove()和poll()方法在队列为空时的行为不同: remove()方法抛出异常,而poll()方法返回null 。

除了上面的区别还有一下几点区别:

offer()和add()的区别:

add()和offer()都是向队列中添加一个元素。但是如果想在一个满的队列中加入一个新元素,调用 add() 方法就会抛出一个 unchecked 异常,而调用 offer() 方法会返回 false。可以据此在程序中进行有效的判断!

peek()和element()的区别:

peek()和element()都将在不移除的情况下返回队头,但是peek()方法在队列为空时返回null,调用element()方法会抛出NoSuchElementException异常

9.哪些集合类是线程安全的

Vector:就比Arraylist多了个同步化机制(线程安全)

Hashtable:就比Hashmap多了个线程安全。

ConcurrentHashMap:是一种高效但是线程安全的集合

10. Iterator 怎么使用?有什么特点?

迭代其实可以简单地理解为遍历,是一个标准化遍历各类容器里面的所有对象的方法类.。

最常用的就是集合内部遍历有删除操作时(例如ArrayList遍历时需要删除特定元素),一定要通过iterator来删除。

11.Iterator 和 ListIterator 有什么区别?

ListIterator和Iterator都有hasNext()和next()方法,可以实现顺序向后遍历。但是ListIterator有hasPrevious()和previous()方法,可以实现逆向(顺序向前)遍历。Iterator就不可以。

ListIterator可以定位当前的索引位置,nextIndex()和previousIndex()可以实现。Iterator 没有此功能。

ListIterator有add()方法,可以向List中插入对象,而Iterator不能。

都可实现删除对象,但是ListIterator可以实现对象的修改,set()方法可以实现。Iterator仅能遍历,不能修改。因为ListIterator的这些功能,可以实现对LinkedList等List数据结构的操作。

12.怎么确保一个集合不能被修改?

Collections.unmodifiableList(List)

Collections.unmodifiableMap(Map)

Collections.unmodifiableSet(Set)

以上返回的集合对象都是不可修改的,调用修改方法会抛出异常UnsupportedOperationException

2019 Java面试问题及答案详解(二)Java容器/集合篇

结束语:好了,本期总结java容器集合的常用知识点到此就结束了,下一章节我们再来介绍下Java多线程相关知识点。期待您的加入,共同学习新知识共同巩固旧知识共同探讨不同的问题。


分享到:


相關文章: