【问题标题】:how to check reference equality in an object which implements content equality?如何检查实现内容相等的对象中的引用相等?
【发布时间】:2012-03-16 05:38:45
【问题描述】:

...换句话说: 假设我有 2 个这样声明的字符串:

String one = new String("yay!");
String two = new String("yay!");

这两个字符串是两个不同的对象,但是如果我运行

if(one.equals(two))
   System.out.println("equals() returns true.");

我得到“equals() 返回 true”。 这是因为 String 类重写了 equals() 方法来实现内容级别的相等性。 但是,我需要访问引用级别的相等性(例如在 Object 中实现的相等性)以区分对象一和对象二。 我该怎么做?

我试过了:

one.getClass().getSuperclass().equals();

尝试调用 String 的 Object equals() 方法,但没有成功。

有什么建议吗?

【问题讨论】:

  • 我不想跑题,但我想添加这些信息,我认为这对那些在这个问题中绊倒的人很有用。我的问题是能够处理实现内容平等作为唯一元素的对象。当然,我的问题的另一面是在 HashMap 中使用它们作为关键元素。有一个 Map 实现来服务于这个目的,IdentityHashMap

标签: java object methods


【解决方案1】:
if (one == two)
    System.out.println("one and two are the same object");

【讨论】:

    【解决方案2】:

    您唯一需要的是“==”等式运算符。

    【讨论】:

      【解决方案3】:

      如果你想检查参考,只需执行:

      one == two
      

      但要小心字符串。有一个东西叫String constant pool,所以它们可能指的是同一个对象。

      【讨论】:

      • 你是对的,但是“常量池”是类文件中的数据结构,另外一个是字符串实习池,你指的技术叫做字符串实习。
      【解决方案4】:

      使用简单的== 比较。但是,为了避免 String 实习,您必须使用 char 数组创建字符串,例如:String me = new String(new char[] { 'm', 'e' });,而不是使用字符串文字 "me",例如 String me = new String("me");

      【讨论】:

      • 很高兴知道,谢谢。不幸的是,我无法控制字符串的创建,因为它们是由 JAX2B 编组器以 XML 输入形式设置的。也许可以配置为避免String interning机制,但我不这么认为。
      【解决方案5】:

      String在java中使用String Literal Pool,这意味着:“当你尝试构造一个字符串时,首先在Literal Pool中搜索传统相同的字符串,如果存在则返回它,如果不存在创建它”,所以你不能通过equals方法比较String实例的引用,你必须使用==操作符如下:

      String one = new String("yay!");
      String two = new String("yay!");
      if(one.equals(two))
         System.out.println("equals() returns true.");
      if(one == two)
         System.out.println(" == operator returns true.");
      

      结果是:

      equals() returns true.
      

      查看以下链接了解更多信息:

      1. http://blog.enrii.com/2006/03/15/java-string-equality-common-mistake/
      2. Java String.equals versus ==

      【讨论】:

      • 此答案未能定义引用相等性。然后它提到了字符串的复杂性,但是“当你尝试构造一个字符串时,..”被示例输出证明是错误的;如果它是正确的“你必须使用 == 运算符”将是不正确的。请参阅@tom 或 Wojtek 的答案。
      猜你喜欢
      • 2012-05-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-07
      • 1970-01-01
      • 1970-01-01
      • 2022-08-22
      相关资源
      最近更新 更多