Java中的collection集合类型总结

Java集合是java提供的工具包,包含了常用的数据结构:集合、链表、队列、栈、数组、映射等。Java集合工具包位置是java.util.*
Java集合主要可以划分为4个部分:List列表、Set集合、Map映射、工具类(Iterator迭代器、Enumeration枚举类、Arrays和Collections)。
Java集合工具包框架如下图。

说明:看上面的框架图,先抓住它的主干,即Collection和Map。
Collection是一个接口,是高度抽象出来的集合,它包含了集合的基本操作和属性。
Collection包含了List和Set两大分支。
(01) List是一个有序的队列,每一个元素都有它的索引。第一个元素的索引值是0。
List的实现类有LinkedList, ArrayList, Vector, Stack。
(02) Set是一个不允许有重复元素的集合。
Set的实现类有HastSet和TreeSet。HashSet依赖于HashMap,它实际上是通过HashMap实现的;TreeSet依赖于TreeMap,它实际上是通过TreeMap实现的。
Map是一个映射接口,即key-value键值对。Map中的每一个元素包含“一个key”和“key对应的value”。
AbstractMap是个抽象类,它实现了Map接口中的大部分API。而HashMap,TreeMap,WeakHashMap都是继承于AbstractMap。
Hashtable虽然继承于Dictionary,但它实现了Map接口。
接下来,再看Iterator。它是遍历集合的工具,即我们通常通过Iterator迭代器来遍历集合。我们说Collection依赖于Iterator,是因为Collection的实现类都要实现iterator()函数,返回一个Iterator对象。
ListIterator是专门为遍历List而存在的。
再看Enumeration,它是JDK 1.0引入的抽象类。作用和Iterator一样,也是遍历集合;但是Enumeration的功能要比Iterator少。在上面的框图中,Enumeration只能在Hashtable, Vector, Stack中使用。
最后,看Arrays和Collections。它们是操作数组、集合的两个工具类。
有了上面的整体框架之后,我们接下来对每个类分别进行分析。

Collection架构
下面,我们将对Collection进行概括。下面先看看Collection的一些框架类的关系图:

Collection是一个接口,它主要的两个分支是:List 和 Set。
List和Set都是接口,它们继承于Collection。List是有序的队列,List中可以有重复的元素;而Set是数学概念中的集合,Set中没有重复元素!
List和Set都有它们各自的实现类。
为了方便实现,集合中定义了AbstractCollection抽象类,它实现了Collection中的绝大部分函数;这样,在Collection的实现类中,我们就可以通过继承AbstractCollection省去重复编码。AbstractList和AbstractSet都继承于AbstractCollection,具体的List实现类继承于AbstractList,而Set的实现类则继承于AbstractSet。
另外,Collection中有一个iterator()函数,它的作用是返回一个Iterator接口。通常,我们通过Iterator迭代器来遍历集合。ListIterator是List接口所特有的,在List接口中,通过ListIterator()返回一个ListIterator对象。
接下来,我们看看各个接口和抽象类的介绍;然后,再对实现类进行详细的了解。

1. Collection简介
Collection的定义如下:

public interface Collection<E> extends Iterable<E> {}

它是一个接口,是高度抽象出来的集合,它包含了集合的基本操作:添加、删除、清空、遍历(读取)、是否为空、获取大小、是否保护某元素等等。
Collection接口的所有子类(直接子类和间接子类)都必须实现2种构造函数:不带参数的构造函数 和 参数为Collection的构造函数。带参数的构造函数,可以用来转换Collection的类型。

// Collection的API
abstract boolean   add(E object)
abstract boolean   addAll(Collection<? extends E> collection)
abstract void   clear()
abstract boolean   contains(Object object)
abstract boolean   containsAll(Collection<?> collection)
abstract boolean   equals(Object object)
abstract int    hashCode()
abstract boolean   isEmpty()
abstract Iterator<E>  iterator()
abstract boolean   remove(Object object)
abstract boolean   removeAll(Collection<?> collection)
abstract boolean   retainAll(Collection<?> collection)
abstract int    size()
abstract <T> T[]   toArray(T[] array)
abstract Object[]  toArray()

2. List简介
List的定义如下:

public interface List<E> extends Collection<E> {}

List是一个继承于Collection的接口,即List是集合中的一种。List是有序的队列,List中的每一个元素都有一个索引;第一个元素的索引值是0,往后的元素的索引值依次+1。和Set不同,List中允许有重复的元素。 List的官方介绍如下:
A List is a collection which maintains an ordering for its elements. Every element in the List has an index. Each element can thus be accessed by its index, with the first index being zero. Normally, Lists allow duplicate elements, as compared to Sets, where elements have to be unique.
关于API方面。既然List是继承于Collection接口,它自然就包含了Collection中的全部函数接口;由于List是有序队列,它也额外的有自己的API接口。主要有“添加、删除、获取、修改指定位置的元素”、“获取List中的子队列”等。

