字符串池行为

2023-11-27

我读了这个关于Java字符串池的问题并了解字符串池的基本概念,但仍然不了解其行为。

第一:如果直接赋值并且 s1 和 s2 都引用池中的同一个对象,它就可以工作

String s1 = "a" + "bc";
String s2 = "ab" + "c";
System.out.println("s1 == s2? " + (s1 == s2));

但是如果我更改字符串 s1+="d",那么池应该有一个字符串对象“abcd”?那么当我更改 s2+="d" 时,它应该在池中找到字符串对象“abcd”并将该对象分配给 s2?但事实并非如此,而且它们没有引用同一个对象。这是为什么?

String s1 = "abc";
String s2 = "abc";
System.out.println("s1 == s2? " + (s1 == s2));

s1 += "d";                  
s2 += "d";
System.out.println("s1 == s2? " + (s1 == s2));

当您调用时,保证字符串被池化String.intern()在一根绳子上。

String s1 = "abcd".intern();
String s2 = "abc";
s2 += "d";
s2 = s2.intern();
s1 == s2 // returns true

当编译器看到一个常量时,它足够聪明地优化和池化字符串文字,即:

String s1 = "abcd";
String s2 = "abcd";
s1 == s2 // returns true

Java语言规范 states:

每个字符串文字都是一个引用 (§4.3) 到实例 (§4.3.1, §12.5) String 类(第 4.3.3 节)。细绳 对象具有恒定的值。细绳 文字,或者更一般地说,字符串 这是常数的值 表达式 (§15.28) - 被“拘禁”,因此 为了共享独特的实例,使用 String.intern 方法。

所以在这种情况下s2 += "d",编译器不像你那么聪明,只是汇集起来"d".

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

