2

HashMapだから私は、およびいくつかの他のパラメータを取り、を変更する静的メソッドを持っていますHashMap:

public static void foo(HashMap map, other parameters)

Bar2 つのインスタンス変数を持つ というクラスがあるとしますHashMap

これらHashMapの s の1 つを に渡しfoo、変更するつもりです (他の HashMap は渡さないでください)。この 1 つのメソッド呼び出しの結果として、他のメソッドを変更することは不可能であると言うのは正しいですか?HashMapfoo

これは私に起こっているように見えるので、私は尋ねます...

4

4 に答える 4

2

あなたが持っている場合

Map<String,String> map1=new HashMap<String,String>();

Map<String,String> map2=new HashMap<String,String>();

map1 をメソッドに渡すと、map1 への変更は map2 に反映されません。これは、map1 と map2 がメモリ内の 2 つの異なるオブジェクトを表しているためです。割り当てている場合map1=map2、両方のマップが同じオブジェクトを参照しているため、1 つのオブジェクトを変更すると、他のオブジェクト参照に反映されます。Java は参照によってオブジェクトを渡しています (これは 100% 正しいわけではなく、参照の値が渡されます)。

両方のマップに格納されている同じオブジェクト参照に対して、同じオブジェクトの動作を変更しているため、一方のマップのオブジェクトのプロパティを変更すると、もう一方のオブジェクトのオブジェクトに反映されます。参照されている場所に変更が反映されます。

于 2013-07-26T05:25:55.227 に答える
1

この 1 つのメソッド呼び出しだけの結果として、他の HashMap が foo によって変更されることは不可能であると言うのは正しいですか?

答えはそうかもしれません。

オブジェクトの参照をメソッドに渡さないとアクセスできないのは事実です。

ただし、マップはキーと値のオブジェクトのペアの参照を格納します。オブジェクトは格納しません。両方のマップがオブジェクトをキーまたは値として共有する場合、それは有効になります。

于 2013-07-26T04:59:03.297 に答える
0

そのような場合

one = new HashMap();
two = one;

1 を に渡しpublic static void foo(HashMap map, other parameters) 、メソッド foo で 1 に行われた変更は 2 にも影響します。

これは、1 つと 2 つの両方が同じオブジェクトを指しているために発生します。

状況は異なります

one = new HashMap();
two = new HashMap();
于 2013-07-26T05:04:16.350 に答える
0

HashMapこの 1 つのメソッド呼び出しだけの結果として、他のものを foo で変更することは不可能だと言っているのは正しいですか?

両方Mapの s が同じオブジェクト参照を指している場合、一方に加えられた変更はMapもう一方のマップに影響します (Mangus の回答に示されているように)。

Mapに異なるインスタンスがあると仮定すると、 1 つを変更Map(つまり、要素をマップに配置またはマップから削除) しても、他のインスタンスに直接影響することはありません。ただしMapがキーまたは値で共通のオブジェクト参照を共有し、このオブジェクト参照がいずれかの で変更Mapされると、もう一方に格納されているオブジェクト参照Mapも変更されます。これをコードで表示するには:

class FooClass {
    private int fooInt;
    public FooClass(int fooInt) {
        this.fooInt = fooInt;
    }
    //getters and setters...
}
class MapHolder {
    private Map<String, FooClass> mapOne;
    private Map<String, FooClass> mapTwo;
    public MapHolder() {
        mapOne = new HashMap<>();
        mapTwo = new HashMap<>();
    }
    public void init() {
        FooClass foo = new FooClass(10);
        //note that we're putting the same FooClass object reference in both maps
        mapOne.put("foo", foo);
        mapTwo.put("bar", foo);
    }
    //getters and setters...
}
class TestMapModification {
    public static void foo(Map<String, FooClass> map, String key) {
        //for testing purposes, we will modify the value of the passed key
        FooClass foo = map.get(key);
        if (foo != null) {
            foo.setFooInt(foo.getFooInt() * 2);
        }
    }
    public static void main(String[] args) {
        MapHolder mapHolder = new MapHolder();
        mapHolder.init();
        System.out.println(mapHolder.getMapOne().get("foo").getFooInt());
        System.out.println(mapHolder.getMapTwo().get("bar").getFooInt());
        foo(mapHolder.getMapOne(), "foo");
        System.out.println("But I just modified mapOne!");
        System.out.println(mapHolder.getMapOne().get("foo").getFooInt());
        System.out.println(mapHolder.getMapTwo().get("bar").getFooInt());
    }
}

コードの実行結果

10
10
But I just modified mapOne!
20
20
于 2013-07-26T05:19:08.860 に答える