有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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相关


共 (5) 个答案

  1. # 1 楼答案

    Java总是在分配新整数文本时创建新对象,因为整数是不可变的

    例如:

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

    现在i1i2作为两个不同的物理地址

  2. # 2 楼答案

    在java中,{}是不可变的。这意味着您不能更改Integer对象的值(以通常的方式)。可以使用新值创建新的Integer实例

    i1i2包含对同一Integer实例的引用。当你

    i1 = 233;
    

    这意味着i1引用了Integer类的另一个实例

    如果你想让i1i2引用同一个实例,你可以使用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());
    
  3. # 3 楼答案

    自动装箱在这里起作用。当你指派

    i1=233;
    

    它实际上读作

    i1= new Integer(233);
    

    现在再次阅读代码。i2整数仍然指向包含11的对象,其中as i1指向包含233的新对象

  4. # 4 楼答案

    执行此操作时:i2 = x;java会自动为您执行i2 = new Integer(x);,因为Integer是不可变的。其中x=(任意整数文字)

  5. # 5 楼答案

    这里的问题是i1 = 233更改了i1引用的内存地址