集合类是Java编程中经常会用到的一类常用类库,在这里将会对整个集合类进行介绍:

Collection接口:

  Collection接口是所有集合类的根接口,代表了所有含有多个元素的集合,无论这个集合中是否有重复元素,元素是否有序。所有我们经常使用的一些集合类,比如ArrayList,LinkedList等等集合类并不是直接实现这个接口。而是去实现这个Collection接口的子接口,比如Set,List等等。

  这个类中规定了一些最通用的方法,比如:

  size(), isEmpty(),contains(Object o), iterator(),toArray(),add(E e), remove(Object o),containsAll(Collection<?> c), addAll(Collection<? extends E> c),removeAll(Collection<?> c),retainAll(Collection<?> c),clear(),equals(Collection<?> c),hashCode();

  但是仅仅声明这个接口其实还不够方便,因为Java语法规定接口中只会对方法进行声明,不会有具体的实现,所以如果想要创建两个不同的,但是都能实现Collection接口的集合类,比如ArrayList和LinkedList,就需要在它们各自类声明文件中去重复实现像isEmpty(),contains()这样的通用方法。比如关于isEmpty()方法的具体实现,我们需要在这个两个类中都分别都列出size()方法的代码,这是一个非常麻烦的操作。

AbstractCollection抽象类

  所以为了解决这个问题,java中定义了一个实现Collection接口的抽象类AbstractCollection,这个类中对于一些简单的通用方法进行的了实现,比如contains()等等。通过这个方案,如果程序员再想要定义一个新的集合类,只需定义一个继承自AbstractCollection类的子类即可,这样就免去了还要重新写一遍contains()等方法的代码的麻烦。

List接口:

  List接口是继承自Collection接口的一个子接口。实现这个接口的集合类代表一个有序集合(也可以把它叫作序列)。也就是说这种集合类可以允许用户通过元素的位置序号来访问,修改这个元素。实现List接口的集合类通常可以包含重复元素。

  所以相比于Collection接口,List接口会定义一些额外的,和元素位置有关的操作,比如

  get(int index):获取位于第index位置处的元素,除此之外还有set(int index, E element),add(int index, E element),remove(int index),indexOf,lastIndexOf,subList(int fromIndex, int toIndex),listIterator(),listIterator(int index)

AbstractList抽象类

  和Collection接口定义AbstractCollection抽象类的目的类似,java针对List接口也定义了一个抽象类AbstractList,其中实现了很多重要的公共方法,比如indexOf,lastIndexOf等等。但是下面的几个方法没有具体实现,需要在具体的集合类中来实现它们:

  get(int index),set(int index, E element),add(int index, E element),remove(int index)

AbstractSequentialList抽象类

  按照这个类的声明文件中所叙述的,这个抽象类的作用是为了帮助我们实现顺序存储的数据结构而提供的抽象类。在这个类中实现了get,set,add,remove方法,不过采取的实现方式和ArrayList不同,是通过listIterator这个数据结构来实现的。

ArrayList类

  这个集合类继承自AbstractList抽象类,它的实现机制就像它的名字中所写的那样,是通过数组Array来实现的一个List结构。在ArrayList中包含一个Object数组,elementData,存放所有数组元素,和另一个size变量,存放当前数组中元素的个数。

  在这个类中实现了几个比较重要的方法,get,set,add,remove。除此之外还重新实现了一些其他的方法,如indexOf,lastIndexOf等等。

LinkedList类

  这个集合类继承子AbstractSequentialList抽象类,实现的是一种顺序访问的线性表结构,和ArrayList的区别就在于,它不能以常数时间复杂度O(1)访问线性表中的任意一个元素,只能顺序访问。这个集合类是通过双链表来实现的。类中一共包含两个成员

