您的位置 首页 java

Java「基本数据类型」,你认为自己了解的够透彻吗?


我们知道,Java是强类型语言,所以Java对于数据类型的规范会相对严格。

它提供了八种基本类型(这里不讲解 Void )。其中六种数字类型(四个整数型(默认是int 型),两个 浮点型 (默认是double 型)),一种字符类型,还有一种布尔型。

基础

上面的图表就是你们想要的干货吧。

但是如果只知道这些,你还是有必要再往下了解一下!!

深入

数据类型在计算机语言里面,是对程序所处理数据的抽象,它存在的意义是为了方便 虚拟机 为不同的数据分配更合适的空间。所以,对数据类型的理解自然与虚拟机分不开。

在 Java 虚拟机规范中, boolean 类型则被映射成 int 类型。具体来说,“true”被映射为整数 1,而“false”被映射为整数 0。这个 编码规则 约束了 Java 字节码 的具体实现。

Java 虚拟机规范同时也要求 Java 编译器遵守这个编码规则,并且用整数相关的字节码来实现逻辑运算,以及基于 boolean 类型的条件跳转。这样一来,在编译而成的 class 文件中,除了字段和传入参数外,基本看不出 boolean 类型的痕迹了。

Java 的基本类型都有对应的值域和默认值。

可以看到,byte、 short 、int、 long 、float 以及 double 的值域依次扩大,而且前面的值域被后面的值域所包含。因此,从前面的基本类型转换至后面的基本类型,无需强制转换。另外一点值得注意的是,尽管他们的默认值看起来不一样,但在内存中都是 0。

在这些基本类型中,boolean 和 char 是唯二的无符号类型。boolean 类型的取值范围是 0 或者 1,char 类型的取值范围则是 [0, 65535]。通常我们可以认定 char 类型的值为 非负数 ,这种特性十分有用,比如说作为数组 索引 等。

数据存储

Java 虚拟机每调用一个 Java 方法,便会创建一个栈帧。这种栈帧有两个主要的组成部分,分别是 局部变量 区,以及字节码的操作数栈。

在 Java 虚拟机规范中,局部变量区等价于一个数组,并且可以用正整数作为索引。除了 long、double 值需要用两个数组单元来存储之外,其他基本类型以及引用类型的值均占用一个数组单元。也就是说,boolean、byte、char、short 这四种类型,在栈上占用的空间和 int 是一样的,和引用类型也是一样的。

因此,当我们将一个 int 类型的值,存储到这些类型的字段或数组时,相当于做了一次隐式的掩码操作。举例来说,当我们把 0xFFFFFFFF(-1)存储到一个声明为 char 类型的字段里时,由于该字段仅占两字节,所以高两位的字节便会被截取掉,最终存入“\uFFFF”。

数据加载

Java 虚拟机的算数运算几乎全部依赖于操作数栈。也就是说,我们需要将堆中的 boolean、byte、char 以及 short 加载到操作数栈上,而后将栈上的值当成 int 类型来运算。

对于 boolean、char 这两个无符号类型来说,加载伴随着零扩展。举例来说,char 的大小为两个字节,在加载时 char 的值会被复制到 int 类型的低二字节,而高二字节则会用 0 来填充。

对于 byte、short 这两个类型来说,加载伴随着符号扩展。举个例子,short 的大小为两个字节。在加载时 short 的值同样会被复制到 int 类型的低二字节。如果该 short 值为非负数,即最高位为 0,那么该 int 类型的值的高二字节会用 0 来填充,否则用 1 来填充。

小结

基础知识要掌握好,底层实现也需要有一定的认识。了解虚拟机,有助于理解Java语言的一些性质,也有助于使用Java语言。

文章来源:智云一二三科技

文章标题:Java「基本数据类型」,你认为自己了解的够透彻吗?

文章地址:https://www.zhihuclub.com/199297.shtml

关于作者: 智云科技

热门文章

发表回复

您的电子邮箱地址不会被公开。

网站地图