理解String类的intern()方法

高数 | 【极限与等价无穷小】两个重要极限 & 经典错误 & 什么情况下求极限可以直接带入 一. 第一个重要极限 二. 第二个重要极限 三. 导数定义式 全文见【高等数学】两个重要的极限 - 知乎 阅读详情

测试环境:eclipse+JDK 1.8

测试例子:

public static void main(String[] args){
    String s1=new String("a")+new String("b"); //1
    System.out.println(s1.intern()==s1); //2

    String s2=new String("a")+new String("b"); //3
    System.out.println(s2.intern()==s2); //4
}

JDK 1.6 输出结果

false
false

JDK 1.7(1.8) 输出结果

true
false

引自周志明《深》解释:

在JDK 1.6中,intern()方法会把首次遇到的字符串实例复制到永久代中,返回的也是永久代中这个字符串实例的引用;而JDK 1.7(以及部分虚拟机)的intern()实现不会再复制实例,只是在常量池中记录首次出现的实例引用。

两个图帮助理解:

JDK 1.6

  • 执行第一句后,字符串常量池将会产生字符串“a”和“b”以及它们的引用。在堆区创建一个String对象,并将引用返回给s1。
  • 执行第二句s1.intern()方法后,在JDK 1.6中,先将字符串“ab”复制到字符串常量池,然后创建字符串“ab”的引用并返回给si.intern()。此时,明显s1和s1.intern()指向的对象不同,返回false。
  • 第三和第四句类似,值得注意的是,此时如果执行s1.intern()==s2.intern()将会返回true。
JDK 1.7(1.8)

注意1.7之后,字符串常量池迁移到堆区。

  • 执行第一句,与JDK 1.6相同
  • 执行第二句s1.intern()方法时,发现字符串常量池中并没有字符串“ab”的引用,此时不再在字符串常量池中创建“ab”字符串,而是在字符串常量池中创建“ab”字符串的引用,然后指向首次出现的实例对象,也即是s1所指向的对象,所以s1.intern()==s1返回true。
  • 执行第四句s2.intern()方法时,发现字符串常量池中已经存在字符串“ab”的引用,直接指向该引用。此时如果执行s2.intern()==s1.intern()或者s2.intern()==s1都会返回true。

为了验证以上所述,再进行一次检验(JDK 1.8)

public static void main(String[] args){
    String s1=new String("a")+new String("b"); //1
    System.out.println(s1.intern()==s1); //2
    s1=null;
    System.gc();
    String s2=new String("a")+new String("b"); //5
    System.out.println(s2.intern()==s2); //6
}

运行结果

true
true

调用gc()方法,将s1指向的实例对象清除,所以执行到第6句时,字符串常量池中不存在“ab”字符串引用,之后的操作与执行1、2句相同。

什么是 WhatsApp云控 WhatsApp群发,WhatsApp协议,他们有什么区别? 下面我们sensws讲解下什么是WhatsApp云控 WhatsApp群发,WhatsApp协议 阅读详情

相关推荐

Android Geckoview实战:5分钟搞定JS与原生交互(附完整Demo代码)

本文详细介绍了在Android应用中使用GeckoView替代系统WebView,构建稳定高效的JavaScript与原生代码交互桥梁的实战方法。通过WebExtension架构,文章提供了从环境配置、扩展开发到Android端集成的完整步骤,并附有可运行的Demo代码,帮助开发者快速解决混合应用中的兼容性问题。

u5v6w7的博客 935

String中的intern()方法

