Java学习【深入探索包装类和泛型】

Java学习【深入探索包装类和泛型】

  • 🚀包装类
    • 获取包装类对象的方式
      • 使用valueOf()创建
      • 直接赋值
    • Integer成员方法
  • 🚀泛型
    • 引出泛型
    • 泛型类
    • 泛型方法
    • 泛型接口
    • 泛型的继承和通配符
      • 泛型的上界

在这里插入图片描述
在Java的学习中,包装类和泛型是两个重要的概念,它们不仅丰富了Java的数据类型,还提高了代码的可读性和安全性。下面,我们将深入探讨这两个主题。

🚀包装类

包装类是Java提供的一种特殊类,它们将Java的基本数据类型(如int、double、char等)封装成对象。这样做的好处是可以将基本数据类型作为对象来处理,使用对象所特有的属性和方法。

Java提供了8种基本数据类型的包装类:
Integer → int
Double → double
Byte → byte
Short → short
Long → long
Float → float
Character → char
Boolean → boolean

获取包装类对象的方式

使用valueOf()创建

以Integer为例,直接通过调用valueOf方法,把值传入到方法中

Integer i1 = Integer.valueOf(127);

下面看一个特殊的例子:

        Integer i1 = Integer.valueOf(127);
        Integer i2 = Integer.valueOf(127);
        System.out.println(i1 == i2); // true

        Integer i3 = Integer.valueOf(128);
        Integer i4 = Integer.valueOf(128);
        System.out.println(i3 == i4); // false

对于引用数据类型,因为" == " 是比较地址值的,i3 , i4不是同一个对象可以理解,但是为什么 i1 和 i2 是一样的呢?
在实际开发中,-128~127之间的数字用的比较多,为了节省内存,Java提前创建好了这些对象,用的时候直接调取,不会再创建新的对象

直接赋值

自动装箱和自动拆箱
当使用包装类的时候,该怎么去进行计算呢,首先要把对象转化为基本数据类型,再进行计算,再转化为引用数据类型,这样手动的去转化就非常麻烦,所以在JDK5的时候就出现了自动装箱和自动拆箱的机制
自动装箱:把基本数据类型变为对应的包装类
自动拆箱:把包装类转化为对应的基本数据类型

       //自动拆箱
        Integer i = 1;
        //自动装箱
        int j = i;
        System.out.println(i);
        System.out.println(j);
        System.out.println(i + j);

Integer成员方法

在这里插入图片描述
返回值为String类型

        //进制转换
        System.out.println(Integer.toBinaryString(10));//1010
        System.out.println(Integer.toOctalString(10));//12
        System.out.println(Integer.toHexString(10));//a

类型转换:

Integer i5 = Integer.parseInt("123");
        System.out.println(i5 + 1);

        Scanner sc = new Scanner(System.in);
        String s = sc.nextLine();//键盘录入一行,遇到空格不会停止
        System.out.println(s);
        System.out.println(Integer.parseInt(s) + 1);

除了 Character,都有对应的转换方法

🚀泛型

在Java编程中,泛型是一个强大的工具,它允许我们在编写代码时定义灵活的、可重用的结构,而无需关心具体的数据类型。

引出泛型

问题:实现一个类,类中包含一个数组成员,使得数组中可以存放任意类型的数据,也可以根据成员方法访问返回数组中下标的值
如果是任意类型的话,可以考虑Object,因为它是所有类型的父类,接着试着实现一下这个问题

class MyArray{
    private Object[] arr = new Object[10];

    public void set(int index,Object value){
        arr[index] = value;
    }
    public Object get(int index){
        return arr[index];
    }
}

public class Demo1 {
    public static void main(String[] args) {
        MyArray myArray = new MyArray();
        myArray.set(0,"AA");
        myArray.set(1,1);
        String s = (String) myArray.get(0);//因为返回的是Object类型,所以需要强制类型转换
        int i = (int)myArray.get(1);
        System.out.println(s+" "+i);
    }
}

上面的代码就实现了这个要求,但是此时发现一个弊端,如果数据过多的话就显得特别杂乱,各种类型都有,都需要强制类型转换
泛型的主要目的就是:指定当前容器要持有什么类型的对象,接着让编译器去检查类型,此时就是把类型作为参数传递,需要什么类型就传入什么类型
格式: <数据类型>
注意: 泛型只能支持引用数据类型

