- ベストアンサー
HashMap要素の操作について
過去質問を検索致しましたが、適当な質問を見つけられなかった為、質問をさせて頂きます。 ●下記コードのうち、AブロックとBブロックとでどのように異なる為、 Aブロックの値操作が、そのままHashMapへ反省されてしまうのかをご教示願えませんでしょうか? コメント"Aブロック"部分でのArrayList型変数へ操作した内容は、そのままHashMap内の当該キー要素に反映されてしまいます。 コメント"Bブロック"で行う、String型への操作は、HashMap内の当該キー要素に反映はされません。 ■実行環境 ・jdk1.3.1_11 ・Windows XP pro SP2 _________________________________________________ HashMap testMap = new HashMap(); // マップへArrayListとStringを追加 testMap.put("KEY_LIST", new ArrayList()); testMap.put("KEY_STRING", "stringVal"); // Aブロック ArrayList testList = (ArrayList) testMap.get("KEY_LIST"); testList.add("one"); testList.add("two"); testList.remove(0); // Bブロック String testString = (String) testMap.get("KEY_STRING"); testString = "one"; testString = ""; _________________________________________________
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
あー、これはオブジェクトの参照を勘違いされているんでしょうね。 >コメント"Aブロック"部分でのArrayList型変数へ操作した内容は、そのままHashMap内の当該キー要素に反映されてしまいます。 これは、当然です。ここで行っているのは、HashMapのKEY_LISTの値に設定されているArrayListそのものに項目を追加する処理だからです。 >コメント"Bブロック"で行う、String型への操作は、HashMap内の当該キー要素に反映はされません。 これが、勘違いです。あなたは、String型を「操作」していません。String型のオブジェクトへの参照を変数に入れた後、「別のString」への参照を変数に入れなおしているだけです。 String testString = (String) testMap.get("KEY_STRING"); testString = "one"; ←これは、"one"を変数testStringに入れなおしているだけ testString = "one";した段階で、変数testStringには、KEY_STRINGの値のStringオブジェクトではなく、全く別の"one"というStringオブジェクトが収められます。KEY_STRINGの値を操作しているわけではないのです。
その他の回答 (1)
- _ranco_
- ベストアンサー率58% (126/214)
testListが、Bブロックの場合と同じく、ぜんぜん別のオブジェクト(別のArrayList)を代入されたら、やはりtestMapには反映されなくなりますよ。ちょっと、試してみたら?
お礼
ご回答頂きありがとうございました。 javaの理解不足により、根本的な勘違いをしていました。 参考になりました。機会ございましたら、また宜しくお願い致します。
お礼
ご回答頂きありがとうございました。 理解不足により、根本的な勘違いをしていました。 大変丁寧な解説を頂きまして、理解することが出来ました。 機会ございましたら、また宜しくお願い致します。