dポイントプレゼントキャンペーン実施中!

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

A 回答 (3件)

詳しく調べてないので、想像なんですが…



HashMapというコンテナは、
ハッシュという手法で、データを保管します。
これはどういうことかというと、
(詳しくはアルゴリズムの本を見てほしいのですが)
データを、いくつかに分類して入れるのです。
たとえば「SpiralGalaxyさんは12文字だから、番号12のところに保存」
というふうに。(実際には番号付けはもっと複雑ですが)

しかし、このようにすると、
同じ番号のところに複数のデータが入ることがあります。
そういう場合、いくつかのデータを列にして保存します。
図にするとこんな感じ。

◇-●-●-●
◇-
◇-●-●
◇-
...
◇-●
◇-●-●-●

◇が番号のところで、●がデータです。
特定の番号には、データは無かったり、複数あったりします。

この場合の$Entryというのも、こういうものだと思います。
複数データを持っている番号があるので、
データの数とその数が合わないのでしょう。

実際に、HashMapからデータを取り出す作業をしてみてください。
おそらく入れた数だけ取り出せると思います。
(そうでなかった場合は補足に書いてください)

参考URL:http://www.amazon.co.jp/exec/obidos/ASIN/4797304 …
    • good
    • 0
この回答へのお礼

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"

お礼日時:2004/08/04 10:12

エクリプスを使っているのであれば、


デバッグモードで実行して、
ブレイクポイントで止めた後、
表示ペインからHashMapの中身を
コンソールに出力するコードを書いて実行することで確認できそうです。

釈迦に説法かもしれなかったですが。

以上
    • good
    • 0
この回答へのお礼

御回答ありがとうございます。

>釈迦に説法かもしれなかったですが。

恐縮します。(^^;

この辺で締め切りとさせていただきます。皆様ありがとうございました。勉強になりました。

お礼日時:2004/08/04 11:21

> size= 19


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

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

お礼日時:2004/08/04 11:18

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!