2013-06-03 4 views
13

この単純なJavaコードはlongのセットに2を追加し、その後2が集合のメンバーであるかどうかを出力します。longのHashSetを使用するJavaコードが機能しません。

import java.util.*; 

class A { 
    public static void main(String[] args) { 
     HashSet<Long> s = new HashSet<Long>(); 
     long x = 2; 
     s.add(x); 
     System.out.println(s.contains(2)); 
    } 
} 

2がセットであるが、その代わりに、それはfalseを出力しますので、それはtrueを印刷する必要があります。どうして?

$ javac A.java && java A 
false 
+0

'long'プリミティブの代わりに' Long'オブジェクトを使用してみてください。 –

+0

@LuiggiMendoza - 「ロング」プリミティブはオートボックスのためうまくいっていました。問題は、それが 'int'プリミティブであったことです。 –

+0

申し訳ありませんが、あなたは正しいです。リテラル2は 'int 'として扱われ、'整数'にオートボックスされました。 –

答えて

21

あなたのセットは、Longのインスタンスが含まれている、あなたはIntegerObjectが必要なときにintが箱詰めされているにタイプ)を探していました。

テスト

System.out.println(s.contains(Long.valueOf(2))); 

または

System.out.println(s.contains(2L)); 
+11

2lは21のように見えるかもしれないので、私はむしろ "2l"( "L"大文字)の代わりに "2l"とタイプします。 –

+0

@MarlonBernardes編集: '2l'が' 2L'に変更されました。 –

1

あなたのHashSetの店がロングの対象と/ Integer型をint型ではない..あなたは、オブジェクトが必要とされている間、INTが箱詰めされた整数を取得しようとしています。

+0

かなり改善されました。私のdownvoteが削除されました。 –

6

s.contains(2)と答えると、デフォルトでintである2が検索され、Integerにボックス化されます。しかし、あなたが保存したオブジェクトはLongでした。したがって、それは返すfalse

代わりにs.contains(Long.valueOf(2))を使用してみてください。

+0

実際には、格納されているオブジェクトは 'long'ではなく' long'でした。しかし、問題の本質を正しいものにするために+1。 –

+0

ちょうどタイプミス。通知をありがとう。 :) –

関連する問題