+字符串类中的运算符

时间:2013-06-25 06:12:28

标签: java string

这是关于'+'运算符返回的结果的差异。结果因String literal和String Object而异。

String str="ab";
String str1="c";
String str2 = "ab"+"c"; // Line 3
String str3 = "abc";
String str4 = str+str1;  // Line 5

System.out.println(str2==str3);  // True
System.out.println(str2==str4);  // False

结果我们可以推断出,对于字面值,返回字符串池中已有的对象,如第3行的情况,并返回字符串对象,返回新对象,如第5行所示。为什么会这样?

4 个答案:

答案 0 :(得分:9)

+的{​​{1}}操作符的处理方式不同,具体取决于表达式的计算时间。

当表达式可以在编译时计算时(如第3行所示),编译器将创建仅包含连接的String。因此,在第3行中,只会创建String“abc”,并且此String将被放入.class文件中。因此,Stringstr3将完全相同并将被实习。

当使用只能在运行时评估的连接时(如第5行),结果str4是新的String,必须与String进行比较,因为它是新的对象

答案 1 :(得分:3)

String str2 = "ab"+"c";这是在编译时评估的。它进入常量池,因为它已经为编译器所知。

另一个可以在运行时进行评估,它不会成为常量池的一部分。

这是一个很好的机会,可以注意到与使用String#concat的情况的区别,如果你这样做

String str2 = "ab".concat("c");

由于String是不可变的,因此从concat返回一个新的String,导致str无法实现。因此,在这种情况下,str2 == str3将为false

答案 2 :(得分:0)

我已经将问题标记为重复,但发现类似的答案没有发布,所以考虑给它一个去。其他答案已经指出为什么答案是错误的。 但这里有一些东西可以告诉你什么时候会成真。

如果您在第二个字符串上调用intern(),则结果将为true

  

为什么会这样?

为了节省内存(并加快测试是否相等),Java支持字符串的“实习”。在String上调用intern()方法时,将对实习字符串表执行查找。如果表中已存在具有相同内容的String对象,则返回对表中String的引用。否则,将String添加到表中,并返回对它的引用。

String str4 = (str+str1).intern();

明确调用intern()会返回对 interned 字符串的引用。

答案 3 :(得分:0)

当你创建str,str1,str2和str3时,它将指向相同的字符串池。这里它不会创建字符串对象。 但是当你创建String str4 = str + str1.So str4是在运行时计算的。所以它不会是同一个字符串池的一部分,其中所有其他字符串都是指向的。所以str4返回false ..