【问题标题】:Java String Memory-Address [duplicate]Java字符串内存地址[重复]
【发布时间】:2021-02-25 06:53:57
【问题描述】:

为什么结果是假的?

String s1 = "hello";
String s2 = "world";
String s3 = "helloworld";
String s4 = s1+s2;
System.out.println(s3==s4);

据我所知,常量池中已经有一个“helloworld”。

感谢您的回答,但我想问的不是“==”和“等于”之间的区别,我只是想确保s1+s2; 生成一个新字符串,即使已经有一个具有值的字符串对象内存中的“helloworld”。

【问题讨论】:

  • 使用 .equals() 即 s3.equals(s4)
  • @BeshambherChaukhwan 我认为关键是它没有指向同一个字符串实例。并不是说字符串的值不相等。
  • s4 将创建一个新字符串,因此 == 比较失败。 == 仅适用于字符串文字,不适用于变量
  • 这能回答你的问题吗? How do I compare strings in Java?
  • 您可能期望String s4 = s1+s2; 在编译时得到优化。但事实并非如此,它仍然是运行时的语句。因此,您正在那里创建一个新的String

标签: java string memory-address


【解决方案1】:

你要明白,它们都是String类的对象实例

String s1 = "hello";
String s2 = "world";
String s3 = "helloworld";

这会创建 3 个具有不同值和不同内存的对象

String s4 = s1+s2;

现在您再次创建一个与 s1 和 s2 具有相同值的新对象,但由于它是一个新对象,因此它具有不同的内存。

 System.out.println(s3==s4);

现在,您正在尝试比较这两个对象的值,而在 String 类中,正确的方法是使用 equals() 方法,即

System.out.println(s3.equals(s4));

详情请查看:
https://www.geeksforgeeks.org/difference-equals-method-java/

【讨论】:

    【解决方案2】:

    (s3==s4) - 表示比较引用,而不是值。参考s3 与参考s4 不同。 s3s4 是两个不同的 String 实例。 使用equals 比较对象的值。如有必要,为您自己的类覆盖 equals。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-25
      • 2021-02-07
      • 1970-01-01
      • 2023-03-21
      • 2017-05-03
      • 1970-01-01
      相关资源
      最近更新 更多