我们什么时候应该对字符串文字使用 String 的 intern 方法

2024-02-18

根据字符串#intern() https://docs.oracle.com/javase/9/docs/api/java/lang/String.html#intern--, intern如果在字符串池中找到了该字符串,该方法应该从字符串池中返回该字符串,否则将在字符串池中添加一个新的字符串对象,并返回该字符串的引用。

所以我尝试了这个:

String s1 = "Rakesh";
String s2 = "Rakesh";
String s3 = "Rakesh".intern();

if ( s1 == s2 ){
    System.out.println("s1 and s2 are same");  // 1.
}

if ( s1 == s3 ){
    System.out.println("s1 and s3 are same" );  // 2.
}

我正期待着s1 and s3 are same将在 s3 被实习时打印,并且s1 and s2 are same将不会被打印。但结果是:两行都被打印出来。这意味着,默认情况下,字符串常量是被保留的。但如果是这样的话,那我们为什么还需要intern方法?换句话说,我们什么时候应该使用这个方法呢?


Java 自动实习字符串文字。这意味着在许多情况下,== 运算符对字符串的作用与对整数或其他原始值的作用相同。

由于字符串文字的实习是自动的,intern()方法用于构造的字符串new String()

使用你的例子:

String s1 = "Rakesh";
String s2 = "Rakesh";
String s3 = "Rakesh".intern();
String s4 = new String("Rakesh");
String s5 = new String("Rakesh").intern();

if ( s1 == s2 ){
    System.out.println("s1 and s2 are same");  // 1.
}

if ( s1 == s3 ){
    System.out.println("s1 and s3 are same" );  // 2.
}

if ( s1 == s4 ){
    System.out.println("s1 and s4 are same" );  // 3.
}

if ( s1 == s5 ){
    System.out.println("s1 and s5 are same" );  // 4.
}

将返回:

s1 and s2 are same
s1 and s3 are same
s1 and s5 are same

在所有情况下,除了s4变量,使用显式创建的值new运算符和位置intern方法未用于其结果,它是返回的单个不可变实例JVM的字符串常量池 https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-5.html#jvms-5.1.

参考JavaTechniques“字符串相等和实习” http://javatechniques.com/blog/string-equality-and-interning/了解更多信息。

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

