无论实在工作还是面试中都经常会与java容器打交道,虽然平时接触的很多,但是很少有深入的去了解细节问题,往往在面试的过程中,这些细节就会被回答,准备不充分就会答不上来。下面就来总结一下有关java容器的相关知识,首先看下面这幅图,对Java容器有一个全局的印象。
b64543a98226cffc7a668019012c9094f703eafb.jpeg
一、基本概念
Java容器类库的主要用途是持有对象,通常两种不同的数据结构。Collection(extends Iterable)和Map
- Collection:一个独立元素的序列,这些元素遵守一条或多条规则。常见的有List和Set
- Map:存储的是“键值对”对象,通过键来检索值
二、常见问题
1、Java容器有那些?
主要有List、Set和Map;List接口下有LinkedList,ArrayList,Vector,Stack等。Set接口下主要有HashSet和TreeSet这两个常用类。Map接口下主要有HashMap和HashTable这两个类。
2、List、Set、Map的区别
- List:有序 元素可重复
- Set:无序 元素不可重复
- Map:以Key-Value形式存储。无需 key不可重复 value可以重复
3、ArrayList和LinkedList的区别?
- ArrayList是基本动态数组,LinkedList是基于链表。
- 对于随机的访问get和set,ArrayList的性能要优于LinkedList,因为LinkedList要移动指针。
- 对于add和remove操作,LinkedList的性能要优化ArrayList,因为ArrayList要移动数据。
4、HashSet和TreeSet的区别?
HashSet: 为快速查找而设计,可以认为是基于哈希表的实现。 存入HashSet的元素必须定义hashCode().
TreeSet:保持次序的Set,底层为树结构(红黑树)。使用它可以从Set提取有序的序列。元素必须实现Comparable接口或者在构造TreeSet时传入Comparator参数。
5、HashMap和Hashtable的区别?
- HashMap和Hashtable都实现了Map接口,HashMap可以接受null的键值对。
- HashMap是非synchronized而Hashtable是synchronized。
- HashMap的迭代器是Iterator,是fail-fast迭代器,而Hashtable是enumerator迭代器,是非fail-fast的。
- 单线程下的效率Hashtable会低一些。
- HashMap不能保证随着时间的推移Map中的元素次序不变。
6、如何决定使用HashMap还是TreeMap?
HashMap是数组方式存储的key/value,线程非安全,允许有null作为key和value,key不可重复,value可以有重复。TreeMap是基于红黑二叉树的NavigableMap的实现,线程非安全,不允许有null,key不可以重复,TreeMap实现了Comparator接口,可以进行排序。通常需要对key-value进行排序时,会选择TreeMap.
7、HashMap的实现原理?
JDK1.8之前HashMap由数组+链表组成,数组是HashMap的主体,链表则是为了解决哈希冲突而存在的,如果定位到的数组位置不含链表(当前 entry 的 next 指向 null ),那么对于查找,添加等操作很快,仅需一次寻址即可;如果定位到的数组包含链表,对于添加操作,其时间复杂度依然为 O(1),因为最新的 Entry 会插入链表头部,急需要简单改变引用链即可,而对于查找操作来讲,此时就需要遍历链表,然后通过 key 对象的 equals 方法逐一比对查找。
JDK1.8之后的HashMap数据结构发生了改变,从单纯的数组加链表变成数组+链表+红黑树。当存储链表的长度大于8时转换为红黑树,当红黑树的节点小于6时就会转换成链表。具体的大家可以多读一下HashMap的源码。
8、如何实现数组与List之间的转换?
- List转数组的方法:1.for循环 2.list.toArray.
- 数组转List的方法:1.for循环 2.Arrays.asList 3.Collections.addAll
9、列举常用的线程安全集合类?
基本上concurrent包下的集合类都是线程安全的。常用的有ConcurrentHashMap,ArrayBlockingQueue,Hashtable等
10、Iterator是什么?怎么使用?有什么特点?
Iteratro是一个迭代器,主要用于遍历集合中的元素。主要有这几具特点:
- 在遍历集合的过程中不允许对集合进行修改。
- 在遍历的过程中不能删除元素。
- Iterator依附于Collection而存在。
- Iterator.remover删除的是上一次的Iterator.next方法返回的对象。
- Iterator.next()具有游标特性。
11、HashMap的长度为什么是2的幂次方?
当数组的长度为2的n次幂的时候,不同的key算得的index相同的概率小,分布更均匀。
12、Collection和Collections的区别?
Collection是一个集合接口,它提供了对集合对象进行基本操作的通用接口方法。Collection接口在Java 类库中有很多具体的实现。Collection接口的意义是为各种具体的集合提供了最大化的统一操作方式,其直接继承接口有List与Set。
Collections则是集合类的一个工具类,它提供了一系列的静态方法,用于对集合中的元素进行操作。常用的有排序(sort),混排(Shuffling),反转(Reverse),拷贝(copy),返回Collections中最小的元素(min),返回最大的元素(max),返回指定源列表中最后一次出现指定目标列表的起始位置(lastIndexOfSubList),返回指定源列表中第一次出现指定目标列表的起始位置。
网友评论