Java 基本类型和包装类

news/2024/11/30 2:31:46/

Java 是基于对象的,所以我们都需要以对象的想法来进行思维。

但 Java 又提供了 8 个基本类型,这 8 个基本类型基本上都和数字有关,是直接可以使用的类型。

基本类型大小包装器类型
boolean/Boolean
char16bitCharacter
byte8bitByte
short16bitShort
int32bitInteger
long64bitLong
float32bitFloat
double64bitDouble
void/Void

String 不算基本类型,但是为了加快 String 的处理,Java 就顺手搞了一个 String Pool。

Java 基本类型

什么是基本类型?

直接可以计算的就是基本类型,基本类型不是对象。

所有的基本数据类型的大小(所占用的字节数)都已明确规定,在各种不同的平台上保持不变,这一特性有助于提高 Java 程序的可移植性。

基本类型就是已经定义好的,可以直接拿来计算和比较的那种。

包装类

既然我们有了基本类型,正如前面说的,Java 里面都是对象。

那么我们应该有必要创建一堆对象和前面说的 8 个基本类型进行对应。

这些对象就是针对基本类型创建的包装类( Wrapper Classes)。

为什么要有包装类

举个例子,我们指定 List 中需要存一堆 Integer 的对象。

如果我们定义的是基本类型,那我们怎么存到对象中呢?

我们是不是需要把基本类型转换为对象,然后再存进去,如果我们不提供包装类的话,就没有这个转换过程。

往大了说,基本数据类型没有办法使用 List 这个数据结构,这多无聊呀。

为了解决这个问题 Java 就搞了一个包装类,用来把基本数据类型转换为对象。

装箱和拆箱

既然东西有了,那么对这个转换的过程,自然就需要定义下概念了。

从基本数据类型类型转换为包装对象的过程就叫做装箱。

反过来就叫做拆箱了。

在老的 JDK ,这个过程都没有办法自动进行操作,每次要手动搞了一个类型转换。

其实这个过程每次都手动做的话,是非常繁琐的,所以在 JDK 进化后,现在全是自动化了,基本上都是自动类型转换了。

虽然有时候也会出点类型转换错误,但整体上提高了不少效率。

简单来说就是 JDK 在需要基本类型的时候,你定义却是对象,那么 JDK 自己帮你把这个拆箱过程给完成了,对你来说是透明的了。

缓存

既然有了装箱和拆箱的过程,如何提高这个效率,就是 JDK 需要考虑的东西了。

在这个过程中,缓存就被使用上了。

Integer valueOf(1); 就是用了缓存的典型例子。

JDK 的代码是这样的:

2023-09-12_10-18-08

    @IntrinsicCandidatepublic static Integer valueOf(int i) {if (i >= IntegerCache.low && i <= IntegerCache.high)return IntegerCache.cache[i + (-IntegerCache.low)];return new Integer(i);}

在这里,JDK 定义了一个最小值和最大值以便于加快类型转换的处理速度。

2023-09-12_10-18-51

所以,下面的代码就有点意思了。

        Integer i1 = 100;Integer i2 = 100;Integer i3 = 200;Integer i4 = 200;System.out.println(i1==i2);System.out.println(i3==i4);

上面代码的结果是第一个判断为 TRUE,第二个为 False。

因为我们知道,对象使用 == 进行比较,比较的是内存地址,所以对值的比较我们通常会用 equals 来进行比较。

但是因为上面代码中的 Integer 小于 100,所以是从缓存中读的,这样会导致比较的时候返回 TRUE。

总结

在面试的时候,上面缓存中的内容是容易被喜欢扣细节的人问到的。

如果你真没有去看看 JDK 的文档,上面还真有点出问题。

但我们认为这个有点钻牛角尖的意思了,因为 Java 使用缓存的目的就是为加快程序的执行的。至于具体怎么实现,对大部分人来说这部分都是透明的。

通常实际编程的过程中,只需要了解自动拆装,并且如何定义变量,因为针对对象的定义和基本类型的定义是不一样的。

定义一个浮点对象,我们使用的代码是 Float x = 1F; ,在后面需要添加一个 F。

至于缓存部分,有时间就研究下,了解自动拆装是有缓存在里面,多是针对小范围 int 来使用的就可以了。

Java 基本类型和包装类 - Java - iSharkFly


http://www.ppmy.cn/news/1107396.html

相关文章

计算机组成原理--数据表示

目录 1、机器数及特点 1.1 机器内的数据表示 1.1.1.原码 1.1.2. 反码 1.1.3. 补码 1.2 常见机器数的特点 2、定点数与浮点数据表示 2.1 定点数据表示 2.2 浮点数据表示 2.3 补充&#xff1a;小数的二进制表示 3、数据校验的基本原理 3.1 必要性&#xff1a; 3.2 基…

远程双屏电脑的时候有的窗口默认打开在第二块屏幕上,导致无法看到和操作【伸手党福利】

解决方法&#xff1a; 点击看不到的窗口&#xff0c;使之处于激活状态 win 左箭头 或者 win右箭头 Alt空格 按M 按 左箭头 或者 右箭头 就能看到窗口移出来了。

VPN都容易受到泄露流量的TunnelCrack攻击

导读研究人员近日发现&#xff0c;影响市面上大多数VPN产品的几个漏洞可以被攻击者用来读取用户流量、窃取用户信息&#xff0c;甚至攻击用户设备。 我们实施的攻击从计算上来说开销并不大&#xff0c;这意味着任何拥有适当网络访问权限的人都可以执行攻击&#xff0c;而且攻击…

分析udev自动创建设备结点的过程

当系统内核发现系统中添加了某个新的设备时&#xff0c;在内核空间中会对该驱动进行注册&#xff0c;并获取该驱动设备的信息&#xff0c;然后创建一个设备类&#xff08;向上提交目录信息&#xff09;&#xff0c;并申请struct class对象并且初始化&#xff0c;然后创建一个设…

信号相关名词概念汇总-采样周期、泄露、窗函数等

信号相关名词概念汇总-采样周期、泄露、窗函数等 以下为信号相关名词概念的汇总 1 名词解释 采样周期/间隔&#xff1a;采样频率的倒数&#xff0c;两次相邻采样之间的时间间隔采样时间&#xff1a;采样的总时长&#xff0c;即采样点数N和采样周期的乘积采样频率&#xff1a; …

Linux创建进程 及父子进程虚拟空间 多进程GDB调试

父子进程的资源是读时共享&#xff0c;写时拷贝&#xff0c;用到某一个资源&#xff0c;比如说改变变量的值的时候才去拷贝这个变量到一个独立的空间 父子进程的关系&#xff1a; 区别&#xff1a; 1.fork&#xff08;&#xff09;函数的返回值不同 父进程中&#xff1a;>…

群晖NAS如何在内网部署HTTPS服务让浏览器信任证书

前言 最近在折腾内部部署Web服务。通过Vue实现一个H5的内部的管理服务。但在实际部署过程中由于种种原因&#xff0c;必须部署成Https服务。但在部署成Https服务后&#xff0c;由于没有HTTPS证书&#xff0c;每次进入页面都会被浏览器拦截。使用起来非常不便。于是开始各种Goo…

vue3-admin-element安装

1、直接点此链接进入下载 https://gitee.com/hu-snail/vue3-admin-element-template 2、下载完毕之后是个压缩包&#xff0c;解压 然后直接可以运行到vscode或HBuilder中 3、下载依赖&#xff1a;我使用的npm下载 npm i npm i serve启动 运行&#xff1a;npm run serve …