Java 集合框架之泛型
JDK 1.5 以后出现的安全机制,提高了编译时期的安全性.
泛型出现的好处:
- 将运行时期的问题 ClassCastException 转到了编译时期
- 避免了强制转换的麻烦
泛型出现的原因:
public static void main(String[] args){
ArrayList al = new ArrayList();
al.add("abc");
al.add("xyz");
al.add(4); // 此处存入的为 Integer 类型
Iterator it = al.iterator();
while(it.hasNext()){
String str = (String)it.next(); // 运行时,出现 ClassCastException 异常
System.out.println(str);
}
}
// 泛型
public static void main(String[] args){
// 在定义集合时, 声明要存储元素的类型
ArrayList<String> al = new ArrayList<String>();
al.add("abc");
al.add("xyz");
al.add(4); // 编译时期,会报错
Iterator<String> it = al.iterator();
while(it.hasNext()){
String str = it.next(); // 使用泛型之后,此处不需要强转
System.out.println(str);
}
}
泛型什么时候使用?
- 当操作的引用数据类型不确定的时候, 就使用<>, 将要操作的引用数据类型传入即可.
其实 <> 就是一个用于接收具体引用数据类型的参数范围. - 在程序中, 只要使用到了带有 <> 的类或者接口, 就要明确传入的具体引用数据类型
- 当操作的引用数据类型不确定的时候, 就使用<>, 将要操作的引用数据类型传入即可.
泛型的擦除和补偿
- 擦除: 程序运行时,会将泛型去掉, 即生成的 class 文件中是不带泛型的. 为了兼容运行时的类加载器.
- 补偿: 程序运行时, 类加载器通过 getClass() 方法获取元素的类型,自动进行转换动作, 不需要使用者在强制转换.
通配符
// 通配符 ?
public static void main(String[] args){
ArrayList<String> al = new ArrayList();
al.add("abc");
al.add("dfd");
HashSet<String> hs = new HashSet();
hs.add("gfj");
hs.add("ert");
printCollection(al);
printCollection(hs);
}
// 迭代并打印集合中的元素,
// 不同的集合均可使用父接口 Collection 接收,提高扩展性
public static void printCollection(Collection<String> al){
Iterator<String> it = al.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
}
// 通配符的使用
public static void main(String[] args){
ArrayList<String> al = new ArrayList();
al.add("abc");
al.add("wew");
ArrayList<Integer> al2 = new ArrayList();
al2.add(3);
al2.add(4);
printCollection(al);
printCollection(al2);
}
// ? 通配符, 也可以理解为占位符,代表未知类型.
// 提高程序扩展性
public static void printCollection(Collection<?> al){
Iterator<?> it = al.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
// 或者 泛型定义在方法上, 类型为 T, 注意使用时,需要先在修饰符 static 后面声明
public static <T> void printCollection(Collection<T> al){
Iterator<T> it = al.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
}
}
- 泛型的限定
- 向上限定:
? extends E, 可以接收 E 类型或者 E 类型的子类型
一般存储元素的时候都是用上限,因为这样取出都是按照上限类型来运算, 不会出现类型隐患.
例如 Collection 接口中的boolean addAll(Collection<? extends E> c)方法 - 向下限定:
? super E, 可以接收 E 类型或者 E 类型的父类型.
通常对集合中的元素进行取出操作时,可以使用下限
例如 TreeSet 构造方法TreeSet(Comparator<? super E> comparator)
- 向上限定:
// 向上限定, Student 和 Worder 对象都继承自 Person
public static void main(String[] args){
ArrayList<Worker> al = new ArrayList<Worker>();
al.add(new Worker("wangcai",32));
al.add(new Worker("lisi",24));
ArrayList<Student> al2 = new ArrayList<Student>();
al2.add(new Student("zhangsan",11));
al2.add(new Student("zhaoliu",26));
printCollection(al);
printCollection(al2);
}
// 只打印 Person 对象的子类
public static void printColletion(Collection<? extends Person> al){
Iterator<? extends Person> it = al.iterator();
while(it.hasNext()){
// System.out.println(it.next());
Person p = it.next(); // 因为存入的都是 Person 对象的子类, 所以多态
System.out.println(p.getName()+"..."+p.getAge());
}
}
_参考资料_
- [JavaSE 基础视频(毕向东)](https://www.bilibili.com/video/av3120256/#page=9)
- [JDK 1.6 中文文档](http://tool.oschina.net/apidocs/apidoc?api=jdk-zh)
Java 集合框架之泛型的更多相关文章
- JAVA基础--JAVA 集合框架(泛型、file类)16
一.集合总结 集合:Collection体系.Map体系. Collection体系:单列集合的共性操作规则. List:列表,可以重复,有下标,拥有特有的迭代器ListIterator. Array ...
- JAVA基础--JAVA 集合框架(泛型、file类)
一.集合总结 集合:Collection体系.Map体系. Collection体系:单列集合的共性操作规则. List:列表,可以重复,有下标,拥有特有的迭代器ListIterator. Array ...
- Java高级特性 第1节 集合框架和泛型
Java中,存储多个同类型的数据,可以用数组来实现,但数组有一些缺陷: 数组长度固定不变,布恩那个很好的适应元素数量动态变化的情况 可以通过数组.length获取数组长度,却无法直接获取数组中实际存储 ...
- 一起学 Java集合框架、数据结构、泛型
一.Java 集合框架 集合框架是一个用来代表和操纵集合的统一架构.所有的集合框架都包含如下内容: 接口:是代表集合的抽象数据类型.接口允许集合独立操纵其代表的细节.在面向对象的语言,接口通常形成一个 ...
- (Collection, List, 泛型)JAVA集合框架一
Java集合框架部分细节总结一 Collection List 有序,有下标,元素可重复 Set 无序,无下标,元素不可重复 以上为Collection接口 以ArrayList为实现类实现遍历:增强 ...
- Java集合框架(常用类) JCF
Java集合框架(常用类) JCF 为了实现某一目的或功能而预先设计好一系列封装好的具有继承关系或实现关系类的接口: 集合的由来: 特点:元素类型可以不同,集合长度可变,空间不固定: 管理集合类和接口 ...
- Java集合框架的总结
本篇文章先从整体介绍了Java集合框架包含的接口和类,然后总结了集合框架中的一些基本知识和关键点,并结合实例进行简单分析.当我们把一个对象放入集合中后,系统会把所有集合元素都当成Object类的实例进 ...
- 【JAVA集合框架之工具类】
一.概述 JAVA集合框架中有两个很重要的工具类,一个是Collections,另一个是Arrays.分别封装了对集合的操作方法和对数组的操作方法,这些操作方法使得程序员的开发更加高效. public ...
- 【JAVA集合框架之Map】
一.概述.1.Map是一种接口,在JAVA集合框架中是以一种非常重要的集合.2.Map一次添加一对元素,所以又称为“双列集合”(Collection一次添加一个元素,所以又称为“单列集合”)3.Map ...
随机推荐
- Error: Could not find or load main class org.apache.flume.tools.GetJavaProperty
问题: [root@master conf]# flume-ng version Error: Could not find or load main class org.apache.flume.t ...
- 何为优秀的机器学习特征 zz
提供好的特征是机器学习任务中最重要的工作,那么何为优秀的机器学习特征?以及如何高效地组合这些特征? 以二分类问题为例,好的特征具有很好的区分性.例如学习任务是区分两种不同类型的狗:灰猎犬(Greyho ...
- Unity中差乘判断目标是否在左边或右边
使用差乘判断左右一般是比较差乘的y,小于0是左,大于0是右.特殊情况可以用其他分量来比较 默认情况: var cross = Vector3.Cross(lhsObject.transform.pos ...
- AAtitit.随时间变色特效 ---包厢管理系统的规划titit.随
Atitit.随时间变色特效 ---包厢管理系统的规划 1 流程滴定仪 定义的参数 颜色.位置(开始值,结束值,当前比值) >>返回数值 可以后期处理转成双位16进制码 分别定义复合颜色的 ...
- 利用C#的指针编写都一个简单链表
using System; namespace UnsafeTest { unsafe struct link { public int x; public link* next; } class P ...
- 【c#】装箱与拆箱
从内存执行的角度来看,值类型的内存分配在线程的堆栈上,而引用类型的内存分配在托管堆上.因此从值类型向引用类型的转换,势必牵涉到数据的拷贝与指针引用等操作. 装箱操作,大致过程为:在托管堆中分配新对象的 ...
- 基于Java语言开发jt808、jt809技术文章精华索引
很多技术开发人员喜欢追逐最新的技术,如Node.js, go等语言,这些语言只是解决了某一个方面,如只是擅长异步高并发等等,却在企业管理后台开发方面提供的支持非常不够,造成项目团队技术选项失败,开发后 ...
- RabbitMQ系列一
1.http://www.erlang.org/downloads 下载一个比教新的版本(otp_win64_20.2.exe) 2.http://www.rabbitmq.com/install-w ...
- vim搜索设置高亮
vim搜索设置高亮 linux vim打开文档搜索字符串时,设置被搜索到字符串高亮显示. 有两种方法: 1.暂时设置:vim打开文档-->命令行形式输入set hlsearch. 缺点:关闭文档 ...
- Linux上安装Nginx及常用命令
一.Linux安装软件常用方法 1.rpm(或pkg)安装,类似于Windows安装程序,是预编译好的程序. 1)使用的是通用参数编译,配置参数不是最佳 2)可控制性不强,比如对程序特定组件的定制性安 ...