java集合框架:

1.Java结合框架的总体结构说明:

集合框架是为表示和操作集合而制定的统一的标准,主要包括三大部分:对外的接口,接口的是实现和对集合的运算。简单地说,编程过程中会涉及对一类数据的处理,这类数据用统一的数据结构表示,为能统一的存放、规范的操作就定了存放、操作的结构规范,类似数组。其实在Java2之前sun就提供了集合操作,更准确的叫法应该是容器,比如Vector,Stack,Hashtable等,但功能相当有限,后来统一了集合架构,有了泛型之后更是对所有集合进行了重写,就有了现在我们看到的集合。

Java提供的集合位于java.util.*包下,主要分为三个部分:Collection(List集合,Set集合,Queue),Map键值对集合,工具类(Iterator迭代器,Enumeration枚举,Arrays数组工具和Collecitons工具)llection是集合的根接口,定义了很多操作集合的方法。

集合框架总体结构图

2.Collection

Collection接口位于java.util;是集合的高度抽象,规范了集合的通用功能,本系列文章从Collection入手分析java提供的集合架构。Collection提供的基本操作包括:添加、判空、删除、是否含有、转换、遍历、清除、判等、分割等。

Collection函数列表:

 

方法摘要

 boolean

add(E e) 
          确保此 collection 包含指定的元素(可选操作)。

 boolean

addAll(Collection<? extends E> c) 
          将指定 collection 中的所有元素都添加到此 collection 中(可选操作)。

 void

clear() 
          移除此 collection 中的所有元素(可选操作)。

 boolean

contains(Object o) 
          如果此 collection 包含指定的元素,则返回 true。

 boolean

containsAll(Collection<?> c) 
          如果此 collection 包含指定 collection 中的所有元素,则返回 true。

 boolean

equals(Object o) 
          比较此 collection 与指定对象是否相等。

 int

hashCode() 
          返回此 collection 的哈希码值。

 boolean

isEmpty() 
          如果此 collection 不包含元素,则返回 true。

 Iterator<E>

iterator() 
          返回在此 collection 的元素上进行迭代的迭代器。

 boolean

remove(Object o) 
          从此 collection 中移除指定元素的单个实例,如果存在的话(可选操作)。

 boolean

removeAll(Collection<?> c) 
          移除此 collection 中那些也包含在指定 collection 中的所有元素(可选操作)。

 boolean

retainAll(Collection<?> c) 
          仅保留此 collection 中那些也包含在指定 collection 的元素(可选操作)。

 int

size() 
          返回此 collection 中的元素数。

 Object[]

toArray() 
          返回包含此 collection 中所有元素的数组。

<T> T[]

 

toArray(T[] a) 
          返回包含此 collection 中所有元素的数组;返回数组的运行时类型与指定数组的运行时类型相同。

 

Collection接口的主要分支包括:List集合,Set集合,Queue集合。

 从结构图可以看出List,Set,Queue接口继承了Collection接口

AbstractCollection抽象类实现了Collection的大部分函数;

AbstractListAbstractSetAbstractQueue都继承于AbstractCollection并实现了List,Set和Queue接口。

具体的ListSet和Queue的实现类直继承AbstractList,AbstractSet和AbstractQueue类减少很多重复代码的编写

 

Collection还提供了hashCode和equals,这两个函数非常重要,但当我们使用具体的集合时调用的是就会调用Object的hashCode()方法的默认实现,返回的是当前对象的内存地址,如果我们复写了hashCode方法,就会调用要存入集合的对象的复写的hashCode方法,所以当定义需要放入集合的Class时,一般需要重写hashCode方法。复写hashCode需要根据具体的需求来定,Java为我们提供了一套标准的实现,可以利用eclipse直接生成,但有时却需要我们自己根据需求编写,例如人名和身份证的存储,其实只需要利用身份证号就可以了,人名的改变跟是不是同一个人没有必然联系,但是同一个人一定只有一个身份证号。

@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + age;
		result = prime * result + ((name == null) ? 0 : name.hashCode());
		return result;
	}

集合总体结构图中接口和类的介绍

 

序号

类描述

1

AbstractCollection 
实现了大部分的集合接口。

2

AbstractList 
继承于AbstractCollection 并且实现了大部分List接口。

3

AbstractSequentialList 
继承于 AbstractList ,提供了对数据元素的链式访问而不是随机访问。

4

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

5

List
List接口,规范了List功能

6

AbstractSequentialList

提供了 List 接口的骨干实现,从而最大限度地减少了实现受“连续访问”数据存储(如链接列表)支持的此接口所需的工作

7

Set

Set接口实现了对set集合的规范

8

SortedSet

SortedSet接口为排序提供支持

9

NavigatibleSet

NavigableSet 扩展 SortedSet,具有了为给定搜索目标报告最接近匹配项的导航方法

10

Queue

Queue接口,提供Queue集合的方法规范,单向队列

11

Deque

对双向队列提供支持

 

public abstract class AbstractCollection<E> implements Collection<E> {
AbstractCollection是一个实现了Collection接口的抽象类,实现了大部分Collection中大部分方法,简化了实现此接口要实现的功能。

AbstractCollection 实现的方法:

 

方法摘要

 boolean

add(E e) 
          确保此 collection 包含指定的元素(可选操作)。