泛型的擦除:
类型擦除是Java编译器在编译泛型代码时的一个步骤。在编译过程中,编译器会将泛型信息从代码中擦除,并在需要的地方插入类型转换和类型检查代码。这样,运行时的字节码不包含任何泛型类型信息,只包含原始类型和必要的类型转换。

ArrayList<Integer> arrayList = new ArrayList<>();

例如在创建集合时,当数据真正的添加到集合里边的时候,集合还是会把它们当作Object类处理,只不过往外获取时会进行相应的强制类型转换

泛型类

当一个类中,某个变量的类型不确定,就可以定义带有泛型的类

格式:
修饰符 class 类名 <类型>{
}

class MyArray <E>{
    private Object[] arr = new Object[10];

    public void set(int index,E value){
        arr[index] = value;
    }
    public E get(int index){
        return (E) arr[index];//
    }
}

public class Demo1 {
    public static void main(String[] args) {
        MyArray<Integer> myArray = new MyArray<>(); //已经确定好类型了
        //myArray.set(0,"Str");  自动类型检查,要与上面的类型一致
        myArray.set(0,1);
        int i = myArray.get(0);
        System.out.println(i);

        //创建String类型
        MyArray<String> myArray2 = new MyArray<>();
        myArray2.set(0,"hello");
        String str = myArray2.get(0);
        System.out.println(str);
    }
}

上面的MyArray就是一个泛型类,通过使用泛型,就对传入的数据类型进行了约束,同时,也实现了可以传入不同的类型参数

泛型方法

当一个类中只有一个方法中要用到不确定的类型,就只需要把这个方法定义为泛型方法即可

格式:
修饰符 <类型> 返回值类型 方法名(类型 变量名){
}

class ListUtil{
    public void show(){
        System.out.println("其他方法···");
    }
    public static <E> void addAll(ArrayList<E> list,E e1,E e2,E e3){
        list.add(e1);
        list.add(e2);
        list.add(e3);
    }

    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        addAll(list,"a","b","c");
        System.out.println(list);
        
        ArrayList<Integer> list2 = new ArrayList<>();
        addAll(list2,1,2,3);
        System.out.println(list2);
    }
}

泛型接口

格式:
修饰符 interface 接口名<类型>{
}

例如Java中的List接口就是一个泛型接口:
在这里插入图片描述
泛型接口的使用方法:
1.实现类给出具体类型
在这里插入图片描述
在这里插入图片描述
2.实现类延续泛型,创建对象时再确定类型
在这里插入图片描述

泛型的继承和通配符

泛型不具备继承性,但数据具备继承性
什么意思呢
在这里插入图片描述
首先定义了两个具有继承关系的类,method方法里边所限定的类型是Fu 类型,它的子类型所创建的对象并不能使用该方法,如果想要子类型也能使用,就需要把方法定义为泛型方法,但是如果是其他类型也可以使用,怎么去限定只有这种具有继承关系的类才能使用
这时就可以使用通配符来实现

通配符:?
也表示不确定类型,但是可以限定类型,
? extend E: 表示可以传递E 或 E所有的子类类型
? super E: 表示可以传递E 或 E 所有的父类类型

在这里插入图片描述

泛型的上界

上面介绍的通过extend进行类型限制就是指定了泛型的上界,下面还有一种复杂的示例
在这里插入图片描述
例如:
写一个泛型类,定义一个方法,可以求数组的最大值

在这里插入图片描述
这时候就需要用到compareTo方法,就要实现comparable接口

public class Alg<E extends Comparable<E>> { //对泛型进行了限制,必须实现Comparable接口的类型才能传入
    public E findMax(E[] array){
        E max = array[0];
        for(int i = 0;i < array.length;i++){
            if(max.compareTo(array[i]) < 0){
                max = array[i];
            }
        }
        return max;
    }

    public static void main(String[] args) {
        Integer[] arr = {1,2,3,4,5};
        Alg<Integer> alg = new Alg<>();
        int a = alg.findMax(arr);
        System.out.println(a); //5
    }
}

比如再定义一个Person类,因为它没有实现Comparable接口,所以泛型里边不能传入Student
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/687113.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

JVM基础知识

