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常量池

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

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

相关文章

ES6语法

一、Let、const、var变量定义 1.let 声明的变量有严格局部作用域 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"&g…

windows平台通过命令行安装前端开发环境

访问node.js官网 访问node.js官网https://nodejs.org/en/download/&#xff0c;可以看到类似画面&#xff1a; 可以获取以下命令 # Download and install fnm: winget install Schniz.fnm # Download and install Node.js: fnm install 22 # Verify the Node.js version: no…

【2025小年源码免费送】

&#x1f496;学习知识需费心&#xff0c; &#x1f4d5;整理归纳更费神。 &#x1f389;源码免费人人喜&#xff0c; &#x1f525;码农福利等你领&#xff01; &#x1f496;山高路远坑又深&#xff0c; &#x1f4d5;大军纵横任驰奔&#xff0c; &#x1f389;谁敢横刀立马行…

深入 Flutter 和 Compose 的 PlatformView 实现对比,它们是如何接入平台控件

在上一篇《深入 Flutter 和 Compose 在 UI 渲染刷新时 Diff 实现对比》发布之后&#xff0c;收到了大佬的“催稿”&#xff0c;想了解下 Flutter 和 Compose 在 PlatformView 实现上的对比&#xff0c;恰好过去写过不少 Flutter 上对于 PlatformView 的实现&#xff0c;这次恰好…

小游戏源码开发搭建技术栈和服务器配置流程

近些年各种场景小游戏开发搭建版本层出不穷,山东布谷科技拥有多年海内外小游戏源码开发经验&#xff0c;现为从事小游戏源码开发或游戏运营的朋友们详细介绍小游戏开发及服务器配置流程。 一、可以对接到app的小游戏是如何开发的 1、小游戏源码开发的需求分析&#xff1a; 明…

【Linux网络编程】传输层协议

目录 一&#xff0c;传输层的介绍 二&#xff0c;UDP协议 2-1&#xff0c;UDP的特点 2-2&#xff0c;UDP协议端格式 三&#xff0c;TCP协议 3-1&#xff0c;TCP报文格式 3-2&#xff0c;TCP三次握手 3-3&#xff0c;TCP四次挥手 3-4&#xff0c;滑动窗口 3-5&#xf…

五、华为 RSTP

RSTP&#xff08;Rapid Spanning Tree Protocol&#xff0c;快速生成树协议&#xff09;是 STP 的优化版本&#xff0c;能实现网络拓扑的快速收敛。 一、RSTP 原理 快速收敛机制&#xff1a;RSTP 通过引入边缘端口、P/A&#xff08;Proposal/Agreement&#xff09;机制等&…

期权帮|在股指期货中超过持仓限额怎么办?

锦鲤三三每日分享期权知识&#xff0c;帮助期权新手及时有效地掌握即市趋势与新资讯&#xff01; 在股指期货中超过持仓限额怎么办&#xff1f; 一、立即平仓或减仓&#xff1a; &#xff08;1&#xff09;最直接且有效的方法是立即平仓或减仓&#xff0c;以降低持仓量至限额…

【FFmpeg】FLV 格式分析 ③ ( Tag Body 数据块体结构 - Vedio Data 视频数据 )

文章目录 一、Tag Body 数据块体结构 - Video Data 视频数据1、Vedio Data 视频数据 类型标识2、Vedio Data 视频数据 结构分析3、Composition Time Offset 字段涉及的时间计算4、AVC Packet Type 字段说明① AVC Sequence Header 类型② AVC NALU 类型③ AVC End of Sequence …

【React】 react路由

这一篇文章的重点在于将React关于路由的问题都给搞清楚。 一个路由就是一个映射关系&#xff0c;key:value。key是路径&#xff0c;value 可能是function或者component。 安装react-router-dom包使用路由服务&#xff0c;我这里想要用的是6版本的包&#xff0c;因此后面加”6&q…

vue3+uniapp开发鸿蒙初体验

