Java S3==S4返回为false,两者都指向SCP中的同一字符串,请说明原因
我试图验证引用是否与下面的代码相同Java S3==S4返回为false,两者都指向SCP中的同一字符串,请说明原因,java,string,Java,String,我试图验证引用是否与下面的代码相同 package com.test.oracleinterviewquestions; public class StringTest { public static void main(String args[]){ StringTest obj=new StringTest(); obj.testString(); } public void testString(){ String s1=new String("y
package com.test.oracleinterviewquestions;
public class StringTest {
public static void main(String args[]){
StringTest obj=new StringTest();
obj.testString();
}
public void testString(){
String s1=new String("you cant change me!");
String s2=new String("you cant change me!");
System.out.println("s1==s2: is "+s1==s2 );
String s3="you cant change me!";
System.out.println("s1==s3: is "+s1==s3);
String s4="you cant change me!";
System.out.println("s3==s4: is "+s3==s4);
System.out.println("---------------------");
}
}
让我们将这些值称为“yccm”,是“你不能改变我!”的缩写。
在创建S1时,将在堆中创建一个条目,其中包含REREREFENCE S1,在scp中创建另一个条目,但不包含out引用
现在,当我创建S3时,它将指向SCP中为s1创建的现有值,在SCP中,当我定义S4时,它也将指向SCP中现有的YCCM值。
但是,当我打印S3==S4时,它返回false。请让我知道你的行为
a+b==c
被解析为(a+b)==c
,而不是a+(b==c)
。也就是说,在比较的周围需要括号。a+b==c
被解析为(a+b)==c
,而不是a+(b==c)
。也就是说,您需要在比较前后加上括号。请按以下方式更新您的方法:
public void testString(){
String s1=new String("you cant change me!");
String s2=new String("you cant change me!");
System.out.println("s1==s2: is "+(s1==s2) );
String s3="you cant change me!";
System.out.println("s1==s3: is "+(s1==s3));
String s4="you cant change me!";
System.out.println("s3==s4: is "+(s3==s4));
System.out.println("---------------------");
}
s1==s2: is false
s1==s3: is false
s3==s4: is true
---------------------
您将获得如下输出:
public void testString(){
String s1=new String("you cant change me!");
String s2=new String("you cant change me!");
System.out.println("s1==s2: is "+(s1==s2) );
String s3="you cant change me!";
System.out.println("s1==s3: is "+(s1==s3));
String s4="you cant change me!";
System.out.println("s3==s4: is "+(s3==s4));
System.out.println("---------------------");
}
s1==s2: is false
s1==s3: is false
s3==s4: is true
---------------------
注意:连接时使用大括号请按以下方式更新您的方法:
public void testString(){
String s1=new String("you cant change me!");
String s2=new String("you cant change me!");
System.out.println("s1==s2: is "+(s1==s2) );
String s3="you cant change me!";
System.out.println("s1==s3: is "+(s1==s3));
String s4="you cant change me!";
System.out.println("s3==s4: is "+(s3==s4));
System.out.println("---------------------");
}
s1==s2: is false
s1==s3: is false
s3==s4: is true
---------------------
您将获得如下输出:
public void testString(){
String s1=new String("you cant change me!");
String s2=new String("you cant change me!");
System.out.println("s1==s2: is "+(s1==s2) );
String s3="you cant change me!";
System.out.println("s1==s3: is "+(s1==s3));
String s4="you cant change me!";
System.out.println("s3==s4: is "+(s3==s4));
System.out.println("---------------------");
}
s1==s2: is false
s1==s3: is false
s3==s4: is true
---------------------
注意:在连接时,无论何时使用
字符串
,都要使用大括号,避免在sysout中添加任何其他硬编码的字符串
,以避免不必要的连接。或者在连接字符串
变量时使用大括号。在您的情况下,(s3==s4)
将产生所需的结果 无论何时使用字符串
,都不要在sysout中添加任何其他硬编码的字符串
,以避免不必要的连接。或者在连接字符串
变量时使用大括号。在您的情况下,(s3==s4)
将产生所需的结果 必须加以考虑
表达式“s1==s2:is”+s1==s2
将被解释为(“s1==s2:is”+s1)==s2
,这是,
“s1==s2:是你不能改变我!”==“你不能改变我!”
,正如中所指出的那样,这是错误的
编辑
有趣的是,表达式“s1==s2:is you cant change me!”==“you cant change me!”
被评估为false
,这不仅是因为这些值,而且因为它们必须被考虑进去
表达式“s1==s2:is”+s1==s2
将被解释为(“s1==s2:is”+s1)==s2
,这是,
“s1==s2:是你不能改变我!”==“你不能改变我!”
,正如中所指出的那样,这是错误的
编辑
有趣的是,表达式“s1==s2:is you cant change me!”==“you cant change me!”
被计算为false
不仅是因为值,而且是因为它们。由于新的运算符,两个字符串不相等
字符串s1=新字符串(“你不能改变我!”);
字符串s2=新字符串(“你不能改变我!”)
这将是平等的
String s1=“你不能改变我!”;
String s2=“你不能改变我!”
Asit将引用字符串池中的同一对象由于新运算符,两个字符串不相等 字符串s1=新字符串(“你不能改变我!”); 字符串s2=新字符串(“你不能改变我!”) 这将是平等的 String s1=“你不能改变我!”; String s2=“你不能改变我!”
Asit将引用字符串池中的同一个对象您的逻辑是正确的,但这里的技巧是
String s3 = "you cant change me!"
String s4 = "you cant change me!";
System.out.println("s3==s4: is "+s3==s4);
第一个附加字符串s3==s4:is
到s3,然后进行比较
简单地说
System.out.println("s3==s4: is "+s3==s4);
与
String s5 = "s3==s4: is "+s3;
System.out.println(s5==s4)
如果你只打印
System.out.println(s3==s4); result will be true
希望我是对的。你的逻辑是正确的,但关键在于
String s3 = "you cant change me!"
String s4 = "you cant change me!";
System.out.println("s3==s4: is "+s3==s4);
第一个附加字符串s3==s4:is
到s3,然后进行比较
简单地说
System.out.println("s3==s4: is "+s3==s4);
与
String s5 = "s3==s4: is "+s3;
System.out.println(s5==s4)
如果你只打印
System.out.println(s3==s4); result will be true
希望我是对的。@sn42这一次,不是重复。提示:
System.out.println(“s1==s2:is”+s1==s2)
将打印false
,而不是像预期的那样打印s1==s2:is false
。除了@manish:best之外,最好只看一次@sn42,而不是重复。提示:System.out.println(“s1==s2:is”+s1==s2)
将打印false
,而不是像预期的那样打印s1==s2:is false
。除了@manish:best是查看public void testString(){String s1=new String(“你不能更改我!”);String s2=new String(“你不能更改我!”);System.out.println(-->“+s1==s2);System.out.println(----------------”);final String s3=“你不能改变我!”;System.out.println(“第二”+(s1==s3));System.out.println(“第二”+(s1==s3));String s4=“你不能改变我!”;System.out.println(“第三”+(s3==s4));System.out.println(“第四”;}public void testString(){String s1=新字符串(“你不能改变我!”);String s2=新字符串(“你不能改变我!”);System.out.println(“-->”+s1==s2);System.out.println(“--------------”;最后一个字符串s3=“你不能改变我!”;System.out.println(“第二个”+(s1==s3));System.out.println(“-----------”;字符串s4=“你不能改变我!”;System.out.println(“第三个”+(s3==s4));System.out.println(”---------------------");}