String#intern

1.intern方法

intern()方法可以在运行期间向字符串中动态加入字符串实例的方式,它的功能很简单,总结起来就一句话
可以在运行时向字符串池中添加字符串常量
添加的原则是,如果常量池中存在当前字符串,则直接返回常量池中它的引用;如果常量池中没有此字符串,则将此字符串的引用放入常量池,然后返回这个引用。
字符串进入常量池有两个途径:
1.字面量在编译器会进入Class的常量池,在类加载后会进入运行时常量池
2.使用intern()

String#intern()方法在JVM中是通过JNI调用C++实现的,其实里面调用的C++当中的StringTable的intern()方法,它的内部结构和HashMap类似,但是它不能扩容,默认大小是1009
如果字符串常量池的String非常躲,就会造成Hash冲突,从而导致链表会很长,它的查询性能将会从O(1)变成O(n),当调用intern方法时性能将会下降
在JDK6的版本中大小是固定的,在JDK7中可以通过参数来设置-XX:StringTableSize=12345

public static void main(String[] args) {String s = new String("1");s.intern();String s2 = "1";System.out.println(s == s2);String s3 = new String("1") + new String("1");s3.intern();String s4 = "11";System.out.println(s3 == s4);
}

s == s2 // false
s和s2比较分析:
String s = new String("1");
new String(“1”)同时创建了两个对象
一个对象是常量池中的"1"
一个是堆中的String对象
由于是new出来了的对象,s指向的是堆中的引用
s.intern();
调用intern方法,如果常量池中存在该字符串,则返回常量池引用,
如果不存在则将此字符串的引用加入到常量池中,然后返回
此时 常量池中已经有"1"这个字符串了,不需要再向常量池中添加,
所以这个地方返回的是常量池中的引用,另外返回的这个常量池的引用也并没有赋值给其他变量
String s2 = "1";
s2创建了一个"1"的字符串对象,这个时候会向StringTable(常量池)中查询是否存在该字符串,如果存在则返回这个引用,注意这个引用是常量池中的引用
System.out.println(s == s2);
s指向堆中的引用
s2指向的是常量池中的引用
在JDK6中,字符串常量池是放在Perm区域的,也就是放在方法区当中
方法区中的引用和堆中的引用,两者是属于不同的区域,必然是不相等的false

在JDK7中,字符串常量池移动到了堆中,原因是方法区的容量相比堆空间比较小,存储不了太多的常量,不过并不影响结果,仍然是两个区域内的对象进行比较仍然是false

s3和s4比较分析:
String s3 = new String("1") + new String("1");
s3在这里创建了两个对象,一个是堆中的"1"字符串对象,另一个两个new String(“1”) 拼接起来的"11"字符串对象放入到了堆中,但常量池中是没有这个"11"的
s3指向的是堆中的"11"对象
s3.intern();
接着s3调用intern方法,将"11"字符串对象放入到了字符串常量池中
在JDK6和JDK7的版本处理是不同的
在JDK6中,是复制堆中的字符串对象添加到字符串常量池中
在JDK7中,是复制堆中的字符串对象的引用添加到字符串常量池中
String s4 = "11";
s4在创建"11"字符串对象时,会先在StringTable中查询一番,如果有则返回常量池中的引用,如果没有则添加进去
在前面s3.intern()步骤中,由于已经将"11"放入到了字符串常量池中,所以这里返回的是常量池中的引用
System.out.println(s3 == s4);
由于intern()方法在不同的JDK版本里面会有差异,所以它们的比较结果也是不同的
在JDK6中,s4指向的是常量池中引用(堆对象的副本),由于内存区域不一样,所以为false
在JDK7中,s4指向的是常量池中引用(堆对象的引用),s4虽然指向的也是常量池中的引用,但是常量池中存储的这个引用是堆对象的引用,所以两者在比较时是一样的,所以为true
在这里插入图片描述
在这里插入图片描述

下面还有一段代码,各位可以再思考下,结果是怎样的

public static void main(String[] args) {String s = new String("1");String s2 = "1";s.intern();System.out.println(s == s2);String s3 = new String("1") + new String("1");String s4 = "11";s3.intern();System.out.println(s3 == s4);
}

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

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

相关文章

【占用网络】SurroundOcc:基于环视相机实现3D语义占用预测 ICCV 2023

