java中的字符串常量池_java字符串常量池

2023-11-15

8cc728ca382138cb7d9c8a162807d4b6.png

字符串常量池SCP

jdk1.6是放在永久代(8中叫方法区或叫元空间)中;

jdk1.7+中,字符串常量池放入了堆中,注意运行时常量依然存放在方法区,例如,Integer a = 40;Java在编译的时候会直接将代码封装成Integer a =Integer.valueOf(40);从而使用常量池中的对象。

字符串常量池中的元素是唯一的

jdk1.7+为了节省内存,对象的真实数据实际上只会有一份,要么在scp中,要么在scp外的堆中,然后scp中引用堆中的地址

intern函数

查询字符串常量池中是否存在当前字符串;

如果字符串常量池中存在此字符串,返回常量池中的字符串的地址;如果常量池中不存在,在常量池中添加此字符串,并返回地址

创建字符串到字符串常量池

String s0 = "abc"; 这种方式创建的字符串直接存放到字符串常量池中

通过new的方式创建的字符串,需要调用intern()方法,就可以存放到字符串常量池中

创建对象个数

可以通过字节码文件查看

String s2 = new String("abc");

上面这行代码实际创建了2个对象,一个是字符串常量池外部的堆空间的abc,另一个是常量池中引用堆空间中abc的地址,s2本体是存放在scp外的堆中,常量池引用了这个地址

String s5 = new String("a") + new String("b") + new String("c");

上面这行代码,字符串常量池中没有存放"abc",会单独存放"a","b","c";

变量之间使用+号,实际会创建一个StringBuilder,然后调用append(),最后调用toString()方法

创建方式

使用字面量(引号)创建

String s1= "abc";

String s2= "abc";

当我们第一次执行String s1 =“abc”时,JVM将在常量池中创建一个新对象,s1将引用该对象,即“abc”。

当我们第二次执行String s2 =“abc”时,JVM将检查字符串常量池中是否存在任何值为“abc”的对象。截至现在是的,我们已经在“字符串常量”池中存在“abc”,因此它不会创建新对象,只是s2引用变量将指向现有的“abc”对象。

使用new关键字

String s2 = new String("abc");

jvm会第一步检查常量池是否有"abc", 发现没有,创建一个新对象在常量池中.

然后因为有new关键词,所以会在堆中创建对象,然后将这个对象的地址引用返回

组合创建

String st1 ="abc";

String st2 = new String("abc");

当我们执行String st1 ="abc";时,JVM将在字符串常量池中创建一个对象

执行第二步的时候,JVM将检查字符串常量池中是否有任何可用的名称为“abc”的对象,现在是有,我们已经在字符串常量池中使用了“abc”,因此JVM不会在字符串常量池中创建任何对象。

因为有new关键词,它将在堆中创建一个对象,st2将指向该对象。

intern验证

以下代码运行环境为jdk1.8

情景一

String str = "aa";

String str2 = new String("aa");

System.out.println(str == str2); //false

String str3 = str2.intern();

System.out.println(str == str3); //true

String str = “aa”;在scp创建了一个对象"aa",

而String str2 = new String(“aa”);这里其实有两步

第一步java去scp找"aa",发现scp有"aa"

第二步,在堆中创建对象.所以两者地址不一样,str == str2 为false.

第二个,在经过 String str3 = str2.intern();后,intern发现scp已经有"aa"了, 所以直接将scp的地址返回给str3, 所以str == str3都是scp的地址,所以为true.

情景二

String s = new String("a") + new String("b");

String s1 = "ab" + "cd";

String s2 = s.intern();

String s3 = "ab";

System.out.println(s == s2); //true

System.out.println(s3 == s2);//true

这是因为第一行代码, 据上面所知,不管"a"和"b",只会在堆中创建"ab"对象

第二行代码,我们用两个声明字符串相加,可知jvm会优化,直接在scp中创建"abcd"

第三行代码,s调用intern方法,发现scp没有"ab",将s在堆中的引用地址给s2

第四行代码,java先去scp找"ab",发现有,直接将其地址返回给s3

所以s指向堆中的地址,s2也是这个地址,所以相同. s3==s2同理,相同

情景三

如果将String s3 = "ab"放到前面

String s = new String("a") + new String("b");

String s1 = "ab" + "cd";