一、JVM的内存区域划分 一个进程在运行的时候,会向操作系统申请到内存资源,从来存放程序运行的相关数据。 JVM本质上就是一个java进程,在运行的时候也会从操作系统那搞一块内存&#xff0c;供Java代码执行使用。 JVM又把申请的一块内存根据不同的用途划分出了不同区域。 每一…

数据库——多表查询概述

与单表查询不同&#xff0c;多表查询是从多张表中查找数据。例如&#xff1a; select * from user,course; 得到一张有36条数据的表&#xff0c;这是因为12条数据的user表与3条数据的course表进行了笛卡尔积运算&#xff0c;但是在多表查询中&#xff0c;往往需要消除笛卡尔积带…

MySQL 与 PostgreSQL 在 SQL 方面的关键对比二(功能篇)

目录 1 详细示例 1.1自动增量列 1.2 字符串连接 1.3 JSON 支持 2 总结 MySQL 和 PostgreSQL 是两种流行的开源关系数据库管理系统&#xff08;RDBMS&#xff09;。尽管它们在许多方面相似&#xff0c;但在 SQL 语法和功能上存在一些显著差异。 以下SQL语句的执行如果需要开…

YoloV8改进策略:Block篇|MobileNetV4——移动生态系统的通用模型

文章目录 摘要1、引言2、相关工作3、硬件无关的帕累托效率4、通用反向瓶颈5、Mobile MQA6、MNv4模型设计6.1、精炼NAS以增强架构6.2、MNv4模型的优化 7、结果7.1、ImageNet分类 8、增强蒸馏方案9、结论10、致谢A、搜索空间细节B、基准测试方法论C、ImageNet-1k分类任务的训练设…

springboot启动报端口被占用,修改端口还是报被占用,如何处理?

第一种方式&#xff1a; 通过cmd查看是否有程序占用端口 netstat -ano| findstr 端口号 杀死进程 taskkill -f -pid 进程号 如果未看到有程序占用该端口说明不是这个原因 第二种方式&#xff1a; 打开任务管理器 查看是否进程占用对应端口&#xff0c;有就关闭进程 第三种…

视觉SLAM十四讲:从理论到实践(Chapter8:视觉里程计2)

前言 学习笔记&#xff0c;仅供学习&#xff0c;不做商用&#xff0c;如有侵权&#xff0c;联系我删除即可 一、目标 1.理解光流法跟踪特征点的原理。 2.理解直接法是如何估计相机位姿的。 3.实现多层直接法的计算。 特征点法存在缺陷&#xff1a; 二、光流(Optical Flow) …

nodeJS社区新冠人群管理与老人疫苗小程序-计算机毕业设计源码65190

目 录 摘要 1 绪论 1.1背景及意义 1.2国内外研究慨况 1.3B/S体系工作原理 1.4node.js主要功能 2 1.5论文结构与章节安排 3 2 社区新冠人群管理与老人疫苗小程序分析 4 2.1 可行性分析 4 2.2 系统流程分析 4 2.2.1数据增加流程 5 2.3.2数据修改流程 5 2.3.3数据删除流程 5…

【会议征稿,IEEE出版】第六届电子与通信,网络与计算机技术国际学术会议(ECNCT 2024,7月19-21)

第六届电子与通信&#xff0c;网络与计算机技术国际学术会议 &#xff08;ECNCT 2024&#xff09;将于 2024年7月19日-21日 在 中国广州 举办&#xff0c; 为期三天。 会议由广东工业大学自动化学院主办&#xff0c;会议将安排主旨报告&#xff0c;口头报告以及海报展示&#…

人类语言处理nlp部分笔记——二、BERT和它的家族-介绍和微调

参考自李宏毅课程-人类语言处理 二、BERT和它的家族-介绍和微调 1. What is pre-train model 这里所说的pre-train model是输入一串tokens&#xff0c;能够输出一串vectors&#xff0c;且每个vector可以表示对应的语义的模型&#xff0c;这些vectors也被称作为embeddings。以…

假设检验学习笔记

1. 假设检验的基本概念 1.1. 原假设&#xff08;零假设&#xff09; 对总体的分布所作的假设用表示&#xff0c;并称为原假设或零假设 在总体分布类型已知的情况下&#xff0c;仅仅涉及总体分布中未知参数的统计假设&#xff0c;称为参数假设 在总体分布类型未知的情况下&#…

