写在前面:
视频是什么东西,有看文档精彩吗?
视频是什么东西,有看文档速度快吗?
视频是什么东西,有看文档效率高吗?
问题
张小飞:虽然用集合存储数据很方便,但是每次取出来都是 Object 类型的,还得转换类型,很麻烦啊
public static void main(String[] args) throws Exception {
ArrayList list = new ArrayList();
//可以添加不同类型的数据
list.add(123);//123会自动装箱成Integer
list.add("456");
for (int i = 0; i < list.size(); i++) {
//每次从集合中取出来的都是 Object 类型的对象
Object o = list.get(i);
System.out.println(o);
}
}
诸小亮:这是因为我们在定义集合的时候没有限制元素的类型,所以不同类型的数据都可以添加进去,
导致取出来的数据类型可能不一致,为了避免错误,所以都返回 Object 类型
张小飞:还可以限制存储的元素类型?
诸小亮:是的,Java推荐在定义集合的时候就限制元素的类型
张小飞:应该怎么做呢?
诸小亮:很简单,只需要在定义集合的时候在后面加上尖括号,并指定元素的类型就行了。
比如,如果我们想要定义一个只能存储 String 的的 ArrayList,就可以这样写:
诸小亮:在使用 get 方法时,就不用强制类型转换了
张小飞:嗯,这样确实不错,不过,就是不存存储其他类型的数据了
诸小亮:你说的不错,但是它的好处也是很多的
首先在编译时期就限制了集合中元素的类型,避免了数据杂乱,提高了程序的健壮性;
其次,取出来的元素都是我们指定的类型,可以直接使用,不需要再进行类型转换,更加方便快捷
泛型介绍
张小飞:所有的集合类,List、Set等,它们都支持限定元素类型吗?
诸小亮:是的,其根本原因是,Collection 接口支持泛型
张小飞:泛型?这是什么东西?
诸小亮:上图中的 E 就是 **泛型,**可以把它当成参数类型
张小飞:不懂,能否在详细一点儿?
诸小亮:就是表示,该类的对象只能操作 **E **类型的数据
张小飞:那,E 类型具体是什么类型呢?String、Integer、Double还是Long
诸小亮:具体是什么类型,在创建对象时候由我们自己指定,比如:
泛型:泛指一些类型(不具体),需要自己指定具体是哪种类型
集合框架中的泛型
诸小亮:来,我们看看集合框架中具体是怎么使用泛型的
迭代器
诸小亮:首先是迭代器,之前我们用 Iterator 取出来的都是 Object 类型
张小飞:现在也是啊,就算我用了泛型,返回的还是 Object 类型
诸小亮:这是因为你没有给 Iterator 指定泛型
张小飞:原来如此,我再改改
30秒后。
张小飞:现在没有问题了,取出来的直接是指定的类型
Comparable
张小飞:我们之前实现 Comparable 后, compareTo 方法的参数都是Object,是不是也能用泛型?
诸小亮:是的,Comparable 也定义了泛型
张小飞:那,具体应该怎么用?
诸小亮:在实现 Comparable 时,指定具体的类型,比如:
张小飞:原来是这样