Java基础知识点3:集合类
集合类是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:集合类的更多相关文章
- Java基础知识点(一)
前言:本篇随笔,主要记录Java的基础知识点,不管是用于项目或者面试中,笔者认为都非常有用,所以将持续更新...... 1.Java的访问权限 Java中有四种访问权限:默认访问权限.public.p ...
- Java基础知识点总结
前言 本文主要是我之前复习Java基础原理过程中写的Java基础知识点总结.Java的知识点其实非常多,并且有些知识点比较难以理解,有时候我们自以为理解了某些内容,其实可能只是停留在表面上,没有理解其 ...
- Java基础知识点(四)
前言:记录Java基础知识点,方便熟悉与掌握. 1.面向对象的"六原则一法则" “六原则一法则”:单一职责原则.开闭原则.依赖倒转原则.里氏替换原则.接口隔离原则.合成聚合复用原则 ...
- Java基础知识点(三)
前言:准备将Java基础知识点总结成一个系列,用于平常复习并加深理解.每篇尽量做到短小精悍,便于阅读. 1.Math类中相关函数 Math.floor(x):返回不大于x的最大整数.eg:Math.f ...
- Java基础知识点(二)
前言:Java的基础知识点不能间断. 1.Array和ArrayList的区别 关于Array的用法,参看:http://blog.csdn.net/b_11111/article/details/5 ...
- JAVA基础知识点总结(全集)
1.JAVA简介 1.1java体系结构:j2se,javaweb,j2ee 1.2java特点:平台无关(虚拟机),垃圾回收(使得java更加稳定) 1.3 JDK与JRE,JDK:java开发环境 ...
- java基础知识点补充---二维数组
#java基础知识点补充---二维数组 首先定义一个二维数组 int[][] ns={ {1,2,3,4}, {5,6,7,8}, {9,10,11,12}, {13,14,15,16} }; 实现遍 ...
- Java 基础知识点
很多 Java 基础的东西都忘记了, 有必要再复习一些基本的知识点. 本文主要参考 https://github.com/Snailclimb/JavaGuide ================== ...
- Java基础知识点
以下10点为JAVA 基础知识,后面将足以总结和完善以备面试 数据类型 (包装类,字符串,数组) 异常处理 Java IO和NIO 数据结构 (集合和容器 ) 多线程(并发) 网络通信(协议) 面向对 ...
- 如何学习java?Java基础知识点分享
面对未知的行业,人们的第一反应应该是:拒绝踏入.因为学习真的是一个痛苦的过程.想要真正了解一个行业,熟知一个行业,并熟练掌握某一技术,是真的需要时间和精力的.在学习Java基础知识期间,千锋小编疯狂为 ...
随机推荐
- Html定位精要
Html定位基础 Html的布局是文档流模型,块元素独占一行,内联元素并列一行. 相对定位 position: relative 相对于自己定位 不脱离文档流,元素原有位置被保留 绝对定位 posit ...
- RabbitMQ 参数们的Power “续”
参数中的 arguments 之前讲参数的一些作用的时候,忽略了最后一个字典类型的参数,因为这个参数是大有文章的,值得单独进出来说道说道. 这时,就不得不打开我们的 Web UI管理系统了,可以看到在 ...
- 为自己的爬虫更换代理和HTML头部
import requestsimport reimport randomimport time class download(): def __init__(self): self.iplist = ...
- JQuery slidebox实现图片轮播
jQuery图片轮播(焦点图)插件jquery.slideBox,简单设置下参数就可以多个多种动画效果,左右,上下,速度,还可指定默认显示第N张,点击的按钮在现代浏览中可以实现圆形或圆角效果,插件代码 ...
- kafka入门:简介、使用场景、设计原理、主要配置及集群搭建(转)
问题导读: 1.zookeeper在kafka的作用是什么? 2.kafka中几乎不允许对消息进行"随机读写"的原因是什么? 3.kafka集群consumer和producer状 ...
- ng-switch
<p>ng-switch : </p> <div ng-switch="isShow"><!--isShow是boolean值--> ...
- Yii应用的目录结构和入口脚本
以下是一个通过高级模版安装后典型的Yii应用的目录结构: . ├── backend ├── common ├── console ├── environments ├── frontend ├── ...
- HTML a标签、4个伪类、常用属性(下载)、锚链接(待扩展:邮件、电话、短信、GPS)
HTML 超链接<a> 1.超链接可以是一个字.一个词.一组词.一幅图像,您可以点击这些内容来跳转到新的文档或者当前文档中的某个部分. 2.当您把鼠标指针移动到网页中的某个链接上时,箭头会 ...
- [译]ASP.NET 5 Configuration
原文:https://docs.asp.net/en/latest/fundamentals/configuration.html ASP.NET 5支持多种配置选项. 应用的配置文件可以是JSON, ...
- noip2015 运输计划
描述 公元 2044 年,人类进入了宇宙纪元.L 国有 nn 个星球,还有 n−1n−1 条双向航道,每条航道建立在两个星球之间,这 n−1n−1 条 航道连通了 L 国的所有星球. 小 P 掌管一家 ...