他の回答は私には役に立たない。私の質問はIntegerについてです。浅いコピーJavaの整数
Integer i1 = new Integer(11);
Integer i2 ;
i2 = i1;
System.out.println(i1+" "+i2);
i1 = 233;
System.out.println(i1+" "+i2);
//~ 11 11
//~ 233 11
i1とi2を関連付ける必要があります。
他の回答は私には役に立たない。私の質問はIntegerについてです。浅いコピーJavaの整数
Integer i1 = new Integer(11);
Integer i2 ;
i2 = i1;
System.out.println(i1+" "+i2);
i1 = 233;
System.out.println(i1+" "+i2);
//~ 11 11
//~ 233 11
i1とi2を関連付ける必要があります。
Java java.lang.Integer
は不変です。つまり、Integerオブジェクトの値を(通常の方法で)変更することはできません。新しい値を持つ新しいInteger
インスタンスを作成できます。
i1
およびi2
には、同じInteger
インスタンスへの参照が含まれています。あなたは
i1 = 233;
を作ったとき、それはi1
はあなたがi1
とi2
が同じインスタンスを参照することを望む場合は、AtomicInteger
を使用することができますが、AtomicInteger
は異なる目的のために作られたInteger
クラス
の別のインスタンスを参照することを意味します。
AtomicInteger i1 = new AtomicInteger(11);
AtomicInteger i2 ;
i2 = i1;
System.out.println(i1+" "+i2);
i1.set(233);
System.out.println(i1+" "+i2);
それとも、ラッパー
public static class IntegerWrapper {
private int value;
public IntegerWrapper(int value) {
this.value = value;
}
public int getValue() {
return value;
}
public IntegerWrapper setValue(int value) {
this.value = value;
return this;
}
}
とコード
IntegerWrapper i1 = new IntegerWrapper(11);
IntegerWrapper i2 ;
i2 = i1;
System.out.println(i1.getValue()+" "+i2.getValue());
i1.setValue(233);
System.out.println(i1.getValue()+" "+i2.getValue());
i1 = 233
は、i1
が参照するメモリアドレスを変更するという問題があります。
ここでオートボクシングが行われています。あなたは
i1=233;
を割り当てられた場合には、実際に
i1= new Integer(233);
として、それを読んで今、再びコードを読みます。あなたのi2整数はまだ11を含むオブジェクトを指しています。ここで、i1は233を含む新しいオブジェクトを指しています。
整数が不変であるため、Javaは常に新しい整数リテラルを割り当てる際に新しいオブジェクトを作成します。 EXのために
:二つの異なる物理アドレスとして
i1=233; // it represent as i1= new Integer(233);
今i1
とi2
。
は、それはあなたが達成しようとしているもので、すべてのはっきりしないことができます。 'i1 = 233;'行は 'i1'の値を変更して別の' Integer'オブジェクトを参照します。 'Integer'自体は不変です。おそらく、代わりに 'AtomicInteger'が必要です。オブジェクト内の値を変更することができますか? –