Java 字符串s1=";之间的区别是什么;“你好”;字符串s1=新字符串(“Hello”)?

Java 字符串s1=";之间的区别是什么;“你好”;字符串s1=新字符串(“Hello”)?,java,Java,Java中的strings1=“Hello”和strings1=新字符串(“Hello”)之间有什么区别 如果String s1=“Hello”和String s2=新字符串(“Hello”),则s1==s2 如果字符串s1=“Hello”和字符串s2=新字符串(“Hello”),s1==s2吗 答案是:不 因为s1和s2是不同的对象,string是不可变的。因此,s1==s2将是false和s1。equals(s2)将是true这里引用了Joshua Bloch的有效Java中关于“new S

Java中的
strings1=“Hello”
strings1=新字符串(“Hello”)
之间有什么区别

如果
String s1=“Hello”
String s2=新字符串(“Hello”)
,则
s1==s2

如果字符串s1=“Hello”和字符串s2=新字符串(“Hello”),s1==s2吗

答案是:


因为s1和s2是不同的对象,
string
是不可变的。因此,
s1==s2
将是
false
s1。equals(s2)
将是
true

这里引用了Joshua Bloch的有效Java中关于“new String()”的用法:

作为不该做的极端例子,请考虑以下陈述:

字符串s=新字符串(“stringette”);//不要这样做

该语句在每次执行时都会创建一个新的字符串实例,并且 这些物体的创造是必要的。字符串的参数 构造函数(“stringette”)本身在功能上是一个字符串实例 与构造函数创建的所有对象相同。如果这 使用发生在循环或频繁调用的方法中,数以百万计 可以不必要地创建字符串实例。改进的版本是 简单地说:

String s=“stringette”

当通过双相等进行比较时,这两个值都将计算为真。但是,它们并不相等,而是都指向内存中相同的“文字字符串”。这永远不是比较字符串内容的方式,所以不要让它愚弄你

String myStr = new String("hello");
String myStr1 = new String("hello");
将计算为false,因为它们都引用具有不同内存地址的不同对象

在比较字符串内容是否相等时,始终
使用myStr.equals(myStr1)
。 请记住,
=
仅比较它们是否引用内存中的同一对象。

编码:

String s1 = "Hello";
String s2 = new String("Hello")
使JVM使用字符串文字:相同字符串文字的每次使用都是对相同对象的引用

对此进行编码:

String s1 = "Hello";
String s2 = new String("Hello")
将始终创建新的字符串对象

那么,将
s1==s2


不,永远不会。

您的问题的答案是“不”,请找出以下原因:-

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

  • 条件s1==s2将比较内存中现在是两个不同位置的内存位置。因此,它将是错误的。

    +1相关示例..如果字符串s3=“Hello”,s3==s1吗?在该场景中,它将看起来好像是这样的,但它并没有以我们想要的方式比较它们,即按内容进行比较。我们想看看s1和s3中的每个字符是否相同,而不是两个引用变量是否指向内存中的相同位置。不要养成这样比较对象的习惯(字符串就是对象),因为你会得到错误的结果,以后会把你弄糊涂。对象是不透明的(封装和数据隐藏),因此对象内容的定义各不相同。现在仍然使用.equals()谢谢,它非常有用。如果字符串s3=“Hello”,s3==s1吗?@CMQ_14是的。没错,“==”运算符与引用匹配。因为在本例中有两个元素s1和s2,并且它们具有不同的引用/地址,所以is s1==s2的输出将为false。但如果使用“equals()”,则输出将为真,因为将比较值,并且根据问题,值是相同的;String s2=“你好”;这里s1==s2给出了一个真实的输出。