【问题标题】:String declared through Constructor and "=" sign, Difference? [duplicate]通过构造函数和“=”符号声明的字符串,区别? [复制]
【发布时间】:2013-11-22 10:37:17
【问题描述】:

为什么比较两个具有相同内容的字符串(s1==s2)返回true但是(s3==s4)如果我们用"="初始化s1和s2返回false但是s3 和 s4 与 String 构造函数? #JAVA 喜欢

String s1="s";
String s2="s";

String s3= new String("s");
String s4= new String("s");

【问题讨论】:

  • 这已经在 Stack Overflow(和其他地方)上被问及回答了 数百次 次。
  • 删除[visual-studio],因为这似乎不相关。

标签: java constructor


【解决方案1】:

String s1 是参考而不是对象。这意味着当您比较 s1 == s2 时,您是在比较引用,而不是这些引用指向的内容。

当您有两个相同的字符串字面量时,它们会被缓存并使用相同的对象。这样做是为了节省空间。这意味着具有相同内容的两个字符串字面量指向同一个对象。

当您创建两个新对象时,它们具有不同的引用,因此它们不相等,即使 s3.equals(s4) 为真。

我建议您查看String.intern() 方法,该方法详细说明了字符串是如何被池化的。

所以这些都是真的。

s1 == s2;
s1 == s3.intern();
s3.intern() == s4.intern();
s1 == s1.intern();
s1 == s1.intern().intern().intern();
s3 != s3.intern();

事后看来,我认为 Java 应该有一个用于比较引用的 === 和一个用于比较内容的 ==,即调用 equals,因为对于不了解引用和对象之间区别的开发人员来说,这是一个常见的混淆来源在 Java 中。

【讨论】:

  • (1) 我认为intern() 需要提及。 (2) 您对=== 的提议将需要新的运算符(不是方法)重载语法。
  • @PM77-1 现在更改为时已晚,因为== 现在已在相当多的代码中使用。 Java 初学者通常期望 == 比较引用的对象的内容。
猜你喜欢
  • 2013-02-03
  • 2014-11-21
  • 2014-05-18
  • 2020-01-28
  • 2015-03-03
  • 1970-01-01
  • 1970-01-01
  • 2013-04-07
  • 1970-01-01
相关资源
最近更新 更多