java常量池

目录

1 Class常量池

2 运行时常量池

3 字符串常量池

3.1 为什么要设计字符串常量池

3.2 字符串对象三种创建姿势

3.3 字符串的+操作

3.4 字符串的不可变性

4 包装类型常量池


1 Class常量池
  • class 文件资源仓库
  • javap命令可以查看class常量池

  • 主要包含字面符号引用
  • 字面
    • 数字字母特殊符号组成常量
    • 通常包含字符串字面量数值字面量
    • 字面包含代码出现的常量或者接口限定属性名称和描述符方法名称和描述符
  • 符号引用
    • 指的或者接口限定属性名称和描述符方法名称和描述符常量池引用形式存在指向常量一个或者多个字面量索引
    • 每一个符号引都有其特殊含义,表明接口方法或者属性
    • 每一个符号引用都指向一个或者多个具体字面

2 运行时常量池
  • Class常量池jvm运行时load内存
  • 其中符号引用被替换直接引用其指向字面量的内存地址
3 字符串常量池
3.1 为什么要设计字符串常量池
  • 字符串作为基础数据类型频繁使用
  • 每次创建字符串对象需要对其分配内存这个非常消耗时间内存空间操作极大影响程序
  • jvm为了提升性能减少内存开销字符串实例时候进行一些优化
  • 字符串开辟字符串常量
  • 创建字符串常量首先查询字符串常量池是否存在字符串
  • 存在返回引用不存在实例化字符串放入常量池
  • 字符串常量池存储
3.2 创建字符串对象的三种姿势
  • 字符串对象内存分配涉及对象本身以及内部char数组对象内存分配
  • 只要字符串相同对象均指向同一char数组对象
  • 至于字符串对象指向引用是否相同需要具体操作

  • 直接赋值创建
String str = "test";
String intern = str.intern();
    • 字符串常量查看test是否存在
    • 如果存在返回引用
    • 如果不存在字符串常量池创建一个对象返回引用
    • 此时intern()方法返回引用和str是同一个引用

  • new String("test")创建
String str = new String("test");
String intern = str.intern();
    • new String操作执行之前因为test通过形参传入,会执行直接赋值流程
    • 然后new String时对象分配内存
    • 但是内部value属性在常量池查找找到testchar数组对象指向引用
    • 此时调用intern()方法返回字符串常量池引用,与str引用不同

  • new String(bytes)创建
byte[] bytes = new byte[]{
      
      116,101,115,116};
String str = new String(bytes);
String intern = str.intern();
    • new String直接创建字符串对象
    • 调用intern()方法时,在字符串常量池分配内存,内存值指向str对象
    • 因此intern()方法返回的引用与str引用一致
    • 调用intern()方法

    • 调用intern()

    • 调用intern()方法执行直接赋值操作

3.3 字符串的+操作
  • +两边都是常量编译确定等同没有+
String a = "ab";
String b = "a"+"b";
 System.out.println(a == b); //true,常量池引用

  • +存在变量使用StringBuilderappend拼接字符串
String a = "ab";
String b = "b";
String c = "a"+ b;
//false,a为常量池引用,
//c为StringBuilder对象toString()返回对象,new新对象
System.out.println(a == c); 

  • +存在变量但是+使用final修饰编译确定
String a = "ab";
final String b = "b";
String c = "a"+ b;
System.out.println(a == c); //true,ac指向常量池引用

3.4 字符串的不可变性
  • 字符重新赋值操作创建新的字符串对象之前字符串对象如果没有其他引用指向会被垃圾回收器回收
  • 字符串+操作存在变量的情况都是采用StringBuilder对象拼接子串最后调用toString()方法返回字符串对象
  • 字符串对象截取替换api方法都是返回字符串对象

  • 字符串内部纸箱char数组对象final修饰指向不可被修改