// Collection的API
abstract boolean   add(E object)
abstract boolean   addAll(Collection<? extends E> collection)
abstract void   clear()
abstract boolean   contains(Object object)
abstract boolean   containsAll(Collection<?> collection)
abstract boolean   equals(Object object)
abstract int    hashCode()
abstract boolean   isEmpty()
abstract Iterator<E>  iterator()
abstract boolean   remove(Object object)
abstract boolean   removeAll(Collection<?> collection)
abstract boolean   retainAll(Collection<?> collection)
abstract int    size()
abstract <T> T[]   toArray(T[] array)
abstract Object[]  toArray()
// 相比与Collection,List新增的API:
abstract void    add(int location, E object)
abstract boolean    addAll(int location, Collection<? extends E> collection)
abstract E     get(int location)
abstract int     indexOf(Object object)
abstract int     lastIndexOf(Object object)
abstract ListIterator<E>  listIterator(int location)
abstract ListIterator<E>  listIterator()
abstract E     remove(int location)
abstract E     set(int location, E object)
abstract List<E>    subList(int start, int end)

3. Set简介
Set的定义如下:

public interface Set<E> extends Collection<E> {}

Set是一个继承于Collection的接口,即Set也是集合中的一种。Set是没有重复元素的集合。
关于API方面。Set的API和Collection完全一样。

// Set的API
abstract boolean   add(E object)
abstract boolean   addAll(Collection<? extends E> collection)
abstract void    clear()
abstract boolean   contains(Object object)
abstract boolean   containsAll(Collection<?> collection)
abstract boolean   equals(Object object)
abstract int    hashCode()
abstract boolean   isEmpty()
abstract Iterator<E>  iterator()
abstract boolean   remove(Object object)
abstract boolean   removeAll(Collection<?> collection)
abstract boolean   retainAll(Collection<?> collection)
abstract int    size()
abstract <T> T[]   toArray(T[] array)
abstract Object[]   toArray()

4. AbstractCollection
AbstractCollection的定义如下:

public abstract class AbstractCollection<E> implements Collection<E> {}

AbstractCollection是一个抽象类,它实现了Collection中除iterator()和size()之外的函数。
AbstractCollection的主要作用:它实现了Collection接口中的大部分函数。从而方便其它类实现Collection,比如ArrayList、LinkedList等,它们这些类想要实现Collection接口,通过继承AbstractCollection就已经实现了大部分的接口了。

5. AbstractList
AbstractList的定义如下:

public abstract class AbstractList<E> extends AbstractCollection<E> implements List<E> {}

AbstractList是一个继承于AbstractCollection,并且实现List接口的抽象类。它实现了List中除size()、get(int location)之外的函数。
AbstractList的主要作用:它实现了List接口中的大部分函数。从而方便其它类继承List。
另外,和AbstractCollection相比,AbstractList抽象类中,实现了iterator()接口。

6. AbstractSet

AbstractSet的定义如下:
public abstract class AbstractSet<E> extends AbstractCollection<E> implements Set<E> {}

AbstractSet是一个继承于AbstractCollection,并且实现Set接口的抽象类。由于Set接口和Collection接口中的API完全一样,Set也就没有自己单独的API。和AbstractCollection一样,它实现了List中除iterator()和size()之外的函数。
AbstractSet的主要作用:它实现了Set接口中的大部分函数。从而方便其它类实现Set接口。

7. Iterator
Iterator的定义如下:

public interface Iterator<E> {}

Iterator是一个接口,它是集合的迭代器。集合可以通过Iterator去遍历集合中的元素。Iterator提供的API接口,包括:是否存在下一个元素、获取下一个元素、删除当前元素。
注意:Iterator遍历Collection时,是fail-fast机制的。即,当某一个线程A通过iterator去遍历某集合的过程中,若该集合的内容被其他线程所改变了;那么线程A访问集合时,就会抛出ConcurrentModificationException异常,产生fail-fast事件。关于fail-fast的详细内容,我们会在fail-fast总结后面专门进行说明。

// Iterator的API
abstract boolean hasNext()
abstract E next()
abstract void remove()

8. ListIterator
ListIterator的定义如下:

public interface ListIterator<E> extends Iterator<E> {}

ListIterator是一个继承于Iterator的接口,它是队列迭代器。专门用于便利List,能提供向前/向后遍历。相比于Iterator,它新增了添加、是否存在上一个元素、获取上一个元素等等API接口。

// ListIterator的API
// 继承于Iterator的接口
abstract boolean hasNext()
abstract E next()
abstract void remove()
// 新增API接口
abstract void add(E object)
abstract boolean hasPrevious()
abstract int nextIndex()
abstract E previous()
abstract int previousIndex()
abstract void set(E object)
(0)