抱抱脸上第一的开原模型Qwen2-72B;腾讯开源人像照片生成视频的模型;Facebook开源翻译模型;智谱 AI 推出的最新一代预训练模型

✨ 1: Qwen2 Qwen2 是一种多语言预训练和指令调优的语言模型&#xff0c;支持128K上下文长度并在多项基准测试中表现优异。 Qwen2&#xff08;全称“Qwen Qwen”&#xff0c;简称Qwen&#xff09;是一个先进的大语言模型家族&#xff0c;在其前身Qwen1.5的基础上进行了重大提…

安卓手机平板使用JuiceSSH无公网IP远程连接本地服务器详细流程

文章目录 前言1. Linux安装cpolar2. 创建公网SSH连接地址3. JuiceSSH公网远程连接4. 固定连接SSH公网地址5. SSH固定地址连接测试 前言 处于内网的虚拟机如何被外网访问呢?如何手机就能访问虚拟机呢? 本文就和大家分享一下如何使用 cpolarJuiceSSH 实现手机端远程连接Linux…

多目标应用:MOHHO多目标哈里斯鹰优化算法求解无人机三维路径规划(MATLAB代码)

详细介绍 多目标应用&#xff1a;MOHHO多目标哈里斯鹰优化算法求解无人机三维路径规划&#xff08;MATLAB代码&#xff09;-CSDN博客 一次运行结果 完整MATLAB代码

四十、openlayers官网示例External map解析——打开一个外部小窗口展示地图

官网demo地址&#xff1a; External map 这篇展示了外部窗口打开地图视图。 首先先初始化地图。 创建了一个UnusableMask类继承Control用来做主页面地图放进小窗口后的遮罩层&#xff0c;设置了自定义属性hidden来控制遮罩层的显隐。 initMap() {class UnusableMask extend…

【Spring Cloud】Gateway 服务网关核心架构的执行流程和断言

文章目录 基本概念执行流程断言内置路由断言工厂自定义路由断言工厂 总结 基本概念 路由(Route)是gateway中最基本的组件之一&#xff0c;表示一个具体的路由信息载体。主要定义了下面的几个信息&#xff1a; id&#xff1a;路由标识符&#xff0c;区别于其他Route。uri&…

营养调控微生物及代谢产物:对免疫和炎症的影响

谷禾健康 菌群.营养.炎症.免疫 营养在整个生命周期中对免疫和炎症以及最终的健康有深远影响。最新研究表明&#xff0c;饮食对肠道微生物组成和代谢产物具有显著影响&#xff0c;从而对宿主免疫和炎症产生重要影响。 研究发现&#xff0c;我们日常饮食中的特定食物成分和代谢产…

Linux-vi编辑器命令使用

一、初始-vi 1、 vi-打开文件并且定位行 有可能会遇到打开一个文件&#xff0c;并定位到指定行的情况 例如&#xff0c;知道某一行代码有错误&#xff0c;可以快速定位到出错代码的位置 可以使用以下命令打开文件$ vi 文件名 行数 提示&#xff1a;如果只带上 而不指定行号&…

(C++) 函数重载机制

文章目录 &#x1f522;前言&#x1f579;️参考资料&#x1f579;️实例代码 &#x1f522;重载机制&#x1f947;名称查找&#x1f948;模板函数处理&#x1f949;重载决议 END关注我 &#x1f522;前言 在C中函数重载是一个非常强大由复杂的问题。 在C中本身就有许多函数机…

外汇天眼:金融服务补偿计划(FSCS)确认已任命清算人为TenetConnect Services有限公司

2024年6月5日&#xff0c;Tenet Group有限公司的董事们任命了Interpath有限公司的Ed Boyle、Howard Smith和Rob Spence为联合清算人。Ed Boyle和Rob Spence也被任命为其子公司Tenet有限公司、TenetConnect有限公司和TenetConnect Services有限公司的联合清算人。Tenet Mortgage…

手把手Linux高可hadoop集群的搭建

高可用集群的搭建 在搭建高可用集群之前&#xff0c;如果搭建了完全分布式hadoop&#xff0c;先执行stop-all.sh停掉所有的服务&#xff0c;只保留jdk和zookeeper的2个服务&#xff0c;然后再去搭建。 目标&#xff1a; 高可用集群简介部署Hadoop高可用集群 一&#xff0e;…