首页 > 解决方案 > 就字符串池而言,字符串连接如何工作?

问题描述

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因为它们都指向内存中的同一个对象?

但是,程序输出只是==. 我哪里做错了?请问谁能给我解释一下...

标签: javastringgarbage-collectionconcatenationstring-pool

解决方案


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

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

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

如果在调用之前,池中已经存在一个Stringequal ,则必须将其分配回(ie ) 以便引用存储在池中的实例。"2cfalse"a.intern()aa = 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

推荐阅读