集合框架和泛型

1,认识集合
开发应用程序时,可以使用数组来存储多个同类型的数据,但是有以下缺陷:
(1),数组长度固定不变,不能很好的适应元素数量动态变化的情况
(2),可通过数组名.length获取数组的长度,却无法直接获取数组中实际存储的元素个数
(3),数组采用在内存中分配连续空间的存储方式存储,根据元素信息查找时效率比较低,需要多次比较
针对数组的缺陷,Java提供了比数组更灵活,更实用的集合框架,可大大提高软件的开发效率,并且不同的集合可适用于不同应用场合
Java集合框架提供了一套性能优良,使用方便的接口和类,它们都位于java.util包中,Java的集合类主要由Map接口和Collection接口派生而来,其中Collection接口有两个常用的子接口即List接口和Set接口
2,List接口
Collection接口是最基本的集合接口,可以存储一组不唯一,无序的对象,List接口继承自Collection接口,可以存储一组不唯一,有序的对象
List接口常用的实现类有ArrayList和LinkedList
1,使用ArrayList类动态存储数据
ArrayList集合类对数组进行了封装,实现了长度可变,并且和数组采用相同的存储方式,而且ArrayList集合中可以添加任何类型的数据,添加的数据都将转换成Object类型
注意:
(1),调用ArrayList类的add(Object obj)方法时,添加到集合当中的数据将被转换为Object类型
(2),使用ArrayList类之前,需要导入相应的接口和类,代码如下:
import java.util.ArrayList;
import java.util.List;
ArrayList集合因为可以使用索引来直接获取元素,所以其优点是遍历元素和随机访问元素的效率比较高,但在添加和删除非尾部元素时性能低下,效率比较低
2,使用LinkedList类动态存储数据
LinkedList类是List接口的链接列表实现类,它支持实现所有List接口可选的列表的操作,并且允许元素值是任何数据,包括null
LinkedList类采用链表存储方式存储数据,优点在于插入,删除元素时效率比较高,但查找效率很低
3,Set接口
Set接口是Collection接口的另外一个常用子接口,可以存储一组唯一,无序的对象
Set接口常用的实现类有HashSet
使用HashSet类动态存储数据,HashSet集合的特点:
(1),集合内的元素是无序排列的
(2)HashSet类是非线程安全的
(3)允许集合元素值为null
注意:
使用HashSet类之前,需要导入相应的接口和类,代码如下:
import java.util.HashSet;
import java.util.Set;
4,Iterator接口
Iterator接口表示对集合进行迭代的迭代器,Iterator接口为集合而生,专门实现集合的遍历,此接口的主要方法:
(1),hasNext():判断是否存在下一个可访问的元素,如果仍有元素可以迭代,则返回true
(2),next():返回要访问的下一个元素
凡是由Collection接口派生而来的接口或者类,都实现了iterate()方法,iterate()方法返回一个Iterator对象
5,Map接口
Map接口存储一组成对的键(key)——值(value)对象,提供key到value的映射,通过key来检索,Map接口中的key不要求有序,不允许重复,value同样不要求有序,但允许重复
Map接口中存储的数据都是键——值对,最常用的Map实现类是HashMap,优点是查询指定元素效率高
注意:
(1),数据添加到HashMap集合后,所有数据的数据类型将转换为Object类型,所以从其中获取数据时需要进行强制类型转换
(2),HashMap类不保证映射的顺序,特别是不保证顺序恒久不变
6,Collections类
Collections类是Java提供的一个集合操作工具类,它包含了大量的静态方法,用于实现对集合元素的排序,查找和替换等操作
注意:
Collections和Collection的区别:前者是集合的操作类,后者是集合接口
在Java中,如果想实现一个类的对象之间比较大小,那么这个类就要实现Comparable接口,此接口强行对实现它的每个类的对象进行整体排序,这种排序被称为类的自然排序,类的compareTo()方法被称为它的自然比较方法,此方法用于比较此对象与指定对象的顺序
compareTo()方法的定义语法格式:
int compareTo(Object obj);
其中:
(1),参数:obj既要比较的对象
(2),返回值:负整数,零或正整数,根据此对象是小于,等于还是大于指定对象返回不同的值
实现此接口的对象列表(和数组)可以通过Collections.sort()方法(和Arrays.sort()方法)进行自动排序
元素之间可以比较大小之后,就可以使用Collections类的sort()方法对元素进行排序操作,Map接口本身是无序的,所以不能对Map接口做排序操作,但List接口是有序的,所以可以对List接口进行排序,注意List接口中存放的元素,必须是实现了Comparable接口的元素才可以
替换集合元素:需要把一个List集合中的所有元素都替换为相同的元素,可以使用Collections类的静态方法fill()来实现
7,认识泛型
1,泛型的定义
将对象的类型作为参数,指定到其他类或者方法上,从而保证类型转换的安全性和稳定性,这就是泛型,泛型的本质就是参数化类型
泛型的定义语法格式:类1或者接口<类型实参>对象 = new 类2<类型实参>();
注意:
首先,“类2”可以是“类1”本身,可以是“类1”的子类,还可以是接口的实现类,其次,“类2”的类型实参必须与“类1”中的类型实参相同
2,泛型在集合中的应用
使用泛型集合在创建集合对象时指定集合中元素的类型,从集合中取出元素时无需进行强制类型转换,并且如果把非指定类型对象放入集合,会出现编译错误
List和ArrayList的泛型形式是List和ArrayList,Map和HashMap的泛型形式是Map<K.V>和HashMap<K.V>
泛型使集合的使用更方便,也提升了安全:
(1),存储数据时进行严格类型检查,确保只有合适类型的对象才能存储在集合中
(2),从集合中检索对象时,减少了强制类型转换
3,深入泛型
泛型的本质就是参数化类型,参数化类型的重要性在于允许创建一些类,接口和方法,其所操作的数据类型被定义为参数,可以在真正使用时指定具体的类型
学习泛型之前,需要了解的概念:
(1),参数化类型:参数化类型包含一个类或者接口,以及实际的类型参数列表
(2),类型变量:是一种非限定性标识符,用来指定类,接口或者方法的类型
泛型类就是具有一个或者多个类型参数的类
语法格式:访问修饰符class className
TypeList表示类型参数列表,每个类型变量之间以逗号分隔
泛型接口就是拥有一个或者多个类型参数的接口
语法格式:访问修饰符 interface interfaceName
泛型方法实际上就是带有类型参数的方法,可以简化代码,提高代码重用性,无论是泛型类还是非泛型类,如果需要就可以定义泛型方法
语法格式:访问修饰符<类型参数>返回值 方法名(类型参数列表)
注意:在泛型方法中,类型变量放置在访问修饰符与返回值之间
面对对象的特性同样适用于泛型类,所以泛型类也可以继承,不过,继承了泛型类的子类,必须也是泛型类
语法格式:class 子类extends父类{}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值