当前位置: 首页 > 知识库问答 >
问题:

更改方法中的数组将更改[duplicate]外部的数组

阳建弼
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。为什么我在方法中改变了数组中的值,而原来的数组却改变了?

共有1个答案

须鸿祯
2023-03-14

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

在C中,这将表示为:

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

当您将该变量传递给一个方法时,您传递的是被分配(复制)到方法中的本地(堆栈)变量的引用值。不复制数组的内容,只复制引用值。同样,就像在C中传递指向函数的指针一样。

您评论说,您通过int[]temp=test创建了数组的“副本”...同样,这只创建了指向内存中单个数组的引用值(指针)的副本。现在有三个变量都持有对同一数组的相同引用(一个在main()中,两个在方法中)。

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

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

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

 类似资料:
  • 问题内容: 我在变量范围方面遇到麻烦。 我期望输出到,但结果是。为什么我在方法中更改了数组中的值,但是原来的数组却更改了? 问题答案: Java中的数组是一个对象。当您通过创建数组时,它是在堆上创建的,并且返回一个参考值(类似于C中的指针)并将其分配给您的变量。 在C语言中,这表示为: 当您将该变量传递给方法时,您将传递给该方法中的局部(堆栈)变量分配(复制)的参考值。不会复制数组的内容,仅复制参

  • 我试图更新数组中的值,我尝试这样做:Mongoose,更新对象数组中的值 但这似乎对我不起作用: myLessonDB返回此项: 我正在尝试按所示的课程ID更改课程中的值,但它不起作用 没有错误或任何看起来在数组中找不到对象的内容 有人知道我做错了什么吗?

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

  • 问题内容: 我正在做类似的事情 我有另一种方法可以将其反转 当然,这是经过简化的,我使用的实际代码使用整个字母和一些数字。因此,这里是我的问题:如果我输入像到它输出 然后我输入到解密()它给了我一样。只有一些字母可以正确切换,而有些则不能。使用数组值的方法有什么我所缺少的吗?我显然是Java新手。 问题答案: 我怀疑您的问题是“为什么链接行为异常”并且数组没有改变。您可以证明replace不会轻易

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

  • 让我们开始讨论这个问题 但为什么会导致 我期待结果 我用nodejs得到的结果