当前位置: 首页 > 面试题库 >

System.arrayCopy()复制对象还是对对象的引用?

章安宜
2023-03-14
问题内容

我正在上最后一堂课NameAndValue。我复制的阵列NameAndValue使用对象System.arrayCopy(),并且当我改变一个NameAndValue中复制的数组对象,它就会被反映原始数组英寸

public final class NameAndValue
{
    public String name;
    public String value;

    public NameAndValue()
    {

    }

    public NameAndValue(String name,String value)
    {
        this.name = name;
        this.value = value;
    }
}

public class Main
{
    public static void main(String[] args)
    {
        NameAndValue[] nv = new NameAndValue[4];
        nv[0] = new NameAndValue("A", "1");
        nv[1] = new NameAndValue("B", "2");
        nv[2] = new NameAndValue("C", "3");
        nv[3] = new NameAndValue("D", "4");

        NameAndValue[] nv2 = new NameAndValue[4];
        System.arraycopy(nv, 0, nv2, 0, 2);
        nv2[2] = new NameAndValue("Y","25");
        nv2[3] = new NameAndValue("Z","26");

        for (int i = 0; i < 2; i++)
        {
            NameAndValue[] nv3 = new NameAndValue[4];
            System.arraycopy(nv2, 0, nv3, 0, 4);
            nv3[2].value = String.valueOf(i);
            nv3[3].value = String.valueOf(i+1);

            System.out.println(nv2[2].value);
            System.out.println(nv2[3].value);
            System.out.println("-----------------------");
        }
    }
}

我正在输出,

0
1
-----------------------
1
2
-----------------------

我应该在所有情况下都得到25和26的输出,对吗?为什么会改变?


问题答案:

System.arrayCopy()复制对象还是对对象的引用?

参考,这是一个 浅表
副本。出乎意料的是,文档没有明确地说,只是隐式地说,因为他们
谈论复制数组元素,而不是递归地复制他们引用的东西。

就像您有这个一样:

NameAndValue nv1 = new NameAndValue("A", "1");
NameAndValue nv2 = nv1;
nv2.value = "4";
System.out.println(nv1.value); // 4

每个数组元素都类似于上面的nv1nv2vars。就像nv1nv2引用(指向)相同的基础对象一样,数组条目也是如此,包括何时将这些条目从一个数组复制到另一个数组。



 类似资料:
  • 与原始类型相比,对象的根本区别之一是对象是“通过引用”被存储和复制的,与原始类型值相反:字符串,数字,布尔值等 —— 始终是以“整体值”的形式被复制的。 如果我们稍微看一下复制值时发生了什么,就很容易理解了。 让我们从原始类型开始,例如一个字符串。 这里我们将 message 复制到 phrase: let message = "Hello!"; let phrase = message; 结果我

  • 通过拖动来复制对象 1选择一个或多个对象。 2选择 “选择 ”、 “直接选择 ”或 “编组选择 ”工具。 3按住 Alt 键 (Windows) 或 Option 键 (Mac OS) 并拖动所选对象(而非定界框上的手柄)。 使用图层面板复制对象 使用 “图层 ”面板可快速复制对象、组和整个图层。 1在 “图层 ”面板中选择要复制的项目。 2执行下列操作之一: 从 “图层 ”面板菜单中选择 “复制

  • 问题内容: 我了解到,当您在Java中修改变量时,它不会更改它所基于的变量 我为对象假设了类似的事情。考虑这个课程。 在尝试了这段代码后,我感到困惑。 请向我解释为什么更改任何一个对象都会影响另一个对象。我知道变量文本的值存储在两个对象的内存中的相同位置。 为什么变量的值是独立的却与对象相关? 另外,如果简单分配不能完成工作,如何复制SomeObject? 问题答案: Java中的每个变量都是一个

  • 问题内容: 我正在尝试设计一个非常简单的应用程序,并使自己与Hibernate的实体和值对象的定义(在Java Persistence with Hibernate的第4章中定义)有些困惑。 我所拥有的是带有客户的应用程序,可以下订单(一对多关系)。这些订单中的每一个都有许多订单行(也是一对多)。现在,我认为客户具有身份(客户编号),订单(订单编号)也是如此,因此它们是实体对象吗?我的困惑来自订单

  • 问题内容: 阅读了SCJP Tip Line的作者Corey McGlone在javaranch网站上的文章后,我都感到困惑。从字面上看是Strings,由Kathy Sierra(javaranch的联合创始人)和Bert Bates共同编写的《 SCJP Java 6程序员指南》。 我将尝试引用Corey先生和Kathy Sierra女士对String Literal Pool的引用。 1.根

  • 我已经被覆盖了hashcode和equals以查找具有相同开始日期和关闭日期的值。我得到了重复对象的类似哈希代码。当等同于这些对象时,我得到了布尔值“假”。在我的理解中,对象==对象比较对象的引用,即使引用是相同的;代码返回假。你能帮我理解是什么问题吗?我在下面发布了我的代码: Main.java 输出: 检查客户对象引用:Customer@643 对象引用(位于Map中):[Customer@6