变量:一个是双链表的头结点指针Entry<E> header;另一个是该双链表的元素个数,size。

  由于LinkedList实现了List,Deque接口,所以LinkedList声明文件中包含了比ArrayList更多的方法,主要来自于Deque接口。

  在LinkedList中一些基本操作都是基于双链表来实现的,时间复杂度如下:

  add(E e)复杂度O(1)。remove(Object o)复杂度O(n)。get(int index)复杂度O(n)。set(int index, E element)复杂度O(n)。remove(int index)复杂度O(n)。其他的方法都是基于这几个方法的。

Vector类

  Vector类的实现方式和ArrayList很像,因为这两个集合类都是模拟一种可以在常数时间复杂度进行随机访问的数据结构。所以它也是采用数组来实现的。

    

Set接口:

  Set接口也是继承自Collection的另一个子接口。实现这个接口的集合类代表一个不包含重复元素的集合。也就是说任何在同一个Set中的两个元素e1,e2,e1.equals(e2)=false。而且集合中至多只有一个null元素。

  相比于Collection接口,Set接口并没有定义新的方法。但是要保证从Collection继承的方法能够在保证集合中不包含重复元素的前提下完成各项操作。

AbstractSet抽象类:

  就像List接口要实现一个AbstractList抽象类来方便我们具体的某个List集合类的构造,比如ArrayList,Set接口也有一个AbstractSet抽象类,里面定义了一些Set接口中声明的方法,因为这些方法在不同的具体的Set集合类中实现方式都是一样的。比如hashCode方法在HashSet和TreeSet方法中是一样的。

HashSet类:

  这个类是通过哈希表来实现的Set集合类。它有以下几个特点:

  1. 在遍历整个集合中的元素时,它不能保证元素出现的次序,即元素之间没有严格的次序关系。

  2. 这个类支持常数时间复杂度的基本操作,比如add,remove,contains,size。

  3. 遍历整个hashSet中的元素所需要时间与HashSet中的元素个数以及实现这个HashSet的HashMap的大小之和成正比。

  

  HashSet是基于HashMap实现的,即在HashSet中定义了一个HashMap,不过这个HashMap的每一个键值对中,键的类型由程序动态给定,值的类型则是固定的Object类型。

  通过观察HashSet的源代码发现,由于HashSet是通过一个HashMap来实现的。所以HashSet中的很多方法也是通过调用HashMap中的已有方法来实现的。比如contains方法:

  public boolean contains(Object o) {

    return map.containsKey(o);

  }

Map接口:

  这个接口所代表的数据结构是能够存放键值对(key/value)的集合,它有以下几个特点:

  1. 同一个集合中,关键字(key)不能重复。

  2. 每一个关键字(key)至多只能映射到一个值上。

  这个接口中声明了关于键值对集合的一些通用操作。

AbstractMap抽象类:

  

