【Java】集合框架和集合基础

Java集合框架图(图片来源网络,侵删):

 

集合框架:

  • 接口:是代表集合的抽象数据类型。例如 Collection、List、Set、Map 等。之所以定义多个接口,是为了以不同的方式操作集合对象

  • 实现(类):是集合接口的具体实现。从本质上讲,它们是可重复使用的数据结构,例如:ArrayList、LinkedList、HashSet、HashMap。

  • 算法:是实现集合接口的对象里的方法执行的一些有用的计算,例如:搜索和排序。这些算法被称为多态,那是因为相同的方法可以在相似的接口上有着不同的实现。

四大集合接口:

集合框架定义了一些接口。本节提供了每个接口的概述:

序号接口描述
1Collection 接口

Collection 是最基本的集合接口,一个 Collection 代表一组 Object,即 Collection 的元素。

Collection不提供直接继承自Collection的类,只提供继承于的子接口(如List和set)。

Collection 接口存储一组不唯一,无序的对象。

2List 接口

List接口是一个有序的 Collection,使用此接口能够精确的控制每个元素插入的位置,能够通过索引(元素在List中位置,类似于数组的下标)来访问List中的元素,第一个元素的索引为 0,而且允许有相同的元素。

List 接口存储一组不唯一,有序(插入顺序)的对象。

3Set

Set 具有与 Collection 完全一样的接口,只是行为上不同,Set 不保存重复的元素。

Set 接口存储一组唯一,无序的对象。

4Map

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接口的标准集合类。其中一些是具体类,这些类可以直接拿来使用,而另外一些是抽象类,提供了接口的

部分实现。

标准集合类汇总于下表:

序号类描述
1AbstractCollection 
实现了大部分的集合接口。
2AbstractList 
继承于AbstractCollection 并且实现了大部分List接口。
3AbstractSequentialList 
继承于 AbstractList ,提供了对数据元素的链式访问而不是随机访问。
4LinkedList

该类实现了List接口,允许有null(空)元素。主要用于创建链表数据结构,该类没有同步方法,如果多个线程同时访问一个List,则必须自己实现访问同步,解决方法就是在创建List时候构造一个同步的List。例如:

Listlist=Collections.synchronizedList(newLinkedList(...));

LinkedList 查找效率低。

5ArrayList

该类也是实现了List的接口,实现了可变大小的数组,随机访问和遍历元素时,提供更好的性能。该类也是非同步的,在多线程的情况下不要使用。ArrayList 增长当前长度的50%,插入删除效率低。

6AbstractSet 
继承于AbstractCollection 并且实现了大部分Set接口。
7HashSet

该类实现了Set接口,不允许出现重复元素,不保证集合中元素的顺序,允许包含值为null的元素,但最多只能一个。

8LinkedHashSet
具有可预知迭代顺序的 Set 接口的哈希表和链接列表实现。
9TreeSet

该类实现了Set接口,可以实现排序等功能。

10AbstractMap 
实现了大部分的Map接口。
11HashMap 
HashMap 是一个散列表,它存储的内容是键值对(key-value)映射。
该类实现了Map接口,根据键的HashCode值存储数据,具有很快的访问速度,最多允许一条记录的键为null,不支持线程同步。
12TreeMap 
继承了AbstractMap,并且使用一颗树。
13WeakHashMap 
继承AbstractMap类,使用弱密钥的哈希表。
14LinkedHashMap 
继承于HashMap,使用元素的自然顺序对元素进行排序.
15IdentityHashMap 
继承AbstractMap类,比较文档时使用引用相等。

在前面的教程中已经讨论通过java.util包中定义的类,如下所示:

序号类描述
1Vector 

该类和ArrayList非常相似,但是该类是同步的,可以用在多线程的情况,该类允许设置默认的增长长度,默认扩容方式为原来的2倍。

2Stack 
栈是Vector的一个子类,它实现了一个标准的后进先出的栈。
3Dictionary 
Dictionary 类是一个抽象类,用来存储键/值对,作用和Map类相似。
4Hashtable 

Hashtable 是 Dictionary(字典) 类的子类,位于 java.util 包中。

5Properties 
Properties 继承于 Hashtable,表示一个持久的属性集,属性列表中每个键及其对应值都是一个字符串。
6BitSet
一个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

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值