java - 是什么导致java以不同的方式对待ArrayList和Integers这两种对象类型?

标签 java

ArrayList和Integer都是对象数据类型,但是为什么下面的代码对两者的处理方式不同呢? ar,br,a 和 b 都是对象。 改变ar会改变br,但改变a并没有改变b,为什么? ArrayList 和 Integer 不都是对象吗?通过使用 = 语句将一个对象分配给另一个对象只是简单地浅复制 FOR BOTH 吗?或不?

import java.util.ArrayList;
import java.util.Arrays;

public class MyClass {
    public static void main(String[] args) {
        ArrayList <Integer> ar = new ArrayList<>(Arrays.asList(1,2,3));
        ArrayList<Integer> br = ar;
        System.out.println(Arrays.toString(br.toArray()));// [1,2,3]
        ar.remove(0);// lets change ar
        // now lets see if br changed too
        System.out.println(Arrays.toString(br.toArray()));// [2,3] (yes did)

        Integer a= new Integer (5);

        Integer b = a;

        a = a+1;// lets change a and see if b changed too

        System.out.println(b);// b is still 5

        //So changing ar changed br too, but changing a did not change b why? Ist it both br and b are objects?




    }
}

最佳答案

这是因为 Integer 对象实际上是 boxed基元。当您调用Integer a= new Integer (5);时,您创建一个新的整数。当您执行Integer b = a;时,则 b 引用与 a 相同的 Integer 实例。

当您调用a = a+1;时,会发生以下情况:

  1. a 被拆箱为原语 int值为 5。
  2. 加一的结果 int已评估。
  3. 结果 6 被装箱到一个新的 Integer 中。其值为 6。原始整数值 5 不会被修改。

对于列表,您将分配 arbr引用 java.util.ArrayList相同实例。当您通过 ar 访问该数组列表时,会看到对该数组列表的修改。和br

关键点是 a = a+1构造一个新的java.lang.Integer()通过拆箱、评估、装箱,同时ar.remove(0);影响该列表而不创建它的新副本。

更多 JLS 阅读:

If p is a value of type int, then boxing conversion converts p into a reference r of class and type Integer, such that r.intValue() == p

关于java - 是什么导致java以不同的方式对待ArrayList和Integers这两种对象类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25817830/

相关文章:

java - Java Spring 中的延迟加载异常

java - 如何删除插入到 TextView 的附加文本

java - 所有版本的 Clojure jar 报告为 Clojure-1.7.0-RC1,无论实际版本如何

java - Java 中的 RSA 和 BigInteger

java - EclipseLink - 并发异常 - signalAttemptedBeforeWait

java - SimpleDateFormat 与带有时区的 ZonedDateTime

java - Click() 在 Fitnesse 的 HtmlUnitDriver 中不起作用的解决方法?

java - Spring MVC 页面到页面导航不起作用

java - 使用 onDraw android 在 View 中绘制多个对象

java - 消费者期待使用 pact 的 List<String> 响应