Java 使用+;操作人员
为什么输出为Java 使用+;操作人员,java,Java,为什么输出为false? 在这个程序中,ab是在stringliteral中创建的,然后创建abc但是为什么ab和abc在字符串常量池中不引用相同的内存,因为在创建abc之前,它会在字符串常量池中搜索字符串meowdeal 我会解释发生了什么: public class Strings { public static void main(String ads[]) { String a = "meow";
false
?
在这个程序中,
ab
是在string
literal中创建的,然后创建abc
但是为什么ab
和abc
在字符串常量池中不引用相同的内存,因为在创建abc
之前,它会在字符串常量池中搜索字符串meowdeal 我会解释发生了什么:
public class Strings
{
public static void main(String ads[])
{
String a = "meow";
String ab = a + "deal";
String abc= "meowdeal";
System.out.println (ab==abc);
}
}
Java只在编译时存储它知道的字符串;字符串常量和常量字符串表达式。a是一个局部变量,因此+“deal”是一个直到运行时才计算的字符串表达式(即使您查看它时可以看到它应该是常量)。Java编译器不知道它是一个常量表达式,也不把它放在池中。它在运行时执行字符串连接,从而产生一个与池中任何对象不同的对象。您的问题意味着您希望Java检查每个字符串连接的结果,以查看字符串常量池中是否有匹配的字符串,但这将是非常低效的。字符串concat总是新对象,除非所有字符串都是编译时常量 如果您真的想使用
==
比较字符串,您需要像这样插入构造的字符串:
public class Strings {
public static void main(String ads[]) {
String a = "meow"; // new string created
String ab = a + "deal"; // again a new string created. Reference different.
String abc = "meowdeal"; // a whole new string.
System.out.println(ab == abc);// even though the values are same, reference is different. For value equality, use .equals()
}
}
然而,这将是一个非常特殊的用例,非常罕见
请注意,这与连接两个常量的情况不同;给定
“ab”+“cd”
,编译器需要将表达式解析为“abcd”
,并汇集结果。如果一个或两个值都是编译时常量,static final…
,则情况也是如此 这是因为它检查的是对象的相等性,而不是内容。尝试ab.equals(abc),它将显示true.System.out.println(“test”==“te”+“st”)------这是真的,为什么。我从@devnull提供的链接中获得了这段代码作为对这个问题的注释。常量检查器不能“看穿”任何类型的变量。@shin--“test”==“te”+“st”,所有字符串都是常量,因此编译器将“te”+“st”简化为“test”;常量池中的对象与以这种方式编写的“test”相同。@antlersoft好的,谢谢您的回复。那么java不会将包含任何变量或方法的字符串表达式汇集在一起?
ab=(a+"deal").intern();