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

在方法中更改数组会在外部更改数组

聂建茗
2023-03-14
问题内容

我在变量范围方面遇到麻烦。

public static void main(String[] args){
    int[] test={1,2,3};
    test(test);
    System.out.println(test[0]+" "+test[1]+" "+test[2]);
}

static void test(int[] test){
    test[0]=5;
}

我期望输出到1 2 3,但结果是5 2 3。为什么我在方法中更改了数组中的值,但是原来的数组却更改了?


问题答案:

Java中的数组是一个对象。当您通过创建数组时new,它是在堆上创建的,并且返回一个参考值(类似于C中的指针)并将其分配给您的变量。

在C语言中,这表示为:

int *array = malloc(10 * sizeof(int));

当您将该变量传递给方法时,您将传递给该方法中的局部(堆栈)变量分配(复制)的参考值。不会复制数组的内容,仅复制参考值。同样,就像将指针传递给C中的函数一样。

因此,当您通过该引用修改方法中的数组时,就是在修改堆中存在的单个数组对象。

您评论说,您int[] temp=test再次通过… 对该数组进行了“复制”
,这仅对指向内存中单个数组的参考值(指针)进行了复制。现在,您拥有三个变量,它们均对同一数组具有相同的引用(方法中的一个,main()方法中的两个)。

如果要复制数组内容,则Java
Arrays该类中提供了一个静态方法:

int[] newArray = Arrays.copyOf(test, test.length);

这将在堆上分配新数组对象(由第二个参数指定大小),将现有数组的内容复制到该对象,然后将对该新数组的引用返回给您。



 类似资料:
  • 我对变量的作用域有问题。 我希望输出为,但结果是。为什么我在方法中改变了数组中的值,而原来的数组却改变了?

  • 考虑: 为什么改变的值会改变的值?

  • 当我单击Governates_nameedt(EditText)时,我有两个想要的数组。在AlertDialog中显示Governate_names,并根据我选择的值,在state_names数组中选择值。当我运行代码时,asList被更改,我在<code>create()中得到一个错误。show() 处于状态_nameedt(编辑文本)。 我的代码 我的错误 05-13 16:42:25.720

  • 问题内容: 我在大型代码中发现了一个错误,并将问题简化为以下情况。 尽管在每一步中我都只更改,但是在每一步中我都打印时,它也会更改,因为在第一循环的结尾我将它们分配为相等。我读过这篇文章,但是写了一些,以防我能解决问题,但事实并非如此 问题答案: 问题是,当您将值从分配回时,您实际上并没有将值从传递给,而是实际上是将两个变量指向 同一对象 。 您遇到的问题 解决方案 相反,您将需要复制 值 。使用

  • 问题内容: 我编写了以下JavaScript: 此代码声明一个变量并将其设置为数组值。然后,它声明第二个变量并将其设置为。它对进行操作,然后向和发出警报。不知何故,当我对执行操作时,似乎对执行了相同的操作。 然后,代码对数字值执行相同的操作:声明一个变量并将其设置为数字值。然后,它声明第二个变量并将其设置为。它对进行操作,然后向和发出警报。在这里,我得到预期的行为:对不同的价值观和。 数组与Jav

  • 问题内容: 我有一个像这样的功能: 在功能结束时, elemR 被更改,但是从main方法调用函数后,参数 elemR 仍具有与函数调用之前相同的值。有什么问题?如何在调用函数后更改此ListElement并“保存”此更改,而无需将返回类型更改为ListElement(我也需要整数返回值)? 问题答案: Java函数参数通过引用名称进行调用,这意味着当您将一个对象作为函数参数放置时,JVM将引用的