Java intern() 方法

jdk1.8之后的String.intern()方法内存分析 关于String.intern()方法,这个问题都被问烂了,有的文章在分析的时候还在用jdk1.7,jdk1.8之后内存模型发生了变化,内存的变化也会影响intern方法的执行,这里有必要写文章分析一下,请大家务必从头开始看,这样才能搞懂 1.字符串常量池划分 jvm对字符串常量池在不同jkd版本有不同的划分,这里用hotspot来分析,文章后部分会使用,主要有以下三种方式 大致划分为这几个部分,对方法区,元空间和堆等概念模糊的朋友可以参考方法区,永久代,元空间这篇文章 2.回顾string对象在内存中的位置以及不可变性 public final class String imple 立即下载

intern() 方法返回字符串对象的规范化表示形式。

它遵循以下规则:对于任意两个字符串 s 和 t,当且仅当 s.equals(t) 为 true 时,s.intern() == t.intern() 才为 true。

 

语法

public String intern()

参数

  • 无

返回值

一个字符串,内容与此字符串相同,但一定取自具有唯一字符串的池。

 

尽管在输出中调用intern方法并没有什么效果,但是实际上后台这个方法会做一系列的动作和操作。在调用”ab”.intern()方法的时候会返回”ab”,但是这个方法会首先检查字符串池中是否有”ab”这个字符串,如果存在则返回这个字符串的引用,否则就将这个字符串添加到字符串池中,然会返回这个字符串的引用。

可以看下面一个范例:

String str1 = "a";
String str2 = "b";
String str3 = "ab";
String str4 = str1 + str2;
String str5 = new String("ab");
 
System.out.println(str5.equals(str3));
System.out.println(str5 == str3);
System.out.println(str5.intern() == str3);
System.out.println(str5.intern() == str4);

得到的结果:

true
false
true
false

为什么会得到这样的一个结果呢?我们一步一步的分析。

  •  第一、str5.equals(str3)这个结果为true,不用太多的解释,因为字符串的值的内容相同。
  •  第二、str5 == str3对比的是引用的地址是否相同,由于str5采用new String方式定义的,所以地址引用一定不相等。所以结果为false。
  •  第三、当str5调用intern的时候,会检查字符串池中是否含有该字符串。由于之前定义的str3已经进入字符串池中,所以会得到相同的引用。
  •  第四,当str4 = str1 + str2后,str4的值也为”ab”,但是为什么这个结果会是false呢?先看下面代码:
String a = new String("ab");
String b = new String("ab");
String c = "ab";
String d = "a" + "b";
String e = "b";
String f = "a" + e;

System.out.println(b.intern() == a);
System.out.println(b.intern() == c);
System.out.println(b.intern() == d);
System.out.println(b.intern() == f);
System.out.println(b.intern() == a.intern());

运行结果:

false
true
true
false
true

由运行结果可以看出来,b.intern() == a和b.intern() == c可知,采用new 创建的字符串对象不进入字符串池,并且通过b.intern() == d和b.intern() == f可知,字符串相加的时候,都是静态字符串的结果会添加到字符串池,如果其中含有变量(如f中的e)则不会进入字符串池中。但是字符串一旦进入字符串池中,就会先查找池中有无此对象。如果有此对象,则让对象引用指向此对象。如果无此对象,则先创建此对象,再让对象引用指向此对象。

当研究到这个地方的时候,突然想起来经常遇到的一个比较经典的Java问题,就是对比equal和==的区别,当时记得老师只是说“==”判断的是“地址”,但是并没说清楚什么时候会有地址相等的情况。现在看来,在定义变量的时候赋值,如果赋值的是静态的字符串,就会执行进入字符串池的操作,如果池中含有该字符串,则返回引用。

执行下面的代码:

String a = "abc";
String b = "abc";
String c = "a" + "b" + "c";
String d = "a" + "bc";
String e = "ab" + "c";
        
System.out.println(a == b);
System.out.println(a == c);
System.out.println(a == d);
System.out.println(a == e);
System.out.println(c == d);
System.out.println(c == e);

运行的结果:

true
true
true
true
true
true
Allegro23.1新功能之软件自带阻抗计算工具操作指导 Allegro升级到了23.1后,软件新增了一个自带阻抗计算的功能,如下图。Propagation velocity:传输速度,单位是光速的多少倍。Dielectric constant输入介电常数,这里使用常规4。新功能之软件自带阻抗计算工具。如何使用,具体操作如下。 阅读详情

相关推荐

深入AOSP构建系统:从BUILD_FINGERPRINT的生成逻辑,看如何定制你的Android设备标识

本文深入解析AOSP构建系统中的设备指纹生成机制,详细介绍了BUILD_FINGERPRINT的生成逻辑及其在Android设备中的关键作用。通过分析多个指纹属性的区别与联系,以及如何定制设备标识,帮助开发者更好地理解和掌握Android系统构建过程。

weixin_27017211的博客 217

String中intern的方法