String s3 = "ab";

String s2 = s.intern();

System.out.println(s == s2); //false

System.out.println(s3 == s2); //true

第一行代码和第二行代码如上

第三行代码,java发现scp没有"ab",在scp创建新对象,然后返回地址给s3

第四行代码,s调用intern方法,发现scp有"ab",将s在scp中的引用地址给s2

所以s是堆中的地址,s2和s3是scp的地址,所以结果是false和true

情景四

这次不调整代码顺序,而是将"ab" + “cd”,两个声明式相加,变成其中一个是变量

String s = new String("a") + new String("b");

String s1 = "ab" + s;

String s2 = s.intern();

String s3 = "ab";

System.out.println(s == s2); //false

System.out.println(s3 == s2); //true

因为s1不再是两个声明式相加,编译器无法得知结果,所以将String s1 = "ab" + s变成:String var = "ab";String s1 = var + s;

所以"ab"会在scp中,s2拿到的也会是var的地址,所以s == s2 为false

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java中的字符串常量池_java字符串常量池 的相关文章

  • 【linux kernel】linux中断管理—软中断

    linux中断管理 软中断 一 简介 软中断是linux预留给系统中对时间要求最为严苛和最重要的中断下半部使用的 并且 驱动中只有一些对时间极其敏感的模块使用了 例如 块设备和网络子系统 linux系统中定义了几种软中断类型 如下所示 in
  • 面试题:连续子数组的最大和与循环列表中的子数组最大和

    一 连续子数组的最大和 LeetCode 53 Maximum Subarray 题意 给定一个整数数组 nums 找到一个具有最大和的连续子数组 子数组最少包含一个元素 返回其最大和 定义dp i 为前i个数中的连续子数组的最大和 状态转
  • Jenkins+SonarQube 代码质量检测详解

    一 SonarQube 概述 1 SonarQube 简介 Sonar Qube是一个开源的代码分析平台 支持Java Python PHP JavaScript CSS等25种以上的语言 可以检测出重复代码 代码漏洞 代码规范和安全性漏洞
  • HTTP基础知识(用一万字帮助你入门)

    HTTP中文意思是超文本传输协议 它可以承载的内容有很多像html web Api css js等等 入门HTTP 一 初识 1 1背景知识 二 协议分析 2 1http的发展历程 2 2状态码 2 3缓存 2 4HTTP 2概述 2 5H
  • 利用Python实现黑客帝国代码雨,打造属于自己的黑客帝国

    导语 看安全类文章的时候 发现文章前面经常会加个代码雨的特效图 感觉拿来用python实现一下当成一个小案例还是不错的 让我们愉快地开始吧 开发工具 Python版本 3 6 4 相关模块 pygame模块 以及一些python自带的模块
  • 计算机打印错误,打印机错误正在打印处理方法,详细教您电脑打印机错误正在打印处理方法...

    打印机 是办公常见的打印设备 平时需要打印表格 订单什么的 但是有的时候打印东西会提示 正在打印打印错误 但是打印机连接完好 驱动也安装正确 这是怎么回事呢 下面 小编就教大家如何去解决打印机出现正在打印处理方法 如今在办公室中电脑和打印机
  • CVE-2021-3156 sudo堆溢出 漏洞分析

    漏洞简介 sudo 是 linux 系统管理指令 是允许系统管理员让普通用户执行一些或者全部的 root 命令的一个工具 它允许授权用户以 root 权限执行命令或者程序 sudo 的 sudoer 插件里面存在一个堆溢出漏洞 攻击者可以利
  • Java异步执行代码块,史上最简单的异步执行!!!

    声明 private static final ExecutorService executor Executors newCachedThreadPool new ThreadFactory int i 0 Override public
  • Git命令使用教程

    git文件提交大致流程 本地文件 git add 文件名 暂存区 git commit m 提交信息 本地仓库 git push 远程仓库地址 复制的 分支名称 要推送的分支名称 远程仓库 github git操作详细流程 1 先配置提交人
  • Unity导入google.protobuf失败,无法找到google命名空间

    问题 1 刚开始把protobuf的文件夹直接从其他项目里 unity2021 里复制到unity 2020 版本 当时报错protobuf dll的依赖项system memory版本不对 2 没有使用原来的protobuf文件了 使用v
  • Qt 第29课、主窗口中的状态栏

    1 主窗口中的状态栏 状态栏的概念和意义 状态栏是应用程序中输出简要信息的区域 状态栏一般位于主窗口的最底部 状态栏的消息类型 实时消息 如 当前程序状态 永久消息 如 程序版本号 机构名称 进度消息 如 进度条提示 百分比提示 在 Qt
  • 【Spring] Spring boot 报错 Unable to start ServletWebServerApplicationContext due to missing ServletWe

    1 概述 spring 报错如下 Error starting ApplicationContext To display the conditions report re run your application with debug e
  • 基于zookeeper的MySQL主主负载均衡的简单实现

    基于zookeeper的MySQL主主负载均衡的简单实现 1 先上原理图 2 说明 两个mysql采用主主同步的方式进行部署 在安装mysql的服务器上安装客户端 目前是这么做 以后想在zookeeper扩展集成 客户端实时监控mysql应
  • hot编码 字符one_笔记1 one-hot、embedding

    one hot 在特征工程中需要对数据进行预处理 one hot在数据预处理中比较常见 1 什么是one hot One Hot编码 又称为一位有效编码 主要是采用N位状态寄存器来对N个状态进行编码 每个状态都由他独立的寄存器位 并且在任意
  • java 16进制字符串转16进制

    author j public class Test public static void main String args byte b HexString2Bytes AA020155 String s Bytes2HexString
  • IDA详细使用教程

    文章目录 软件介绍 目录结构 启动页面 IDA文件加载 界面介绍 常用快捷键 操作概述 函数操作 数据类型操作 导航操作 类型操作 关闭数据库 软件介绍 Ollydbg 仅仅是运行于 Windows 用户模式下的一种 32 位调试器 而 I
  • IDEA常用插件

    cajon plugin zip ChatGPT zip Generate All Getter And Setter zip github copilot intellij zip idea mybatis generator zip i
  • c++栈的用法(1)

    栈最大的特点是 先进后出 如同一筒羽毛球 先放进去的球是最后才能拿出来的 而后放进去的球却是最先拿出来的 同理 先储存进栈中的元素是最后才能展现 而后放进去的却是最先展现的 栈的头文件是 include
  • MySQL基础篇-第11章_数据处理之增删改

    第11章 数据处理之增删改 讲师 尚硅谷 宋红康 江湖人称 康师傅 官网 http www atguigu com 1 插入数据 1 1 实际问题 解决方式 使用 INSERT 语句向表中插入数据 1 2 方式1 VALUES的方式添加 使

