举例1:
集合类在设计阶段/声明阶段不能确定这个容器到底实际存的是什么类型的对象,所以在JDK5.0之前只能
把元素类型设计为Object,JDK5.0时Java引入了“参数化类型(Parameterized type)”的概念,允许
我们在创建集合时指定集合元素的类型。比如: List<String> ,这表明该List只能保存字符串类型的对
象。
使用集合存储数据时,除了元素的类型不确定,其他部分是确定的(例如关于这个元素如何保存,如何
管理等)。
举例2:
java.lang.Comparable 接口和 java.util.Comparator 接口,是用于比较对象大小的接口。这两个接
口只是限定了当一个对象大于另一个对象时返回正整数,小于返回负整数,等于返回0,但是并不确定是
什么类型的对象比较大小。JDK5.0之前只能用Object类型表示,使用时既麻烦又不安全,因此 JDK5.0 给
它们增加了泛型。
其中 <T> 就是类型参数,即泛型。
所谓泛型,就是允许在定义类、接口时通过一个 标识 表示类中某个 属性的类型 或者是某个方法的
返回值或参数的类型 。这个类型参数将在使用时(例如,继承或实现这个接口、创建对象或调用方
法时)确定(即传入实际的类型参数,也称为类型实参)。
2. 使用泛型举例
自从JDK5.0引入泛型的概念之后,对之前核心类库中的API做了很大的修改,例如:JDK5.0改写了集合框
架中的全部接口和类、java.lang.Comparable接口、java.util.Comparator接口、Class类等。为这些接
口、类增加了泛型支持,从而可以在声明变量、创建对象时传入类型实参。
2.1 集合中使用泛型
2.1.1 举例
集合中没有使用泛型时:
集合中使用泛型时:
Java泛型可以保证如果程序在编译时没有发出警告,运行时就不会产生ClassCastException异常。
即,把不安全的因素在编译期间就排除了,而不是运行期;既然通过了编译,那么类型一定是符合
要求的,就避免了类型转换。
同时,代码更加简洁、健壮。
把一个集合中的内容限制为一个特定的数据类型,这就是generic背后的核心思想。
举例:
举例:
//泛型在List中的使用
@Test
public void test1(){
//举例:将学生成绩保存在ArrayList中
//标准写法:
//ArrayList<Integer> list = new ArrayList<Integer>();
//jdk7的新特性:类型推断
ArrayList<Integer> list = new ArrayList<>();
list.add(56); //自动装箱
list.add(76);
list.add(88);
list.add(89);
//当添加非Integer类型数据时,编译不通过
//list.add("Tom");//编译报错
Iterator<Integer> iterator = list.iterator();
while(iterator.hasNext()){
//不需要强转,直接可以获取添加时的元素的数据类型
Integer score = iterator.next();
System.out.println(score);
}
}
//泛型在Map中的使用
@Test
2.1.2 练习
练习1:
public void test2(){
HashMap<String,Integer> map = new HashMap<>();
map.put("Tom",67);
map.put("Jim",56);
map.put("Rose",88);
//编译不通过
// map.put(67,"Jack");
//遍历key集
Set<String> keySet = map.keySet();
for(String str:keySet){
System.out.println(str);
}
//遍历value集
Collection<Integer> values = map.values();
Iterator<Integer> iterator = values.iterator();
while(iterator.hasNext()){
Integer value = iterator.next();
System.out.println(value);
}
//遍历entry集
Set<Map.Entry<String, Integer>> entrySet = map.entrySet();
Iterator<Map.Entry<String, Integer>> iterator1 = entrySet.iterator();
while(iterator1.hasNext()){
Map.Entry<String, Integer> entry = iterator1.next();
String key = entry.getKey();
Integer value = entry.getValue();
System.out.println(key + ":" + value);
}
}
(1)创建一个ArrayList集合对象,并指定泛型为<Integer>
(2)添加5个[0,100)以内的整数到集合中
(3)使用foreach遍历输出5个整数
(4)使用集合的removeIf方法删除偶数,为Predicate接口指定泛型<Ineteger>
(5)再使用Iterator迭代器输出剩下的元素,为Iterator接口指定泛型<Integer>
package com.atguigu.genericclass.use;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.Random;