相关推荐

  • Java的Hibernate框架中集合类数据结构的映射编写教程

    一.集合映射 1.集合小介 集合映射也是基本的映射,但在开发过程中不会经常用到,所以不需要深刻了解,只需要理解基本的使用方法即可,等在开发过程中遇到了这种问题时能够查询到解决方法就可以了.对应集合映射它其实是指将java中的集合映射到对应的表中,是一种集合对象的映射,在java中有四种类型的集合,分别是Set.Map.List还有普通的数组,它们之间有很大的区别: (1)Set,不可以有重复的对象,对象是无序的: (2)List,可以与重复的对象,对象之间有顺序: (3)Map,它是键值成对出现

  • redis集合类型_动力节点Java学院整理

    我们来看看Redis五大类型中的第四大类型:"集合类型",集合类型还是蛮有意思的,先看redis手册,如下: 上面就是redis中的set类型使用到的所有方法,还是老话,常用的方法也就那么四个(CURD)... 一: 常用方法 1. SAdd 这个方法毫无疑问,就是向集合里面添加数据,比如下面这样,我往fruits集合里面添加喜爱的水果. 127.0.0.1:6379> sadd fruits apple (integer) 1 127.0.0.1:6379> sadd f

  • 总结Java集合类操作优化经验

    在实际的项目开发中会有很多的对象,如何高效.方便地管理对象,成为影响程序性能与可维护性的重要环节.Java 提供了集合框架来解决此类问题,线性表.链表.哈希表等是常用的数据结构,在进行 Java 开发时,JDK 已经为我们提供了一系列相应的类来实现基本的数据结构,所有类都在 java.util 这个包里,清单1 描述了集合类的关系. 清单 1.集合类之间关系 Collection ├List │├LinkedList │├ArrayList │└Vector │ └Stack └Set Map

  • Java集合类中文介绍

    Java集合是java提供的工具包,包含了常用的数据结构:集合.链表.队列.栈.数组.映射等.Java集合工具包位置是java.util.*Java集合主要可以划分为4个部分:List列表.Set集合.Map映射.工具类(Iterator迭代器.Enumeration枚举类.Arrays和Collections)..Java集合工具包框架图(如下):大致说明:看上面的框架图,先抓住它的主干,即Collection和Map.1 Collection是一个接口,是高度抽象出来的集合,它包含了集合的基

  • java集合类源码分析之Set详解

    Set集合与List一样,都是继承自Collection接口,常用的实现类有HashSet和TreeSet.值得注意的是,HashSet是通过HashMap来实现的而TreeSet是通过TreeMap来实现的,所以HashSet和TreeSet都没有自己的数据结构,具体可以归纳如下: •Set集合中的元素不能重复,即元素唯一 •HashSet按元素的哈希值存储,所以是无序的,并且最多允许一个null对象 •TreeSet按元素的大小存储,所以是有序的,并且不允许null对象 •Set集合没有ge

  • Java集合类的组织结构和继承、实现关系详解

    Collection继承.实现关系如下(说明(I)表示接口, (C)表示Java类,<--表示继承,<<--表示实现): (I)Iterable |<-- (I)Collection |<-- (I)List |<<-- (C)ArrayList |<<-- (C)LinkedList |<<-- (C)Vector |<-- (I)Set |<<-- (C)HashSet |<-- (I)Queue [kju] M

  • java集合类arraylist循环中删除特定元素的方法

    在项目开发中,我们可能往往需要动态的删除ArrayList中的一些元素. 一种错误的方式: <pre name="code" class="java">for(int i = 0 , len= list.size();i<len;++i){ if(list.get(i)==XXX){ list.remove(i); } } 上面这种方式会抛出如下异常: Exception in thread "main" java.lang.I

  • Redis有序集合类型的操作_动力节点Java学院整理

    今天我们说一下Redis中最后一个数据类型 "有序集合类型",回首之前学过的几个数据结构,不知道你会不会由衷感叹,开源的世界真好,写这些代码的好心人真的要一生平安哈,不管我们想没想的到的东西,在这个世界上都已经存在着,曾几何时,我们想把所有数据按照数据结构模式组成后灌输到内存中,然而为了达到内存共享的方式,不得不将这块内存单独部署,同时还要考虑怎么序列化,何时序列互的问题,烦心事太多太多...后来才知道有redis这么个玩意,能把高级的,低级的数据结构单独包装到一个共享内存中(Redi

  • 浅析Java中的set集合类型及其接口的用法

    概念 首先,我们看看Set集合. (01) Set 是继承于Collection的接口.它是一个不允许有重复元素的集合. (02) AbstractSet 是一个抽象类,它继承于AbstractCollection,AbstractCollection实现了Set中的绝大部分函数,为Set的实现类提供了便利. (03) HastSet 和 TreeSet 是Set的两个实现类.     HashSet依赖于HashMap,它实际上是通过HashMap实现的.HashSet中的元素是无序的.   

  • Java中的collection集合类型总结

    Java集合是java提供的工具包,包含了常用的数据结构:集合.链表.队列.栈.数组.映射等.Java集合工具包位置是java.util.* Java集合主要可以划分为4个部分:List列表.Set集合.Map映射.工具类(Iterator迭代器.Enumeration枚举类.Arrays和Collections). Java集合工具包框架如下图. 说明:看上面的框架图,先抓住它的主干,即Collection和Map. Collection是一个接口,是高度抽象出来的集合,它包含了集合的基本操作

  • 剖析Java中在Collection集合中使用contains和remove为什么要重写equals

    目录 引言 源码剖析 实例测试 String类和包装类的特殊情况 自定义类型 总结 引言 在Collection集合中: contains方法是判断一个集合里面是否包含指定元素,如果有则返回true: remove方法是从集合中删除指定元素的单个实例: 这两个方法看起很简单,用起来也很简单,同样也非常常用:但是,它们到底是怎么匹配到相应的元素呢? 源码剖析 以ArrayList为例,我们分析一下ArrayList中的contains和remove的源码: 先看看contains: 这里看到比较的

  • 详解JAVA中的Collection接口和其主要实现的类

    Collection是最基本的集合接口,一个Collection代表一组Object,即Collection的元素(Elements).一些Collection允许相同的元素而另一些不行.一些能排序而另一些不行.Java SDK不提供直接继承自Collection的类,Java SDK提供的类都是继承自Collection的"子接口"如List和Set,详细信息可见官方文档http://tool.oschina.net/uploads/apidocs/jdk-zh/java/util/

  • 学习Java中的List集合

    目录 1.概述 2.List的使用 2.1List的常用方法 3.List的实现类 3.1ArrayList 3.2Vector 3.3LinkedList 3.4ArrayList与Vector的区别 1.概述 List是一个有序集合(也被称为序列).此接口的用户在列表中的每个元素都被插入的地方有精确的控制.用户可以通过它们的整数索引(在列表中的位置)访问元素,并在列表中搜索元素. 说是List集合,其实只是习惯说法,因为它是Collection接口的一个子接口(Collection有很多的子

  • Java 详解Collection集合之ArrayList和HashSet

    目录 Collection List ArrayList Set HashSet ArrayList和HashSet的区别 泛型 Collection Collection接口被List接口和Set接口继承 本章只介绍常用的集合 List ArrayList是List接口的实现类 ArrayList ArrayList 类是一个可以动态修改的数组,与普通数组的区别就是它是没有固定大小的限制,我们可以添加或删除元素. ArrayList 继承了 AbstractList ,并实现了 List 接口

  • Java 详解Collection集合之ArrayList和HashSet

    目录 Collection List ArrayList Set HashSet ArrayList和HashSet的区别 泛型 Collection Collection接口被List接口和Set接口继承 本章只介绍常用的集合 List ArrayList是List接口的实现类 ArrayList ArrayList 类是一个可以动态修改的数组,与普通数组的区别就是它是没有固定大小的限制,我们可以添加或删除元素. ArrayList 继承了 AbstractList ,并实现了 List 接口

  • Java中的set集合是什么意思

    目录 引言 概念 HashSet集合 LinkedHashSet集合: TreeSet集合: 实战场景 引言 在前面的内容中,我们先是一一介绍了Collection集合中都有哪些种类的集合,并且详细地讲解了List集合中的相关知识,那么今天我们来详细地讲解一下Collection集合中的另外一个分支——Set系列集合.最后还是希望这一篇篇的文章能够对你在集合中的学习.Java中的学习起到一定的帮助作用,好了,闲话不多说直接步入正题吧. 概念 Set系类集合特点: 无序:存取顺序不一致 不重复:可

  • Java中对List集合的常用操作详解

    目录: 1.list中添加,获取,删除元素: 2.list中是否包含某个元素: 3.list中根据索引将元素数值改变(替换): 4.list中查看(判断)元素的索引: 5.根据元素索引位置进行的判断: 6.利用list中索引位置重新生成一个新的list(截取集合): 7.对比两个list中的所有元素: 8.判断list是否为空: 9.返回Iterator集合对象: 10.将集合转换为字符串: 11.将集合转换为数组: 12.集合类型转换: 备注:内容中代码具有关联性. 1.list中添加,获取,

  • 6种方法初始化JAVA中的list集合

    List 是 Java 开发中经常会使用的集合,你们知道有哪些方式可以初始化一个 List 吗?这其中不缺乏一些坑,今天栈长我给大家一一普及一下. 1.常规方式 List<String> languages = new ArrayList<>(); languages.add("Java"); languages.add("PHP"); languages.add("Python"); System.out.println

随机推荐