2. 使用泛型举例
自从JDK5.0引入泛型的概念之后,对之前核心类库中的API做了很大的修改,例如:JDK5.0改写了集合框架中的全部接口和类、java.lang.Comparable接口、java.util.Comparator接口、Class类等。为这些接口、类增加了泛型支持,从而可以在声明变量、创建对象时传入类型实参。
2.1 集合中使用泛型
2.1.1 举例
集合中没有使用泛型时:
集合中使用泛型时:
ava泛型可以保证如果程序在编译时没有发出警告,运行时就不会产生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
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);
}}
2.1.2 练习
练习1:
(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;
import java.util.function.Predicate;public class TestNumber {
public static void main(String[] args) {
ArrayList<Integer> coll = new ArrayList<Integer>();
Random random = new Random();
for (int i = 1; i <= 5 ; i++) {
coll.add(random.nextInt(100));
}System.out.println("coll中5个随机数是:");
for (Integer integer : coll) {
System.out.println(integer);
}
//方式1:使用集合的removeIf方法删除偶数
coll.removeIf(new Predicate<Integer>() {
@Override
public boolean test(Integer integer) {
return integer % 2 == 0;
}
});
//方式2:调用Iterator接口的remove()方法
//Iterator<Integer> iterator1 = coll.iterator();
//while(coll.hasNext()){
// Integer i = coll.next();
// if(i % 2 == 0){
// coll.remove();
// }
//}System.out.println("coll中删除偶数后:");
Iterator<Integer> iterator = coll.iterator();
while(iterator.hasNext()){
Integer number = iterator.next();
System.out.println(number);
}}
}
练习2:编写一个简单的同学通迅录
需求说明:
-
查询所有通讯录的同学信息。
-
输入姓名,根据姓名查询指定同学信息。如果该姓名不存在,输出提示信息。
-
添加同学,姓名重复的不能添加。
-
根据学员姓名删除学员。
-
按姓名排序查询学员。
分析:
-
使用HashMap<K,V>存储同学信息,使用同学姓名做key,同学对象做value。
-
同学对象包含的属性有:姓名、年龄、住址、爱好等。