字符串池行为 的相关文章

  • 使用cameltestsupport进行Camel单元测试,模板始终为空

    我正在用 Camel 做一个简单的单元测试 我想做的就是从文件 在资源下 读取 JSON 内容 将其发送到 Java 类进行验证 这是我试图测试的路线 无论我做什么 模板 我用来发送正文 json 始终为空 这是我的代码 public cl
  • 无法使用maven编译java项目

    我正在尝试在 java 16 0 1 上使用 maven 构建 IntelliJ 项目 但它无法编译我的项目 尽管 IntelliJ 能够成功完成 在此之前 我使用maven编译了一个java 15项目 但我决定将所有内容更新到16 0 1
  • 检查 PHP 中的字符串长度

    我有一个长度为 141 个字符的字符串 使用下面的代码我有一个if如果字符串大于或小于 140 则语句返回一条消息 libxml use internal errors TRUE dom new DOMDocument dom gt loa
  • Python - 将宽字符字符串从二进制文件转换为 Python unicode 字符串

    这是漫长的一天 我有点困惑 我正在读取一个包含大量宽字符字符串的二进制文件 我想将它们转储为 Python unicode 字符串 为了解压非字符串数据 我使用 struct 模块 但我不知道如何对字符串执行相同的操作 例如 阅读 系列 一
  • 改变字符串颜色

    好的 这是我上一个问题的延续 但我有代码 private void btnTrans Click object sender EventArgs e var abrvStr inputBx Text foreach var kvp in d
  • Java套接字:在连接被拒绝异常时重试的最佳方法?

    现在我正在这样做 while true try SocketAddress sockaddr new InetSocketAddress ivDestIP ivDestPort downloadSock new Socket downloa
  • 将表值参数与 SQL Server JDBC 结合使用

    任何人都可以提供一些有关如何将表值参数 TVP 与 SQL Server JDBC 一起使用的指导吗 我使用的是微软提供的6 0版本的SQL Server驱动程序 我已经查看了官方文档 https msdn microsoft com en
  • 具有字符串类型的 CAPL 关联数组

    按照此paper https kb vector com upload 551 file CAPL 3 CANNewsletter 201411 PressArticle EN pdf 我正在尝试创建一个像这样的关联数组 variables
  • 无法加载或查找主类,可以在命令行中使用,但不能在 IDE 中使用[重复]

    这个问题在这里已经有答案了 在将其标记为重复之前 请先听我说完 我正在尝试使用 gradle 导入一个 java 项目 功能齐全 适用于所有其他笔记本电脑 没有问题 我的项目 100 正常运行 适用于所有其他笔记本电脑 当我的笔记本电脑被重
  • Java - 返回值是否会中断循环?

    我正在编写一些基本上遵循以下格式的代码 public static boolean isIncluded E element Node
  • 如何记录来自 Akka (Java) 的所有传入消息

    在 Scala 中 您可以使用 LoggingReceive 包装接收函数 如何通过 Java API 实现相同的目标 def receive LoggingReceive case x do something Scala API 有Lo
  • 如何在 Eclipse Java 动态 Web 项目中使用 .properties 文件?

    我正在 Eclipse 中开发动态 Web 项目 我创建了一个 properties 文件来存储数据库详细信息 用户名 密码等 我通过右键单击项目和 New gt File 添加它 我使用了Java util包Properties类 但它不
  • 尝试使用等于“是”或“否”的字符串变量重新启动 do-while 循环

    计算行程距离的非常简单的程序 一周前刚刚开始 我有这个循环用于解决真或假问题 但我希望它适用于简单的 是 或 否 我为此分配的字符串是答案 public class Main public static void main String a
  • 无法捕获 Spring Batch 的 ItemWriter 中的异常

    我正在编写一个 Spring Batch 流程来将数据集从一个系统迁移到另一个系统 在这种情况下 这就像使用RowMapper实现在传递给查询之前从查询构建对象ItemWriter The ItemWriter称为save我的 DAO 上的
  • 对象锁定私有类成员 - 最佳实践? (爪哇)

    I asked 类似的问题 https stackoverflow com questions 10548066 multiple object locks in java前几天 但对回复不满意 主要是因为我提供的代码存在一些人们关注的问题
  • 将图像添加到自定义 AlertDialog

    我制作了一个 AlertDialog 让用户可以从我显示的 4 个选项中选择一个 前 3 个让他们在单击号码时直接拨打号码 第 4 个显示不同的视图 现在看起来是这样的 由于第四个选项的目的是不同的任务 我想让它看起来不同 因为用户可能会感
  • 挂钩 Eclipse 构建过程吗?

    我希望在 Eclipse 中按下构建按钮时能够运行一个简单的 Java 程序 目前 当我单击 构建 时 它会运行一些 JRebel 日志记录代码 我有一个程序可以解析 JRebel 日志文件并将统计信息存储在数据库中 是否可以编写一个插件或
  • JSON 到 hashmap (杰克逊)

    我想将 JSON 转换为 HashMapJackson http jackson codehaus org 这是我的 JSON String json Opleidingen name Bijz trajecten zorg en welz
  • 在android中跟踪FTP上传数据?

    我有一个运行 Android 的 FTP 系统 但我希望能够在上传时跟踪字节 这样我就可以在上传过程中更新进度条 安卓可以实现这个功能吗 现在 我正在使用org apache common net ftp我正在使用的代码如下 另外 我在 A
  • 运算符“==”不能应用于“int”和“string”类型的操作数

    我正在编写一个程序 我想到了一个数字 然后计算机猜测了它 我一边尝试一边测试它 但我不断收到不应该出现的错误 错误是主题标题 我使用 Int Parse 来转换我的字符串 但我不知道为什么会收到错误 我知道它说 不能与整数一起使用 但我在网

