2013-10-22 86 views
0

Java中的String s1="Hello"String s1=new String("Hello")之间的区别是什么?String s1 =“Hello”和String s1 = new String(“Hello”)之间的区别是什么?

如果String s1="Hello"String s2=new String("Hello"),将s1 == s2

+0

那么'=='运算符匹配引用。由于在这个例子中有2个元素s1和s2,因为他们有不同的引用/地址,所以输出是s1 == s2将是错误的。但是如果使用'equals()',则输出将为真,因为这些值将进行比较,并且根据问题的值是相同的。 – BIJAY

+0

如果有两个字符串,即s1和s2,如果String s1 =“Hello”; String s2 =“Hello”;这里s1 == s2给出了一个真正的输出。 – BIJAY

回答

0

如果String s1 =“Hello”并且String s2 = new String(“Hello”),那么s1 == s2?

答案是:

因为,S1和S2是不同的对象,并string是不可变的。所以,s1 == s2将是falses1.equals(s2)将是true

1

这里是距离Joshua Bloch的Effective Java的关于 “)新的String(” 使用的报价:

由于什么不能做一个极端的例子,此声明:

的String = new String(“stringette”); // 不要这样做!

该语句每次执行时都会创建一个新的String实例,并且这些对象创建都不是必需的。字符串构造函数(“stringette”)的参数本身就是一个字符串实例,在功能上与构造函数创建的所有对象完全相同 。如果这个 用法出现在循环或频繁调用的方法中,则可以毫无用处地创建数百万个字符串实例。改进的版本是 简单地执行以下操作:

的String = “stringette”;

2
String myStr = "hello"; 
String myStr1 = "hello"; 

这些时通过双等于两者相比将评估为true。然而,它们并不相等,而是都指向内存中相同的“文字串”。这从来没有如何比较一个字符串的内容,所以不要让这个骗过你。

String myStr = new String("hello"); 
String myStr1 = new String("hello"); 

将评估为false,因为它们都引用具有不同内存地址的不同对象。

始终始终始终use myStr.equals(myStr1)比较字符串的内容是否相等时。 还记得==只比较它们是否引用内存中的同一个对象。

+0

+1相关示例.. –

+0

如果String s3 =“Hello”,则s3 == s1? –

+0

好吧,它会出现,如果他们在那种情况下,但它不是比较他们的方式,我们想比较他们,这是内容。我们希望看看s1和s3中的每个字符是否都是同一个,而不是两个引用变量是否指向内存中的相同位置。不要习惯于以这种方式比较对象(字符串是一个对象),因为你会得到错误的结果,后来它会混淆你。对象是不透明的(封装和数据隐藏),因此定义对象内容的内容会有所不同。现在只需使用.equals() – Whoppa

3

编码此:

String s1 = "Hello"; 

导致JVM到intern字符串文字:同一字符串文字的每一个的使用将是相同的对象的引用。

编码这样的:

String s2 = new String("Hello") 

总是会创建一个新的String对象。

那么,会s1 == s2?不,从不。

+0

如果字符串s3 =“Hello”,将s3 == s1? –

+0

@ CMQ_14是的。究竟。 – Bohemian

0

你的问题的回答是否定的,请在下面找到了原因: -

  1. 字符串S1 = “你好”。在这里,hello字符串将被存储在一个位置,并且s1将保持对它的引用。
  2. String s2 = new String(“Hello”)将创建一个新对象,将引用该对象并将存储在不同的位置。

条件s1 == s2将比较内存中现在2个不同位置的内存位置。所以它会变成错误的。

相关问题