2016-10-12 9 views
2

他の回答は私には役に立たない。私の質問は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を関連付ける必要があります。

+4

は、それはあなたが達成しようとしているもので、すべてのはっきりしないことができます。 'i1 = 233;'行は 'i1'の値を変更して別の' Integer'オブジェクトを参照します。 'Integer'自体は不変です。おそらく、代わりに 'AtomicInteger'が必要です。オブジェクト内の値を変更することができますか? –

答えて

5

Java java.lang.Integerは不変です。つまり、Integerオブジェクトの値を(通常の方法で)変更することはできません。新しい値を持つ新しいIntegerインスタンスを作成できます。

i1およびi2には、同じIntegerインスタンスへの参照が含まれています。あなたは

i1 = 233; 

を作ったとき、それはi1はあなたがi1i2が同じインスタンスを参照することを望む場合は、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()); 
2

が不変なので、i2 = i1; javaが自動的にこれを行います。i2 = new Integer(i1);です。

+0

私はあなたが 'i2 =(任意の整数リテラル);'を意味することを望みます、そうでなければこれは間違っています。 – tkausl

+0

私はそれが明らかだと思います。新しいオブジェクトが作成されたことを指摘したいだけです。 – xro7

+0

それは全く明らかではありません。 OPのコードでは、 'i1'と' i2'は両方とも 'Integer'と' i2 = i1; 'は' Integer'の新しいインスタンスを作成しません。 – tkausl

0

i1 = 233は、i1が参照するメモリアドレスを変更するという問題があります。

0

ここでオートボクシングが行われています。あなたは

i1=233; 

を割り当てられた場合には、実際に

i1= new Integer(233); 

として、それを読んで今、再びコードを読みます。あなたのi2整数はまだ11を含むオブジェクトを指しています。ここで、i1は233を含む新しいオブジェクトを指しています。

1

整数が不変であるため、Javaは常に新しい整数リテラルを割り当てる際に新しいオブジェクトを作成します。 EXのために

:二つの異なる物理アドレスとして

i1=233; // it represent as i1= new Integer(233); 

i1i2

関連する問題