前言:
标题中的集合框架指的是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.Collection 是Java 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方法
捏麻麻滴,这都被你看到了