4 包装类型常量池
  • 通过=包装类型赋值隐式调用对应valueOf()方法
  • 包装类型常量池机制是通过valueOf()方法实现
  • FloatDouble实现常量池

  • Boolean类型常量只有两个TrueFalse

  • ByteShort,Long实现-128~127常量池

  • Integer默认支持-128~127常量池可设置配置项常量池范围

Integer通过配置java.lang.Integer.IntegerCache.high调整常量池最大

  • Character实现0~127常量池

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C语言-内存管理

1、malloc()函数 用于动态分配一块指定大小的内存,并返回指向这块内存的指针。如果分配失败, 返回 NULL。 int* ptr (int*)malloc(sizeof(int) * 10); // 分配一个包含 10 个整数的内存 if (ptr NULL) {printf("Memory allocation failed!\n&q…

基于ESP32-IDF驱动GPIO输出控制LED

基于ESP32-IDF驱动GPIO输出控制LED 文章目录 基于ESP32-IDF驱动GPIO输出控制LED一、点亮LED3.1 LED电路3.2 配置GPIO函数gpio_config()原型和头文件3.3 设置GPIO引脚电平状态函数gpio_set_level()原型和头文件3.4 代码实现并编译烧录 一、点亮LED 3.1 LED电路 可以看到&#x…

YOLOv5训练自己的数据及rknn部署

YOLOv5训练自己的数据及rknn部署 一、下载源码二、准备自己的数据集2.1 标注图像2.2 数据集结构 三、配置YOLOv5训练3.1 修改配置文件3.2 模型选择 四、训练五、测试六、部署6.1 pt转onnx6.2 onnx转rknn 七、常见错误7.1 训练过程中的错误7.1.1 cuda: out of memory7.1.2 train…

MATLAB 如何避免复杂shp文件对inpolygon的影响