我们什么时候应该对字符串文字使用 String 的 intern 方法 的相关文章

  • 在 JList 中写一些东西

    嘿 我还有另一个问题 我创建JList在我的主窗口中 现在我想向其中添加一些内容 我这样做 private void jButton2ActionPerformed java awt event ActionEvent evt Dodaj
  • 将更改(永久)保存在数组列表中?

    那可能吗 例如 用户将新的项目 元素添加到数组列表 缓冲读取器进程 中 并且肯定会发生更改 我的问题是 即使用户多次更改数组列表 它也可能会永久存在 即使他们关闭程序并再次打开它 它也会一直存在 注意 不使用 txt 很抱歉问这样的问题 但
  • Jboss EAP 7 - 如何从部署中排除隐式模块(javax.jms)?

    我没想到我会来到这里 但经过大量 Google 和 StackOverflow 搜索后 我来到了这里 这就是我的确切问题 https www linkedin com pulse tale two jars marco antonio al
  • 如何确定 JDialog 显示在哪个屏幕上

    我有一个非常大的应用程序 有多个对话框 我的任务是确保不完全可见的对话框 因为用户将其从可见屏幕区域拉出 移回屏幕中心 当我只处理一个屏幕时 这没问题 它工作得很好 但是 该应用程序的大多数用户的桌面上都有两个屏幕 当我尝试找出对话框显示在
  • TableModel setCellEditable 并自动将值设置回 false

    我目前正在尝试在 JTable 中实现 JPopupMenu 它允许解锁单元格以进行编辑 Override public void actionPerformed ActionEvent e if e getActionCommand Un
  • 竞争条件和 Clojure Atoms

    clojure atom 的文档指出 Changes to atoms are always free of race conditions 然而 竞争条件不仅是根据更改定义的 而且是在不同线程中并行逻辑操作的上下文中定义的 我想知道 保证
  • Hibernate更新查询问题

    对于此更新查询 update TestDB dbo MyEmp set empname where empid 我在 DAO 课上写的 MyEmployee myEmployee new MyEmployee MyEmployee myEm
  • Android 的@hide 注解到底有什么作用?

    Android中很多内部API都被标记出来了 hide What exactly这是吗 另一个答案 https stackoverflow com questions 17035271 what does hide mean in the
  • 覆盖乔达一周的第一天?

    是否有可能覆盖乔达弱的第一天sunday 因为 Joda 使用Monday作为一周的第一天 如果有办法的话 谁能解释一下 我在 SOF 中提到了以下主题 乔达时间 一周的第一天 https stackoverflow com questio
  • String.intern() 线程安全吗

    我想在Java中使用 String intern 来节省内存 对具有相同内容的字符串使用内部池 我从不同的线程调用这个方法 这是个问题吗 对你的问题的简短回答是肯定的 它是线程安全的 但是 您可能需要重新考虑使用此工具来减少内存消耗 原因是
  • 用二进制数、常规数字和格雷编码填充矩阵

    我有一个包含 1 s 或 0 s 的矩阵 用于创建二进制数 其宽度为n 对于 n 2 和 n 3 它看起来像 00 000 01 001 10 010 11 011 100 101 110 111 等等 现在我正在使用以下代码来生成它 in
  • mysql 准备好的语句错误:MySQLSyntaxErrorException

    我使用准备好的语句编写了选择语句 每次尝试运行都会出现此错误 我如何克服这个错误 我的jdbc连接器是mysql connector java 5 1 13 bin jar 我的代码 public Main add ad to getAdD
  • jasper 报告文件中出现错误

    首先 我在 iReport 5 1 0 中创建一个 R D1 jrxml 文件 我执行该报告的 Java 代码如下所示 import java sql Connection import java sql DriverManager imp
  • 将 ASCII 字符转换为“”unicode 表示法的脚本

    我正在对 Linux 区域设置文件进行一些更改 usr share i18n locales like pt BR 并且需要格式化字符串 例如 d m Y H M 必须以 Unicode 指定 其中每个 在本例中为 ASCII 字符表示为
  • 在大文件中查找重复字符串

    一个文件包含大量 例如100亿 字符串 您需要查找重复的字符串 您有 N 个可用系统 您将如何找到重复项 埃里克森的答案可能是提出这个问题的人所期望的 您可以将 N 台机器中的每台机器用作哈希表中的一个存储桶 对于每个字符串 按顺序说出字符
  • 使用 SimpleDateFormat、Java 进行错误的日期解析

    我需要使用日期模式 yyyy MM dd 解析输入字符串中的日期 如果日期采用任何其他格式 则抛出错误 这是我解析日期的代码 private void validateDate throws MyException Date parsedD
  • 原子整数的compareandexchange()与compareandset()

    在研究 AtomicInteger 时 我发现这个 API 提供了两种方法 比较和交换 如果当前值被引用 则自动将该值设置为 newValue to 作为见证值 预期值 记忆效应为 由指定VarHandle compareAndExchan
  • std::regex 转义正则表达式中使用的特殊字符

    我是字符串来创建一个std regex FILE 作为单元测试的一部分 检查一些打印文件名的异常输出 在 Windows 上失败并显示 regex error error escape 表达式包含无效的转义字符或尾随转义 因为 FILE 宏
  • 如何将元素添加到通用集合

    我想知道如何将专用对象添加到通用集合中 我正在使用以下代码 Collection
  • Spring Boot 2 中的 401 代替 403

    With 春季启动 https projects spring io spring boot 1 5 6 发布我能够发送 HTTP 状态代码401代替403如中所述如果请求未经身份验证的uri 如何让Spring Security响应未经授

