Java基本数据类型boolean占用几个字节?

我们知道Java中的基本数据类型有以下几种
char占用2个字节
boolean占用1个字节或者4个字节(稍后解释)
byte占用1个字节
short占用2个字节
int占用4个字节
long占用8个字节
float占用4个字节
double占用8个字节

char a = 'a';
boolean b = false;
int c = 1;
......

当我们在对这些基本数据类型操作时,JVM会帮我们生成字节码指令,举个例子

public class BasicDataType {public static void main(String[] args) {int a = 1;int b = 2;int c = a + b;}
}

我们使用javac BasicDataType.java命令编译生成class,然后我们再通过javap -v BasicDataTyple.class命令来查看下生成的字节码,重点观察红色方框中的内容
在这里插入图片描述
接着我再来简单介绍iconst iadd
iconst
表示我们定义了一个int类型的常量,其中i表示int类型,
iadd
表示两个int类型变量进行相加

同理其他的基本类型也有相应的指令,具体对应关系如下

  • l 代表long
  • s代表short
  • b代表byte
  • c代表char
  • f代表float
  • d代表double

看到这里,你可能会有疑问? 为什么没有boolean类型?当时我也有这样的疑问,会不会是资料写错了,抱着怀疑的态度去思考问题,我们再来将代码做一些调整再来观察

public class BasicDataType {public static void main(String[] args) {boolean testBool = false;boolean[] testBoolArray = new boolean[10];testBoolArray[0] = true;}
}

javac BasicDataType.java
javap -v BasicDataType.class

重点关注下这个部分
在这里插入图片描述
看到这里你可能会大吃一惊,iconst 不是操作int类型的嘛,我明明操作的是boolean类型,怎么是int类型的字节码操作。
通过查询官方字节码指令集:https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-6.html#jvms-6.5.bastore

The arrayref must be of type reference and must refer to an array whose components are of type byte or of type boolean. The index and the value must both be of type int. The arrayref, index, and value are popped from the operand stack. The int value is truncated to a byte and stored as the component of the array indexed by index.
官方是这样描述boolean类型数组的,翻译过来的意思就是在操作boolean数组类型的时候,它的index索引值以及存储的值(也就是数组中的元素)都必须是int类型,对于boolean数组来说,会对int类型做截断让其占用1个字节的存储空间

总结来说就是,使用boolean数组类型,它的占用空间是一个字节,当我们单独使用boolean类型的时候,它其实被当作int类型了,那么也就是4个字节

结论我们已经知道了,接下来我们来谈谈为什么要这样处理?JVM为什么要使用int类型来表示boolean类型的字节码操作,为什么不用byte或者short,这样还可以在空间上节省一些

使用int类型的原因:
对于当下32位的处理器来说,
一次处理数据是32位(这里不是指的是32/64位操作系统),而是CPU硬件层面)的高效存取的数据,
虽然定义了boolean类型,
但是JVM只对它提工了非常有限的支持,
JVM中没有任何供boolean专用的字节码指令

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

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

相关文章

STL tuple源码分析

STL tuple源码分析 和pair一样,tuple也是STL中非常常见的数据结构。pair是个二元组,只支持两个类型参数,tuple则是个多元组,可以支持多个类型参数。因此,在具体实现上,要比pair复杂一些。我们还是以MSVC提供…

js检测网址是否可访问,javascript检测网址是否可访问,支持跨域;

js检测网址是否可访问&#xff0c;javascript检测网址是否可访问&#xff0c;支持跨域&#xff1b; <!DOCTYPE html> <html> <head><meta name"viewport" content"widthdevice-width" /><title>url检测是否可访问</tit…

从生活入手学编程(1):Edge浏览器设置自动刷新专业教程

一、前言 我们都知道&#xff0c;Edge浏览器运行时的速度卡的实在是感人…… 于是今天&#xff0c;我就突发奇想&#xff0c;来看一看怎么刷新并且还能保留页面内容。 二、探索 首先&#xff0c;我在此提醒您&#xff0c;在使用这种方法时要非常小心。因为更改网页源代…

MySQL——深入数据库原理(事务及锁)

文章目录 锁行级锁共享 (S) 锁排他 (X) 锁间隙锁 表级锁意向锁自增锁Lock Table/DDL 事务ACID 原则1. 原子性 A2. 一致性 C3. 隔离性 I4. 持久性 D 隔离级别1. READ UNCOMMITTED&#xff08;未提交读&#xff09;2. READ COMMITTED&#xff08;提交读&#xff09;3. REPEATABLE…

webpack魔法注释-预获取/预加载模块

Webpack v4.6.0 增加了对预获取&#xff08;prefetch&#xff09;和预加载&#xff08;preload&#xff09;的支持。 在声明 import 时&#xff0c;使用下面这些内置指令&#xff0c;可以让 webpack 输出“resource hint”&#xff0c;来告知浏览器&#xff1a; prefetch&…

【JavaWeb】Web程序设计期末复习总结

试题 一. 单选题&#xff08;共24题&#xff0c;24分&#xff09; 二. 多选题&#xff08;共16题&#xff0c;32分&#xff09; 三. 填空题&#xff08;共20题&#xff0c;10分&#xff09; 四. 判断题&#xff08;共30题&#xff0c;15分&#xff09; 五. 论述题&#xf…

基于TOGAF和WAF的企业级架构