前言 本文分享“占用网络”方案中,来自ICCV 2023的SurroundOcc,它基于环视相机实现3D语义占用预测。 使用空间交叉注意力将多相机图像信息提升到3D体素特征,即3D体素Query到2D图像中查询融合特征的思想。 然后使用3D卷积逐步对体素特征进行…

【Spring Boot】SpringMVC入门

1.什么是springMVC MVC就是把一个项目分成了三部分: MVC是一种思想。Spring进行了实现,称为Spring MVC。SpringBoot是创建SpringMVC项目的一种方式而已。springMVC对于MVC做出了一些改变: 当前阶段,MVC的概念又发生了一些变化,后端开发人员不涉及前端页…

【学术会议】第三届神经计算青年研讨会 学习笔记

第三届神经计算青年研讨会 学习笔记 会议时间:2024-1-6至2024-1-7 会议地点:电子科技大学 会议介绍: 为提升我国神经计算⻘年研究队伍的学术⽔平和国际影响⼒,研讨会主题涵盖:神经系统建模与模拟、脑机接⼝与类脑智能、…

【Helm 及 Chart 快速入门】03、Chart 基本介绍

目录 一、Chart 基本介绍 1.1 什么是 Chart 1.2 Chart ⽬录结构 1.3 Chart.yaml ⽂件 二、创建不可配置 Chart 2.1 创建 Chart 2.2 安装 Chart 三、创建可配置的 Chart 3.1 修改 chart 3.2 安装 Chart 一、Chart 基本介绍 1.1 什么是 Chart Helm 部署的应…

Ncast盈可视 高清智能录播系统 IPSetup.php信息泄露+RCE漏洞复现(CVE-2024-0305)

0x01 产品简介 Ncast盈可视 高清智能录播系统是广州盈可视电子科技有限公司一种先进的音视频录制和播放解决方案,旨在提供高质量、高清定制的录播体验。该系统采用先进的摄像和音频技术,结合强大的软件平台,可以实现高清视频录制、多路音频采集、实时切换和混音、定制视频分…

机器视觉检测设备在连接器外观缺陷检测中的应用

作为传输电流或信号连接两个有源器件的器件,连接器被广泛应用于各个行业,从手机、平板、电脑,到冰箱、空调、洗衣机,再到汽车、国防、航空,处处是它的所在。每个电子产品少了连接器将无法运作,因此&#xf…

Qt 6之六:Qt Designer介绍

Qt 6之六:Qt Designer介绍 Qt Designer是一个可视化的用户界面设计工具,用于创建Qt应用程序的用户界面,允许开发人员通过拖放和布局来设计和创建GUI界面。 Qt 6之一:简介、安装与简单使用 https://blog.csdn.net/cnds123/articl…

软件测试|Python openpyxl库使用指南

简介 我们之前介绍过,python在自动化办公方面可以大放异彩,因为Python有许多的第三方库,其中有很多库就支持我们对office软件进行操作,熟练的使用Python对office进行操作,可以实现自动化办公,极大提升我们…

计算机二级WPS Office考试须知、如何备考、备考建议

本文从计算机二级考试须知、如何备考、备考建议以及考试的注意事项等方面进行讲述,认认真真看,对你受益匪浅。 一、计算机二级考试须知 2021年3月27日至29日将举办第60次全国计算机等级考试(NCRE),从今年起&#xff0…

Python-12-正则

当然内容不是很全,可以参考: 正则表达式学习资料 https://blog.csdn.net/weixin_40907382/article/details/79654372

42 智能指针 auto_ptr, unique_ptr,shared_ptr,weak_ptr 整理

都是类模版 都不用开发者自己delete 指针。这是因为智能指针有自己管理指向对象的能力,包括释放指向的内存,因此开发者不要自己释放。 auto_ptr, (废弃)C98 已经被弃用,替代方案是unique_ptr. 被弃用的原因: 1.不能…

[足式机器人]Part3 机构运动学与动力学分析与建模 Ch00-3(2) 刚体的位形 Configuration of Rigid Body

本文仅供学习使用,总结很多本现有讲述运动学或动力学书籍后的总结,从矢量的角度进行分析,方法比较传统,但更易理解,并且现有的看似抽象方法,两者本质上并无不同。 2024年底本人学位论文发表后方可摘抄 若有…