 boolean

addAll(Collection<? extends E> c) 
          将指定 collection 中的所有元素都添加到此 collection 中(可选操作)。

 void

clear() 
          移除此 collection 中的所有元素(可选操作)。

 boolean

contains(Object o) 
          如果此 collection 包含指定的元素,则返回 true。

 boolean

containsAll(Collection<?> c) 
          如果此 collection 包含指定 collection 中的所有元素,则返回 true。

 boolean

isEmpty() 
          如果此 collection 不包含元素,则返回 true。

abstract  Iterator<E>

iterator() 
          返回在此 collection 中的元素上进行迭代的迭代器。

 boolean

remove(Object o) 
          从此 collection 中移除指定元素的单个实例,如果存在的话(可选操作)。

 boolean

removeAll(Collection<?> c) 
          移除此 collection 中那些也包含在指定 collection 中的所有元素(可选操作)。

 boolean

retainAll(Collection<?> c) 
          仅保留此 collection 中那些也包含在指定 collection 的元素(可选操作)。

abstract  int

size() 
          返回此 collection 中的元素数。

 Object[]

toArray() 
          返回包含此 collection 中所有元素的数组。

<T> T[]

 

toArray(T[] a) 
          返回包含此 collection 中所有元素的数组;返回数组的运行时类型与指定数组的运行时类型相同。

 String

toString() 
          返回此 collection 的字符串表示形式。

AbstractCollection未实现的方法包括:

 

public abstract Iterator<E> iterator();
public abstract int size();
    public boolean add(E e) {
        throw new UnsupportedOperationException();
    }

如果子类集合不提供修改功能,程序员只需提供 iterator 和 size 方法的实现。否则还必须另外重写此类的 add 方法(否则,会抛出 UnsupportedOperationException),并且 iterator 方法返回的迭代器必须另外实现其 remove 方法。 

 

 public boolean isEmpty() {

        return size() == 0;

    }

AbstractCollection源码中isEmpty()方法对集合进行判空,调用了size()方法,但是从上面的源码可以知道,size()方法是个抽象方法怎么能调用呢,这里由于AbstractCollection是个抽象类,所以无法直接实例化,所以不会直接调用抽象的方法,会最终调用具体实现类的size方法。

 

Collection的Iterator<E> iterator();

函数会返回一个Iterator接口,提供对具体集合的遍历,所以具体的集合或者其父类都会实现此方法,提供给外界利用此接口遍历的具体实现,这就是迭代器模式。

3 Map框架:

 

 

如图是Map的框架,Map的数据结构为key-value键值对,Map存储的结构中能够包括一个K和一个与K对应的V

public interface Map<K,V> {

//接口对应的函数
java.util.Map<K, V>
java.util.Map.size()
java.util.Map.isEmpty()
java.util.Map.containsKey(Object)
java.util.Map.containsValue(Object)
java.util.Map.get(Object)
java.util.Map.put(K, V)
java.util.Map.remove(Object)
java.util.Map.putAll(Map<? extends K, ? extends V>)
java.util.Map.clear()
java.util.Map.keySet()
java.util.Map.values()
java.util.Map.entrySet()
java.util.Map.Entry<K, V>
java.util.Map.equals(Object)
java.util.Map.hashCode()
java.util.Map.getOrDefault(Object, V)
java.util.Map.forEach(BiConsumer<? super K, ? super V>)
java.util.Map.replaceAll(BiFunction<? super K, ? super V, ? extends V>)
java.util.Map.putIfAbsent(K, V)
java.util.Map.remove(Object, Object)
java.util.Map.replace(K, V, V)
java.util.Map.replace(K, V)
java.util.Map.computeIfAbsent(K, Function<? super K, ? extends V>)
java.util.Map.computeIfPresent(K, BiFunction<? super K, ? super V, ? extends V>)
java.util.Map.compute(K, BiFunction<? super K, ? super V, ? extends V>)
java.util.Map.merge(K, V, BiFunction<? super V, ? super V, ? extends V>)

 

public abstract class AbstractMap<K,V> implements Map<K,V> {

AbstractMap是个抽象类,它实现了Map接口中的大部分API。

 

其他接口:

//有关的接口&抽象类
 public interface SortedMap<K,V> extends Map<K,V> {

 public interface NavigableMap<K,V> extends SortedMap<K,V> {

 public class Hashtable<K,V> extends Dictionary<K,V>

 implements Map<K,V>, Cloneable, java.io.Serializable {

//Hashtable属于早期遗留的API,继承自抽象类Dictionary,但也实现了Map接口。

 //Enumeration,它是JDK 1.0引入的抽象类,作用是为了遍历集合;但是Enumeration的功能要比Iterator少。

Enumeration只能在Hashtable, Vector, Stack中使用。

Map结构图中涉及的接口&抽象类:

序号

类描述

1

AbstractMap 
实现了大部分的集合接口。

2

SortedMap
继承于Map,使Key保持在升序排列。

3

NavigableMap
NavigableMap 扩展 SortedMap,具有了为给定搜索目标报告最接近匹配项的导航方法

4

Dictionary
早期用来存储键/值对,作用和Map类相似。

5

Enumeration
提供的遍历元素的接口

 具体的Map集合类实现AbstractMap简化了实现。

Java集合的整体结构分析到这里,后面将要对各个接口和具体实现类进行详细分析。

 

 

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