0

リストとマップに関連するいくつかの簡単なコードを理解するのに問題があります。例として以下のコードを取り上げます。

public class test {

private Map<Integer, List<String>> myMap ;

public test(){
    myMap = new HashMap<Integer, List<String>>();
}

public void addToMap(String ss){

    List<String> myTemp = myMap.get(ss);
    Random  r = new Random();
    if(myTemp == null){

        myTemp = new ArrayList<String>();
        myMap.put(r.nextInt(100), myTemp);
    }

    myTemp.add(ss);

}

public Map<Integer, List<String>> getMap1(){
    return myMap;
}


public  static void main(String args[]){

    test myTest = new test();
    myTest.addToMap("abdc");
    myTest.addToMap("eeer");
    System.out.println(myTest.getMap1());

}

}

mylistマップに新しい要素をどの程度正確にaddToMap()追加しますか。具体的には、ローカル変数であるときにmyTemp.add(ss)新しい要素を追加し、実行が完了すると削除される方法を教えてください。さらに、メソッドから削除すると、メインメソッドで空のHashMapが出力されますが、これはなぜですか?putメソッドは、addメソッドの前に実行されたときに、どのように要素をマップに挿入しますか?ありがとう。myMapmyTempmyTemp.add(ss)addToMap()

編集:もう少し意味をなすようにコードを編集しました。

4

4 に答える 4

2

C ++とは異なり、Javaでは、すべての変数は実際のオブジェクトへの参照です。だから、あなたがするとき

myTemp = new Object();

参照がスタック変数myTempにコピーされるオブジェクトをヒープ内に作成します。参照がリスト(または他の変数)に追加されると、参照のコピーがそこに追加されます。

myTempが破棄されると、オブジェクトは存続し続けます。例外は、オブジェクトへのすべての参照がなくなった場合です。その場合、コードはオブジェクトに到達できず、ガベージコレクションはメモリからオブジェクトを削除できます(ただし、強制されることはありません)。

于 2012-06-06T22:17:10.467 に答える
2

myTemp物ではありません-リスト-代わりに物への参照です。しかし、それはあなたが地図に入れているその特定の参照ではありません。それが参照するものです。マップにはThingへの独自の参照があるため、myTemp参照を削除してもマップには影響しません。

于 2012-06-06T22:19:08.760 に答える
1

myTempはリストへの参照です。リストはヒープメモリに割り当てられ、myTempは実際にはスタックに格納されているポインタです。関数を終了するたびに関数は削除されますが、ヒープメモリに割り当てられたメモリは削除されません。ガベージコレクタによる参照がない場合、ヒープメモリで割り当てられたメモリが解放されます。

あなたが正しいです。addToMap()メソッドを終了すると、myTempは解放されます(実際にはスタックからポップされます)が、ヒープメモリスペースに割り当てられているリストは残ります。newキーワードを使用して作成されたものはすべて、ヒープメモリスペース内に配置されます。

このリンクを読むJava参照オブジェクト

于 2012-06-06T22:18:03.967 に答える
1

ベストプラクティスの観点から、HashMapを「mylist」と呼ぶことは多くの点で問題があります。それは直交しておらず、「mylist」はその使用法について多くを教えてくれません。

あなたの質問に答えるのは、アイテムがマップに存在する場合はアイテムが取得され、リストが作成されてマップに追加されない場合は文字列が追加されるという単純なケースです。マップがスコープ内にある限り、マップに追加されたリストへの参照は(関数のスコープ内で作成された場合でも)スコープ内に残ります。

ただし、これは名前が混在しており、実際のユースケースを提供しないため、まったく有用な例ではありません。

于 2012-06-06T22:23:16.017 に答える