深入理解JVM之.intern()的用法
intern只在常量池里记录首次出现的实例引用
来看一段代码
public class RuntimeConstantPoolOOM {public static void main(String[] args) {String str1 = new StringBuilder("计算机").append("软件").toString();System.out.println(str1.intern() == str1);String str2 = new StringBuilder("ja").append("va").toString();System.out.println(str2.intern() == str2);}
}
这段代码在JDK 6中运行,会得到两个false,而在JDK 7中运行,会得到一个true和一个false。
产生差异的原因是,在JDK 6中,intern()方法会把首次遇到的字符串实例复制到永久代的字符串常量池中存储,返回的也是永久代里面这个字符串实例的引用,而由StringBuilder创建的字符串对象实例在Java堆上,所以必然不可能是同一个引用,结果将返回false。
而JDK 7(以及部分其他虚拟机,例如JRockit)的intern()方法实现就不需要再拷贝字符串的实例 到永久代了,既然字符串常量池已经移到Java堆中,那只需要在常量池里记录一下首次出现的实例引 用即可,因此intern()返回的引用和由StringBuilder创建的那个字符串实例就是同一个。而对str2比较返 回false,这是因为“java” [2]这个字符串在执行String-Builder.toString()之前就已经出现过了,字符串常量 池中已经有它的引用,不符合intern()方法要求“首次遇到”的原则,“计算机软件”这个字符串则是首次 出现的,因此结果返回true。
这个intern()的用法确实与我们想象的不太一样
下面是我的测试用例,看完可以帮助更好的理解
public class RuntimeConstantPoolOOM {public static void main(String[] args) {String A = "计算机软件";String B = new String("计算机软件");//此时B首次出现在字符串常量池的地址就是A,因此返回trueSystem.out.println(A == B.intern());String str1 = new StringBuilder("计算机").append("软件").toString();//此时str1首次出现的位置是与A相同的,A的地址与str1不同,因此返回false。//但是如果我们在上文中不定义A,那么这个判断就会返回trueSystem.out.println(str1.intern() == str1);//验证str1与A的地址在字符串常量池中是相同的,输出trueSystem.out.println(A == str1.intern());//B在字符串常量池中的地址也与A的地址相同,也与str1.intern相同,返回trueSystem.out.println(B.intern() == str1.intern());String str2 = new StringBuilder("ja").append("va").toString();//这个是因为在我们看不到的地方,java这个字符串就已经存在了,第一次的地址不知道,因此返回了falseSystem.out.println(str2.intern() == str2);//我们再来看一个例子,此时输出的就是true了,因为”学习计算机“这个字符串第一次出现在字符串常量池,两个地址是相同的String D = new StringBuilder("学a习").append("计算机").toString();System.out.println(D.intern() == D);}
}
输出结果如图

相关文章:
深入理解JVM之.intern()的用法
intern只在常量池里记录首次出现的实例引用 来看一段代码 public class RuntimeConstantPoolOOM {public static void main(String[] args) {String str1 new StringBuilder("计算机").append("软件").toString();System.out.println(str1.intern() st…...
idea报“Could not autowire. No beans of ‘UserMapper‘ type found. ”错解决办法
原因和解决办法 1.原因 idea具有检测功能,接口不能直接创建bean的,需要用动态代理技术来解决。 2.解决办法 1.修改idea的配置 1.点击file,选择setting 2.搜索inspections,找到Spring 3.找到Spring子目录下的Springcore 4.在Springcore的子目录下…...
QEMU源码全解析35 —— Machine(5)
接前一篇文章:QEMU源码全解析34 —— Machine(4) 本文内容参考: 《趣谈Linux操作系统》 —— 刘超,极客时间 《QEMU/KVM》源码解析与应用 —— 李强,机械工业出版社 特此致谢! 上回书说到有3…...
SpringBoot对一个URL通过method(GET、POST、PUT、DELETE)实现增删改查操作
目录 1. rest风格基础2. 开启方法3. 实战练习 1. rest风格基础 我们都知道GET、POST、PUT、DELETE分别对应查、增、改、删除 虽然Postman这些工具可以直接发送GET、POST、PUT、DELETE请求。但是RequestMapping并不支持PUT和DELETE请求操作。需要我们手动开启 2. 开启方法 P…...
webpack 创建VUE项目
1、安装 node.js 下载地址:https://nodejs.org/en/ 下载完成以后点击安装,全部下一步即可 安装完成,输入命令验证 node -vnpm -v2.搭建VUE环境 输入命令,全局安装 npm install vue-cli -g安装完成后输入命令 查看 vue --ver…...
deepin 深度操作系统正式适配苹果 M1 芯片
导读近日消息,据深度操作系统官方消息,在已经发布的 deepin V23 beta 版本中,深度操作系统正式适配 Apple Mac mini M1 了。 官方表示,Mac mini M1 是苹果于 2020 年 11 月发布的迷你电脑主机,它搭载了最高 3.2GHz …...
Labview控制APx(Audio Precision)进行测试测量(七)
处理集群控制子集 大多数用户不会想要设置所有的控制包括在一个大的控制集群,如水平和增益配置控制。例如,假设您只在 APx 中使用模拟不平衡输出连接器,而您想要做的就是控制发电机的电平和频率。在这种情况下,水平和增益配置集群…...
Mybatis 源码 ② :流程分析
文章目录 一、前言二、Mybatis 初始化1. AutoConfiguredMapperScannerRegistrar2. MapperScannerConfigurer3. ClassPathMapperScanner3.1 ClassPathMapperScanner#scan3.2 ClassPathMapperScanner#processBeanDefinitions 4. 总结 三、 Mapper Interface 的创建1. MapperFacto…...
Unity2D RPG开发笔记 P1 - Unity界面基础操作和知识
文章目录 工具选择简单快捷键Game 窗口分辨率检视器Transform 组件Sprite Renderer综合检视器 工具选择 按下 QWERTY 可以选择不同的工具进行 旋转、定位、缩放 简单快捷键 按下 Ctrl D 可以复制物体 Game 窗口分辨率 16:9 为最常见的分辨率 检视器 Transform 组件 物体在…...
聚类与回归
聚类 聚类属于非监督式学习(无监督学习),往往不知道因变量。 通过观察学习,将数据分割成多个簇。 回归 回归属于监督式学习(有监督学习),知道因变量。 通过有标签样本的学习分类器 聚类和…...
了解IL汇编循环
IL代码, .assembly extern mscorlib {}.assembly Test{.ver 1:0:1:0}.module test.exe.method static void main() cil managed{.maxstack 8.entrypoint.locals init (int32, int32)ldc.i4 4stloc.0 //Upper limit of the Loop, total 5 ldc.i4 0 stloc.…...
电脑突然黑屏的解决办法
记录一次电脑使用问题 问题描述 基本情况:雷神游戏笔记本 windows10操作系统 64位 使用时间 4年 日期:2023年8月11日 当时 电脑充着电 打开了两个浏览器:edge[页面加载5个左右],火狐[页面加载1个左右] 两个文件夹 一个百度网盘…...
socket练习
socket练习 工具目的代码运行结果 工具 pycharm 目的 使用socket进行图片采集 代码 采集流程: 1 获取url 2 发送请求,获取数据 3 提取数据 4 保存数据 import socket import reurls [https://pic.netbian.com/uploads/allimg/220211/004115-1644511…...
Gitlab CI/CD笔记-第二天-主机套接字进行构建并push镜像。
一、安装gitlab-runner 1.可以是linux也可以是docker的 2.本文说的是docker安装部署的。 二、直接上.gitlab-ci.yml stages: # List of stages for jobs, and their order of execution - build-image build-image-job: stage: build-image image: harbor.com:543/docke…...
nginx服务器报错502 Bad Gateway的原因以及解决办法
服务器报错nginx 502 Bad Gateway的原因以及解决办法_502 bad gateway nginx_主题模板站的博客-CSDN博客...
带你了解什么是内容协商---如何返回不同媒体类型的数据
😀前言 本篇博文是关于客户端接收能力不同,SpringBoot 返回不同媒体类型的数据如何处理的说明,希望你能够喜欢😊 🏠个人主页:晨犀主页 🧑个人简介:大家好,我是晨犀&#…...
容器化相关面试题
Docker相关面试题 (1)Docker的组件包含哪些? 客户端:dockerclient服务端:dockerserver## 能看到相关的信息 docker info## docker client向docker daemon发送请求,docker daemon完成相应的任务,并把结果返还给容器 Docker镜像: docker镜像是一个只读的模板,是启动一…...
BIO、NIO、AIO 有什么区别
在Java中,BIO(Blocking I/O)、NIO(Non-blocking I/O)和AIO(Asynchronous I/O)都是用于处理I/O(输入/输出)操作的不同方式。它们在处理I/O时具有不同的特点和适用场景。 B…...
如何构建一个对象池并使用
1.背景 在项目中,如果频繁的通过new 创建对象,之后让gc再去回收,这就很容易造成内存抖动,并且频繁的GC本身也会消耗内存,这样就很容易在一瞬间造成OOM 内存溢出,因为瞬间申请大量内存会造成内存占用突然升…...
【沁恒蓝牙mesh】CH58x USB功能开发记录(三)
本博文主要记录 ,【沁恒蓝牙mesh】CH58x USB功能开发记录(三),数据收发基于寄存器级别解释 💖 作者简介:大家好,我是喜欢记录零碎知识点的小菜鸟。😎📝 个人主页…...
从一个地狱笑话看大模型的推理机制撕
. GIF文件结构 相比于 WAV 文件的简单粗暴,GIF 的结构要精密得多,因为它天生是为了网络传输而设计的(包含了压缩机制)。 当我们用二进制视角观察 GIF 时,它是由一个个 数据块(Block) 组成的&…...
embeddinggemma-300m入门必看:Ollama一键启动+WebUI交互全流程
embeddinggemma-300m入门必看:Ollama一键启动WebUI交互全流程 1. 快速了解EmbeddingGemma-300m EmbeddingGemma-300m是谷歌推出的开源文本嵌入模型,专门用来把文字转换成数字向量。你可以把它想象成一个"文字翻译官",能把任何文字…...
AI Agent Pharma:从 Copilot 到 Autonomous Pharma
当药物研发遇上 AI Agent,不是锦上添花,是游戏规则的重写。本文拆解架构、给出可跑的代码、聊聊那些 PPT 不会告诉你的坑。在这里插入图片描述 一、我为什么在写这篇文章 大概是 2023 年末,我们团队拿到了一个任务:帮某中型药企的研发部门"引入 AI"。预算不小,…...
从Matlab到FPGA:CIC滤波器设计验证全流程(附可下载的Verilog代码与测试脚本)
从Matlab到FPGA:CIC滤波器设计验证全流程实战指南 在数字信号处理领域,CIC(Cascaded Integrator-Comb)滤波器因其无需乘法器的硬件友好特性,成为数字下变频、采样率转换等场景的首选方案。本文将带领算法工程师和FPGA开…...
Google疯了!AI全面免费,这下全网都要变天了!
太特么疯狂了!谷歌刚刚发布的 Gemma 4 开源模型,简直是要了所有付费 AI 的命,整个行业的游戏规则被瞬间掀翻。划重点:AI 彻底进入“白嫖时代”了!你现在完全可以利用 Ollama 这类工具,把 Gemma 4 直接接进 …...
Vivado IP核管理指南:xci vs xcix,哪种方式更适合你的项目?
Vivado IP核管理实战:xci与xcix的深度选择策略 在FPGA开发领域,Vivado作为主流设计工具,其IP核管理方式直接影响着工程的可维护性和团队协作效率。xci和xcix两种IP核保存格式看似只是文件扩展名的差异,实则代表着完全不同的管理哲…...
多元高斯分布:条件分布的实际应用与推导解析
1. 多元高斯分布基础回顾 第一次接触多元高斯分布时,我被它优雅的数学形式深深吸引。这种分布在自然界中随处可见,比如一群人的身高体重数据、股票市场的收益率波动,甚至是天气预报中的温度湿度关系。多元高斯分布就像一位全能选手࿰…...
LeetCode:矩阵置零
方法一:O(MN)class Solution {public void setZeroes(int[][] matrix) {int m matrix.length;int n matrix[0].length;//申请一个和原矩阵完全等大的新矩阵int[][] copy new int[m][n];//把旧矩阵的数据原封不动地搬过来for (int i 0; i < m; i) {for (int j…...
击败PI!星动纪元登顶具身奥林匹克,狂揽三项全球冠军
田晏林 发自 凹非寺量子位 | 公众号 QbitAI人工智能和机器人领域,有一个反直觉现象:往往人类觉得复杂、困难的任务,机器人做起来很容易;而人类不以为意的一些感知与运动技能,让机器复现异常困难。就像AlphaGo可以轻松打…...
K8s Pod CrashLoopBackOff 根因分析
Kubernetes作为容器编排领域的标杆,其Pod的CrashLoopBackOff状态是运维人员最头疼的问题之一。当Pod反复崩溃重启时,不仅影响业务连续性,还可能隐藏着更深层次的系统隐患。本文将深入剖析这一现象的典型诱因,帮助开发者快速定位问…...
