首页 > 编程语言 >数据结构(JAVA)包装类&泛型

数据结构(JAVA)包装类&泛型

时间:2024-10-18 18:50:34浏览次数:9  
标签:拆箱 JAVA 类型 泛型 Integer 数据结构 装箱 public

文章目录


包装类

基本数据类型和对应的包装类

在这里插入图片描述
注意,除了int基本数据类型的包装类是Integer和char基本数据类型的包装类是Character以外的基本数据类型的包装类都是首字母大写。

装箱和拆箱

装箱:把基本数据类型变成包装类的过程,就叫作装箱。
拆箱:把包装类变成基本数据类型的过程,就叫作拆箱。
装箱分为显示装箱和自动装箱。
拆箱分为显示拆箱和自动拆箱。

显示装箱和自动装箱

    public static void main(String[] args) {
        int a = 15;
        Integer a1 = Integer.valueOf(a);//显示装箱
        Integer a2 = a;//自动装箱
    }

显示拆箱和自动拆箱

    public static void main(String[] args) {
        Integer a = 15;
        int a1 = a.intValue();//显示拆箱
        int a2 = 15;//自动拆箱
    }

自动装箱,自动拆箱的原理
自动装箱和自动拆箱的原理都是底层帮助我们调用valueOf 或者 intValue方法;
在这里插入图片描述

面试题

下面的代码的运行结果是什么?

public static void main(String[] args) {
    Integer a = 127;
    Integer b = 127;
 
    Integer c = 128;
    Integer d = 128;
 
    System.out.println(a == b);
    System.out.println(c == d);
}

当我们把上述代码运行,发现结果令人惊讶
在这里插入图片描述
为什么呢?明明两个结果都应该是true,但第一个是true 第二个是false?
我们发现这两个都是装箱操作,那么我们装箱是怎么工作的,也就是valueOf的逻辑是什么。
观察valueOf方法,当我们给valueOf方法传入一个值,并且他满足一定范围,返回一个数组值,不满足返回新的对象。
在这里插入图片描述
那这个方法的值范围是多少呢?
在这里插入图片描述
范围是[-128,127]。

泛型

什么是泛型

一般的类和方法,只能使用具体的类型: 要么是基本类型,要么是自定义的类。如果要编写可以应用于多种类型的
代码,这种刻板的限制对代码的束缚就会很大。---- 《Java编程思想》
通俗来讲,就是适用于许多许多类型。把想要的数据类型当作参数传递,需要什么类型,就传入什么类型。

泛型的语法

class 泛型类名称<类型形参列表> {
    // .....
}

类名后的 代表占位符,表示当前类是一个泛型类。
在这里插入图片描述

泛型类的使用

泛型类的语法

泛型类<类型实参> 变量名; // 定义一个泛型类引用
new 泛型类<类型实参>(构造方法实参); // 实例化一个泛型类对象

new后面的<类型实参>中的类型实参可以省略,编译器可以根据上下文推导出类型实参。

泛型的使用

在这里插入图片描述

class MyArray <E>{
    public Object[] objects = new Object[10];

    public void setVal(int pos,E val) {
        objects[pos] = val;
    }

    public E getVal(int pos) {
        return (E)objects[pos];
    }
}

public class Test {
    public static void main(String[] args) {
        MyArray<Integer> myArray = new MyArray<>();
        myArray.setVal(0,12);
        myArray.setVal(1,13);
        Integer a = myArray.getVal(1);
        System.out.println(a);
    }
}

我们以Integer为例,当我们以Integer类型当作参数传入,那E类型必须是整数类型,不能是其他类型。
如果传入其他类型,编译器会通过自动类型检查发现错误并报错。
在这里插入图片描述
注意<>内只能写类类型,不能写简单类型。

在这里插入图片描述

裸类型(Raw Type) (仅需了解)

裸类型是一个泛型类但没有带着类型实参(为了兼容老版本的api)

擦除机制

擦除机制:就是在编译时,将所有的E替换Object。

泛型的上界

在定义泛型类时,有时需要对传入的类型变量做一定的约束,可以通过类型边界来约束。
示例一

class 泛型类名称<类型形参 extends 类型边界> {
   ...
}
class MyArray <E extends Number>{
    public Object[] objects = new Object[10];

    public void setVal(int pos,E val) {
        objects[pos] = val;
    }

    public E getVal(int pos) {
        return (E)objects[pos];
    }
}

当我们规定E的上界时,此时传入的参数必须是Number或者是Number的子类。
如果不是将会报错。

在这里插入图片描述
示例二

public class MyArray<E extends Comparable<E>> {
   ...
}

写一个泛型方法,求数组中的最大值。

在这里插入图片描述
观察上面的代码,发现在if判断句报错,这是为什么呢?
因为E的类型我们不知道,我们无法比较。
解决方法:让E继承Comparable接口。

