【JVM】对String::intern()方法深入详解(JDK7及以上)

文章目录

  • 1、什么是intern?
  • 2、经典例题解释
    • 例1
    • 例2
    • 例3

1、什么是intern?

String::intern()是一个本地方法,它的作用是如果字符串常量池中已经包含一个等于此String对象的字符串,则返回代表池中这个字符串的String对象的引用;否则,会将此String对象包含的字符串添加到常量池中,并且返回此String对象的引用。----书上描述

已经包含。。。可能不太好理解。我画图解释
在这里插入图片描述
方法的执行顺序肯定是从下向上依次执行的。
String s1 = “11”; 先去字符串常量池中查看是否已经存在“11”,如果存在则直接返回"11"的地址,如果不存在则会在字符串常量池中创建“11”,然后返回创建好的“11”的地址。因为之前未创建过,所以该指令会先去字符串常量池中创建“11”,然后返回11的地址 501
String s2 = new String(“11”); 也是先去字符串常量池中查看是否已经存在“11”,如果有就在堆中创建对象,存的是字符串常量池中“11”的地址501,最后,将堆中对象的地址601返回给S2 。
String s3 = s2.intern(); intern方法会从字符串常量池中,查询当前s2字符串"11"是否存在,若不存在就会在字符串常量池中创建字符串"11"的实例, 由于s1已经在字符串常量池中已经创建了“11”,s2.intern()则返回501。

System.out.println(s1==s2);
System.out.println(s1==s3);false
true

s1==s2 返回false是因为s1指向的是字符串常量池中的"11"对象(501),而s2指向的是堆中存储了"11"的地址的对象(601)
s1==s3 返回true 是因为s3和s1都指向的是字符串常量池中的"11"。

对String srt = new String(“str”)与 str1 = ”str“的区别不了解的话可以看篇文章

2、经典例题解释

例1

//1
String s = new String("1");
//2
s.intern();//调用此方法之前,字符串常量池中已经存在了"1".
//3
String s2 = "1";
//4
System.out.println(s==s2);
  • 执行1,会创建两个对像,在字符串常量池中创建一个”1“,在堆中创建一个String对象,并存储“1”在字符串常量池中的的地址。
  • 执行2,调用此方法之前,字符串常量池中已经存在了"1",所以此指令什么都没做,此时s指向堆中的对象。
  • 执行3,由于字符串常量池中已经存在了“1”,所以不需要再创建,返回“1”的地址,s2指向字符串常量池中的”1“。
  • 执行4,由于s指向堆中对象,s2指向字符串常量池中的对象,所以打印结果是false。

这是比较简单的例子
下面上强度了!!!!!!

例2

		//1String s3 = new String("1")+new String("1");//2s3.intern();//3String s4 = "11";//4System.out.println(s3==s4);
  • 执行1,会在堆中创建两个存储字符串”1“的地址的对象和一个字面量为”11“的String对象,在字符串常量池中创建一个”1“字符串实例。
    在编译期间,在创建String对象之前,会先创建一个StringBuilder对象,后面每次在堆中创建完一个String对象,会对该字符串执行LDC指令,LDC指令会先到字符串常量池中查找是否存在对应字符串实例的引用,如果有的话,那么直接返回这个字符串实例的地址给堆中的new的String对象,如果没有的话,会创建一个字符串实例,然后将其添加到字符串常量池中,之后再返回这个字符串实例对象的地址给堆中创建的对象。完成String对象初始化后,都会执行StringBuilder::append()方法,将该字符串拼接到StringBuilder对象里。当都拼接完,会执行StringBuilder::toString()方法,返回一个在堆中新new的String对象,value为"11"。
    可以通过编译后的字节码文件清晰的观察整个过程:
    在这里插入图片描述
    标注的都是刚才介绍的行为。

  • 执行2,由于toString()方法只在堆中创建了一个”存储11"的String对象,并没有在字符串常量池中创建"11"字符串实例。按之前的说法intern应该去字符串常量池中创建字符串”11“的实例,但是在JDK7中,并没有在字符串常量池中创建字符串"11"的实例,由于堆中已经存在了"11"这个String对象,那么为了节省空间,会在字符串常量池中申请一块空间,存放这个String对象的地址,并返回存放的地址,也就是堆中存储"11"的String对象的地址。

  • 执行3,会去字符串常量池中查找是否存在"11",因为第二行已经在字符串常量池中,创建了存储堆中存储"11"的String对象的地址的空间,则直接返回空间里面存储的堆中String对象的地址,所以s4也指向了堆中存储"11"的String对象。

  • 由于s3和s4都指向堆中同一个对象,所以打印结果为true。
    如图所示:
    在这里插入图片描述
    通过debug,可以看到两个句柄指向的地址是一样的:
    在这里插入图片描述
    打印结果:
    在这里插入图片描述

