Java集合框架图(图片来源网络,侵删):
集合框架:
-
接口:是代表集合的抽象数据类型。例如 Collection、List、Set、Map 等。之所以定义多个接口,是为了以不同的方式操作集合对象
-
实现(类):是集合接口的具体实现。从本质上讲,它们是可重复使用的数据结构,例如:ArrayList、LinkedList、HashSet、HashMap。
-
算法:是实现集合接口的对象里的方法执行的一些有用的计算,例如:搜索和排序。这些算法被称为多态,那是因为相同的方法可以在相似的接口上有着不同的实现。
四大集合接口:
集合框架定义了一些接口。本节提供了每个接口的概述:
序号 | 接口描述 |
---|---|
1 | Collection 接口 Collection 是最基本的集合接口,一个 Collection 代表一组 Object,即 Collection 的元素。 Collection不提供直接继承自Collection的类,只提供继承于的子接口(如List和set)。 Collection 接口存储一组不唯一,无序的对象。 |
2 | List 接口 List接口是一个有序的 Collection,使用此接口能够精确的控制每个元素插入的位置,能够通过索引(元素在List中位置,类似于数组的下标)来访问List中的元素,第一个元素的索引为 0,而且允许有相同的元素。 List 接口存储一组不唯一,有序(插入顺序)的对象。 |
3 | Set Set 具有与 Collection 完全一样的接口,只是行为上不同,Set 不保存重复的元素。 Set 接口存储一组唯一,无序的对象。 |
4 | Map Map 接口存储一组键值对象,提供key(键)到value(值)的映射。 |
1.Collecton:存储无序的、不唯一的数据;其下有List和Set两大接口。
方法一览:
方法 | 解释 |
---|---|
add(E e) | 向集合中添加一个元素,E指的是e元素的数据类型 |
addAll(Collection c) | 向集合中添加集合 c 中的所有元素 |
clear() | 清除所有元素 |
contains(Object o) | 判断集合中是否包含指定元素 |
containsAll(Collection c) | 判断集合中是否包含集合 c 中的所有元素 |
isEmpty() | 判断集合是否为空 |
Iterator<E>iterator() | 返回一个 Iterator 对象,用于遍历集合中的元素 |
remove(Object o) | 删除一个指定元素 |
removeAll(Collection c) | 删除集合 c 中所有的元素 |
retainAll(Collection c) | 仅保留集合 c 中出现的元素 |
int size() | 返回集合中元素的个数,也叫集合的大小 |
Object[] toArray() | 返回包含此集合中所有元素的数组 |
2.List接口:实现所有可选的列表操作,并且允许所有元素
List接口继承了 Collection接口以定义一个允许重复项的有序集合。该接口不但能够对列表的一部分进行处理,还添加了面向位置的操作。
add( int index, Object element) | 在指定位置 index上添加元素 |
addAll( int index, Collection c) | 将集合 c的所有元素添加到指定位置 index |
Object get( int index) | 返回 List中指定位置的元素 |
nt indexOf( Object o) | 返回第一个出现元素 o的位置,否则返回-1 |
int lastIndexOf( Object o) | 返回最后一个出现元素 o的位置,否则返回-1 |
Object remove( int index) | 删除指定位置上的元素 |
Object set( int index, Object element) | 用元素 element取代位置 index上的元素,并且返回旧的元素 |
-
a.LinkedList类:
方法 | 功能 | |
---|---|---|
addFirst(E e) | 将指定元素插入此列表的开头 | |
addLast(E e) | 将指定元素添加到此列表的结尾 | |
removeFirst() | 移除并返回此列表的第一个元素 | |
removeLast() | 移除并返回此列表的最后一个元素 | |
getFirst() | 返回此列表中的第一个元素 | |
getLast() | 返回此列表中的最后一个元素 |
-
b.ArrayList类:
方法名 | 功能说明 | |
---|---|---|
addFirst(E e) | 将指定元素插入此列表的开头 | |
addLast(E e) | 将指定元素添加到此列表的结尾 | |
removeFirst() | 移除并返回此列表的第一个元素 | |
removeLast() | 移除并返回此列表的最后一个元素 | |
getFirst() | 返回此列表中的第一个元素 | |
getLast() | 返回此列表中的最后一个元素 | |
ensureCapacity(int minCapacity) | 将ArryList对象容量增加minCapacity | |
trimToSize() | 整理ArrayList对象容量为列表当前大小。减少ArrayList对象存储空间 |
-
c.ArrayList和LinkedList:
ArrayList和LinkedList。使用两种List实现的哪一种取决于您特定的需要如果要支持随机访问,而不必在除尾部的任何位置插入或除去元素,
那么,ArrayList提供了可选的集合。但如果,您要频繁的从列表的中间位置添加和除去元素,而只要顺序的访问列表元素,那么,
LinkedList实现更好。
-
d.ListIterator接口
ListIterator接口继承 Iterator接口以支持添加或更改底层集合中的元素,还支持双向访问。 ListIterator没有当前位置,光标位于调用
previous和 next方法返回的值之间。一个长度为 n的列表,有 n+1个有效索引值:
void add(Object o) | 将对象o添加到当前位置的前面 |
void set(Object o) | 用对象o替代next或previous方法访问的上一个元素 |
boolean hasPrevious() | 判断向后迭代时是否有元素可访问 |
Object previous() | 返回上一个对象 |
int nextIndex() | 返回下次调用next方法时将返回的元素的索引 |
int previousIndex() | 返回下次调用previous方法时将返回的元素的索引 |
3.Set接口:
Set接口继承Collection接口,而且它不允许集合中存在重复项,每个具体的Set实现类依赖添加的对象的equals()方法来检查独- -性。Set接
口没有引入新方法,所以Set就是一个Collection, 只不过其行为不同。
-
HashSet类
(1) HashSet():构建一个 空的哈希集。
(2) HashSet(Collectionc):构建一个哈希 集,并且添加集合c中所有元素。
(3) HashSet(int initialCapacity):构建一个拥有 特定容量的空哈希集。
(4) HashSet(int initialCapacity, float loadFactor):构建一个拥有特定容量和加载因子的空哈希集。LoadFactor是0.0至1.0之间的一 个数。
-
TreeSet类
(1) TreeSet():构建一个 空的树集。
(2) TreeSet(Collectionc):构建一个树集 ,并且添加集合c中所有元素。
(3) TreeSet(Comparator c):构建一个树集 ,并且使用特定的比较器对其元素进行排序。
-
LinkedHashSet类
LinkedHashSet扩展HashSet。如果想跟踪添加给
HashSet的元素的顺序, LinkedHashSet实现会有帮助。LinkedHashSet的迭代器按照元素的插入顺序来访问各个元素。它提供了一个可以快速访问各个元素的有序集:合。同时,它也增加了实现的代价,因为哈希表元中的各个元素是通过双重链接式列表链接在一起的。
(1) LinkedHashSet():构建一个空的链接式哈 希集。(2) LinkedHashSet(Collection c):构建一个链接式哈希集,并且添加集合c中所有元素。
(3) LinkedHashSet(int initialCapacity):构建一个拥有特定容量的空链接式哈希集。
(4) LinkedHashSet(int initialCapacity, float
loadFactor):构建一个拥有特定容量和加载因子的空链接式哈希集。LoadFactor是0.0至1.0之间的一个数。“为优化HashSet空间的使用,您可以调优初始容量和负载因子。TreeSet不包含调优选项,因为树总是平衡的。
4.Set和List的区别
-
1. Set 接口实例存储的是无序的,不重复的数据。List 接口实例存储的是有序的,可以重复的元素。
-
2. Set检索效率低下,删除和插入效率高,插入和删除不会引起元素位置改变 <实现类有HashSet,TreeSet>。
-
3. List和数组类似,可以动态增长,根据实际存储的数据的长度自动增长List的长度。查找元素效率高,插入删除效率低,因为会引起其他元素位置改变 <实现类有ArrayList,LinkedList,Vector> 。
5.Map接口
Map接口不是Collection接口的继承,Map接口用于维护键/值对(key/value pairs),该接口描述了从不重复的键到值得映射。
(1)添加、删除操作:
Object put(Object key, Object value:将互相关联的一个关键字与一个值放入该映像。如果该关键字已经存在,那么与此关键字相关的新
值将取代旧值。方法返回关键字的旧值,如果关键字原先并不存在,则返回null。
0bject remove(Object key):从映像中删除与key相关的映射。
void putll(Map t):将来自特定映像的所有元素添加给该映像。
void clear(): 从映像中删除所有映射。
“键和值都可以为null。但是,您不能把Map作为一个键或值添加给自身。”
(2)查询操作:
Object get(Object key):获得与关键字key相关的值,并且返回与关键字key相关的对象,如果没有在该映像中找到该关键字,则返回
null。
boolean containsKey(Object key):判断映像中是否存在关键字key。
boolean containsValue(Object value):判断映像中是否存在值value。
intsize():返回当前映像中映射的数量。
boolean isEmpty():判断映像中是否有任何映射。
(3)视图操作:处理映像中键/值对组。
Set keySet():返回映像中所有关键字的视图集。
“因为映射中键的集合必须是唯一的, 您用Set支持。你还可以从视图中删除元素,同时,关键字和它相关的值将从源映像中被删除,但是
你不能添加任何元素。”
Collection values():返回映像中所有值的视图集
-
Map.Entry接口
Map的entrySet()方法返回一个实现Map.Entry接口的对象集合。集合中每个对象都是底层Map中一个特定的键/值对。
通过这个集合的迭代器,您可以获得每一个条目(唯一获取方式)的键或值并对值进行更改。当条目通过迭代器返回后,除非是迭代器自身
的remove()方法或者迭代器返回的条目的setValue()方法,其余对源Map外部的修改都会导致此条目集变得无效,同时产生条目行为未定
义。
(1) Object getKey():返回条目的关键字。
(2) Object getValue():返回条目的值。
(3) Object setValue( Object value):将相关映像中的值改为 value,并且返回旧值。
-
HashMap类
(1) HashMap():构建一个 空的哈希映像。
(2) HashMap(Map m):构建一个哈 希映像,并且添加映像m的所有映射。
(3) HashMap(int initialCapacity):构建一个拥有 特定容量的空的哈希映像。
(4) HashMap(int initialCapacity, float loadFactor):构建一个拥有特定容量和加载因子的空的哈希映像。
-
TreeMap类
TreeMap没有调优选项,因为该树总处于平衡状态。(1) TreeMap():构建一个空的映像树。
(2) TreeMap(Map m):构建一个映像树, 并且添加映像m中所有元素。
(3) TreeMap(Comparator c):构建一个映像树, 并且使用特定的比较器对关键字进行排序。
(4) TreeMap(SortedMap s):构建一个映像树 ,添加映像树s中所有映射,并且使用与有序映像s相同的比较器排序。
-
LinkedHashMap类
LinkedHashMap扩展HashMap,以插入顺序将关键字/值对添加进链接哈希映像中。象LinkedHashSet-样,LinkedHashMap内部也采用双重链接式列表。
(1) LinkedHashMap():构建一个空 链接哈希映像。
(2) LinkedHashMap(Map m):构建一个链接哈 希映像,并且添加映像m中所有映射。
(3) LinkedHashMap(int initialCapacity):构建一个 拥有特定容量的空的链接哈希映像。
(4) LinkedHashMap(int initialCapacity, float
loadFactor):构建一个拥有特定容量和加载因子的空的链接哈希映像。
(5) LinkedHashMap(int initialCapacity, floatloadFactor,
boolean accessOrder):构建一个拥有 特定容量、加载因子和访问顺序排序的空的链接哈希映像。
集合实现类(集合类)
Java提供了一套实现了Collection接口的标准集合类。其中一些是具体类,这些类可以直接拿来使用,而另外一些是抽象类,提供了接口的
部分实现。
标准集合类汇总于下表:
序号 | 类描述 |
---|---|
1 | AbstractCollection 实现了大部分的集合接口。 |
2 | AbstractList 继承于AbstractCollection 并且实现了大部分List接口。 |
3 | AbstractSequentialList 继承于 AbstractList ,提供了对数据元素的链式访问而不是随机访问。 |
4 | LinkedList 该类实现了List接口,允许有null(空)元素。主要用于创建链表数据结构,该类没有同步方法,如果多个线程同时访问一个List,则必须自己实现访问同步,解决方法就是在创建List时候构造一个同步的List。例如: LinkedList 查找效率低。 |
5 | ArrayList 该类也是实现了List的接口,实现了可变大小的数组,随机访问和遍历元素时,提供更好的性能。该类也是非同步的,在多线程的情况下不要使用。ArrayList 增长当前长度的50%,插入删除效率低。 |
6 | AbstractSet 继承于AbstractCollection 并且实现了大部分Set接口。 |
7 | HashSet 该类实现了Set接口,不允许出现重复元素,不保证集合中元素的顺序,允许包含值为null的元素,但最多只能一个。 |
8 | LinkedHashSet 具有可预知迭代顺序的 Set 接口的哈希表和链接列表实现。 |
9 | TreeSet 该类实现了Set接口,可以实现排序等功能。 |
10 | AbstractMap 实现了大部分的Map接口。 |
11 | HashMap HashMap 是一个散列表,它存储的内容是键值对(key-value)映射。 该类实现了Map接口,根据键的HashCode值存储数据,具有很快的访问速度,最多允许一条记录的键为null,不支持线程同步。 |
12 | TreeMap 继承了AbstractMap,并且使用一颗树。 |
13 | WeakHashMap 继承AbstractMap类,使用弱密钥的哈希表。 |
14 | LinkedHashMap 继承于HashMap,使用元素的自然顺序对元素进行排序. |
15 | IdentityHashMap 继承AbstractMap类,比较文档时使用引用相等。 |
在前面的教程中已经讨论通过java.util包中定义的类,如下所示:
序号 | 类描述 |
---|---|
1 | Vector 该类和ArrayList非常相似,但是该类是同步的,可以用在多线程的情况,该类允许设置默认的增长长度,默认扩容方式为原来的2倍。 |
2 | Stack 栈是Vector的一个子类,它实现了一个标准的后进先出的栈。 |
3 | Dictionary Dictionary 类是一个抽象类,用来存储键/值对,作用和Map类相似。 |
4 | Hashtable Hashtable 是 Dictionary(字典) 类的子类,位于 java.util 包中。 |
5 | Properties Properties 继承于 Hashtable,表示一个持久的属性集,属性列表中每个键及其对应值都是一个字符串。 |
6 | BitSet 一个Bitset类创建一种特殊类型的数组来保存位值。BitSet中数组大小会随需要增加。 |
参考资料:
https://www.runoob.com/java/java-collections.html
https://www.cnblogs.com/yanphet/p/9414419.html
https://www.cnblogs.com/zqr99/p/7127418.html