TOGAF是技术无关的企业级架构框架&#xff0c;WAF则侧重于云的最佳实践和指导方针&#xff0c;本文介绍了两者的异同。原文: Enterprise Architecture with TOGAF and Well-Architected Frameworks (AWS, Azure and Google) 简介 本文旨在解释TOGAF和云架构框架/良好架构框架(W…

IaC基础设施即代码:使用Terraform 连接 alicloud阿里云

目录 一、实验 1.环境 2.alicloud阿里云创建用户 3.Linux使用Terraform 连接 alicloud 4.Windows使用Terraform 连接 alicloud 二、问题 1.Windows如何申明RAM 相关变量 2.Linux如何申明RAM 相关变量 3. Linux terraform 初始化失败 4.Linux terraform 计划与预览失败…

【LeetCode: 57. 插入区间+分类讨论+模拟】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

blender 导入到 Marvelous Designer

1&#xff09; 将模型的所有部分合并为一个单独的mesh 2&#xff09; 先调整计量单位&#xff1a; 3&#xff09;等比缩放&#xff0c;身高调整到180cm左右 4&#xff09;应用当前scale 首先&#xff0c;选中你要修改的物体&#xff0c;然后按下Ctrl-A键&#xff0c;打开应用…

CSAPP - bomblab 作弊方式2: gdb jump 命令, 以及修改 jne 为 nop 指令

CSAPP - bomblab 作弊方式2&#xff1a; gdb jump 命令&#xff0c; 以及修改 jne 为 nop 指令 厌倦了在 gdb 中一步步顺序执行 bomb 可执行程序。为什么不能自行控制程序的执行呢&#xff1f;跳到特定的函数去执行&#xff0c;又或者把原本要执行的指令改掉&#xff0c;gdb 里…

【Machine Learning】Other Stuff

本笔记基于清华大学《机器学习》的课程讲义中有关机器学习的此前未提到的部分&#xff0c;基本为笔者在考试前一两天所作的Cheat Sheet。内容较多&#xff0c;并不详细&#xff0c;主要作为复习和记忆的资料。 Robust Machine Learning Attack: PGD max ⁡ δ ∈ Δ L o s s (…

linux环境下安装postgresql

PostgreSQL: Linux downloads (Red Hat family)postgresql官网 PostgreSQL: Linux downloads (Red Hat family) 环境&#xff1a; centos7 postgresql14 选择版本 执行启动命令 配置远程连接文件 vi /var/lib/pqsql/14/data/postgresql.conf 这里将listen_addresses值由lo…

力扣399. 除法求值

广度优先搜索 思路&#xff1a; 题目梳理 输入信息里包含 A / B val&#xff1b;输入一堆 A / B 需要求出它们的比值&#xff1b;以操作数为节点&#xff0c;构建权重图&#xff0c;节点对应了关联节点及其比值&#xff1b;可以进行简单的处理&#xff0c;将代数变量映射为整…

【位运算】【二分查找】【C++算法】100160价值和小于等于 K 的最大数字

作者推荐 【动态规划】【字符串】扰乱字符串 本文涉及的基础知识点 二分查找算法合集 位运算 LeetCode100160. 价值和小于等于 K 的最大数字 给你一个整数 k 和一个整数 x 。 令 s 为整数 num 的下标从1 开始的二进制表示。我们说一个整数 num 的 价值 是满足 i % x 0 且…

数据分析---SQL(3)

目录 IF和CASE WHEN的区别IF函数示例CASE WHEN示例如何求字段整体的标准差和均值什么是笛卡尔积笛卡尔积通常的使用场景是什么rank、dense rank、row number的区别rank函数示例dense rank函数示例row number函数示例什么是窗口函数除了rank之外还有哪些窗口函数IF和CASE WHEN的…

阿里云ingress配置时间超时的参数

一、背景 在使用阿里云k8s集群的时候&#xff0c;内网API网关&#xff0c;刚开始是用的是Nginx&#xff0c;后面又搭建了ingress。 区别于nginx配置&#xff0c;ingress又该怎么设置参数呢&#xff1f;比如http超时时间等等。 本文会先梳理nginx是如何配置&#xff0c;再对比…

优雅的删除链表元

王有志&#xff0c;一个分享硬核Java技术的互金摸鱼侠加入Java人的提桶跑路群&#xff1a;共同富裕的Java人 在数据结构&#xff1a;链表中&#xff0c;我们实现了链表的删除方法&#xff0c;但代码看起来并不“优雅”&#xff0c;那么今天我们就来尝试使用多种方法&#xff0c…

Halcon 3D相关算子(二)

(1) moments_object_model_3d( : : ObjectModel3D, MomentsToCalculate : Moments) 功能&#xff1a;计算3D对象模型的平均值或中心二阶矩。要计算3D物体模型点的平均值&#xff0c;在MomentsToCalculate中选择mean_points&#xff1b;如果要计算二阶中心矩&#xff0c;则选择…

windows安装conda环境,开发openai应用准备,运行第一个ai程序

文章目录 前言一、windows创建openai开发环境二、国内代理方式访问openai的方法&#xff08;简单方法&#xff09;三、测试运行第一个openai程序总结 前言 作者开发第一个openai应用的环境准备、第一个openai程序调用成功&#xff0c;做个记录&#xff0c;希望帮助新来的你。 …