【问题标题】:java String to prove equality证明相等的java字符串
【发布时间】:2014-04-03 12:42:33
【问题描述】:
class Foo{}
class Boo{}
class MyString
{
 public static void main (String[] args) throws java.lang.Exception
 {
     String s1="Hello";
     String s2="Hello";
     String s3=new String("Hello");
     System.out.println(s1.hashCode()+" "+(s1==s2));
     System.out.println(s2.hashCode());
     System.out.println(s3.hashCode()+" "+(s2==s3));
     System.out.println(new Boo().hashCode());
     System.out.println(new Foo().hashCode());
 }
}

上述代码的输出是
69609650 true 69609650 69609650 false 17351095 9318325

因为字面量池 s1 和 s2 指的是同一个对象,所以s1==s2 给出了真值。而 s3 是使用 new 关键字创建的 String 对象。所以s2==s3 给出了 false。 我试图通过使用hashCode()来证明 s2 和 s3 在不同的位置 然后我才知道不同的对象不需要有不同的hashCodes 并且字符串内容用于产生hashCode

所以我的问题是
如何证明 s2 和 s3 在不同的内存位置? (使用 == 除外)是否有任何内置方法来检查内存位置?
如果 hashCode 值是通过使用其内容为字符串计算的,那么它是如何为 new Foo().hashCode() 工作的?

【问题讨论】:

  • Is there any inbuilt method to check the memory location 这就是== 的用途。
  • 查找Object.hashCode()的javadoc。它解释了你所问的一切。
  • 你可能也想看看System#identityHashCode(Object)

标签: java string hashcode


【解决方案1】:

new Foo().hashCode() 的工作原理

首先你需要了解hashCode()方法是由Object类实现的。 而String 类刚刚重写了这个方法,提供了一种机制来不同地计算字符串对象的 hashCode。

所以,new Foo().hashCode() 使用 Object 类提供的默认 hashCode() 实现。由于Foo 类没有通过覆盖它来提供自己的 hashCode() 实现。

Object 类提供的默认hashCode()(本机方法)只是简单地使用object 的内存引用来计算hashcode 值。

【讨论】:

    猜你喜欢
    • 2010-12-23
    • 1970-01-01
    • 1970-01-01
    • 2021-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多