随机推荐

  • WPF:禁用列表框,但启用滚动

    整个早上我都在用头撞这个问题 基本上 我有一个列表框 我希望防止人们在长时间运行的过程中更改选择 但允许他们仍然滚动 解决方案 所有的答案都很好 我选择了吞咽鼠标事件 因为这是最直接的 我将 PreviewMouseDown 和 Previ
  • 加载 pandas 数据帧,其块大小由列变量确定

    如果我有一个太大而无法用 pandas 加载到内存中的 csv 文件 在本例中为 35gb 我知道可以使用 chunksize 分块处理该文件 但是我想知道是否可以根据列中的值更改块大小 我有一个 ID 列 然后每个 ID 都有几行包含信息
  • Twisted:等待子任务完成

    在我的代码中 我有两个假设的任务 一个从生成器获取 url 并使用 Twisted 的 Cooperator 批量下载它们 另一个获取下载的源并异步解析它 我试图将所有获取和解析任务封装到一个 Deferred 对象中 该对象在下载所有页面
  • 从 Django 直接输入数据以生成 D3 图

    似乎所有 D3 示例图都采用外部 csv 或 tsv 文件作为输入数据 有没有办法修改代码以从 Django 中的变量获取数据 假设 data 是 JSON 格式 如何在图表中实现它 例如http bl ocks org 3885304 o
  • 某些应用程序如何阻止/替换平视通知?

    背景 自从 Android 上出现平视通知以来 有些人喜欢它的快速处理 但有些人讨厌它显示在应用程序 尤其是游戏 顶部 为了显示抬头通知 开发人员可以使用类似的东西 final NotificationCompat Builder buil
  • 为什么没有 std::move_if 算法?

    我在互联网上看到过一些地方 他们描述了使用std copy if with std make move iterator 但如果迭代器是前向迭代器 则会导致有效但未指定的 VBU 对象分散在源容器周围 拥有一个不是更好吗std move i
  • 如何在asp.net c# 中统计网站的访问者数量

    如何统计asp net c 网站的访问者数量 我正在使用下面的代码 在 global asax 页面中 void Application Start object sender EventArgs e Code that runs on a
  • Array.Find 和 IndexOf 用于查找完全相同对象的多个元素

    我无法获取完全相同对象的多个元素的当前元素的索引 b A D B D C E D F b contains D 替代版本 b A D B D C E D F Array FindAll b Predicate String args 0 c
  • BPMS 还是只是简单的编程?

    在实现业务流程时 您更喜欢什么 从开发人员的角度来看 业务流程管理系统 BPMS 还是您最喜欢的带有所需工具和框架 例如报告工具 的 IDE 从您的角度来看 与具有您个人工具和框架的 IDE 相比 BPMS 的最大好处是什么 好的 也许我应
  • Python Pandas,应用函数

    我正在尝试使用 apply 来避免iterrows 函数中的迭代器 然而 pandas 方法的记录很少 我找不到如何使用它的示例 除了蹩脚的 apply sq rt 在文档中 没有关于如何使用参数等的示例 不管怎样 这里有一个关于我尝试做的
  • 如何将 git-replace 推送到远程仓库?

    我使用 git Replace 来替换分支 没有共同祖先 22b2b25 来替换 master 中的提交 我希望这种改变是永久性的 我对以前的历史不感兴趣 在下面的输出中 前 5 个提交来自原始 master 分支 后 2 个来自不同的分支
  • appengine-maven-plugin 配置选项,例如 jvm 标志

    从1 7 4版本开始 Google App Engine 的官方 appengine maven plugin 是由 Google 发布的 它有一个任务 appengine devserver 来启动本地开发服务器 这个插件似乎没有任何 M
  • 带有 Kubernetes 客户端插件的 Jenkins - NoSuchMethodError

    将 jenkins 插件 Kubernetes Client 升级到版本 1 30 3 也适用于 1 31 1 后 当我开始构建时 我在 jenkins 日志中收到以下异常 Timer task org csanchez jenkins p
  • 删除流星身份验证的登录令牌

    我不确定以前是否有人问过这个问题 但是loginTokens变得非常大并且没有任何清理会使我的数据库大小增加 对此我们正在做什么 其他人正在做什么来管理这个问题 我指的是默认的Meteor users services其中有一个loginT
  • 使用Cgroups限制cpu使用

    我正在尝试使用 cgroups 来限制 CPU 使用率 我正在使用本指南https access redhat com documentation en US Red Hat Enterprise Linux 6 html Resource
  • 无法从使用本地类型参数化的另一个包中实现来自另一个包的泛型类型的特征

    此测试代码 playpen use std fmt Display Formatter Error struct MyLocalType type MyResult Result
  • 在java中绘制圆的切片?

    我想通过一个实心圆来表示一个计时器 该实心圆是在计时器的过程中逐段完全绘制的 IE 如果在 4 秒计时器内每 1 秒填充一次圆圈 第一个将显示四分之一圆 然后是半圆 然后是四分之三 最后是一个完整的圆 有没有办法在java中绘制这些圆的切片
  • 在 hbase shell 上执行 ValueFilter 或 ColumnFilter

    谁能告诉我如何从 hbase shell 命令行执行限定符过滤器或 ValueFilter 它与使用任何编程语言进行编码的方式非常相似 例如 import org apache hadoop hbase filter CompareFilt
  • Hadoop mapReduce 如何在 HDFS 中仅存储值

    我用它来删除重复的行 public class DLines public static class TokenCounterMapper extends Mapper
  • 字符串池行为

    我读了这个关于Java字符串池的问题并了解字符串池的基本概念 但仍然不了解其行为 第一 如果直接赋值并且 s1 和 s2 都引用池中的同一个对象 它就可以工作 String s1 a bc String s2 ab c System out