java的集合和泛型

为什么要用集合框架

Java 集合框架支持两种类型的容器:一种是为了存储一个元素集合,简称为集合(collection);另一种是为了存储键/值对,称为映射(map,或称图)。

在前面章节介绍面向对象时,我们使用的“租车系统”如果想存放多个轿车的数据,该如何实现呢?以大家现有的知识储备,使用数组解决这个问题是最合理的方式。但是使用数组存放“租车系统”中多个轿车的信息,也会存在很多问题。

首先,Java 语言中的数组长度是固定的,一旦创建出指定长度的数组以后,就给内存分配了相应的存储空间。但数组的长度应该设置为多少合适呢?如果数组长度设置小了,不能满足程序需求,并且容易造成数组越界等异常的发生;如果数组长度设置大了,又会造成空间浪费。

其次,如果使用长度为 20 的轿车对象数组来存放轿车的信息,但是实际上只存放了 8 辆轿车的信息,不但会造成内存空间的浪费,也无法通过数组对象直接的获取真实存放轿车的数量。因为数组提供的 length 属性是获取数组的长度,而不是数组中实际存放有用信息的个数。

最后,数组元素在内存空间中是连续存放的,这样如果在数组中删除一个元素,为了保持数组内数据元素的连续性,被删除之后的数组元素全部要前移一位,但这种元素的移动是比较消耗系统资源的。

通过上面的分析可以看出,使用数组虽然可以实现“租车系统”中的部分功能,但会有诸多的麻烦。为了解决这个问题,Java 语言提供了集合这种类型。集合是一种逻辑结构,提供了若干的实用方法,方便使用者对一组数据进行操作。针对不同的需求,Java 也提供了不同的集合。

collection接口

前面提到,集合可以分为 Collection 和 Map 两类,现在开始学习 Collection。Collection 是一个顶层接口,一些 Collection 接口的实现类允许有重复的元素,而另一些则不允许;一些 Collection 是有序的,而另一些则是无序的。

JDK 不提供 Collection 接口的任何直接实现类,而是提供了更具体的子接口,如 Set 接口和 List 接口。这些子接口继承 Collection 接口的方法,然后再对 Collection 接口从不同角度进行重写或扩充。Collection 接口框架如图所示。

图片描述

从图中可以看出,Collection 接口主要有三个子接口,分别是 Set 接口、List 接口和 Queue 接口,下面简要介绍这三个接口。

Set 接口

Set 实例用于存储一组不重复的元素。

List 接口

List 实例是一个有序集合。程序员可对 List 中每个元素的位置进行精确控制,可以根据索引来访问元素,此外 List 中的元素是可以重复的。

Queue 接口

Queue 中的元素遵循先进先出的规则,是对数据结构“队列”的实现。

map接口

Map 接口定义了存储和操作一组“键(key)值(value)”映射对的方法。

Map 接口和 Collection 接口的本质区别在于,Collection 接口里存放的是一系列单值对象,而 Map 接口里存放的是一系列key-value 对对象。Map 中的 key 不能重复,每个 key 最多只能映射到一个值。Map 接口框架如图所示。

图片描述

从图中可以看出,HashMap 和 Hashtable ,TreeMap是 Map 接口的实现类

以上,我们对单值集合的顶层接口 Collection 和键值对集合的顶层接口 Map 做了简要的介绍,接下来的小节会逐步介绍它们的一些重要实现类。
/
/
/
/
/
/
/
/
/

泛型

在之前使用集合的时候,装入集合的各种类型的元素都被当作 Object 对待,而非元素自身的类型。因此从集合中取出某个元素时,就需要进行类型转换,这种做法效率低下且容易出错。如何解决这个问题?可以使用泛型。

泛型是指在定义集合的同时也定义集合中元素的类型,需要“< >”进行指定,其语法形式如下。

集合<数据类型> 引用名 = new 集合实现类<数据类型> ();

需要注意,使用泛型约束的数据类型必须是对象类型,而不能是基本数据类型。如下就限制了 List 集合中只能存放 String 类型的元素。

List<String> list = new ArrayList<String>();

在 JDK1.7 之后,=右边< >中的的 String 等类型也可以省略,例如以上代码可以写成以下的等价形式。

List<String> list = new ArrayList<>();

在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值