去年7月20号&#xff0c;uniapp官网就已经开始支持鸿蒙应用开发了&#xff0c;话不多说&#xff0c;按照现有规则进行配置实现一下鸿蒙开发效果&#xff1b; 本文基于macOS Monterey 版本 12.6.5实现 开发鸿蒙的前置准备 这里就直接说我的版本&#xff1a; DevEco Studio 5.…

Git代码管理工具 — 5 GitHub远程仓库

目录 1 常用的代码托管平台 2 GitHub平台详解 2.1 github简介 2.2 Github基本功能介绍 3 GitHub创建远程仓库 3.1 创建远程仓库 3.2 创建远程仓库别名 4 推送本地分支到远程仓库 5 拉取远程库到本地 6 克隆远程库到本地 1 常用的代码托管平台 前面我们已经知道了Git…

UDP 广播组播点播的区别及联系

1、网络IP地址的分类 组播地址是分类编址的IPv4地址中的D类地址&#xff0c;又叫多播地址&#xff0c;他的前四位必须是1110&#xff0c;所以网络地址的二进制取值范围是11100000~11101111对应的十进制为 224~~239。所以以224~239开头的网络地址都是组播地址。 组播地址的功能…

mysql 学习2 MYSQL数据模型,mysql内部可以创建多个数据库,一个数据库中有多个表;表是真正放数据的地方,关系型数据库 。

在第一章中安装 &#xff0c;启动mysql80 服务后&#xff0c;连接上了mysql&#xff0c;那么就要 使用 SQL语句来 操作mysql数据库了。那么在学习 SQL语言操作 mysql 数据库 之前&#xff0c;要对于 mysql数据模型有一个了解。 MYSQL数据模型 在下图中 客户端 将 SQL语言&…

10个非常基础的 Javascript 问题

Javascript是一种用于Web开发的编程语言。JavaScript在网络的客户端上运行。 根据MDN&#xff0c;JavaScript&#xff08;通常缩写为JS&#xff09;是一种轻量级的&#xff0c;解释性的&#xff0c;面向对象的语言&#xff0c;具有一流的功能&#xff0c;并且最著名的是Web页面…

把 PVE 下的机械硬盘(非SSD系统盘)分配给虚拟机使用

PVE 挂在硬盘 参考 Ubuntu 24.04 LTS 空闲硬盘挂载到 文件管理器的 other locations。 在 PVE shell 中根据上面教程挂在硬盘 新建分享目录 参考 Proxmox VE&#xff08;PVE&#xff09;添加硬盘做存储 虚拟机新增硬盘 虚拟机 关机&#xff0c;按下图新增硬盘 新增硬盘…

制作动态菜单

动态菜单的说明 什么叫做动态菜单&#xff1f;动态菜单就是根据用户属于不同的角色&#xff0c;每个角色还有不同的菜单&#xff0c;左侧菜单栏会有不同的显示 前端加载流程 menu.js 修改/src/api/menu.js中的请求地址&#xff0c;如下所示&#xff1a; // 获取菜单 export…

C语言数组详解:从基础到进阶的全面解析

在C语言中&#xff0c;数组是一种基本的数据结构&#xff0c;用于存储多个相同类型的数据。数组的引入使得C语言能够高效地存储和操作大量数据。在任何一个C语言程序中&#xff0c;数组都发挥着极其重要的作用。无论是在算法实现、数据存储、还是在复杂程序的设计中&#xff0c…

什么是COLLATE排序规则?

在当今数字化世界中&#xff0c;数据的整理、比较和排序是至关重要的。在数据库管理和编程语言中&#xff0c;我们经常需要对字符串进行排序&#xff0c;以展示或处理信息。为了实现这一点&#xff0c;各种系统和工具提供了排序规则&#xff0c;其中COLLATE排序规则就是其中的一…

【数据结构进阶】红黑树超详解 + 实现(附源码)

&#x1f31f;&#x1f31f;作者主页&#xff1a;ephemerals__ &#x1f31f;&#x1f31f;所属专栏&#xff1a;数据结构 目录 前言 一、红黑树介绍 二、红黑树原理详解 三、红黑树的实现 1. 节点定义 2. 红黑树类型定义及接口声明 3. 红黑树的插入&#xff08;重点&a…