**任务描述:**当我想用inpolygon函数将属于非洲的pixel选出来时,发现因为周边小岛的影响,pixel选取有问题,如下图。 第一种解决办法: 首先将复杂shp文件查分成简单的shp文件,即将不相交的元素分离开 [QGIS…

2025.01春节可用两个带源的TV直播软件

电视直播pro 2.612 论坛的分享: https://tieba.baidu.com/p/9183010315 我的网盘 http://pan.ezdial.cn/nasone/tvbox/%E7%94%B5%E8%A7%86%E7%9B%B4-pro.apk 这个软件挺牛逼的,因为虽然有直播购物,但是里面的频道是真好,有电影解说有电视剧, 最后还能自定义播放源. 唯一不足找…

Ubuntu24.04初始化MySQL报错 error while loading shared libraries libaio.so.1

Ubuntu24.04初始化MySQL报错 error while loading shared libraries: libaio.so.1 问题一:libaio1不存在 # 提示libaio1不存在 [rootzabbix-mysql-master.example.com x86_64-linux-gnu]#apt install numactl libaio1 Reading package lists... Done Building depe…

【Linux】其他备选高级IO模型

其他高级 I/O 模型 以上基本介绍的都是同步IO相关知识点,即在同步I/O模型中,程序发起I/O操作后会等待I/O操作完成,即程序会被阻塞,直到I/O完成。整个I/O过程在同一个线程中进行,程序在等待期间不能执行其他任务。下面…

RV1126+FFMPEG推流项目源码

源码在我的gitee上面,感兴趣的可以自行了解 nullhttps://gitee.com/x-lan/rv126-ffmpeg-streaming-projecthttps://gitee.com/x-lan/rv126-ffmpeg-streaming-project

VMware虚拟机克隆或复制linux后无法上网的解决方案

1.首先转移虚拟机到另一台电脑 【虚拟机转移】超详细的将虚拟机(ubuntu)从一台电脑复制到另一台电脑教程_虚拟机复制到另一台电脑-CSDN博客 1.先把虚拟机整个文件拷贝到另一台电脑 2。打开vmware,选择打开虚拟机,选择 .vmx 就可…

具有CLI命令和Web界面的WOL

简介 什么是 wol ? wol 是一个命令行工具,用于发送唤醒网络上设备的 Wake-On-LAN(WOL)魔法包。具有命令行界面和网页界面两种功能。本文只介绍了网页界面。 主要特点 功能:通过发送 Wake-On-LAN(WOL&…

Vue2:使用sortablejs实现el-table中行拖拽调整顺序

如图,实现拖拽表格中的行来调整行顺序,但是其中的编号仍然是1、2、3、4的顺序,不跟着变化。 实现如下: 一、导入sortablejs import Sortable from "sortablejs";export default { components: {Sortable},data() {return {//数据中的id很重要,拖拽行重新排序…

分布式光纤应变监测是一种高精度、分布式的监测技术

一、土木工程领域 桥梁结构健康监测 主跨应变监测:在大跨度桥梁的主跨部分,如悬索桥的主缆、斜拉桥的斜拉索和主梁,分布式光纤应变传感器可以沿着这些关键结构部件进行铺设。通过实时监测应变情况,能够精确捕捉到车辆荷载、风荷…

智能手机“混战”2025:谁将倒下而谁又将突围?

【潮汐商业评论原创】 “去年做手机比较艰难,几乎每个品牌都在调价、压货,像华为这种以前都不给我们分货的厂商,也开始成为我的主要库存。不过今年开头比较好,20号国补一开始,店里的人流和手机销量就明显涨了不少&…

OpenCV文字绘制支持中文显示

OpenCV版本:4.4 IDE:VS2019 功能描述 OpenCV绘制文本的函数putText()不支持中文的显示,网上很多方法推荐的都是使用FreeType来支持,FreeType是什么呢?FreeType的官网上有介绍 FreeType官网 https://www.freetype.or…

MyBatis-Plus的条件构造器和常用接口

一、wrapper介绍 Wrapper : 条件构造抽象类,最顶端父类 ​ AbstractWrapper : 用于查询条件封装,生成 sql 的 where 条件 ​ QueryWrapper : 查询条件封装 ​ UpdateWrapper : Update 条件封装 ​ Abst…

结合实例分析A2DP SBC帧结构和编解码算法

SBC也就是Sub band codec,俗称子带编码,是蓝牙A2DP必须支持的唯一编码。下面结合实例看看SBC编码数据在蓝牙传输中帧结构以及SBC的编解码算法流程: AVDTP Frame 首先AVDTP Frame是基于L2CAP协议,所以会包含有4个字节的L2CAP头部&…

接口(3)

大家好,今天我们接着上一篇的内容继续往下来看看,了解一下如何实现多个接口,与继承父类不同,一个类可以实现接口,那么话不多说,来看。 2.5实现多个接口. 在Java中,类和类之间是单继承的,一个类只能有一个…

MATLAB提供的颜色映射表colormap——伪彩色

图像处理领域的一个习惯:不是真实的颜色,一般用伪彩色。一是说明不是物体本身的颜色,二是彩色更容易分辨。 MATLAB陆续提供了16种颜色映射表colormap。 之前的都很丑,近5年新增的4种还可以。总的说来还是丑。 这是一种鸟的名字。…

网络安全 | 入侵检测系统(IDS)与入侵防御系统(IPS):如何识别并阻止威胁

网络安全 | 入侵检测系统(IDS)与入侵防御系统(IPS):如何识别并阻止威胁 一、前言二、入侵检测系统(IDS)2.1 IDS 的工作原理2.2 IDS 的技术类型2.3 IDS 的部署方式 三、入侵防御系统(…

工业“MCU+AI”

随着工业4.0的推进,传统工业设备正向智能化和自动化方向转型。这要求设备具备更高的算力、更强的实时处理能力以及支持AI算法的能力,以应对工业机器人、电机控制、预测性维护等复杂应用场景。 近年来越来越多的芯片厂商纷纷推出工业“MCUAI”产品&#…