【剧前爆米花--爪哇岛寻宝】包装类的装拆箱和泛型的擦除机制

news2024/9/22 1:17:37

作者:困了电视剧

专栏:《数据结构--Java》

文章分布:这是关于数据结构的基础之一泛型的文章,希望对你有所帮助。

目录

包装类

装箱

装箱源码小细节

拆箱

泛型

什么是泛型

泛型编译的擦除机制

不能实例化泛型类型数组


包装类

在Java中,由于基本类型不是继承自Object,为了在泛型代码中可以支持基本类型,Java给每个基本类型都对应了一个包装类型。

给每一个基本类型都设置一个包装类后,这些包装类就可以继承Object类,并且作为一个引用类型进行使用,从而使其拥有相应的方法,再进行一些运算的时候可以更加的兼容和方便,同时也可以像其他引用类型那样进行传址调用。 

装箱

有如下的一段代码和其执行结果:

Integer是int基本数据类型的包装类,这里将int的值赋给Integer就是装包,结果也很明显输出的都是10,那他内部是怎么运行的呢?我们打开反编译来看一下。

有这个反编译我们会看到,Integer在进行装包的过程中,调用了valueof这个方法,我们打开这个方法的源码看一下

从这我们可以看到,valueof方法返回的是一个Integer对象,所以

        int a=10;
        Integer val = a;
        Integer val1 = new Integer(a);
        Integer val2 = Integer.valueOf(a);

 这三种装包形式都是一样的效果,其中第一种装包方式也叫隐式装箱,也叫作自动装箱,其他的则是显示装包。

装箱源码小细节

我们都知道,对于引用类型来说,==比较的是两个引用类型的地址而不是值,要想比较值的大小,需要重写equals方法才行,那么问题来了,此时的a和b都是包装类,是引用类型,这里应该比较的是地址,按常理来说应该是false才对,然而结果确实true,我们再来看一个栗子:

当我将值改为200时,结果就变为了false,这是为什么呢?原因很简单。 

我们通过valueof的源码可知,当i>low并且<high时,返回值是一个数组中的元素,而当i不属于这个范围时,才会返回一个全新的new出来的对象,所以100由于在这个范围内,返回的都是数组中的统一位置的元素,自然地址相同,而当new一个新元素后,地址就是一个全新的地址,自然就无法相等。由源码可知这个范围是-128~127。

拆箱

对于这段代码我们打开反编译看一下他底层的运行机制。

 由这个我们可以看到,当装箱完成后,java又通过调用intValue方法实现了拆箱,使我们能得到value值。

泛型

什么是泛型

一般的类和方法,只能使用具体的类型 : 要么是基本类型,要么是自定义的类。如果要编写可以应用于多种类型的代码,这种刻板的限制对代码的束缚就会很大。----- 来源《 Java 编程思想》对泛型的介绍。
泛型是在 JDK1.5 引入的新的语法,通俗讲,泛型: 就是适用于许多许多类型 。从代码上讲,就是对类型实现了参数化。

现在我定义了一个泛型类MyArray,其中T就是需要传入的类型。在我的main函数中,我用Integer当做我现在传入的类型,实例化了一个MyArray类。 

由上图我们可以发现两点:
1.存储数据的时候,可以自动的帮我们进行类型检查。即如果我们传入的一个double类型的数据,那java就会在这个编译阶段进行报错。

2.获取元素的时候,可以帮助我们进行类型转换。 

泛型编译的擦除机制

我们在了解到泛型的用处后自然需要知道泛型的底层是如何运行的,我们打开命令行观察一下反编译:

通过这个我们可以看到在改程序运行的时候,参与的并不是我们的T类型(在本例中则是Integer类型)而是Object类型,这就是泛型的擦除机制。

即在编译的时候,泛型起到的作用是帮我们进行修正,如果我们输入了不符合相应类型的数据,则会在编译的时候报错来提醒我们,而当我们输入的全部数据都合规并且通过编译的时候,程序在运行的过程中就会“擦除”这些泛型,统一用Object类进行运算,这就是泛型的擦除机制。

不能实例化泛型类型数组

class MyArray<T> {
	public T[] array = (T[])new Object[10];
	public T getPos(int pos) {
		return this.array[pos];
	}
	public void setVal(int pos,T val) {
		this.array[pos] = val;
	}
	public T[] getArray() {
		return array;
	}
}
public static void main(String[] args) {
	MyArray<Integer> myArray1 = new MyArray<>();
	Integer[] strings = myArray1.getArray();
}

