Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 当从另一个变量访问时,为什么数组会更改?_Java_Arrays - Fatal编程技术网

Java 当从另一个变量访问时,为什么数组会更改?

Java 当从另一个变量访问时,为什么数组会更改?,java,arrays,Java,Arrays,我曾在多种语言(例如python和js)中尝试过,每次都会得到相同的结果: int[] arr = {1, 2, 3, 4, 5}; int[] other = arr; other[4] = 2; System.out.println("other[4]: " + other[4]); System.out.println("arr[4]: " + arr[4]); int x = 7; int y = x; y = 888; System.out.println("x: " + x);

我曾在多种语言(例如python和js)中尝试过,每次都会得到相同的结果:

int[] arr = {1, 2, 3, 4, 5}; 
int[] other = arr; 
other[4] = 2;
System.out.println("other[4]: " + other[4]);
System.out.println("arr[4]: " + arr[4]);
int x = 7;
int y = x;
y = 888;
System.out.println("x: " + x);
System.out.println("y: " + y);

为什么
other
在修改时会更改
arr
,但正如它应该更改的那样,
y
在修改时不会更改
x

这是因为只复制引用,而不复制内容。要使两个数组独立,应为目标分配新内存,,然后复制所有元素

简而言之,
arr
other
指向相同的内存,因为您将
arr
指向的内存引用复制到了
other

下面是一张图表

Address 0x1000 :  1
Address 0x1004:   2
Address 0x1008:   3
Address 0x100C:   4
Address 0x1010:   5

Address 0x4000(arr): 0x1000
Address 0x4008(other): 0x1000
因此
arr
other
指向smae地址
0x1000
,该地址是在分配
arr
时首先分配的

x
y
只有它们的基本值

0x4020(x): 7
0x4024(y): none
变成:

0x4020(x): 7
0x4024(y): 7
y=x之后。然后它变成:

0x4020(x): 7
0x4024(y): 888
y=888


不同之处在于,许多语言中的数组变量实际上指向实际数据的地址。原因是:如果我们每次将一个数组分配给另一个数组时都复制所有数据,这将导致大量性能损失。

基本上,数据类型不同,因此行为也不同

至少在Javascript中,int值是基本数据类型,而数组是对象

请参阅本文以获得更好的解释:

造成混淆的主要原因是您误认了引用类型和值类型。看一看


这是一个很长的讨论,但简而言之:
integers
是基本类型(例如也称为值类型),因此在您的示例中,内存中有一个特定的空间用于
x
y
<代码>数组是引用类型,所以内存中只有一个数组和两个指向它的对象。

Java有三种类型的变量:基元类型、对象类型和空类型。有一点需要澄清,Java总是按值传递的。在另一个基元上分配一个基元,例如int a=b;原语变量b的值被分配给A。在分配对象的情况下,它也遵循相同的规则:按值传递。但在后一种情况下,值是对对象的引用。引用变量不是C和C++中的指针,它们只是对象的句柄,这样就可以访问它们,并对对象的状态进行一些更改。这就是为什么数组的值被改变的原因。Java中的任何数组都是对象。java.lang.Object在每个java数组中都作为超类型工作,因此它继承了Object API中的所有函数。

“为什么数组会更改”这就是你的错误所在-你只有一个数组。请不要标记垃圾邮件,尤其是因为不同语言的答案可能不同。因为您的示例是Java,所以我删除了Python标记不创建第二个数组。它为您提供了第二个变量,该变量引用与第一个变量相同的数组。对数组所做的任何更改都可以通过这两个变量自然地看到,因为它们都指向同一个位置。arr中的指针指向一个数组,然后将另一个设置为指向同一数组的指针。通过任意一个指针访问数组都会产生相同的值。虽然有点离题,但我想,唯一真正的答案是:去用C编写程序,直到你了解内存发生了什么。@T.J.Crowder谢谢,编辑了我的。为什么我被否决了?显然,这些标记已经被修改,不再是关于JavaScript的问题。虽然Java与JS或Python之间的比较可能会有所帮助,但这篇文章并没有像现在这样回答这个问题。一个数组对象,两个指向它的引用。