class Alg <E extends Comparable<E>> {
    public E findMax(E[] array) {
        E max = array[0];
        for (int i = 1; i < array.length; i++) {
            if(max.compareTo(array[i]) < 0) {
                max = array[i];
            }
        }
        return max;
    }
}

注意<>中的数据类型必须实现了Comparable接口。如果没有将会报错
在这里插入图片描述

泛型方法

方法限定符 <类型形参列表> 返回值类型 方法名称(形参列表) { ... }
class Alg1 {
    public <E extends Comparable<E>>  E findMax(E[] array) {
        E max = array[0];
        for (int i = 1; i < array.length; i++) {
            if(max.compareTo(array[i]) < 0) {
                max = array[i];
            }
        }
        return max;
    }
}

调用泛型方法,有俩种。
1.java通过参数传递,推导出类型。
2.手动添加类型。
在这里插入图片描述

标签:拆箱,JAVA,类型,泛型,Integer,数据结构,装箱,public
From: https://blog.csdn.net/2301_81225368/article/details/142869182

相关文章

  • Java中JDK8-17新特性下
    JDK8-17新特性(第二部分)目录JDK8-17新特性(第二部分)switch表达式增强文本块标准化模式匹配局部变量类型判断switch表达式增强在Java中,switch语句的增强主要体现在Java12引入的预览特性(并在Java14中成为正式特性)中,即所谓的“SwitchExpressions”(switch表达式)。这个新特性使得s......
  • JavaWeb开发3
    JavaScript一门跨平台、面向对象的脚本语言,用来控制网页行为,能使网页可交互js引入方式内部脚本:将JS代码定义在HTML页面中JavaScript代码必须位于<script></script>在HTML文档中,可以在任意地方,放置任意数量的<script>一般会把脚本置于<body>元素的底部,可以改......
  • 【Java后端】SpringBoot 自动配置原理解析
    为什么就这一个注解,就可以让SpringBoot自动配置呢?为了更清晰地阐述SpringBoot自动配置的底层原理,我们将结合源码进行更深入的分析,并加入一些关键步骤的代码片段。 注意:按住Ctrl键不松,点击相应注解,即可进入对应源码1. @SpringBootApplication 注解的秘密:开启自动配置......
  • java 11天 StringBuffer static
    补充:1--100正则表达式1-100 100拿出去或上“[1-9][0-9]{0,1}|100”0--100  0和100拿出去或上“[1-9][0-9]{0,1}|100|0”获取常量池中的地址 String - intern();String学过23个 一.StringBufferStringBuffer 字符串长度+16 StringBuffer空间是2*oldCap......
  • Java工程师必备的20条SQL最佳实践详解
    在Java开发中,SQL是处理数据库交互的核心技能。高效的SQL查询不仅能够提升应用程序的性能,还能减少资源消耗和提高用户体验。以下是Java工程师必备的20条SQL最佳实践,每条都附有代码示例和详细解释。1.使用索引索引可以显著提高查询速度。为经常用于查询条件、排序和连接的......
  • 基于Java微信小程序的模拟考试系统(源码+lw+部署文档+讲解等)
    项目运行截图技术框架后端采用SpringBoot框架SpringBoot是一个用于快速开发基于Spring框架的应用程序的开源框架。它采用约定大于配置的理念,提供了一套默认的配置,让开发者可以更专注于业务逻辑而不是配置文件。SpringBoot通过自动化配置和约定大于......
  • java+vue计算机毕设高校图书馆借阅管理系统app【源码+程序+论文+开题】
    本系统(程序+源码)带文档lw万字以上文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着信息技术的飞速发展和移动互联网的普及,高校学生的学习和生活方式正经历着深刻的变革。图书馆作为知识传播和学术研究的重要场所,其管理与服务模式......
  • java+vue计算机毕设高校运动会管理系统【源码+程序+论文+开题】
    本系统(程序+源码)带文档lw万字以上文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着高校体育教育的不断发展,运动会作为增强学生体质、培养团队协作精神的重要活动,其组织与管理日益复杂。传统的人工管理方式存在效率低下、信息不透......
  • java+vue计算机毕设高校体育场馆管理【源码+程序+论文+开题】
    本系统(程序+源码)带文档lw万字以上文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着高等教育事业的蓬勃发展,高校体育场馆作为校园内重要的教学与生活设施,其管理效率与质量直接影响到师生的体育活动参与度及身心健康。近年来,高校体......
  • Java项目集成xxl-job(自动任务)
    官网|代码官网网址:https://www.xuxueli.com/xxl-job/首先:文档很详细,非常清晰,集成到项目中也非常简单进入官网后下拉就是文档按文档一步步一般没有问题,主要说下可能会疑惑的点直接点击1.5在gitee下载代码:http://gitee.com/xuxueli0323/xxl-job代码结构如下:以......