随机推荐

  • 老司机教你如何跨进Python的大门

    1 Python介绍 python 动态语言 java 静态语言 python不用编译 直接解释执行 不用像java一样显式声明变量 要不要学看下图 2 安装Python 下载 解压缩 或者安装 配置环境变量 没错就是这么简单 查看pyth
  • 服务 zookeeper 不支持 chkconfig

    在给zk设置开机启动的时候 报错 服务 zookeeper 不支持 chkconfig 因为配置文件是从别人的博客了拷贝的 只是改了个性化的部分 然后就粘贴到服务器上了 服务器上使用service能正常执行start stop status
  • windows环境下springboot程序启停脚本

    1 启动应用脚本 echo off if 1 h goto begin mshta vbscript createobject wscript shell run nx0 h 0 window close exit begin start
  • css伪类where、is、has用法

    目录 一 where 1 作用 2 用法 3 优先级 二 is 1 作用 2 用法 3 优先级 三 has 1 作用 2 用法 3 优先级 css伪类where is has用法 一 where 1 作用 where CSS 伪类函数接受选
  • Windows查看和导入证书(.cer / .pfx)

    文章目录 证书介绍 问题汇总 导入导出细节注意 如何查看以上两种证书的到期日 Windows下导入证书 证书介绍 作为文件形式存在的证书一般有以下几种格式 带有私钥的证书 由Public Key Cryptography Standards
  • 深度学习-第T5周——运动鞋品牌识别

    深度学习 第T5周 运动鞋品牌识别 深度学习 第T5周 运动鞋品牌识别 一 前言 二 我的环境 三 前期工作 1 导入数据集 2 查看图片数目 3 查看数据 四 数据预处理 1 加载数据 1 设置图片格式 2 划分训练集 3 划分验证集 4
  • 如何选购阿里云服务器并快速入门(Windows版本)?

    本入门教程采用ecs g6 large实例规格 在Windows Server 2016系统上配置了IIS服务 结合ECS管理控制台展示如何快速使用云服务器ECS 准备工作 创建账号 以及完善账号信息 注册阿里云账号 并完成实名认证 具体操
  • Centos 7 Zabbix 6.0 TimescaleDB 安装配置

    Zabbix 6 0 TimescaleDB 安装配置 系统 Centos7 PHP PHP 7 4 30 apache httpd 2 4 6 PostgreSQL 13 TimescaleDB version 2 7 0 zabbix
  • C++学习(四三五)android获取so安装路径

    ClassLoader loader getClassLoader try Method library ClassLoader class getDeclaredMethod findLibrary String class String
  • 《深入理解计算机系统》实验八Proxy Lab 下载和官方文档机翻

    前言 深入理解计算机系统 官网 http csapp cs cmu edu 3e labs html 该篇文章是 实验八Proxy Lab的Writeup proxylab pdf 机翻 原文 http csapp cs cmu edu 3
  • python的面向对象和面向过程(意义和区别)

    面向过程 侧重于怎么做 1 把完成某一个需求的 所有步骤 从头到尾 逐步实现 2 根据开发要求 将某些功能独立的代码封装成一个又一个函数 3 最后完成的代码 就是顺序的调用不同的函数 特点 1 注重步骤和过程 不注重职责分工 2 如果需求复
  • 2020电赛经验总结+E题解题思路

    2020电赛经验总结 E题解题思路 取得的成果和经验 四川省2020年电子设计竞赛已经落下帷幕 第一次参加电赛 无论从知识还是经验上都有所获得 虽然只取得省三的成绩 但整个比赛过程为明年备战国赛具有指导作用 也算是一个不错的结果 一个团队中
  • 深度学习超分辨率重建(总结)

    本文为概述 详情翻看前面文章 1 SRCNN 2 3改进 开山之作 三个卷积层 输入图像是低分辨率图像经过双三次 bicubic 插值和高分辨率一个尺寸后输入CNN 图像块的提取和特征表示 特征非线性映射和最终的重建 使用均方误差 MSE
  • linux time 和/usr/bin/time

    http codingstandards iteye com blog 798788 用途说明 time命令常用于测量一个命令的运行时间 注意不是用来显示和修改系统时间的 这是date命令干的事情 但是今天我通过查看time命令的手册页 发
  • LeetCode #124 二叉树中的最大路径和

    124 二叉树中的最大路径和 路径 被定义为一条从树中任意节点出发 沿父节点 子节点连接 达到任意节点的序列 同一个节点在一条路径序列中 至多出现一次 该路径 至少包含一个 节点 且不一定经过根节点 路径和 是路径中各节点值的总和 给你一个
  • ADO方法操作数据库

    一 ADO连接数据库步骤 1 这行不能少 import C Program Files Common Files system ado msado60 tlb no namespace rename EOF adoEOF 2 初始化ado组
  • 让HTML img垂直居中的三种办法:

    声明 原文来自DIVCSS5 其次原文代码存在一些引起误解的地方 已经进行修改和测试 下文会注明引起误解的地方 主要收藏为方便下次阅读 故进行转发 如有侵权 请私聊本人 定立即删除 原文连接 DIVCSS5 让html img垂直居中的三种
  • 2018腾讯移动游戏技术评审标准与实践案例

    文档下载点这里 lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt 下载文档 gt gt gt gt gt gt gt gt gt gt gt gt gt gt
  • webpack系列 —— 打包原理

    为什么要使用webpack 如今的很多网页其实可以看做是功能丰富的应用 它们拥有着复杂的JavaScript代码和一大堆依赖包 为了简化开发的复杂度 前端社区涌现出了很多好的实践方法 模块化 让我们可以把复杂的程序细化为小的文件 类似于Ty
  • java中的字符串常量池_java字符串常量池

    字符串常量池SCP jdk1 6是放在永久代 8中叫方法区或叫元空间 中 jdk1 7 中 字符串常量池放入了堆中 注意运行时常量依然存放在方法区 例如 Integer a 40 Java在编译的时候会直接将代码封装成Integer a I