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()
的工作方式是什么?
答案 0 :(得分:0)
它如何用于新的Foo()。hashCode()
首先,您需要了解hashCode()
类已实现Object
方法。
并且String
类刚刚重写了此方法,以提供一种以不同方式计算字符串对象的hashCode的机制。
因此,new Foo().hashCode()
使用Object
类提供的defualt hashCode()实现。由于Foo
类没有通过覆盖它来提供自己的hashCode()实现。
Object类提供的默认hashCode()
(本机方法)只是使用object的内存引用来计算hashcode值。