String中的intern方法的实现原理(jdk8中): 以下面代码为例 public class InternTest{ String s1 = new String("a") + new String("b"); s1.intern(); String s2 = "ab"; System.out.println(s1 == s2);//true } (1)String s1 = new String(“a”) + new String(“b”); ①创建StringBuilder对

Longstar_L的博客 557

南京邮电大学电工电子基础B实验六(组合逻辑电路)

南京邮电大学电工电子基础B实验五(组合逻辑电路);电工电子;南京邮电大学;计算机学院;实验报告;电路图;

亦是远方的小地方 1万+

关于《深入理解Java虚拟机》中提到的String.intern()

学习中,有错误烦请指出,谢谢。 有关String.intern() intern public String intern() 目录==学习中,有错误烦请指出,谢谢。==有关String.intern()internapi而在周志明的《深入理解Java虚拟机》中,则提到了关于intern()方法的不同实现关于s.intern的总结 api Returns a canonical repre...

weixin_42907817的博客 372

Foxglove 介绍以及入门使用教程

Foxglove 是由Foxglove 工作室开发的一套工具集,包括和等组件。跨平台支持:可以在 Windows、macOS 和 Linux 上运行。多协议兼容:支持 ROS、ROS 2、CAN 数据以及其他自定义协议。丰富的可视化功能:可以绘制点云、轨迹、激光雷达数据、IMU 数据等。实时与离线模式:既可以实时监控机器人状态,也可以加载和回放记录的数据文件。Foxglove 的 3D 视图允许你以三维方式查看机器人的运动轨迹、传感器数据和其他几何信息。你可以旋转、缩放和平移视图以获得更好的观察角度。

zolty 1万+

LPDDR5 学习笔记05:WCK操作详解

LPDDR5 SDRAM采用双时钟设计,写时钟(WCK)频率为命令时钟(CK)的2倍或4倍,需要通过WCK2CK同步机制解决时钟域对齐问题。该同步操作由带特殊标志位的CAS命令触发,控制器需提供半频WCK脉冲进行状态校准。同步完成后才能执行读写操作,且支持多存储体组同步和WCK常开模式以优化性能。掉电后必须重新执行同步流程,确保时钟域正确对齐。该机制有效解决了高速内存接口的时序挑战,为LPDDR5性能提升提供关键技术支撑。

一只豌豆象的博客 2005

浅谈String的intern方法

关于String的intern方法

formydreamTAO的博客 226

Simulink仿真入门到精通(三) Simulink信号

本系列教程是根据孙忠潇编著的<<Simulink仿真及代码生成技术入门到精通>>学习笔记。 目录 Simulink仿真入门到精通(一) Simulink界面介绍 Simulink仿真入门到精通(二) Simulink模块 Simulink仿真入门到精通(三) Simulink信号 Simulink仿真入门到精通(四) Simulink子系统 Simulink仿真入门到精通(五) Simulink模型的仿真 Simulink仿真入门到精通(六) Simulink模型保存为图片 Sim

king110108的专栏 5395

String对象的intern()方法的总结

char[] a={'a','d','f','r'}; String s = new String(a,0,4); System.out.println(s==s.intern()); String s1 = new String("hello"); System.out.println(s1==s1.intern()); 输出: true false 用的是jdk1.8 猜测...

dw33xn的博客 1793

实战交易策略 篇二十二:情绪流龙头交易策略

在股票市场中,机构主导趋势,游资驱动热点,散户易被情绪裹挟,形成“金字塔”式生态链,并存在情绪传递、强者恒强、物极必反的规律特点。股市是资金驱动的情绪博弈场,价格波动由群体心理、资金博弈和预期差共同驱动,核心是资本逐利性与人性贪婪恐惧的交织,兼具资源配置、财富再分配与风险定价功能。涨停加速与逃逸缺口(主升强化)凹字板/平台突破(趋势延续)天量弱转强(分歧买点)不参与首波(二波策略)情绪周期(道术合一)主线思维(聚焦核心)开盘抢筹(竞价博弈)一字助攻(情绪强化)分批进出(滚动操作)

生活在别处 1487

FISCO BCOS(一)———搭建单群组FISCO BCOS联盟链

1、安装ubuntu依赖 sudo apt install -y openssl curl 2、创建操作目录, 下载安装脚本 创建操作目录 cd ~ && mkdir -p fisco && cd fisco 下载脚本 curl -#LO https://github.com/FISCO-BCOS/FISCO-BCOS/releases/download/v2.8.0/build_chain.sh && chmod u+x build_chain.

林中有神君 6652

字符串intern()方法详解

1. intern()方法简介 如果字符串s在字符串常量池中存在对应字面量,则intern()方法返回该字面量的地址;如果不存在,则创建一个对应的字面量,并返回该字面量的地址 2. String对象与字面量的intern()区别 public static void main(String[] args) { String s1 = new String("字符串"); String s2 = "字符串"; System.out.println

zs357的博客 1万+

KEPServerEX 6 之 lot Gateway MQTT Clinet 配置使用方式

IoT Gateway即Internet of Things Gateway物联网网关。 ---------------------------------------------------------------------------------- 方式:使用kepw的IOTGateway插件选择MQTTClient 解决:可以实现 KEPW 的Tag值 发送到 MQTT 服务器上 ----------------------------------------...

-雲飛兄-博客 6942

Java中String类的intern()方法深入理解。

我们很少用到intern()这个方法,那么这个方法有什么用呢? 先看一段代码: String s1 = new String("RD");// 指向堆对象引用 String s2 = s1.intern(); // 向常量池添加s1 并且S2引用常量池 String s3 = "RD"; System.out.println(s1 == s2); System.out.pri

RD_Lee的博客 774

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

关于String类字符串在JVM的存储地址问题,结合字符串拼接、intern()方法的详细理解。

最近看了网上一些关于String的intern()方法的例子,以及字符串拼接的博客,彻底把我的思绪搞乱了,我对String的理解又被打回了原点,所以决定再一探究竟。 在开始正式探讨之前,我们先要回顾这几个知识点: String直接赋值与使用new的区别: 当String类直接赋值时,如果常量池内存在这个字符串,则s1直接指向常量池的地址,若没有,则先在常量池内创建这个字符串对象,s1直...

linlvting1314的博客 1078

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Java-String类的intern()方法

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

weixin_43421142的博客 295

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

String中的intern()方法分析(图文并茂容易理解)

String类中的intern()方法。 /** * Returns a canonical representation for the string object. * <p> * A pool of strings, initially empty, is maintained privately by the * class {@code String}. * <p> * When the intern method ...

AiT_Boy的博客 414

浅谈String类中的intern()方法

有关于intern()方法入池的问题(jdk1.7及以上)1.开头说明1).String类中“==”比较的含义1.1)利用刚才的概念验证2.引入intern()方法3.有关intern()方法细节 1.开头说明 我们先来看简单的一段代码,众所周知JAVA中提供了两种String类的实例化方式: 1.直接赋值 String strA = "hello"; //第一种实例化方式 2....

weixin_42394840的博客 379

Java记录 -27- String的intern方法

String类的intern()方法:(intern拘留的意思)publicStringintern()返回字符串对象的规范化表示形式。一个初始为空的字符串池,它由类String私有地维护。当调用intern方法时,如果池已经包含一个等于此String对象的字符串(用equals(Object)方法确定),则返回池中的字符串。否则,将此Stri...

weixin_33859504的博客 87

53.String的intern()方法、new String()到底创建了几个对象、intern()面试难题

目录1.`intern`方法解释2.`new String()`到底创建了几个对象3.`intern()`面试难题4.`intern()`总结5.`intern()`练习题6.`intern()`空间效率 1.intern方法解释 1.任意的字符串调用String.intern()方法,都会先去字符串常量池中寻找有没有相同的字符串,如果找到,则直接返回字符串常量池中的引用。 如果没有找到,JDK6和JDK7及以后的处理存在区别: a)JDK6会直接复制一个String对象的副本放到常量池 b)JDK7及以后

simpleGq的专栏 978

String——String和StringBuilder的intern()方法的区别

JDK对public String inter()方法的解释如下:        当调用intern()方法时,如果池已经包含一个与等值(object)方法确定的字符串对象相等的字符串,则返回池中的字符串。否则,该字符串对象将被添加到常量池中,并返回对该字符串对象在常量池的引用。public class StringIntern { public static final int _1M...

laoXingyao的博客 1049

String创建对象理解

对String的创建过程进一步理解。

njiang的专栏 3606

【Java】字符串常量池和intern()方法的理解

public String intern()                返回字符串对象的规范化表示形式。          一个初始时为空的字符串池,它由类 String 私有地维护。         当调用 intern 方法时,如果池已经包含一个等于此 String 对象的字符串(该对象由 equals(Object) 方法确定),则返回池中的字符串。否则,将此 String

且歌且行 495

JAVA --String类笔试面试题

转自:http://jingbo2759.blog.163.com/blog/static/98375315200971731522144/       http://jingbo2759.blog.163.com/blog/#m=0       JAVA基础面试题     字符串对象是一种特殊的对象.String类是一个不可变的类..也就说,String对象一旦创建就不允许修改

Super的专栏 1万+

String.intern()

每次用intern()方法之后,都是先去常量池中去查找,找不到就把堆里的对象放到常量池中。 因为intern()是对象的方法,所以要先有String对象才能用intern()方法,也就是当常量池中没有对应的字符串对象,堆里肯定有。 常见问题: ...

七月听雪的博客 242

java String 中 intern方法的概念

public String intern()返回字符串对象的规范化表示形式。 一个初始为空的字符串池,它由类 String 私有地维护。 当调用 intern 方法时,如果池已经包含一个等于此 String 对象的字符串(用 equals(Object) 方法确定),则返回池中的字符串。否则,将此 String 对象添加到池中,并返回此 String 对象的引用。 它遵循以下规...

zweifei的博客 235
上一篇: 广州YY面经
下一篇: [编程题]重构二叉树
HamalAlpha
博客等级 码龄11年 5粉丝 31原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值