0

以下のコードは、値が参照によって返されることを示しています。

public class Playground {

    public static void main(String[] args) {
        Map<Integer, vinfo> map = new HashMap<Integer, vinfo>(); 
        map.put(1, new vinfo(true));
        map.put(2, new vinfo(true));
        map.put(3, new vinfo(true));


        for(vinfo v : map.values()){
            v.state = false;
        }

        printMap(map);
    }

    public static void printMap(Map m){
        Iterator it = m.entrySet().iterator();
        while(it.hasNext()){
            Map.Entry pairs = (Map.Entry) it.next();
            Integer n = (Integer) pairs.getKey();
            vinfo v = (vinfo) pairs.getValue();
            System.out.println(n + "=" + v.state);
        }
    }
}

class vinfo{
    boolean state;

    public vinfo(boolean state){
        this.state = state;
    }
}

出力:
1=偽
2=偽
3=偽

以下のコードでは、値によって返されています。でも; 整数オブジェクトを使用しています。

public class Playground {

    public static void main(String[] args) {
        Map<Integer, Integer> map = new HashMap<Integer, Integer>(); 
        map.put(1, 1);
        map.put(2, 1);
        map.put(3, 1);


        for(Integer n : map.values()){
            n+=1;
        }

        printMap(map);
    }

    public static void printMap(Map m){
        Iterator it = m.entrySet().iterator();
        while(it.hasNext()){
            Map.Entry pairs = (Map.Entry) it.next();
            Integer n = (Integer) pairs.getKey();
            Integer n2 = (Integer) pairs.getValue();
            System.out.println(n + "=" + n2);
        }
    }
}

出力:
1=1
2=1
3=1

値 (またはそのキー) を直接変更しているとき、または完全な .remove() および .put() を実行する必要があることをどのように知ることができますか。

4

2 に答える 2

2

簡単に言うと、Java オブジェクトにはいくつかの非常に独特なプロパティがあります。

一般に、Java には、値によって直接渡されるプリミティブ型 (int、bool、char、double など) があります。次に、Java にはオブジェクト (java.lang.Object から派生したすべてのもの) があります。オブジェクトは実際には常に参照を介して処理されます (参照は触れることができないポインターです)。つまり、通常、参照は重要ではないため、実際にはオブジェクトは値によって渡されます。ただし、参照自体が値によって渡されるため、指しているオブジェクトを変更できないことを意味します。

問題を単純化するには、以下のコードを参照してください

@Test
public void testIntegerValue() {
    Integer num = new Integer(1);
    setInteger(num);
    System.out.println(num); // still return one, why? because Integer will convert to 
                            // int internally and int is primitive in Java, so it's pass by value

}

public void setInteger(Integer i) {
    i +=1;
}
于 2013-08-01T00:51:38.493 に答える