前言:

标题中的集合框架指的是java.util.Collection和java.util.Map接口及其部分子接口和实现类

或Java官方文档中定义的Java Collections Framework的部分成员


Collection<E>

E 此集合中元素的类型

集合层次结构中的根接口。 一个集合代表一组对象,称为它的元素。 一些集合允许重复元素,而另一些则不允许。 有些是有序的,有些是无序的。 JDK 不提供此接口的任何直接实现:它提供了更具体的子接口的实现。

Collection的部分子接口

List<E> – 有序集合(也称为序列)

Set<E> – 不包含重复元素的无序集合。


List<E>

有序集合(也称为序列)。 此界面的用户可以精确控制每个元素在列表中的插入位置。 用户可以通过它们的整数索引(在列表中的位置)访问元素,并在列表中搜索元素。列表通常允许存在两个元素e1和e2使得e1.equals(e2)==true

List的部分实现类

ArrayList<E> – List接口的可调整大小的数组实现。 实现所有可选的列表操作,并允许所有元素,包括null 。此实现不是同步的。

LinkedList<E> – List和Deque接口的双向链表实现。 实现所有可选的列表操作,并允许所有元素(包括null )。此实现不是同步的。

Vector<E> – Vector类实现了一个可增长的对象数组。 像数组一样,它包含可以使用整数索引访问的组件。Vector是同步的


Set<E>

不包含重复元素的集合。 更正式地说,集合不包含一对元素e1和e2使得e1.equals(e2) ,允许至多一个空元素此实现可以认为是对数学定义上的集合的建模

Set的部分实现类

HashSet<E> – 这个类实现了Set接口,由一个哈希表(Hash Table)(实际上是一个HashMap实例)支持。 它不保证集合的迭代顺序; 特别是,它不保证顺序会随着时间的推移保持不变。此实现不是同步的。

TreeSet<E> – 基于TreeMap NavigableSet实现。集合根据其键的自然顺序进行排序,或者由通常在集合创建时提供的Comparator进行排序。此实现不是同步的。

Map<K,V>

K此Map维护的键(Key)的类型

V映射的值(Value)的类型

将键(key)映射到值(value)的对象。 Map不能包含重复的键; 每个键最多可以映射到一个值。Map接口提供了三个集合视图,允许将一个Map的内容视为存放K的Set,存放V的Collection,存放key-value映射的Set,允许至多一个键为null

Map的部分实现类

HashMap<K,V> – Map接口基于哈希表的实现。此实现提供所有可选的Map操作,并允许空值和空键。( HashMap类大致等同于Hashtable ,除了它是非同步的并且允许空值),该类不保证映射的顺序; 特别是,它不保证顺序会随着时间的推移保持不变。此实现不是同步的。

TreeMap<K,V> – 于红黑树的NavigableMap的实现。映射根据其键的自然顺序进行排序,或者由通常在SortMap(TreeMap是NavigableMap的实现,NavigableMap继承自SortMap)创建时提供的Comparator进行排序。此实现不是同步的。

HashTable<K,V> – 这个类实现了一个哈希表,它将键映射到值。 任何非null对象都可以用作键或值。从 Java 2 平台 v1.2 开始,该类经过改造以实现Map接口,使其成为Java Collections Framework的成员。 与新的集合实现不同, Hashtable是同步的。 如果不需要线程安全的实现,建议使用HashMap代替Hashtable 。

一些细节问题

Collection 和 Collections 有什么区别?

java.util.CollectionJava Collections Framework的一个顶级接口。它提供了对集合对象进行基本操 作的通用接口方法。Collection接口在Java 类库中有很多具体的实现。Collection接口的意义是为各种具体的集合提供了最大化的统一操作方式,其直接继承接口有List与Set。

java.util.Collections是针对java.util.Collection的一个工具类,其中提供了一系列静态方法,用于对集合中元素进 行排序、搜索以及线程安全等各种操作。

HashMap 和 Hashtable 有什么区别?

hashMap去掉了HashTable 的contains方法,但是加上了containsValue()和containsKey()方法。因为contains()和containsKey()相比需要更大的代价

HashTable是同步的,而HashMap是非同步的,所有HashMap效率更高。

HashMap允许至多一个键为null,而HashTable不允许。

如何决定使用 HashMap 还是 TreeMap?

对于在Map中插入、删除和定位元素这类操作,HashMap是最好的选择。然而,假如你需要对一个有序的key集合进行遍历,TreeMap是更好的选择。

HashMap 的实现原理简述

HashMap实际 上是一个“链表散列”的数据结构,即数组和链表的结合体。

当我们往HashMap中put元素时,首先根据key的hashcode重新计算hash值,根据hash值得到这个元素在 数组中的位置(下标),如果该数组在该位置上已经存放了其他元素,那么在这个位置上追加的元素将以链表的形式存放,新加入的放在链头,最先加入的放入链尾.如果数组中该位置没有元素,就直接将该元素放到数组的 该位置上。

需要注意Jdk 1.8中对HashMap的实现做了优化,当链表中的节点数据超过八个之后,该链表会转为红黑树 来提高查询效率,从原来的O(n)到O(logn)

HashSet实现原理简述

HashSet底层由HashMap实现,HashSet的值存放于HashMap的key上, HashMap的value统一为PRESENT

ArrayList 和 LinkedList 的区别是什么

最明显的区别是 ArrrayList底层的数据结构是数组,支持随机访问,而 LinkedList 的底层数据结构是双 向循环链表,不支持随机访问。使用下标访问一个元素,ArrayList 的时间复杂度是 O(1),而 LinkedList 是 O(n)。

如何实现数组和 List 之间的转换

List转换成为数组:调用ArrayList的toArray方法。

数组转换成为List:调用Arrays的asList方法

捏麻麻滴,这都被你看到了