以这段代码为例,这段代码能通过编译,但是在运行的时候会报错。

数组在java中是一个很特殊的东西,在这段代码中getArray的返回数组在运行时被擦除成一个Object数组,此时java并不知道这个数组中的元素是否均满足要求,所以尽管我们的数据可能都是合法的,但是java认为这些数据中可能会有其他类型,于是出于安全性的考量不会让我们进行运行。

以上就是本篇博客的全部内容,如有疏漏还请指出。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LicenseBox Crack,对服务器的要求最低

LicenseBox Crack,对服务器的要求最低 LicenseBox是用于管理基于PHP的软件、WordPress插件或主题、主题、插件和WordPress的更新和许可的完整软件。它易于安装&#xff0c;对服务器的要求最低&#xff0c;用户友好的界面&#xff0c;无限脚本的使用为您的创造力打开了大门。 Li…

基于STM32的水质浑浊度和PH值监测系统设计(仿真+程序+讲解)

基于STM32的水质浑浊度和PH值监测系统设计(仿真程序讲解&#xff09; 仿真图proteus 8.9 程序编译器&#xff1a;keil 5 编程语言&#xff1a;C语言 设计编号&#xff1a;C0077 这里写目录标题演示讲解视频1.主要功能2.仿真3. 程序4.资料清单&下载链接演示讲解视频 基于…

基于JSP的网上书店的设计与实现

技术&#xff1a;Java、JSP等摘要&#xff1a;近年来&#xff0c;随着互联网的迅速普及&#xff0c;网络已经走进了千家万户&#xff0c;作为信息交流的一种平台&#xff0c;它给我们的日常生活带来了很大的便利。今天&#xff0c;各种各样的网站已经深入到了我们的日常生活&am…

单例模式之饿汉式

目录 1 单例模式的程序结构 2 饿汉式单例模式的实现 3 饿汉式线程安全 4 防止反射破坏单例 5 总结 单例模式&#xff08;Singleton Pattern&#xff09;是 Java 中最简单的设计模式之一。所谓单例就是在系统中只有一个该类的实例&#xff0c;并且提供一个访问该实例的全局…

2023年房地产定价模型研究报告

第一章 房地产定价模型概述 受疫情和房地产发展模式影响&#xff0c;目前我国房地产行业遭受着多重冲击&#xff0c;消费者不断降低的购房意愿&#xff0c;频繁出现的烂尾楼问题&#xff0c;建筑材料和工人价格的不断上涨等。而房地产行业本身又是带动如电器&#xff0c;装修&…

《C++程序设计原理与实践》笔记 第14章 设计图形类

本章借助图形接口类介绍接口设计的思想和继承的概念。为此&#xff0c;本章将介绍与面向对象程序设计直接相关的语言特性&#xff1a;类派生、虚函数和访问控制。 14.1 设计原则 我们的图形接口类的设计原则是什么&#xff1f; 14.1.1 类型 我们的程序设计理念是在代码中直…

人工智能( AI )将如何颠覆项目管理?看看这六大关键领域

Gartner 研究预测&#xff0c;到 2030 年&#xff0c;80% 的项目管理任务将由 AI 运行&#xff0c;由大数据、机器学习和自然语言处理提供支持。 这些即将到来的技术发展视为前所未有的机遇。为这一颠覆时刻做好充分准备的企业和项目负责人将收获最大的回报。项目管理的每个方…

Linux操作系统学习(互斥)

文章目录线程安全互斥量互斥锁的原理线程安全补充可重入函数死锁线程安全 ​ 由于多个线程是共享同一个地址空间的&#xff0c;也就是很多资源都是共享的&#xff0c;那么线程通信就会很方便&#xff0c;但是方便的同时缺乏访问控制&#xff0c;可能会由于一个线程的操作问题&…

元数据管理、治理、系统、建设方案、范例等

【数据治理工具】–元数据系统 1.元数据系统 1.1 概述 如果想建设好元数据系统&#xff0c;需要理解元数据系统的相关概念&#xff0c;如数据、数据模型、元数据、元模型、ETL、数据血缘等等。 首先&#xff0c;要清楚数据的定义、数据模型的定义。数据一般是对客观事物描述…

全国程序员薪酬大曝光!看完我酸了····

2023年&#xff0c;随着互联网产业的蓬勃发展&#xff0c;程序员作为一个自带“高薪多金”标签的热门群体&#xff0c;被越来越多的人所关注。在过去充满未知的一年中&#xff0c;他们的职场现状发生了一定的改变。那么&#xff0c;程序员岗位的整体薪资水平、婚恋现状、职业方…

Halo开源建站工具

目录 特性 代码开源 易于部署 插件机制 附件管理 搜索引擎 快速开始 最新主题 下载安装主题 开发者指南 我的本地站点 docker管理 本地站点 gaghttps://halo.run/ 支持h2文件系统存储数据&#xff0c;支持docker部署。 特性 我们会一直探索&#xff0c;追求更好…

【JavaSE】方法的使用初学者易懂

前言 大家好&#xff0c;我是程序猿爱打拳。今天讲解的是Java中方法的使用。Java中的方法类似于C语言里面的函数其中都有实参与形参。但Java中的方法又比C语言中的函数更为强大&#xff0c;为何呢&#xff1f;请看下文。 目录 1.为什么要有方法&#xff1f; 2.方法的概念及使…

Centos 虚拟机安装

文章目录Centos 虚拟机安装一、模版虚拟机环境准备安装VMvare&#xff0c;安装CentosCentos 虚拟机安装 一、模版虚拟机环境准备 安装VMvare&#xff0c;安装Centos 创建虚拟机&#xff0c;然后选择自定义安装 然后是默认的&#xff0c;点一下步 这一步选择稍后安装操作系…

Java下浅谈String.valueOf()

今日遇到遇见无语的事情&#xff0c;mybatis查询数据库结果 List<Map<String, String>> 需要转换为字符串&#xff0c;但是在debug时&#xff0c;在idea小窗口单独执行代码&#xff0c;是可以正常编译的&#xff0c;离开idea小窗口执行就报错&#xff1a; 类型转换…

Anaconda安装Pytorch(win系统)

前面有一篇博客专门讲了安装CPU版本的Pytorch&#xff0c;因为当时没有GPU&#xff0c;现在有了3090&#xff0c;专门记录一下安装GPU版的过程。一、添加清华源可参考官方anaconda | 镜像站使用帮助 | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror创建虚拟环境若没有…

一文解决Vue所有报错【持续更】

前言 Vue是一个流行的前端框架&#xff0c;许多web开发人员使用Vue来构建他们的应用程序。然而&#xff0c;正如任何其他框架一样&#xff0c;Vue也可能会发生错误。在这篇技术文章中&#xff0c;我们将探讨Vue常见的报错以及如何解决它们。 常见错误 1. Vue Template Error …

【目标检测】61、Dynamic Head Unifying Object Detection Heads with Attentions

文章目录一、背景二、方法2.1 scale-aware attention2.2 spatial-aware attention2.3 task-aware attention2.4 总体过程2.5 和现有的检测器适配2.6 和其他注意力机制的关联三、效果四、代码论文链接&#xff1a; https://arxiv.org/pdf/2106.08322.pdf代码链接&#xff1a;htt…

一文带你了解阿里的开源Java诊断工具 :Arthas

Arthas 是阿里开源的 Java 诊断工具&#xff0c;相比 JDK 内置的诊断工具&#xff0c;要更人性化&#xff0c;并且功能强大&#xff0c;可以实现许多问题的一键定位&#xff0c;是我用到的最方便的诊断工具。 下载和安装见官网 https://arthas.aliyun.com/doc/profiler.html 下…

Gem5模拟器,如何在linux系统中查看内存、CPU、硬盘、进程、网络等信息(十二)

虽然说&#xff0c;这个记录的是与Linux相关的操作&#xff0c;每次查每次忘&#xff0c;必须写一个来归总一下&#xff0c;以免我漫山遍野找命令。但是不想新开一一个主题&#xff0c;再加上确实是在运行模拟器时会关注这方面的信息&#xff0c;就把这一节搁这儿啦。 常见的查…

MedCalc v20.217 医学ROC曲线统计分析参考软件

MedCalc是一款医学 ROC 曲线统计软件,用于ROC曲线分析的参考软件,医学工作者设计的医学计算器,功能齐全。它可以帮助医生快速作出普通的医学计算,从而对症下药。提供超过76种常用的规则和方法,包括:病人数据、单位参数、费用计算等等。甚至可以将图形另存为BMP,PNG,GIF…