2014-03-02 34 views
0
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 9318325Java字符串證明平等

由於文字池s1的和s2是指相同的對象,以便s1==s2給出真實的。並且s3是使用新的關鍵字創建的String對象。因此s2==s3給出了錯誤。 我試圖證明,S2和S3在不同的位置使用hashCode() 後來我才知道不同的對象,不需要有不同hashCodes和字符串的內容用於生產hashCode

所以我的問題是
如何證明s2和s3在不同的內存位置? (使用==除外)是否有任何內置的方法來檢查內存位置?
如果hashCode通過使用其內容計算字符串的值,那麼它是如何工作的new Foo().hashCode()

+7

'是否有任何內置的方法來檢查內存位置?這就是'=='的用途。 –

+0

查找'Object.hashCode()'的javadoc。它解釋了你所問的一切。 –

+1

你可能想看一下'System#identityHashCode(Object)' – Marco13

回答

0

它是如何工作的新的Foo()。hashCode()方法

首先你要明白,hashCode()方法由Object類實現。 而String類剛剛重寫了此方法,以提供一種機制來以不同方式計算字符串對象的hashCode。

因此,new Foo().hashCode()使用Object類提供的defualt hashCode()實現。由於Foo類沒有通過重寫它提供自己的hashCode()實現。

Object類提供的默認hashCode()(本地方法)只是使用object的內存引用來計算hashcode值。