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基础知识期间,千锋小编疯狂为 ...
随机推荐
- 最简单的JavaScript模板引擎
在小公司待久了感觉自己的知识面很小,最近逛博客园和一些技术网站看大家在说JavaScript模版引擎的事儿,完全没有概念,网上一搜这是08年开始流行起来的...本来以为这是很高深的知识,后来在网上看到 ...
- codevs 1036 商务旅行(Targin求LCA)
传送门 Description 某首都城市的商人要经常到各城镇去做生意,他们按自己的路线去做,目的是为了更好的节约时间. 假设有N个城镇,首都编号为1,商人从首都出发,其他各城镇之间都有道路连接,任意 ...
- Linux 内核数据结构:Linux 双向链表
Linux 内核提供一套双向链表的实现,你可以在 include/linux/list.h 中找到.我们以双向链表着手开始介绍 Linux 内核中的数据结构 ,因为这个是在 Linux 内核中使用最为 ...
- bzoj 2301: [HAOI2011]Problem b
2301: [HAOI2011]Problem b Time Limit: 50 Sec Memory Limit: 256 MB Submit: 3757 Solved: 1671 [Submit] ...
- BZOJ3771: Triple
额我不是来发题解的,只是非常郁闷= =,这题的答案最大是1.2e9/6左右,所以用ntt的话要在模意义下除以6,不能最后除,否则刚好爆掉= = #include<bits/stdc++.h> ...
- Formal Definitions Using ASN.1 - SNMP Tutorial
30.7 Formal Definitions Using ASN.1 The SMI standard specifies that all MIB variables must be define ...
- .net core
- 直接操作 SDL_Overlay YUV叠加上的像素
根据这篇解码出yuv数据后 海思h264解码库 y,u,v数据全部存进数组内, IntPtr y = _decodeFrame.pY; IntPtr ...
- Java排序算法——希尔排序
package sort; //================================================= // File Name : ShellSort //------- ...
- Maven总结
项目管理构建工具:maven ant gradle == 项目管理利器(Maven)——maven介绍及环境搭建maven可以帮助我们更有效地管理项目,它也是一套强大的自动化构建工具,覆盖了编译.测试 ...