2016-03-24 22 views
0

私はLinkedHashMapに要素を追加しようとしています。 LHMの各エントリは、キーとページと呼ばれるクラスです。Longをパラメータとして送信するには、Longのインスタンスを作成する必要がありますか?

私はこのコードを書いた:

public void addPage(Page<byte[]> addPage) 
{ 
    if(numOfPages < initialCapacity) // Checks that there is room 
    { 
     pages.put(new java.lang.Long(addPage.hashCode()), addPage); 
     numOfPages++; 
    } 
} 

動作するようにし、エラーを与えるものではありませんようです。

しかし、私はなぜ理解していない:

public void addPage(Page<byte[]> addPage) 
{ 
    if(numOfPages < initialCapacity) // Checks that there is room 
    { 
     pages.put(java.lang.Long(addPage.hashCode()), addPage); 
     numOfPages++; 
    } 
} 

は動作しません。 hashCodeからLongに返されたintをキャストする代わりに、実際にLongの新しいインスタンスを作成する必要がありますか?非常に無駄に思える。

編集 - クラスのページ:

public class Page<T> 
{ 
    private T content; 
    private java.lang.Long pageId; 

    public Page(java.lang.Long pageId, T content) 
    { 
     this.pageId = pageId; 
     this.content = content; 
    } 

    public java.lang.Long getPageId() 
    { 
     return pageId; 
    } 

    public void setPageId(java.lang.Long pageId) 
    { 
     this.pageId = pageId; 
    } 

    public T getContent() 
    { 
     return content; 
    } 

    public void setContent(T content) 
    { 
     this.content = content; 
    } 

    public boolean equals(Page<T> page) 
    { 
     if(this.pageId == page.getPageId()) 
      return true; 
     return false; 
    } 


} 
+0

'pages.put(java.lang.Long(addPage.hashCode())、addPage);'は構文的に間違っています。ここに投稿を作成したとき、または実際にこの行で試してみたときに、これは単なるコピー&ペーストエラーですか? – dunni

+3

hashCode()は通常、int型の値であり、ユニークであることが保証されていないため、重複が発生します。マップエントリのコード、または使用している値のサイズを比較するのは無駄ではありません。違いはほとんどありません。より多くの問題は、あなたのhashCode()が約60Kのエントリで繰り返す可能性が高いことです。これは、無駄なメモリを心配するよりもずっと前です。 –

+0

私は参照してください。それは確かに大きな問題です。それから、より良い方法でハッシュするのですか? –

答えて

1

ここでの「キャスティング」は、オブジェクトの作成をあなたから隠すことになるので、同様に効率的です。

私はこれを書く傾向があります(long) addPage.hashCode()を書き込むことになります。オートボクシングにコンパイルされます。ほとんどの場合、新しいLongオブジェクトが割り当てられます。

また、Long.valueOf(addPage.hashCode())と書くと、明示的にボクシングを行いますが、小さなhashCode値をキャッシュします。

1
java.lang.Long(addPage.hashCode()) 

は有効な構文ではありません。 mapのキータイプがLongある場合は、intが暗黙的にLongに変換されることはありませんので、

pages.put((long) addPage.hashCode(), addPage); 

を行う必要があります。

それはそれのように見えない場合でも、このコードは、Longの新しいインスタンスを作成しないので、暗黙的にボックスhashCode-128127の間でなければ、新たなLongが(これらLong sはキャッシュされるようにlong )。

非常に無駄です。

はい、そうです。これは、現在、プリミティブをジェネリック型として使用できないためです。私はこれがJava 10で変わると信じています。

関連する問題