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.rhkb.cn/news/235305.html

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

相关文章

NPS配置https访问web管理页面

因为NPS默认也支持http的访问,所以在部署完后就一直没在意这个事情。 因为服务器是暴露在公网内的,所以还是要安全一点才行。不然一旦远控的机器被破解了就很危险了 一、使用nginx反向代理访问 1、首先在nps的配置文件里关闭使用https选项,…

m1 + swoole(hyperf) + yasd + phpstorm 安装和debug

参考文档 Mac M1安装报错 checking for boost... configure: error: lib boost not found. Try: install boost library Issue #89 swoole/yasd GitHub 1.安装boost库 brew install boostbrew link boost 2.下载yasd git clone https://github.com/swoole/yasd.git 3.编…

@RequestParam

在我们写接口的时候,经常会用到这个注解来标记参数,通过这个注解我们可以把请求的url中的参数名和值映射到被标记的参数上。 比如下方,这个接口是通过传入的参数来查询相关信息的 我们定义这样一个接口,设置了8个参数,…

银联商务:Apache Doris 赋能“科技银商”,助力金融机构挖掘增长新机遇

本文导读: 在长期服务广大规模商户的过程中,银联商务已沉淀了庞大、真实、优质的数据资产数据,这些数据不仅是银联商务开启新增长曲线的基础,更是进一步服务好商户的关键支撑。为更好提供数据服务,银联商务实现了从 H…

【Python】编程练习的解密与实战(一)

​🌈个人主页:Sarapines Programmer🔥 系列专栏:《Python | 编程解码》⏰诗赋清音:云生高巅梦远游, 星光点缀碧海愁。 山川深邃情难晤, 剑气凌云志自修。 目录 🪐1. 初识Python &a…

【Flutter 开发实战】Dart 基础篇:最基本的语法内容

在深入了解 Dart 这门编程语言之前,我们需要了解一些关于 Dart 的最基本的知识,像是常量、变量、函数等等,这样才能够让我们的开发效率更上一层楼。在本节,我们将探讨一些基础语法,包括入口方法 main、变量、常量以及命…

中国农业熟制区划数据, Shp格式,高清大图可获取

数据基本信息. 数据名称: 中国农业熟制区划数据 数据格式: Shp 数据时间: 未知 数据几何类型: 面 数据坐标系: WGS84 数据来源:网络公开数据 示例数据: 序号区域名称1川鄂湘黔低高原山地水田旱地二熟兼一熟区2大小兴安岭山麓岗地凉温作物…

STM32蓝牙小车、红外循迹小车、超声波避障小车项目设计

一、前言 本文旨在分享我学习STM32的过程中,为了强化学习成果,试着制作一些实训项目。最开始做的就是STM32蓝牙小车、STM32红外循迹小车、STM32超声波避障小车。 相信看完本文的你,一定可以亲手制作一辆属于自己的智能小车! 注&am…

C语言入门教程,C语言学习教程(第三部分:C语言变量和数据类型)二

十、在C语言中使用英文字符 前面我们多次提到了字符串,字符串是多个字符的集合,它们由" "包围,例如"http://c.biancheng.net"、"C语言中文网"。字符串中的字符在内存中按照次序、紧挨着排列,整个字…

STM32F103RCT6使用数据手册及应用示例程序分享

STM32F103RCT6是意法半导体(STMicroelectronics)推出的一款Cortex-M3内核的高性能微控制器。它具有丰富的外设功能和强大的处理能力,适用于多种应用场景。 要进行手册数据分析,首先需要下载并查阅STM32F103RCT6的技术参考手册。可…

【已解决】安装fasttext、py2neo失败

安装fasttext 1.官方方法(不好使) pyfasttext PyPI pip install cysignals pip install pyfasttext报错: Building wheels for collected packages: cysignalsBuilding wheel for cysignals (PEP 517) ... errorERROR: Command errored …

Spring Security介绍

一、Spring Security: 1、简介:Spring Security 是一个非常流行和成功的 Java 应用开发框架。Spring Security 基于 Spring 框架,提供了一套 Web 应用安全性的完整解决方案。一般来说,Web 应用的安全性包括用户认证(A…

20240107移远的4G模块EC20在Firefly的AIO-3399J开发板的Android11下调通能上网

20240107移远的4G模块EC20在Firefly的AIO-3399J开发板的Android11下调通能上网 2024/1/7 11:17 开发板:Firefly的AIO-3399J【RK3399】SDK:rk3399-android-11-r20211216.tar.xz【Android11】 Android11.0.tar.bz2.aa【ToyBrick】 Android11.0.tar.bz2.ab …

麦芯(MachCore)开发教程1 --- 设备软件中间件

黄国强 2024/1/10 acloud163.com 对任何公司来说,在短时间内开发一款高质量设备专用软件,是一件不太容易做到的事情。麦芯是笔者发明的一款设备软件中间件产品。麦芯致力于给设备厂商提供一个开发工具和平台,让客户快速高效的开发自己的设备专…

Android通过Recyclerview实现流式布局自适应列数及高度

调用 FlowAdapter 跟普通recyclerview一样使用 RecyclerView rvLayout holder.getView(R.id.spe_tag_layout); FlowAdapter rvAdapter new FlowAdapter(); FlowLayoutManager flowLayoutManager new FlowLayoutManager(); rvLayout.setLayoutManager(flowLayoutManager); r…

PHP开发日志 ━━ php8.3安装与使用组件Xdebug

今天开头写点历史: 二十年前流行asp,当时用vb整合常用函数库写了一个dll给asp调用,并在此基础上开发一套仿windows界面的后台管理系统;后来asp逐渐没落,于是在十多年前转投php,不久后用php写了一套mvc框架&…

CSS3实现轮播效果

在我们不使用JS的情况下&#xff0c;是否也可以实现轮播功能呢&#xff1f; 答应是可以的 上代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>轮播</title><style>.boss…

在 WinForms 应用程序中实现 FTP 文件操作及模式介绍

在 WinForms 应用程序中实现 FTP 文件操作及模式介绍 简介 在许多应用程序中&#xff0c;能够从远程服务器获取文件是一个非常有用的功能。本文将详细介绍如何在 Windows Forms (WinForms) 应用程序中使用 FTP 协议进行文件操作&#xff0c;包括连接到 FTP 服务器、列出目录、…

初识 Elasticsearch 应用知识,一文读懂 Elasticsearch 知识文集(2)

&#x1f3c6;作者简介&#xff0c;普修罗双战士&#xff0c;一直追求不断学习和成长&#xff0c;在技术的道路上持续探索和实践。 &#x1f3c6;多年互联网行业从业经验&#xff0c;历任核心研发工程师&#xff0c;项目技术负责人。 &#x1f389;欢迎 &#x1f44d;点赞✍评论…

《SPSS统计学基础与实证研究应用精解》视频讲解:SPSS的功能特色

《SPSS统计学基础与实证研究应用精解》1.2 SPSS的功能特色 视频为《SPSS统计学基础与实证研究应用精解》张甜 杨维忠著 清华大学出版社 一书的随书赠送视频讲解1.2节内容。本书已正式出版上市&#xff0c;当当、京东、淘宝等平台热销中&#xff0c;搜索书名即可。本书旨在手把手…