Java基础知识点3:集合类的更多相关文章

  1. Java基础知识点(一)

    前言:本篇随笔,主要记录Java的基础知识点,不管是用于项目或者面试中,笔者认为都非常有用,所以将持续更新...... 1.Java的访问权限 Java中有四种访问权限:默认访问权限.public.p ...

  2. Java基础知识点总结

    前言 本文主要是我之前复习Java基础原理过程中写的Java基础知识点总结.Java的知识点其实非常多,并且有些知识点比较难以理解,有时候我们自以为理解了某些内容,其实可能只是停留在表面上,没有理解其 ...

  3. Java基础知识点(四)

    前言:记录Java基础知识点,方便熟悉与掌握. 1.面向对象的"六原则一法则" “六原则一法则”:单一职责原则.开闭原则.依赖倒转原则.里氏替换原则.接口隔离原则.合成聚合复用原则 ...

  4. Java基础知识点(三)

    前言:准备将Java基础知识点总结成一个系列,用于平常复习并加深理解.每篇尽量做到短小精悍,便于阅读. 1.Math类中相关函数 Math.floor(x):返回不大于x的最大整数.eg:Math.f ...

  5. Java基础知识点(二)

    前言:Java的基础知识点不能间断. 1.Array和ArrayList的区别 关于Array的用法,参看:http://blog.csdn.net/b_11111/article/details/5 ...

  6. JAVA基础知识点总结(全集)

    1.JAVA简介 1.1java体系结构:j2se,javaweb,j2ee 1.2java特点:平台无关(虚拟机),垃圾回收(使得java更加稳定) 1.3 JDK与JRE,JDK:java开发环境 ...

  7. java基础知识点补充---二维数组

    #java基础知识点补充---二维数组 首先定义一个二维数组 int[][] ns={ {1,2,3,4}, {5,6,7,8}, {9,10,11,12}, {13,14,15,16} }; 实现遍 ...

  8. Java 基础知识点

    很多 Java 基础的东西都忘记了, 有必要再复习一些基本的知识点. 本文主要参考 https://github.com/Snailclimb/JavaGuide ================== ...

  9. Java基础知识点

    以下10点为JAVA 基础知识,后面将足以总结和完善以备面试 数据类型 (包装类,字符串,数组) 异常处理 Java IO和NIO 数据结构 (集合和容器 ) 多线程(并发) 网络通信(协议) 面向对 ...

  10. 如何学习java?Java基础知识点分享

    面对未知的行业,人们的第一反应应该是:拒绝踏入.因为学习真的是一个痛苦的过程.想要真正了解一个行业,熟知一个行业,并熟练掌握某一技术,是真的需要时间和精力的.在学习Java基础知识期间,千锋小编疯狂为 ...

随机推荐

  1. iOS - 系统提醒短音频

    Demo下载地址 iPhone端系统Audio资源路径:/System/Library/Audio/UISounds 首先,通过 NSFileManager 获取资源路径下的所有路径(文件夹/文件) ...

  2. iOS - YYAdd对UIDevice的拓展

    YYKit中对UIDevice的拓展,accumulate knowledge !!! 首先 #include <sys/socket.h> #include <sys/sysctl ...

  3. ElasticSearch-5.0.0安装中文分词插件IK

    Install IK 源码地址:https://github.com/medcl/elasticsearch-analysis-ik,git clone下来. 1.compile mvn packag ...

  4. eclipse安装Eclipse Memory Analyzer插件

    在Install New software中输入 http://archive.eclipse.org/mat/1.2/update-site/ 然后选择Memory Analyzer for Ecl ...

  5. 通过ipv6访问 g o o g l e

    Google.Youtube.Facebook等均支持IPv6访问,IPv4网络的用户大部分都无法访问,比如Gmail,Google Docs等等各种相关服务.而该类网站大部分均已接入IPv6网络,因 ...

  6. Coding编译连接过程中遇到的问题及解决方法(iOS)

    Coding 上下载地址:https://coding.net/u/coding/p/Coding-iOS/git Github源码下载地址:https://github.com/Coding/Cod ...

  7. mysql安装配置

    MySQL 是最流行的关系型数据库管理系统,由瑞典MySQL AB公司开发,目前属于Oracle公司. MySQL所使用的SQL语言是用于访问数据库的最常用标准化语言. MySQL由于其体积小.速度快 ...

  8. C# *= 运算顺序

    a *= a + b *c; 不管等号右边有没有括号,总是先算右边: 即等价于 a = a *(a + b*c); using System; using System.Collections.Gen ...

  9. ZOJ 3699 Dakar Rally

    Dakar Rally Time Limit: 2 Seconds      Memory Limit: 65536 KB Description The Dakar Rally is an annu ...

  10. Linux进程间通信(三):匿名管道 popen()、pclose()、pipe()、close()、dup()、dup2()

    在前面,介绍了一种进程间的通信方式:使用信号,我们创建通知事件,并通过它引起响应,但传递的信息只是一个信号值.这里将介绍另一种进程间通信的方式——匿名管道,通过它进程间可以交换更多有用的数据. 一.什 ...