Java基本数据类型以及包装类型的常量池技术
Java 中的基本数据类型
Java 中有 8 种基本数据类型,分别为:
- 6 种数字类型:
- 4 种整数型:byte、short、int、long
- 2 种浮点型:float、double
- 1 种字符类型:char
- 1 种布尔型:boolean。
这 8 种基本数据类型的默认值以及所占空间的大小如下:
对于 boolean,官方文档未明确定义,它依赖于 JVM 厂商的具体实现。逻辑上理解是占用 1 位,但是实际中会考虑计算机高效存储因素。
另外,Java 的每种基本类型所占存储空间的大小不会像其他大多数语言那样随机器硬件架构的变化而变化。这种所占存储空间大小的不变性是 Java 程序比用其他大多数语言编写的程序更具可移植性的原因之一(《Java 编程思想》2.2 节有提到)。
注意:
- Java 里使用 - 类型的数据一定要在数值后面加上 L,否则将作为整型解析。
char a = 'h'char
:单引号,String a = "hello"
:双引号。
这八种基本类型都有对应的包装类分别为:Byte
、Short
、Integer
、Long
、Float
、Double
、Character
、Boolean
。
包装类型不赋值就是Null
,而基本类型有默认值且不是Null
。
另外,这个问题建议还可以先从 JVM 层面来分析。
基本数据类型直接存放在 Java 虚拟机栈中的局部变量表中,而包装类型属于对象类型,对象实例都存在于堆中。相比于对象类型, 基本数据类型占用的空间非常小。
《深入理解 Java 虚拟机》 :局部变量表主要存放了编译期可知的基本数据类型
(boolean
、byte
、char
、short
、int
、float
、long
、double
)、对象引用
(reference
类型,它不同于对象本身,可能是一个指向对象起始地址的引用指针,也可能是指向一个代表对象的句柄或其他与此对象相关的位置)。
包装类型的常量池技术
Java 基本类型的包装类的大部分都实现了常量池技术。
Byte
,Short
,Integer
,Long
这 4 种包装类默认创建了数值 [-128,127]
的相应类型的缓存数据,Character
创建了数值在 [0,127]
范围的缓存数据,Boolean
直接返回True
or False
。
Integer 缓存源码:
public static Integer valueOf(int i) {if (i >= IntegerCache.low && i <= IntegerCache.high)return IntegerCache.cache[i + (-IntegerCache.low)];return new Integer(i);
}
private static class IntegerCache {static final int low = -128;static final int high;static {// high value may be configured by propertyint h = 127;}
}
Character 缓存源码:
public static Character valueOf(char c) {if (c <= 127) { // must cachereturn CharacterCache.cache[(int)c];}return new Character(c);
}private static class CharacterCache {private CharacterCache(){}static final Character cache[] = new Character[127 + 1];static {for (int i = 0; i < cache.length; i++)cache[i] = new Character((char)i);}}
Boolean 缓存源码:
public static Boolean valueOf(boolean b) {return (b ? TRUE : FALSE);
}
如果超出对应范围仍然会去创建新的对象,缓存的范围区间的大小只是在性能和资源之间的权衡。
两种浮点数类型的包装类 Float
,Double
并没有实现常量池技术。
Integer i1 = 33;
Integer i2 = 33;
System.out.println(i1 == i2);// 输出 trueFloat i11 = 333f;
Float i22 = 333f;
System.out.println(i11 == i22);// 输出 falseDouble i3 = 1.2;
Double i4 = 1.2;
System.out.println(i3 == i4);// 输出 false
下面来看一下问题。下面的代码的输出结果是 true
还是 false
呢?
Integer i1 = 40;
Integer i2 = new Integer(40);
System.out.println(i1==i2);
Integer i1=40
这一行代码会发生装箱,也就是说这行代码等价于 Integer i1=Integer.valueOf(40)
。因此,i1
直接使用的是常量池中的对象。而Integer i2 = new Integer(40)
会直接创建新的对象。
因此,答案是 false
。
记住:所有整型包装类对象之间值的比较,全部使用 equals 方法比较。
自动装箱与拆箱原理
什么是自动拆装箱
- 装箱:将基本类型用它们对应的引用类型包装起来;
- 拆箱:将包装类型转换为基本数据类型;
举例:
Integer i = 10; //装箱
int n = i; //拆箱
上面这两行代码对应的字节码为:
L1LINENUMBER 8 L1ALOAD 0BIPUSH 10INVOKESTATIC java/lang/Integer.valueOf (I)Ljava/lang/Integer;PUTFIELD AutoBoxTest.i : Ljava/lang/Integer;L2LINENUMBER 9 L2ALOAD 0ALOAD 0GETFIELD AutoBoxTest.i : Ljava/lang/Integer;INVOKEVIRTUAL java/lang/Integer.intValue ()IPUTFIELD AutoBoxTest.n : IRETURN
从字节码中,可以发现装箱其实就是调用了 包装类的valueOf()
方法,拆箱其实就是调用了 xxxValue()
方法。
因此,
Integer i = 10
等价于Integer i = Integer.valueOf(10)
int n = i
等价于int n = i.intValue()
注意:如果频繁拆装箱的话,也会严重影响系统的性能。应该尽量避免不必要的拆装箱操作。
相关文章:

Java基本数据类型以及包装类型的常量池技术
Java 中的基本数据类型 Java 中有 8 种基本数据类型,分别为: 6 种数字类型: 4 种整数型:byte、short、int、long2 种浮点型:float、double 1 种字符类型:char1 种布尔型:boolean。 这 8 种基本…...
P1054 [NOIP2005 提高组] 等价表达式
题目描述 明明进了中学之后,学到了代数表达式。有一天,他碰到一个很麻烦的选择题。这个题目的题干中首先给出了一个代数表达式,然后列出了若干选项,每个选项也是一个代数表达式,题目的要求是判断选项中哪些代数表达式…...

什么牌子蓝牙耳机好用不贵?国产性价比高的蓝牙耳机推荐
相较于有线耳机,无线蓝牙耳机更便携、功能更丰富,不用受到耳机孔与线的限制。那么,什么牌子的蓝牙耳机好用不贵?针对这个问题,我给大家推荐几款国产性价比高的蓝牙耳机,可以当个参考。 一、南卡小音舱Lite…...

明明花钱上了ERP,为什么还要我装个MES系统
目前, ERP系统依旧是很多制造企业的选择。据统计,ERP系统的应用已经达到70%以上,但是在车间的应用, MES系统的应用比例并不高。那么,为什么现在很多企业又都选择再上个MES呢? MES系统是一个面向…...
JAVA中的集合框架有哪些?
在Java中,集合(Collection)是一组对象的容器,而集合框架(Collection Framework)是一组接口、实现类和算法,用于存储和操作集合。Java集合框架提供了一组通用的、高性能的、可扩展的接口和类&…...

用Jmeter进行接口自动化测试的工作流程你知道吗?
目录 测试流程 接口测试相关文档管理规范 接口测试要点 测试流程 在测试负责人接受到测试任务后,应该按照以下流程规范完成测试工作。 2.1 测试需求分析 产品开发负责人在完成某产品功能的接口文档编写后,在核对无误后下发给对应的接口测试负责人…...
Java 中的设计模式有哪些?(十九)
Java设计模式是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。 设计模式可以帮助我们解决软件开发过程中面临的一般问题,提高代码的可读性、可复用性和可扩展性。 Java中一般认为有23种设计模式,总体来说设计模式分为三大类&…...
奇数单增序列
题目描述 给定一个长度为 N(不大于 500)的正整数序列,请将其中的所有奇数取出,并按升序输出。 输入格式 第 1 行为 N;第 2 行为 N 个正整数,其间用空格间隔。 输出格式 增序输出的奇数序列,…...

Seata介绍
介绍: Seata的设计目标是对这个业务无侵入,因此从业务无侵入的2PC方案开始的,在传统的2PC的基础上演进的。它把一个分布式事务拆分理解成一个包含了若干分支事务的全局事务。全局事务的职责是协调其下管辖的分支事务达成一致性,要…...

VK Cup 2017 - Round 1 A - Bear and Friendship Condition(并查集维护大小 + dfs 遍历图统计边数)
题目大意: 给你一些n个点m条边,如果三个点(a,b,c)是合法的,当且仅当 a-b,b-c,c-a都有一条边,问你这个图是否合法,如果有一个或两个点视为合法 思路 考虑什么图才是个合法图:除了点…...

为UOS启用VNC和Windows远程桌面
1 参考资料 UOS系统中安装x11vnc远程桌面 如何通过windows电脑远程UOS桌面RDP 已在ARM版本和X86版本中验证均可用 2 准备工作 2.1 设置代理(可选) 如果设备本身能和公网通,就不需要了。 由于我们全程需要在root账号下进行,系…...
Java时间类(七)-- LocalDateTime()类
目录 1. LocalDateTime的概述: 2. LocalDateTime的常用方法: 1. LocalDateTime的概述: 是一个不可变的日期-时间对象,表示日期和时间,而没有时区。 它基于ISO-8601日历系统,是由日期和时间组合而成。它可以存储到纳秒级精度,并提供了各种方法来处理日期和时间的运算…...

卢北辰:数据点亮梦想,能力驱动人生 | 提升之路系列(九)
导读 为了发挥清华大学多学科优势,搭建跨学科交叉融合平台,创新跨学科交叉培养模式,培养具有大数据思维和应用创新的“π”型人才,由清华大学研究生院、清华大学大数据研究中心及相关院系共同设计组织的“清华大学大数据能力提升项…...

数据库基础及用户管理授权
数据库概念 关系型数据库 数据结构二维表格 库 -> 表 -> 列(字段):用来描述对象的的一个属性;行:用来描述一个对象的信息 mysql(5.7/8.0) maridb ocracle postgresql sqlserver(windows…...

比特米盒子刷安卓ATV6.0
最近海鲜市场有很多比特米盒子,50多块包邮,买来的盒子回来折腾下,买回来发现一直卡在“系统启动"中无法进入,不知道原来的是啥系统,看来只能找找线刷的办法,重新拯救救个这盒子。 原文链接地址&#x…...

【用python的QT做信号处理的界面】
文章目录 入口文件界面参数调整数据从dat解析出来的文件从界面点击打开文件夹的功能实现主要功能代码网络参数存图替换功能,比如把倒频谱替换成倒频谱2 入口文件 入口文件,主要用来实例化窗口(不重要),只要知道从这里…...

【Linux】进程间通信 —— 管道
文章目录 📕 进程间通信介绍📕 匿名管道原理使用读写规则特点 📕 命名管道原理使用匿名管道和命名管道的区别 📕 进程间通信介绍 进程间通信,顾名思义,就是两个进程之间的 “交流” ,我们知道&…...

知识管理在企业中的重要性
随着经济全球化和信息化的快速发展,企业面临着越来越多的竞争和挑战。如何把握市场动态、满足客户需求、提高产品质量和效率等,成为了企业发展中亟待解决的问题。而知识管理作为一种新兴的管理方式,逐渐引起了企业们的重视。本文将从以下几个…...
Socks5、网络安全、代理IP技术详解
随着互联网的发展,网络安全问题越来越受到人们的关注。为了保护个人隐私和网络安全,使用代理服务器成为了一种普遍的选择。其中,Socks5协议是一种常见的代理协议,而代理IP是使用代理服务器时经常需要考虑的问题。本文将深入探讨So…...

C++学习day--09 字符串比较、运算符
1、项目练习 第 1 节 项目需求、项目实现 项目实现: #include <iostream> #include <Windows.h> #include <string> using namespace std; int main( void ) { string name; string pwd; std::cout << " 请输入账号&am…...
Python|GIF 解析与构建(5):手搓截屏和帧率控制
目录 Python|GIF 解析与构建(5):手搓截屏和帧率控制 一、引言 二、技术实现:手搓截屏模块 2.1 核心原理 2.2 代码解析:ScreenshotData类 2.2.1 截图函数:capture_screen 三、技术实现&…...
云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?
大家好,欢迎来到《云原生核心技术》系列的第七篇! 在上一篇,我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在,我们就像一个拥有了一块崭新数字土地的农场主,是时…...

Prompt Tuning、P-Tuning、Prefix Tuning的区别
一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...

关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案
问题描述:iview使用table 中type: "index",分页之后 ,索引还是从1开始,试过绑定后台返回数据的id, 这种方法可行,就是后台返回数据的每个页面id都不完全是按照从1开始的升序,因此百度了下,找到了…...

STM32F4基本定时器使用和原理详解
STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...
Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务
通过akshare库,获取股票数据,并生成TabPFN这个模型 可以识别、处理的格式,写一个完整的预处理示例,并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务,进行预测并输…...

Python实现prophet 理论及参数优化
文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候,写过一篇简单实现,后期随着对该模型的深入研究,本次记录涉及到prophet 的公式以及参数调优,从公式可以更直观…...

从零实现STL哈希容器:unordered_map/unordered_set封装详解
本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说,直接开始吧! 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...

HarmonyOS运动开发:如何用mpchart绘制运动配速图表
##鸿蒙核心技术##运动开发##Sensor Service Kit(传感器服务)# 前言 在运动类应用中,运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据,如配速、距离、卡路里消耗等,用户可以更清晰…...
AGain DB和倍数增益的关系
我在设置一款索尼CMOS芯片时,Again增益0db变化为6DB,画面的变化只有2倍DN的增益,比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析: 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...