字符串连接在字符串池方面是如何工作的?

如何解决字符串连接在字符串池方面是如何工作的?

13: String a = "";
14: a += 2;
15: a += 'c';
16: a += false; 
17: if ( a == "2cfalse") System.out.println("==");
18: if ( a.equals("2cfalse")) System.out.println("equals");

输出equals

如果我错了请纠正我...

在第 13 行,创建了一个新的 String 对象并将引用存储在 a。 (a = "")

在第 14 行,创建了一个新的 String 对象并将引用存储在 a 中。之前的 String 对象成为垃圾回收 (GC) 的合格对象。 (a = "2c")

在第 15 行,创建了一个新的 String 对象并将引用存储在 a 中。之前的 String 对象成为垃圾回收 (GC) 的合格对象。 (a = "2cfalse").

现在,String pool2cfalse 字面量组成。因此,在第 17 行,不应该将 a == "2cfalse" 计算为 true,因为它们都指向内存中的同一个对象?

然而,程序输出只是==。我哪里做错了?请有人给我解释一下...

解决方法

"2cfalse" 仅在第 17 行添加到字符串池中,当您将 a 与文字 "2cfalse" 进行比较时。

第 17 行之前由 a 引用的实例未添加到字符串池中,因此它与 "2cfalse" 字面量不是同一个实例。

如果在第 17 行之前添加对 a.intern () 的调用,a 引用的实例将被添加到池中(因为它尚未在池中),并且条件第 17 行将评估为 true。

如果在调用 String 之前池中已经存在等于 "2cfalse"a.intern(),您必须将其分配回 a(即 {{1 }}) 以便 a = a.intern(); 引用存储在池中的实例。

a

输出:

String a = "";
a += 2;
a += 'c';
a += false; 
a.intern (); // or a = a.intern(); in case the pool already contains "2cfalse"
if ( a == "2cfalse") System.out.println("==");
if ( a.equals("2cfalse")) System.out.println("equals");

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?