JAVA String.intern()方法

2023-11-10

感谢原作者的分享,转载只为方便知识点,原文地址:http://www.runoob.com/java/java-string-intern.html (莫洛的笔记)

尽管在输出中调用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

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JAVA String.intern()方法 的相关文章

随机推荐

  • 解决 ANSJ分词 自定义词典文件无效

    注意 1 指定配置文件的路径时 建议配置为绝对路径 这种方式最简单 否则需自行解决路径的问题 2 配置文件的内容 词典各字段之间使用tab t 分割 一般发现自定义字典无效 就是因为使用的不是tab t 而是4个空格等 所以 一定要记住 t
  • Bootstrap 3导航栏

    Today we continue Bootstrap 3 lessons and review Bootstrap 3 Navbar In our new lesson we will try to disassemble the nav
  • 关于复位的一些总结

    同步reset synchronous reset 是说 当reset信号为active的时候 寄存器在下一个时钟沿到来之后被复位 时钟沿到来之前寄存器还是保持其之前的值 异步reset asynchronous reset 是说 当res
  • bash: /opt/ros/kinetic/setup.bash: 没有那个文件或目录

    我安的是ROS melodic版本 但是使用的是kinetic版本的安装教程 这就导致了在有一步 添加环境变量时 使用echo指令 忘了将教程中的kinetic改成melodic 所以出现了以下的现象 当我source bashrc的时候
  • Java学习笔记 -- 包 (package)

    Java 面向对象篇 笔记首页 序号 内容 链接地址 1 面向对象概述 https blog csdn net weixin 44141495 article details 107999131 2 类与对象 https blog csdn
  • 2022蓝桥杯JAVA研究生组--我写了几个

    试题 A 排列字母 本题总分 5 分 问题描述 小蓝要把一个字符串中的字母按其在字母表中的顺序排列 例如 LANQIAO 排列后为 AAILNOQ 又如 GOODGOODSTUDYDAYDAYUP 排列后为 AADDDDDGGOOOOPST
  • 晶振是如何起振的?

    01 皮尔斯晶体振荡器 目前工作中用得最多的就是皮尔斯晶体振荡器 也就是下面这个结构 CL1 CL2为匹配电容 Rext通常为串联的几百欧姆电阻 有时也不加 上面这个结构可能看着不是很熟悉 我们把它转换一下 变成下面这个就熟悉些 上图中把R
  • TestNG 开源自动化测试框架

    摘要 TestNG是一个开源自动化测试框架 TestNG表示下一代 TestNG是类似于JUnit 特别是JUnit 4 但它不是一个JUnit扩展 它的灵感来源于JUnit 它的目的是优于JUnit的 尤其是当测试集成的类 主要内容 Te
  • 如何在Java中将GIF图像转换为PNG等图像格式?试试Aspose

    通常 GIF图像用于描述动画 动画GIF是按特定顺序组合在一起的帧的集合 但是 在某些情况下 必须将GIF图像转换为其他光栅图像格式 对于这种情况 本文演示了如何使用Java将GIF图像转换为PNG JPEG BMP和TIFF格式 在Jav
  • 【upload-labs】————12、Pass-11

    闯关界面 前后端检测判断 查看源代码 这里采用了白名单判断 但是 img path直接拼接 所以可以先上传一个符合白名单检测的jpg文件 之后再burpsuite中使用 00截断保存路径即可 截断保存路径 浏览器中访问
  • C++项目中调用C#库

    最近有个功能在实现的时候要么要求 C 版本比较高 C 17 要么要求的 Qt 版本比较高 要么要求 windows 版本比较高 而且也没有比较好的第三方 C 库 无意间发现 C 早就实现了该功能 故准备使用 C 实现具体功能 在 C 项目中
  • 差帧法——学习

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 引言 思路 伪代码 代码 详解 函数详解 二值化 高斯滤波 引言 个人理解 差帧法 就是相邻两帧之间图象的差值 通过对差值进行高斯滤波或者腐蚀 膨胀操作减小图象噪声
  • Vue基础

    Vue 是什么 Vue 读音 vju 类似于 view 是一套用于构建用户界面的渐进式框架 vue 的核心库只关注视图层 不仅易于上手 还便于与第三方库或既有项目整合 使用Vue将helloworld 渲染到页面上 指令 本质就是自定义属性
  • 操作系统复习总结(五)

    10 18 14 30 15 00 第五章 主存管理 主存储器 主存 or 内存 中央处理器为可直接访问的存储器 计算机系统的一个关键性资源 理想中的存储器 更大更快 更便宜的非易失性存储器 存储管理的功能 方式 连续分配方式 一个进程分配
  • LINUX-LVM简单配置

    1 在编辑设置中为虚拟机添加另一块新硬盘 2 fdisk dev sdb gt n新建分区 gt p选择默认主分区 gt 回车 gt 回车 gt 回车 gt t为新建分区分配id gt 8e gt 回车 3 pvcreate dev sdb
  • 字符串有关习题

    0 请问下面代码有没有毛病 为什么 1 gt gt gt input I love FishC com 2 gt gt gt print input 3 I love FishC com 答 有问题 给变量命名要避免与内置函数名字冲突 1
  • 安装老版本flash - 解决”正尝试安装的adobe flash player不是最新版本“的办法

    安装Flash player时提示 正尝试安装的adobe flash player不是最新版本 解决的办法是在运行中输入regedit 在注册表中找到 HKEY LOCAL MACHINE SOFTWARE Macromedia Flas
  • c语言中关于时间的函数

    本文从介绍基础概念入手 探讨了在C C 中对日期和时间操作所用到的数据结构和函数 并对计时 时间的获取 时间的计算和显示格式等方面进行了阐述 本文还通过大量的实例向你展示了time h头文件中声明的各种函数和数据结构的详细使用方法 关键字
  • 抓蓝牙数据包_蓝牙协议分析工具Wireshark/Frontline/Ellisys的使用

    一 声明 本专栏文章我们会以连载的方式持续更新 本专栏计划更新内容如下 第一篇 蓝牙综合介绍 主要介绍蓝牙的一些概念 产生背景 发展轨迹 市面蓝牙介绍 以及蓝牙开发板介绍 第二篇 Transport层介绍 主要介绍蓝牙协议栈跟蓝牙芯片之前的
  • JAVA String.intern()方法

    感谢原作者的分享 转载只为方便知识点 原文地址 http www runoob com java java string intern html 莫洛的笔记 尽管在输出中调用intern方法并没有什么效果 但是实际上后台这个方法会做一系列的