当前位置: 首页 > news >正文

Java泛型01:什么是泛型?

文章目录

        • 一、泛型的概念
        • 二、集合中没有泛型的时候
        • 三、集合中有泛型的时候
        • 四、总结

一、泛型的概念

  • 所谓泛型,就是允许在定义类、接口时通过一个标识表示类中某个属性的类 型或者是某个方法的返回值及参数类型。这个类型参数将在使用时(例如, 继承或实现这个接口,用这个类型声明变量、创建对象时)确定(即传入实 际的类型参数,也称为类型实参)。
  • 从JDK1.5以后,Java引入了“参数化类型(Parameterized type)”的概念, 允许我们在创建集合时再指定集合元素的类型,正如:List,这表明 该List只能保存字符串类型的对象。
  • JDK1.5改写了集合框架中的全部接口和类,为这些接口、类增加了泛型支持, 从而可以在声明集合变量、创建集合对象时传入类型实参。

⭕️:那么为什么要有泛型呢,直接Object不是也可以存储数据吗?

  1. 解决元素存储的安全性问题,好比商品、药品标签,不会弄错。
  2. 解决获取数据元素时,需要类型强制转换的问题,好比不用每回拿商品、药 品都要辨别。

二、集合中没有泛型的时候

在这里插入图片描述

代码举例:

1.以ArrayList为例:

//在集合中使用泛型之前的情况
@Test
public void test1(){
    ArrayList list = new ArrayList();
    //存放学生的成绩
    list.add(12);
    list.add(13);
    list.add(14);
    list.add(15);

    list.add("金士曼");
    //问题一:类型不安全

    for (Object obj:list) {
        //问题二:强转时,可能出现异常:ClassCastException
        int score=(Integer) obj;//因为添加的是学生成绩所以需要int型
        System.out.println(score);

    }
}

三、集合中有泛型的时候

在这里插入图片描述

注意:使用泛型的时候,这个泛型是一个类型,不能是基本数据类型,可以是它的包装类

包装类:Java中什么是包装类?包装类与基本数据类型如何转换?

代码:

1.以ArrayList为例

@Test
    public void test2(){
        ArrayList<Integer> list = new ArrayList<Integer>();
        //此时泛型写的Integer,再去调用add方法的时候,如果放别的类型,编译就过不了了
        list.add(32);
        list.add(1232);
        list.add(2);
        list.add(323);
        //编译时进行类型检查
//        list.add("123");
        //方式一:增强for循环
        for(Integer score:list){
            //避免了强转操作
            int stuScore=score;
            System.out.println(stuScore);
        }
        //方式二:迭代器
        Iterator<Integer> iterator = list.iterator();
        while (iterator.hasNext()){
            System.out.println(iterator.next());
        }
    }

2.以HashMap为例

@Test
public void test3(){
    HashMap<String , Integer> map = new HashMap<String, Integer>();
    map.put("Tom",98);
    map.put("Jack",89);
    map.put("Jerry",69);
    //一样的,放泛型以外的类型编译不会过

    //泛型的嵌套
    //这里Entry前面的Map点是因为他是内部类,如果要省可以导包(import java.util.Map.*;)之和就可以不写
    Set<Map.Entry<String , Integer>> entry = map.entrySet();

    //遍历
    Iterator<Map.Entry<String, Integer>> iterator = entry.iterator();
    while (iterator.hasNext()){
        Map.Entry<String, Integer> e = iterator.next();
        String key = e.getKey();
        Integer value = e.getValue();
        System.out.println(key+"---"+value);
    }


}

四、总结

  1. 集合接口或集合类接口在jdk5.0之和都修改为带泛型的结果

  2. 在实例化集合类时,可以指明具体的泛型的类型(注意:泛型是类型,不是变量名)

  3. 指明完以后,在集合类或集合接口时,内部结构使用到类的泛型的位置,都指定为实例化时泛型的类型,

    比如:add(E e)—>实例化后:add(Object e)

  4. 注意点:泛型的类型必须是一个类,不能是基本数据类型,需要用到基本数据类型的时候用包装类替换

  5. 如果实例化时没有指明泛型的类型,我们默认类型为java.long.Object

  6. Java泛型可以保证如果程序在编译时没有发出警告,运行时就不会产生 ClassCastException异常。同时,代码更加简洁、健壮。

相关文章:

  • 网站怎么维护更新/引流推广方法
  • 建设教育协会培训网站/营销培训总结
  • 迁安做网站哪家好/杭州seo联盟
  • 网站源码搭建教程/郑州网站推广公司排名
  • 贵阳企业做网站开发/网站提交入口大全
  • 自己做的网站地址手机怎么打不开/全媒体运营师报名入口
  • 【Python】for/else、列表的创建、查询、删除、修改、排序、列表生成式
  • 基于技能优化算法的函数寻优算法
  • MySql(25)索引及索引优缺点
  • 【C++】哈希应用
  • 【3D建模制作技巧分享】Maya制作骑自行车的女孩模型
  • 《一个月冲刺祥云杯》(2)需要的html典例以及PHP基础
  • Spring学习阶段性总结
  • CET4之翻译
  • 简单了解泛型和包装类
  • 串口使用系列学习之什么是流控
  • centos7安装docker
  • 前端基石:构造函数和普通函数