例3

		//1String s3 = new String("1")+new String("1");//2String s4 = "11";//3s3.intern();//4System.out.println(s3==s4);
  • 第一行执行结果与例2的第一行执行结果一致。
  • 执行2,由于字符串常量池中,还没有"11",则向字符串常量池中创建字符串"11"的实例,并返回实例的地址。
  • 执行3,由于字符串常量池中已经存在"11",则不需要再创建,返回实例的地址,但由于没有赋值操作,所以该行代码没有什么作用。
  • 此时,s3指向堆中存储了“11”的String对象,而s4指向的是字符串常量池中字符串为"11"的实例,所以指向的地址不同打印结果为false
    通过debug可以看到两个句柄指向的地址是不同的:
    在这里插入图片描述
    打印结果:
    在这里插入图片描述

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

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

相关文章

7-15 然后是几点

有时候人们用四位数字表示一个时间,比如 1106 表示 11 点零 6 分。现在,你的程序要根据起始时间和流逝的时间计算出终止时间。 读入两个数字,第一个数字以这样的四位数字表示当前时间,第二个数字表示分钟数,计算当前时…

【Vue-Router】嵌套路由

footer.vue <template><div><router-view></router-view><hr><h1>我是父路由</h1><div><router-link to"/user">Login</router-link><router-link to"/user/reg" style"margin-left…

代码随想录算法训练营(二叉树总结篇)

一.二叉树的种类 1.满二叉树&#xff1a;就是说每一个非叶子节点的节点都有两个子节点。 2.完全二叉树&#xff1a;此二叉树只有最后一层可能没填满&#xff0c;并且存在的叶子节点都集中在左侧&#xff01;&#xff01;&#xff01; &#xff08;满二叉树也是完全二叉树&…

【Flutter】【基础】CustomPaint 绘画功能(一)

功能&#xff1a;CustomPaint 相当于在一个画布上面画画&#xff0c;可以自己绘制不同的颜色形状等 在各种widget 或者是插件不能满足到需求的时候&#xff0c;可以自己定义一些形状 使用实例和代码&#xff1a; CustomPaint&#xff1a; 能使你绘制的东西显示在你的ui 上面&a…

安装Tomac服务器——安装步骤以及易出现问题的解决方法

文章目录 前言 一、下载Tomcat及解压 1、选择下载版本&#xff08;本文选择tomcat 8版本为例&#xff09; 2、解压安装包 二、配置环境 1、在电脑搜索栏里面搜索环境变量即可 2、点击高级系统设置->环境变量->新建系统变量 1) 新建系统变量&#xff0c;变量名为…

nginx一般轮询、加权轮询、ip_hash等负载均衡模式配置介绍

一.负载均衡含义简介 二.nginx负载均衡配置方式 准备三台设备&#xff1a; 2.190均衡服务器&#xff0c;2.191web服务器1&#xff0c;2.160web服务器2&#xff0c;三台设备均安装nginx&#xff0c;两台web服务器均有网页内容 1.一般轮询负载均衡 &#xff08;1&#xff09…

Autoware感知02—欧氏聚类(lidar_euclidean_cluster_detect)源码解析

文章目录 引言一、点云回调函数&#xff1a;二、预处理&#xff08;1&#xff09;裁剪距离雷达过于近的点云&#xff0c;消除车身的影响&#xff08;2&#xff09;点云降采样&#xff08;体素滤波&#xff0c;默认也是不需要的&#xff09;&#xff08;3&#xff09;裁剪雷达高…

React Native 图片组件基础知识

在 React Native 中使用图片其实跟 HTML 中使用图片一样简单&#xff0c;在 React Native 中我们使用Image组件来呈现图片的内容&#xff0c;其中主要的属性有&#xff1a;source。这个属性主要是设置图片的内容&#xff0c;它可以是网络图像地址、静态资源、临时本地图像以及本…

【LeetCode75】第二十九题 删除链表的中间节点

目录 题目&#xff1a; 示例; 分析: 代码: 题目&#xff1a; 示例; 分析: 给我们一个链表&#xff0c;让我们把链表中间的节点删了。 那么最直观最基础的办法是遍历两边链表&#xff0c;第一遍拿到链表长度&#xff0c;第二次把链表中间节点删了。 这个暴力做法我没事过…

Docker查看、创建、进入容器相关的命令

