Целое число с мелким копированием в Java

#java #variables

#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 были связаны.

Комментарии:

1. Совсем не ясно, чего вы пытаетесь достичь. Строка i1 = 233; изменяет значение i1 для ссылки на другой Integer объект. Integer само по себе является неизменяемым. Возможно, вы хотите AtomicInteger вместо этого, где вы можете изменить значение внутри объекта?

Ответ №1:

В Java java.lang.Integer является неизменяемым. Это означает, что вы не можете изменить значение объекта Integer (обычным способом). Вы можете создать новый Integer экземпляр с новым значением.

i1 и i2 содержит ссылку на тот же Integer экземпляр. Когда вы сделали

 i1 = 233;
  

это означает, что i1 ссылается на другой экземпляр Integer класса

Если вы хотите, i1 и i2 ссылается на тот же экземпляр, который вы можете использовать AtomicInteger , но AtomicInteger был создан для разных целей.

 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 = x; java автоматически делает это i2 = new Integer(x); за вас, потому Integer что является неизменяемым. где x = (любой целочисленный литерал)

Комментарии:

1. Надеюсь, вы имели в виду i2 = (any integer literal); , иначе это было бы неправильно.

2. я думаю, это очевидно. Я просто хочу отметить, что создается новый объект.

3. Это совсем не очевидно. В коде OP i1 и i2 оба Integer являются s и i2 = i1; не будут создавать новый экземпляр Integer .

4. Хорошо, строго говоря, это не обязательно должен быть новый объект. Вы правы.

5. Мне бы больше понравилось Integer.valueOf(i1) , а не new Integer(i1);

Ответ №3:

Java всегда создает новый объект при назначении нового целочисленного литерала, потому что целое число является неизменяемым.

Например:

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

Теперь i1 и i2 как два разных физических адреса.

Ответ №4:

Проблема, с которой вы столкнулись, заключается в том, что i1 = 233 изменяется адрес памяти, на который i1 ссылается.

Ответ №5:

Здесь играет роль автобоксинг. Когда вы назначили

 i1=233;
  

На самом деле это читается как

 i1= new Integer(233);
  

Теперь прочитайте код еще раз. Ваше целое число i2 по-прежнему указывает на объект, содержащий 11, где, поскольку i1 указывает на новый объект, содержащий 233.