随机推荐

  • Couchbase 文档 ID 生成

    我有一个与 couchbase 6 0 集成的 Springboot 应用程序 我读过 如果一个键用 Id 注释 那么它将保存为文档 ID 并且不会成为 json 的一部分 然后我在键上一起使用了 Id和 Field 但该字段仍然没有出现在
  • 如何在 Jupyter / IPython 中覆盖之前的打印行

    我完全清楚print Blah end r 但这在 Jupyter IPython 笔记本中不起作用 因为它在终端中通常不打印任何内容 或者如果操作非常快 则会触发异常 难道这就是不可能吗 谢谢 None
  • 单独读取数据 fscanf

    我正在尝试从文件中读取数字 该文件具有以下格式 2 4 5 7 3 2 4 7 我尝试使用fscanf收集直到换行符的所有数字并将数字存储在数组中 与第二行相同 但直接从第二行开始不会再次开始并将其存储在另一个数组中 是否可以使用以下方法来
  • 如何修复错误:此类与键 tableView 的键值编码不兼容。 [复制]

    这个问题在这里已经有答案了 我做了一个应用程序Table View and Segmented Control 这是我第一次 我正在使用一些代码和一些教程 但它不起作用 当我运行我的应用程序时 它崩溃了 并在日志中显示此错误 MyAppli
  • 在 shell/bash 中的两个命令之间连接输入和输出

    我有两个 UNIX 程序 A 和 B 它们从 stdin stdout 读取和写入 我的第一个问题是如何将 A 的 stdout 连接到 B 的 stdinandB 的标准输出到 A 的标准输入 即 类似 A B而是双向管道 我怀疑我可以通
  • 为什么我的库无法在 CocoaPods 网站上扩展?

    我正在尝试通过 CocoaPods 网站访问我的图书馆信息 但无法访问 所有其他库似乎都能够扩展 我的是 MKWeatherUndergroundKit 这是我的 podspec Pod Spec new do s s name MKWea
  • Ember.js 中的路由采用什么样的单元测试解决方案? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我正在寻找在 Ember js 应用程序中对路由进行单元测试的最佳解决方案 我找到了两种解决方案 我希望你告诉我什么是最适合你的 这两个实现可以
  • 正则表达式匹配字符串的可选结尾

    鉴于以下情况 John Smith John Smith 123 John Smith 123 456 我想捕捉 John Smith John Smith 123 John Smith 123 456 什么样的 Java 正则表达式可以让
  • cURL 中的主机名和路径分开

    使用 cURL 时有没有办法将主机名和路径分开 我想向服务器本身发出请求 而不是向特定资源发出请求 如下 IETF 所述 Request URI 的四个选项取决于请求的性质 要求 星号 表示该请求不适用于 特定资源 但仅限于服务器本身 并且
  • QSocketNotifier:只能与以 QThread 启动的线程一起使用

    我仅使用一个非常基本的应用程序并且没有套接字或任何奇特的东西就收到以下错误 QSocketNotifier 只能与以 QThread 启动的线程一起使用 Machine Fedora 32 工作站版 Python 3 8 PyQt5 Fed
  • v4.app.Fragment 中 getLoaderManger() 和 getActivity().getSupportLoaderManager() 之间的区别

    getLoaderManager from android support v4 app Fragment and getSupportLoaderManager from android support v4 app FragmentAc
  • 如何将 XCTAssertNil 与可选结构一起使用?

    更新 2016 年 3 月 23 日我刚刚测试了下面的原始示例代码 它在 XCode 7 3 中编译得很好 看起来 XCTAssertNil 已更新以获取类型表达式 throws gt Any 因此 可能不再需要这个问题和答案 除了旧版本编
  • Google Charts API 使用 $(document).ready 方法显示空白屏幕

    我有几个函数可以使用 Google Charts API 实例化各种图表 当我在没有 jQuery 的情况下调用它们时 document ready方法 一切正常 但用这种方法 我看到的是空白屏幕 Why function drawColu
  • 遇到:json.decoder.JSONDecodeError:期望值:第1行第1列(字符0)

    我拿到json decoder JSONDecodeError Expecting value line 1 column 1 char 0 当我尝试访问我创建的 json 文件中的值时 我运行了下面的运行文件 似乎存在这个解码器问题 但是
  • 相机2最大1440x1080

    我正在尝试使用横向 1920x1080 显示正常的全高清预览Camera2 但相机返回 1440x1080 作为最高分辨率 使用旧相机 android hardware camera 同一设备没有这样的问题 我究竟做错了什么 CameraM
  • NetBeans 作为 ColdFusion 脚本的编辑器?

    是否有任何已知的 NetBeans 插件可用于 ColdFusion 脚本的编辑 格式化和颜色编码 恐怕没有 有些人将非常基本的语法着色和正确的注释组合在一起 但没有插件 也没有 cfml 支持 你最好的选择是基于日食CFEclipse h
  • Golang 与 docker 镜像内的 CGO 交叉编译

    要求 应用程序必须容器化为 docker 镜像 并且需要支持arm64 and amd64架构 Codebase 这是一个golang应用程序 需要使用git2go https github com libgit2 git2go图书馆并且必
  • Android 颜色叠加 - PorterDuff 模式

    我有一个黑白九块可绘制对象作为视图的背景 我想在其上应用颜色 例如半透明覆盖层 使绘图可见但在其上应用所需的颜色 我想drawable setColorFilter color mode 可能会成功 但我无法弄清楚不同模式的含义 有人能给我
  • 带有自定义按钮标题的 SWT MessageBox

    我想在我的非 RCP SWT 应用程序中添加自定义按钮标题 MessageBox messageBox new MessageBox shell SWT ICON WARNING SWT ABORT SWT RETRY SWT IGNORE
  • 我们什么时候应该对字符串文字使用 String 的 intern 方法

    根据字符串 intern https docs oracle com javase 9 docs api java lang String html intern intern如果在字符串池中找到了该字符串 该方法应该从字符串池中返回该字符