1.查看、创建、进入容器的指令 用-it指令创建出来的容器&#xff0c;创建完成之后会立马进入容器。退出之后立马关闭容器。 docker run -it --namec1 centos:7 /bin/bash退出容器&#xff1a; exit查看现在正在运行的容器命令&#xff1a; docker ps查看历史容器&#xff0…

Uniapp当中使用腾讯位置路线规划插件保姆教学

首先我们在使用腾讯地图插件之前我们需要先做几点准备 1&#xff1a;我们需要在腾讯地图位置服务当中注册账号以及在控制台当中创建应用和创建key 这里在创建应用当中应用类型一定要选出行类型&#xff0c;否则后期可能会出现问题。 我们创建完应用之后&#xff0c;点击创建…

java毕业设计-智慧食堂管理系统-内容快览

首页 智慧食堂管理系统是一种可以提高食堂运营效率的管理系统。它将前端代码使用Vue实现&#xff0c;后端使用Spring Boot实现。这个系统的目的是简化食堂管理&#xff0c;提高食堂服务质量。在现代快节奏的生活中&#xff0c;人们对餐饮服务提出了更高的要求&#xff0c;食堂管…

论文复现--关于单视角动作捕捉工具箱--MMHuman3d的研究(基于Windows10和Linux18.04中配置)

分类&#xff1a;动作捕捉 github地址&#xff1a;https://github.com/open-mmlab/mmhuman3d 所需环境&#xff1a; Windows10&#xff0c;CUDA11.6&#xff0c;conda 4.13.0&#xff0c;Visual Studio 2017&#xff1b; Ubuntu18.04&#xff0c;conda22.9.0&#xff0c;CUDA11…

C语言题目的多种解法分享 2之字符串左旋和补充题

前言 有的时候&#xff0c;这个系列专栏中的解法之间并无优劣&#xff0c;只是给大家提供不同的解题思路 我决定将代码实现的过程写成注释&#xff0c;方便大家直接找到对应的函数&#xff0c;只有需要补充说明的知识才会单拿出来强调 这个系列的文章会更的比较慢&#xff0…

Kafka3.0.0版本——Broker( 退役旧节点)示例

目录 一、服务器信息二、先启动4台zookeeper&#xff0c;再启动4台kafka三、通过PrettyZoo工具验证启动的kafka是否ok四、查看4台kafka集群节点上是否存在创建的名称为news的主题五、退役旧节点5.1、执行负载均衡操作5.2、 执行停止命令5.3、再次查看kafka中的创建过的名称为ne…

React Native 列表组件基础知识

ScrollView 组件 ScrollView组件是一个容器滚动组件&#xff0c;当容器超出指定宽高时就可以进行滚动交互。 ScrollView组件是一次性渲染所有的 React 子组件&#xff0c;这在性能上是比较差的&#xff0c;所以不建议当列表特别长的时候使用此组件。 接下来列举几个常用的一…

导入示例工程出现error: failed to start ability. Error while Launching activity错误的解决办法

导入华为健康生活应用&#xff08;ArkTS&#xff09;&#xff0c;使用DevEco Studio打开&#xff0c;运行报错&#xff1a; error: failed to start ability. Error while Launching activity解决办法&#xff1a;修改module.json5里面exported的值&#xff0c;由false改为tr…

LVGL学习笔记 30 - List(列表)

目录 1. 添加文本 2. 添加按钮 3. 事件 4. 修改样式 4.1 背景色 4.2 改变项的颜色 列表是一个垂直布局的矩形&#xff0c;可以向其中添加按钮和文本。 lv_obj_t* list1 lv_list_create(lv_scr_act());lv_obj_set_size(list1, 180, 220);lv_obj_center(list1); 部件包含&…

07 - 深入浅出HashMap的设计与优化

在上一讲中提到过 Collection 接口&#xff0c;那么在 Java 容器类中&#xff0c;除了这个接口之外&#xff0c;还定义了一个很重要的 Map 接口&#xff0c;主要用来存储键值对数据。 HashMap 作为我们日常使用最频繁的容器之一&#xff0c;相信你一定不陌生了。今天我们就从 …

做外贸发布产品的最简单的方式

最近和一个朋友聊天&#xff0c;说到他朋友在开某平台的网店&#xff0c;因为抄袭某家的好评而被投诉罚款&#xff0c;而被罚款的原因是这个朋友太懒了&#xff0c;在挑选了一家店铺的好评后&#xff0c;就直接照抄不误&#xff0c;而且全部的好评语都是抄自这同一家的&#xf…