Java中的集合类型体系(一)

提问:为什么需要集合?

通常情况下,程序需要根据运行时才知道创建了多少对象。若非程序运行时,而在开发阶段,我们并不知道创建了多少对象,甚至不知道对象的准确类型,为了满足常规的编程需要,我们要求能在任何时候,任何地点创建任意数量的对象,但是用什么容器要存放这些对象呢?首先可能会想到用数组存放,但是数组只能存放同一类型的数据,且数组长度是固定的。所以用什么来存放更合适呢?就这样,集合便应运而生了。

一、集合的概念

Java中的集合类统一封装在java.util包中,是一个用来存放对象的容器。它允许以各种方式将元素分组,并定义了各种使这些元素更容易操作的方法。集合类是可以往里面保存多个对象的类,存放的是对象,不同的集合类有不同的功能和特点,适合不同的场合,用以解决一些实际问题。

注意点:

1、集合只能存放对象。如果存入基本数据类型,如将int型数据10存入集合中,集合会将int自动转换成其封装类Integer存入,Java中每一种基本数据类型都有对应的引用类型;

2、集合存放的对象的引用,而非对象本身。所以我们称集合中的对象就是集合中对象的引用。对象本身还是放在堆内存中。

3、集合可以存放不同类型,不限数量的数据类型。

二、Java中集合体系框架

图1 集合框架简图

从上图可以看出:上述的所有集合类,除了Map集合系列,即左边的集合都实现了Iterator接口。

Iterator接口用来遍历集合当中的元素,有hashNext()、next()、remove()三个处理集合的方法;

ListIterator接口继承Iterator接口,在它的基础上又添加了三种处理集合的方法,分别为:add(),previous(),hasPrevious()等。

集合的两大的部分:

1、集合主要分为Collection接口Map接口

2、Collection接口分别被Queue、List和Set三个接口继承;

3、List接口被AbstractList实现,分为三个子类:LinkedList、ArrayList、Vector;

4、Set接口被AbstractSet实现,分为两个子类:HashSet、TreeSet;

5、Map接口被AbstractMap实现,分为两个子类:HashMap、TreeMap;

6、Map接口被HashTable实现。

常用集合的分类

图2 常用集合的分类

三、集合和数组的区别

图3 集合与数组区别

四、Iterator迭代器

(一)、Iterator接口是Java中集合的顶层接口。(不包含Map系列接口,Map接口是Map系列集合的顶层接口)。

三个方法:

1、Object next():返回迭代器刚越过元素的引用,返回值是Object,需要根据需要强制转换;

2、boolean hashNext():判断迭代器中是否还有供访问的元素;

3、void remove():删除迭代器中越过的元素。

除了Map集合系列,程序都可以通过Iterator迭代器来遍历集合中的元素。

(二)、Iterator与Iterable

Iterable接口封装在java.util包中,

 public interface Iterable<T>{
/**
* Returns an iterator over elements of type {@code T}
*
* @return an Iterator
*/
Iterator<T> iterator();
...
}

从上面代码可以看出,Iterable接口封装了Iterator接口,所以只要子类实现了Iterable接口,就可以使用Iterator迭代器的功能了。

(三)、ListIterator接口

由于Iterator值提供了next()、hashNext()、remove()功能,如果我们想在使用迭代器遍历的同时添加元素,该怎么办呢?

这里提供两种方式:

1、自定义接口或者实现类,实现Iterator接口,在自定义实现类或接口中添加相应的功能;

2、使用Iterator的子接口ListIterator

具体运用哪种方式,具体依据需求而定,这里主要说明一下第二种方式。

ListIterator接口继承自Iterator接口,在其基础上扩展了一些常用的方法,如下图:

图4 ListIterator中的方法

五、Collection接口介绍

COllection接口是List和Set集合的顶层接口,封装了集合操作的基本功能。

Collection接口分别有List子接口和Set子接口:

  1、List接口:元素按进入先后有序保存,可重复,元素有序 ;

  2、Set接口:仅接收一次,不可重复,元素无序 ;

Collection定义的方法:

图5 Collection接口定义的方法

六、工具类Collections、Arrays及对数组的操作方法

(一)、Collections:封装在java.utils包中,集合框架中的一个工具类。该类中的方法都是静态的。

Collections有三个静态字段:EMPTY_LISTEMPTY_MAPEMPTY_SET;这三个字段分别返回一个空的List,Map和Set并且是不可修改的,当我们试图修改这三个返回的集合容器时,会抛出UnsupportedOperationException异常;之所以不能修改这三个返回的集合容器,原因是被返回的这三个容器都是final所修饰的。

    1、常用的方法:

  

图6 Collections常用方法

(二)、Arrays:封装在java.utils包中,用于操作数组的工具类。里面都是静态方法。

该类包含用于操作数组的各种方法(如排序和搜索)。 该类还包含一个静态工厂,可以将数组视为列表。

1、常用的方法:

图7 Arrays常用方法

(三)、集合对数组的操作方法

1、将数组变成集合的好处:可以使用集合的方法和思想来操作数组中的元素。

2、将数组转换成集合后,只能使用遍历,而不能使用集合中增删改方法,因为数组的长度是固定的,如果你增删。那么会产生UnsupportedOperationException报错。

3、数组转换为集合:一般用Arrays.asList(T ... a)方法,将数组变成List集合。

