美文网首页
Java容器List、set、map

Java容器List、set、map

作者: 王灵 | 来源:发表于2020-04-12 23:21 被阅读0次

无论实在工作还是面试中都经常会与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的区别?
  1. ArrayList是基本动态数组,LinkedList是基于链表。
  2. 对于随机的访问get和set,ArrayList的性能要优于LinkedList,因为LinkedList要移动指针。
  3. 对于add和remove操作,LinkedList的性能要优化ArrayList,因为ArrayList要移动数据。
4、HashSet和TreeSet的区别?

HashSet: 为快速查找而设计,可以认为是基于哈希表的实现。 存入HashSet的元素必须定义hashCode().
TreeSet:保持次序的Set,底层为树结构(红黑树)。使用它可以从Set提取有序的序列。元素必须实现Comparable接口或者在构造TreeSet时传入Comparator参数。

5、HashMap和Hashtable的区别?
  1. HashMap和Hashtable都实现了Map接口,HashMap可以接受null的键值对。
  2. HashMap是非synchronized而Hashtable是synchronized。
  3. HashMap的迭代器是Iterator,是fail-fast迭代器,而Hashtable是enumerator迭代器,是非fail-fast的。
  4. 单线程下的效率Hashtable会低一些。
  5. 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是一个迭代器,主要用于遍历集合中的元素。主要有这几具特点:

  1. 在遍历集合的过程中不允许对集合进行修改。
  2. 在遍历的过程中不能删除元素。
  3. Iterator依附于Collection而存在。
  4. Iterator.remover删除的是上一次的Iterator.next方法返回的对象。
  5. 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),返回指定源列表中第一次出现指定目标列表的起始位置。

相关文章

网友评论

      本文标题:Java容器List、set、map

      本文链接:https://www.haomeiwen.com/subject/chyimhtx.html