泛型
泛型:标签
如生活中中药店,每个抽屉外面贴着标签
为什么要有泛型
- 解决元素存储的安全性问题,好比商品、药品标签,不会弄错
- 解决获取数据元素时,需要类型强制转换的问题,好比不用每回拿商品、药 品都要辨别。
Jdk1.5改写了集合框架中的全部接口和类,为这些接口,类增加了泛型,从而可以在声明集合变量,创建集合对象时传入泛型实参。
在集合中使用泛型
1.集合接口或集合类在jdk 5.0时都修改为带泛型的结构
2.在实例化集合类时,可以指明具体的泛型类型
3.指明完以后,内部结构(比如:方法,构造器,属性等)使用泛型的位置,都指定为实例化的泛型类型。
4.注意点:泛型的类型必须是类(如Integer,String等),不能是基本数据类型。需要用到基本数据类型的位置,拿包装类替换
如果实例化时,没有指明泛型的类型。默认类型为Object类型
public class GenericTest {
//在集合中使用泛型之前的情况
@Test
public void test1(){
//需求:存放学生成绩
ArrayList list=new ArrayList();
list.add(35);
list.add(89);
list.add(66);
list.add(90);
//问题一:类型不安全
list.add("Tom"); //混进非学生类型的数据
//增强for循环,遍历输出
for(Object score:list){
//问题二:强转时,可能出现ClassCastException报错,"Tom"不能转换成Integer
int stuScore=(Integer) score; //Object类型转换成Integer类型,Integer自动拆箱变成int类型
System.out.println(stuScore);
}
}
//在集合中使用泛型的情况:以ArrayList为例
@Test
public void test2(){
//实例化泛型类,泛型不能是基本数据类型
ArrayList<Integer> list = new ArrayList<Integer>();
list.add(89);
list.add(53);
list.add(79);
list.add(35);
//编译时,就会进行类型检查,保证数据安全
// list.add("TOm");
//方式一:
// for (Integer score:list){
//避免了类型强制转换
// int stuscore=score;
// System.out.println(stuscore);
// }
//方式二:
//迭代器
Iterator<Integer> iterator = list.iterator();
while(iterator.hasNext()){
int stuscore=iterator.next();
System.out.println(stuscore);
}
}
//在集合中使用泛型的情况,以HashMap为例
@Test
public void test3(){
// Map<String,Integer> map=new HashMap<String,Integer>();
//jdk 7 新特性:类型推断
Map<String,Integer> map=new HashMap<>();
map.put("Tom",89);
map.put("Jerry",89);
map.put("jack",43);
//泛型嵌套
Set<Map.Entry<String,Integer>> entry=map.entrySet(); //Entry接口是Map接口的内部接口
Iterator<Map.Entry<String,Integer>> iterator=entry.iterator();
while(iterator.hasNext()){
Map.Entry<String,Integer> e=iterator.next();
String key=e