java - 就字符串池而言,字符串连接如何工作?
问题描述
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 pool
由2cfalse
文字组成。因此,在第 17 行,不应该a == "2cfalse"
评估到,true
因为它们都指向内存中的同一个对象?
但是,程序输出只是==
. 我哪里做错了?请问谁能给我解释一下...
解决方案
"2cfalse"
仅在第 17 行添加到字符串池中,当您a
与文字比较时"2cfalse"
。
第 17 行之前引用的实例a
未添加到字符串池中,因此它与"2cfalse"
文字的实例不同。
a.intern ()
如果您在第 17 行之前添加一个调用,则引用的实例a
将被添加到池中(因为它尚未在池中),并且第 17 行中的条件将评估为真。
如果在调用之前,池中已经存在一个String
equal ,则必须将其分配回(ie ) 以便引用存储在池中的实例。"2cfalse"
a.intern()
a
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");
输出:
==
equals
推荐阅读
- r - 如何将 Unicode 代码点读入 R 数据帧
- sql-server - Linux 容器上的 Microsoft SQL Server
- c - 标记字符串时的内存泄漏
- python - 从类似文件的目录中提取特定行并将它们写入输出文件
- python - Pandas Dataframe:如何检查列是否包含连续整数,如果没有,如何添加和填充 0
- c++ - 在 CMake 中链接 boost 文件系统的问题
- next.js - 为静态站点部署大型工件
- python - 通过 PIL/Python 将元素添加到 OLED 显示器而不擦除其余部分
- ruby-on-rails - Rails:thread_mattr_accessor 在开发中随机变为“nil”
- swift - mlmodel NNClassifier 的输出形状是 Multiarray,VNClassificationObservation 不起作用?