• ベストアンサー

HashMapがおかしい

HashMap で以下の様にコーディングしました。 当然 map の中には19個のオブジェクトが存在するはずですが、何故か15個しかありません。どなたか原因を御存知でしょうか? HashMap map = new HashMap(); map.put("key1", new Integer(1)); . (2->8)省略 . map.put("key9", new Integer(9)); map.put("key10", new String("10")); . (11->18)省略 . map.put("key19", new String("19")); 以下エクリプスのデバッガで取得したもの。 ECLIPSE 2.1.3 / JDK 1.4.2.03 map= HashMap (id=21) entrySet= HashMap$EntrySet (id=50) keySet= null loadFactor= 0.75 modCount= 19 size= 19 table= HashMap$Entry[32] (id=26) [0]= null [1]= HashMap$Entry (id=28) [2]= HashMap$Entry (id=31) [3]= null [4]= null [5]= null [6]= null [7]= null [8]= null [9]= HashMap$Entry (id=32) [10]= HashMap$Entry (id=33) [11]= null [12]= null [13]= HashMap$Entry (id=34) [14]= HashMap$Entry (id=35) [15]= HashMap$Entry (id=36) [16]= HashMap$Entry (id=37) [17]= null [18]= null [19]= null [20]= HashMap$Entry (id=38) [21]= null [22]= null [23]= HashMap$Entry (id=39) [24]= HashMap$Entry (id=40) [25]= null [26]= HashMap$Entry (id=41) [27]= HashMap$Entry (id=42) [28]= null [29]= HashMap$Entry (id=43) [30]= HashMap$Entry (id=44) [31]= null threshold= 24 values= null

質問者が選んだベストアンサー

  • ベストアンサー
  • liar_adan
  • ベストアンサー率48% (730/1515)
回答No.1

詳しく調べてないので、想像なんですが… HashMapというコンテナは、 ハッシュという手法で、データを保管します。 これはどういうことかというと、 (詳しくはアルゴリズムの本を見てほしいのですが) データを、いくつかに分類して入れるのです。 たとえば「SpiralGalaxyさんは12文字だから、番号12のところに保存」 というふうに。(実際には番号付けはもっと複雑ですが) しかし、このようにすると、 同じ番号のところに複数のデータが入ることがあります。 そういう場合、いくつかのデータを列にして保存します。 図にするとこんな感じ。 ◇-●-●-● ◇- ◇-●-● ◇- ... ◇-● ◇-●-●-● ◇が番号のところで、●がデータです。 特定の番号には、データは無かったり、複数あったりします。 この場合の$Entryというのも、こういうものだと思います。 複数データを持っている番号があるので、 データの数とその数が合わないのでしょう。 実際に、HashMapからデータを取り出す作業をしてみてください。 おそらく入れた数だけ取り出せると思います。 (そうでなかった場合は補足に書いてください)

参考URL:
http://www.amazon.co.jp/exec/obidos/ASIN/4797304952/
SpiralGalaxy
質問者

お礼

Oracleに接続してデータを選択し選択レコードの項目タイプに応じて取り出し HashMap に結果として保存するクラスを書いていたんですが、ある項目が NULL 値となるため、質問文のようなソースを書いて確認しました。その時点で個数が合わないのでおかしいと思い質問した次第です。 実際上記ソースでも、ちゃんと取り出せました。確認もせず質問してしまい冷や汗ものです(^^; NULL値となるのは SQL文他別の原因でした。 デバッガでさらに確認したところ 1個しか入らないと「思い込んで」いた配列の一つの要素に以下の様に3つ入っていました。 ありがとうございました。参考になりました。 [1]= HashMap$Entry (id=28)   hash= -820427199   key= "key18" <------------------     count= 5     hash= 101943494     offset= 0     value= char[5] (id=54)   next= HashMap$Entry (id=52)     hash= 1493777409     key= "key4" <------------------     next= HashMap$Entry (id=56)       hash= -819273471       key= "key13" <------------------       next= null       value= "13"       value= Integer (id=57)   value= "18"

その他の回答 (2)

  • lawson
  • ベストアンサー率44% (29/65)
回答No.3

エクリプスを使っているのであれば、 デバッグモードで実行して、 ブレイクポイントで止めた後、 表示ペインからHashMapの中身を コンソールに出力するコードを書いて実行することで確認できそうです。 釈迦に説法かもしれなかったですが。 以上

SpiralGalaxy
質問者

お礼

御回答ありがとうございます。 >釈迦に説法かもしれなかったですが。 恐縮します。(^^; この辺で締め切りとさせていただきます。皆様ありがとうございました。勉強になりました。

  • itto_
  • ベストアンサー率33% (1/3)
回答No.2

> size= 19 とあるので19個入っていると思いますよ。 eclipseのデバッガで見ているのなら、 toStringした結果の方を見てみると全て表示されていると思いますが。 HashMap(正確にはAbstractMap)のtoString実装は内容物全てを表示するような作りになっていますので。

SpiralGalaxy
質問者

お礼

御回答ありがとうございます。 確かに入ってました。 table[0]~table[31] に一つづつ入っているものと思い込み、十分確認しませんでした(^^;

関連するQ&A