首先查看官方API那个的解释: ——————————————————————————————————————— intern public String intern() 返回字符串对象的规范化表示形式。 一个初始时为空的字符串池,它由类 String 私有地维护。 当调用 intern 方法时,如果池已经包含一个等于此 String 对象的字符串(该对象由 equals...

1106

TL494充电器原理与维修 (转)

TL494充电器原理与维修 电动自行车充电器多采用开关 电源,型号虽多,但电路结构大同小异,主要区别在于所选的脉宽调制(PWM)芯片不同如(UC3845、UC3842、SG3524、TL494)。现以佳腾牌 充电器为例,介绍其原理和故障检修方法。 一、电路原理 根据实物测绘的佳腾牌充电器电路原理如图1所示。整机可分为PWM产生和推动电路、功 率开关变换电路、...

weixin_30500663的博客 1815

Java之intern方法

面试问题: (1)现在当有人问 String str = new String(“abc”);创建了几个对象,常量池有abc字段是1个,常量池没有"abc"字段则是2个。 (2)String str=“abc”;创建了几个对象(如果常量池里面已经有对象了就是0个。如果没有就是1个); (3)new String(“abc”).intern();创建了几个对象(如果常量池里面已经有该字符串对象了就是1个,如果没有就是两个) ...

渣渣 9856

【AI智能体】Dify 搭建个人专属简历美化助手操作详解

Dify 搭建个人专属简历诊断助手实战操作详解

congge 4381

汽车IVI中控开发入门及进阶(九):显示屏

显示屏Display panel和触控屏Touch panel,可以说随着汽车四化的进展,屏越来越多,越来越大,越来越高清,成为IVI中控、智能座舱系统的重要组成部分。比如如下一个电阻触摸屏。正文:显示屏主要功能就是显示,车载内容和信息的传递全靠显示屏,目前车载显示屏的种类可以分为:LCD液晶显示屏(TFT(薄膜晶体管)驱动的有源矩阵液晶显示,再细分IPS、TFT、SLCD,这几个子类)、LED显示屏(用 LED发光二极管作为背光光源)、OLED 显示屏。

码农17年的博客 2526

Java之String系列--intern方法的作用及原理

本文介绍Java的String的intern方法的原理。

IT利刃出鞘的博客 1万+

HQChart实战教程21 - uniapp app端K线图定制tooltip

HQChart实战教程21 - uniapp app端K线图定制tooltip序效果步骤2. 注册标题绘制事件3. 标题绘制回调函数格式说明eventdataobjtooltip显示函数完整代码HQChart代码地址 序 hqchartK线图内置一个tooltip, 如果需要定制一个tooltip, 我们可以通过注册绘制标题事件,来自己做一个div显示数据。 参考教程HQChart实战教程7-自定义显示手势点击K线显示信息 效果 步骤 在外部创建一个view,并在view里创建需要显示的信息字段. 例子里

小银 2558

转载:JAVA中intern()方法的详解

转载于:很多童鞋可能在Java考试中或者笔试中遇到String字符串比较相等的问题,今天就来谈一谈在JAVA虚拟机中,有运行时数据区,包含线程共享的:堆,方法区 和线程隔离的:程序计数器,Java虚拟机栈,本地方法栈.其中方法区包含一块取域,叫做常量池,因为型被用到的频率高,所以HotSpot将它放入了常量池.

初心不改 499

TensorRT - 使用自定义层扩展 TensorRT

TensorRT 支持通过自定义插件扩展功能。开发者可以基于 IPluginV3 接口实现插件类,并通过 IPluginCreatorV3One 创建器类注册到 TensorRT 插件注册表。插件实现需要包含核心、构建和运行时三种能力,并通过静态或动态方式注册。最后可使用 addPluginV3() 将插件实例添加到 TensorRT 网络中。这种方法允许在标准层不满足需求时,使用自定义层扩展模型功能。

1148

2 硬件工程师笔面试高频知识考点真题解析——电容

本文全面解析了电容在电子电路中的关键应用与技术要点。主要内容包括:1. 电容选型核心要素:介质材质(陶瓷/电解/钽电容等)、容值精度、耐压等级、温度特性、ESR参数等,不同应用场景(滤波/去耦/谐振等)的选型策略。2. 典型电路应用原理:详细阐述去耦电容布局规则、晶振负载电容作用、共射放大电路旁路电容功能,以及RC电路的滤波/定时等应用。3. 特殊问题解决方案:MLCC啸叫机理与对策、寄生电容影响与消除、高速信号线电容使用禁忌等工程实践难题。4. 安全规范要点:X/Y电容的区别与选用、电解/钽电容防反接措施

XU157303764的博客 1561

java intern看这一篇就够了

intern的概念? 官方解释就不说了,说说个人理解,简单点就是一个字符串使用intern方法后就会发生如下逻辑: 如果此字符串不在字符串常量池中则将此字符串放置在字符串常量池中,否则不动。 为什么使用intern方法? 个人理解:使用intern可以将字符串放置到字符串常量池中,方便字符串的重复利用。 intern解析 看如下代码: 大家都知道==操作是判断对象的地址是否相同,那么这段代码的结果是什么呢? 答案:false 为什么是false? 原因:第一行new String(“ab”)创建了两个对象

叫兽张益达的博客 828

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Java技术——你真的了解String类的intern()方法吗

0.引言 什么都先不说,先看下面这个引入的例子: String str1 = new String("SEU")+ new String("Calvin"); System.out.println(str1.intern() == str1); System.out.println(str1 == "SEUCalvin"); 本人JDK版本1.8,输出结果为: tru...

关于Android开发的一些技术点总结 ╮( ̄▽ ̄”)╭ 6万+

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

JAVA中intern()方法的详解

很多童鞋可能在Java考试中或者笔试中遇到String字符串比较相等的问题,今天就来谈一谈 在JAVA虚拟机中,有运行时数据区,包含线程共享的:堆,方法区 和线程隔离的:程序计数器,Java虚拟机栈,本地方法栈.其中方法区包含一块取域,叫做常量池,因为String类型被用到的频率高,所以HotSpot将它放入了常量池. Intern() 在一书中解释道: String.intern()...

tangyaya8的博客 2万+

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Java-String类的intern()方法

String类的intern()方法 intern()方法 介绍 String类中定义了intern()方法,该方法的用途是为每一个字符序列生成一个且仅生成一个String的引用。intern()方法设计的初衷,就是重用String对象,以节省内存消耗。 作用 intern()方法的作用在jdk1.7之后是查看常量池中是否存在和调用方法的字符串内容一样的字符串,如果有的话,就返回该常量池中的字符串,若没有的话,就在常量池中写入一个堆中该字符串对象的一个引用,指向堆中的该对象,并返回该引用。 举例 案例1

weixin_43421142的博客 296

对Java中intern()方法的理解

先看源码API的解释: 来看例子: String str1 = "todo"; String str2 = "todo"; String str3 = "to"; String str4 = "do"; String str5 = str3 + str4; String str6 = new String(str1); System.out.println("------普通String测试结果----

挽风博客 621

Java String之intern()方法深入分析

美团技术团队Blog

RangeBlog 779

java中 intern()_Java intern()方法

Java intern()方法intern() 方法返回字符串对象的规范化表示形式。它遵循以下规则:对于任意两个字符串 s 和 t,当且仅当 s.equals(t) 为 true 时,s.intern() == t.intern() 才为 true。语法publicStringintern()参数 无返回值一个字符串,内容与此字符串相同,但一定取自具有唯一字符串的池。实例public class...

weixin_42224303的博客 237

JAVA intern()方法学习

intern()方法和前面说的equals()方法关系密切,从public native String intern()看出,它是Java的本地方法,我们先来看看Java文档里的描述: Returns a canonical representation for the string object.   A pool of strings, initially empty, is mainta

Amy的学习之路 1165

java中String优化之intern()方法

文章目录1、intern()的简介1.1、jdk1.7之后的intern()方法的作用:1.2、使用场景1.3、各大框架String的操作都有使用intern()方法2、例子**总结** 1、intern()的简介 1.1、jdk1.7之后的intern()方法的作用: 1、若是字符串常量池中不存在这个字符串,那么,就创建一个引用,把该字符串实例对象的引用复制过来,并返回该地址。 2、若是字符串常量池中已存在该字符串,那么直接返回该字符串的地址。 1.2、使用场景 String.intern()方法主要适用

qq_54199667的博客 2561

java的string的intern_java String的intern()方法

intern()方法用于将字符串对象加入常量池中。public native String intern();intern()方法返回的是一个常量池中的String对象(即常量池中某个String对象的引用)。String s = new String("1");s.intern();s是一个位于堆中的String对象,其字符串值为 "1" , 调用s的intern()方法,可在常量池中创建一个字...

weixin_30611317的博客 413

Java String的intern()方法

welcome to my blog 问题: String的intern()方法是什么情况? intern()是个native方法, 如下所示 public native String intern(); 例子一: //在堆中创建一个字符串对象; 这里不涉及字符串常量池 String m = new String("abc"); //由于字符串常量池中没有记录过"abc", 所以调用inter...

littlehaes的博客 586

关于Java中String类的intern()方法

常见列子 String s1 = new StringBuilder(“go”).append(“od”).toString(); System.out.println(s1.intern() == s1); String s2 = new StringBuilder(“ja”).append(“va”).toString(); System.out.println(s2.intern() == s2); 输出 true false 在网上搜了下,都解释说字符串常量池中有java这个字符串常量,因此下面那.

yks的博客 689

Java中intern()方法的使用

String类中定义了intern()方法,该方法的用途是为每一个字符序列生成一个且仅生成一个String的引用,下面用实例来进行说明: 首先了解Java中String的内存分配。 1、直接赋值方式 String a = "123"; String b = "123"; System.out.println(a == b);执行结果为true,可知,这种方式定义的String类型,字符串的内

wanna_wsl的博客 3419

Java:intern()方法.

intern() 方法返回字符串对象的规范化表示形式。

孤芳不自赏 272
上一篇: 高并发系统的解决思路与思路
下一篇: 抽象类和接口的区别
tobecoder0539
博客等级 码龄9年 1粉丝 8原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值