字符串+;int与同一字符串比较+;java中的int?
为什么我在下面的语句中得到字符串+;int与同一字符串比较+;java中的int?,java,Java,为什么我在下面的语句中得到false int x = 10; System.out.println("X="+x=="X="+x); //false 如果我是对的,那么经过评估后,它会像下面的陈述一样 System.out.println("X=10"=="X=10"); //true 为什么我在这方面得到了true final int y = 10; System.out.println("Y
false
int x = 10;
System.out.println("X="+x=="X="+x); //false
如果我是对的,那么经过评估后,它会像下面的陈述一样
System.out.println("X=10"=="X=10"); //true
为什么我在这方面得到了true
final int y = 10;
System.out.println("Y="+y=="Y="+y);
让我们比较一下所有的方法
“X=“+X==”X=“+X
为false,因为这两个不同的实例和=
返回false(因为=
比较对象或字符串的地址)Y
被声明为final,并且字符串类型的编译时常量表达式总是“interned”“Y=“+Y
应使用
equals
方法比较字符串<代码>=比较身份
“X=“+X==”X=“+X
创建两个单独的字符串实例,虽然内容相等,但它们的标识不同
“X=10”==“X=10”
是真的
,因为字符串插入。编译器遇到两个内容相同的字符串文本,并确定这两个实例指向同一个字符串对象,因此它们具有相同的标识
“Y=“+Y==”Y=“+Y
是true
,因为Y
是一个常量表达式,编译器决定可以在编译时串联字符串和int,从而生成两个相等的字符串。实际上,这就像编写了“Y=10”==“Y=10”
。一个连接的字符串正在编译中,如果可能的话,可以组合成一个单数字符串,因此“X=“+”10”
使“X=10”
,如果int
是final
,这同样有效,但如果它是一个正态变量,那么这个过程当然不会发生
然后==被简化为比较中临时对象之间的对象比较工具,因此失败
此外,请不要编写这样的代码,因为您可以看到它会很快导致问题,请在适当的情况下使用大括号和.equals()函数。要详细说明死池,请回答最有可能在后台发生的事情是代码优化 只有当它是同一个对象时,Java才会将
strings1==strings2
计算为true。
因为y
被声明为final
,编译器可以用该值替换y
的所有实例
它是给定的
所以
变成
System.out.println("Y="+10=="Y="+10);
变成
String tmp = "Y="+10;
System.out.println(tmp==tmp);
System.out.println(true);
变成
String tmp = "Y="+10;
System.out.println(tmp==tmp);
System.out.println(true);
但是,如果您不将变量声明为final,那么编译器将无法执行此操作,因为它无法预测在“y=“+y
和“y=“+y
之间y将发生什么
也在做类似的事情
final int y = x;
System.out.println("Y="+y=="Y="+y);
将导致(我的)编译器跳过此优化,然后其计算结果为false
TL;博士
它的计算结果为
true
如果它是同一个对象,在某些情况下,编译器将通过预计算优化比较。因为这不是比较字符串的方式除了所有答案之外,也许这有助于您理解:什么是新字符串(“a”)==新字符串(“a”)
vsnew String(“a”).equals(new String(“a”))
?Naman我知道如何比较String,我只是问一下输出。你的意思是运行时两个不同的对象存储在SCP外部并指向不同的对象,这就是为什么我得到false的原因。我不知道你所说的“外部到SCP”是什么意思。但是intx=10
不是一个常量表达式,因此编译器假定x
可以在运行时更改。这就是为什么在编译时无法确定“X=“+X
的值,并且编译器无法插入这两个字符串。我不确定“X”和另一个“X”是否是不同的对象引用。当值相同时,文字字符串实例化从相同的字符串池中获取。