java集合框架介绍

java集合框架:

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

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

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

集合框架总体结构图

java集合框架介绍_第1张图片

2.Collection

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

Collection函数列表:

 

方法摘要

 boolean

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

 boolean

addAll(Collection 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

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[]

 

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 implements Collection {
AbstractCollection是一个实现了Collection接口的抽象类,实现了大部分Collection中大部分方法,简化了实现此接口要实现的功能。

AbstractCollection 实现的方法:

 

方法摘要

 boolean

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

 boolean

addAll(Collection 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

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[]

 

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

 String

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

AbstractCollection未实现的方法包括:

 

public abstract Iterator 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 iterator();

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

3 Map框架:

 

 

java集合框架介绍_第2张图片

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

public interface Map {

//接口对应的函数
java.util.Map
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)
java.util.Map.clear()
java.util.Map.keySet()
java.util.Map.values()
java.util.Map.entrySet()
java.util.Map.Entry
java.util.Map.equals(Object)
java.util.Map.hashCode()
java.util.Map.getOrDefault(Object, V)
java.util.Map.forEach(BiConsumer)
java.util.Map.replaceAll(BiFunction)
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)
java.util.Map.computeIfPresent(K, BiFunction)
java.util.Map.compute(K, BiFunction)
java.util.Map.merge(K, V, BiFunction)

 

public abstract class AbstractMap implements Map {

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

 

其他接口:

//有关的接口&抽象类
 public interface SortedMap extends Map {

 public interface NavigableMap extends SortedMap {

 public class Hashtable extends Dictionary

 implements Map, 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集合的整体结构分析到这里,后面将要对各个接口和具体实现类进行详细分析。

 

 

你可能感兴趣的:(java基础,java面试小问题)