4、集合转换为数组:可以使用toArray()toArray(T[] a)将集合转换为数组。

toArray():返回一个包含此集合中所有元素的数组。

toArray(T[] a):返回一个包含此集合中所有元素的数组; 返回的数组的运行时类型是指定数组的运行时类型。

Java中的集合类型体系(一)的更多相关文章

  1. Java中的集合类型的继承关系图

    Java中的集合类型的继承关系图

  2. 万字长文深入理解java中的集合-附PDF下载

    目录 1. 前言 2. List 2.1 fail-safe fail-fast知多少 2.1.1 Fail-fast Iterator 2.1.2 Fail-fast 的原理 2.1.3 Fail- ...

  3. C#与java中的集合区别

    集合一般的操作       插入: add       删除: remove       查找: contains,remove java中的集合 注意哪些是接口,哪些是实现类 使用集合的时候 1. ...

  4. (转)java中对集合对象list的几种循环访问总结

    Java集合的Stack.Queue.Map的遍历   在集合操作中,常常离不开对集合的遍历,对集合遍历一般来说一个foreach就搞定了,但是,对于Stack.Queue.Map类型的遍历,还是有一 ...

  5. java中的集合操作类(未完待续)

    申明: 实习生的肤浅理解,如发现有错误之处.还望大牛们多多指点 废话 事实上我写java的后台操作,我每次都会遇到一条语句:List<XXXXX> list = new ArrayList ...

  6. Java中的集合概述

    Java中的集合类有两个重要的分支,分别是接口Collection(包括List,Set等)和接口Map. 由于HashSet的内部实现原理使用了HashMap,所以我们先来了解Map集合类. 1.H ...

  7. Java中的集合框架(上)

    Java中的集合框架概述 集合的概念: Java中的集合类:是一种工具类,就像是容器,存储任意数量的具有共同属性的对象. 集合的作用: 1.在类的内部,对数据进行组织: 2.简单的快速的搜索大数据量的 ...

  8. Programming In Scala笔记-第十七章、Scala中的集合类型

    本章主要介绍Scala中的集合类型,主要包括:Array, ListBuffer, Arraybuffer, Set, Map和Tuple. 一.序列 序列类型的对象中包含多个按顺序排列好的元素,可以 ...

  9. JAVA中的集合容器操作类

    目录 JAVA中的集合容器操作类 List集合 ArrayList的操作方法说明 LinkedList Stack Set Map Queue 总结 JAVA中的集合容器操作类 Java容器类库总共分 ...

随机推荐

  1. libevent(九)evhttp

    用libevent构建一个http server非常方便,可参考libevent(六)http server. 主要涉及的一个结构体是evhttp: struct evhttp { /* Next v ...

  2. 《新版阿里巴巴Java开发手册》提到的三目运算符的空指针问题到底是个怎么回事?

    最近,阿里巴巴Java开发手册发布了最新版--泰山版,这个名字起的不错,一览众山小. 新版新增了30+规约,其中有一条规约引起了作者的关注,那就是手册中提到在三目运算符使用过程中,需要注意自动拆箱导致 ...

  3. 【Hadoop离线基础总结】Sqoop数据迁移

    目录 Sqoop介绍 概述 版本 Sqoop安装及使用 Sqoop安装 Sqoop数据导入 导入关系表到Hive已有表中 导入关系表到Hive(自动创建Hive表) 将关系表子集导入到HDFS中 sq ...

  4. Day_11【集合】扩展案例4_删除长度大于5的字符串,删除元素包含0-9数字的字符串

    分析以下需求,并用代码实现 1.定义ArrayList集合,存入多个字符串 如:"ab1" "123ad" "bca" "dadf ...

  5. 01-Taro打造hello-world应用

    01-Taro打造hello-world应用 一.简介 Taro是由京东凹凸实验室出品,书写一套代码通过 Taro 的编译工具,将源代码分别编译出可以在不同端(微信 / 京东 / 百度 / 支付宝 / ...

  6. Linux安装tomcat并部署JavaWeb项目

    前提条件: 安装tomcat前请确认一下信息: 系统安装了JDK,且JDK版本应与javaWeb所使用的JDK一致,具体操作可参见Linux下安装JDK. 打包了javaWeb的.war 文件,具体操 ...

  7. Oracle JDK究竟从哪个版本开始商用收费?

    经常被问到Oracle JDK是不是要钱了?收费了?从哪个版本开始商用收费? 木有错,Oracle JDK从2019年4月16号开始商用商用商用收费了!有图有真像: 2019年4月16日当天,Orac ...

  8. 云小课 | WAF反爬虫“三板斧”:轻松应对网站恶意爬虫

    描述:反爬虫是一个复杂的过程,针对爬虫常见的行为特征,WAF反爬虫三板斧——Robot检测(识别User-Agent).网站反爬虫(检查浏览器合法性)和CC攻击防护(限制访问频率)可以全方位帮您解决业 ...

  9. C:复试

    C语言程序设计基础知识 C语言特点 1.是一种兼有高级语言和汇编语言优点的语言 2.是一种结构化程序设计语言 3.数据类型丰富 4.具有丰富的运算符 5.具有预处理功能 合理算法的特点 1.有输入 2 ...

  10. Linux相关命令、虚拟机网络配置

    虚拟机联网 Linux命令 1.查找 #查找django进程,不包括grep自建的 ps -ef |grep django | grep -v grep # find 查找home目录下的name.t ...