Java &引用;假设您正在向/从方法传递或返回对可变对象的引用数组……”;

Java &引用;假设您正在向/从方法传递或返回对可变对象的引用数组……”;,java,deep-copy,mutable,Java,Deep Copy,Mutable,“假设向方法传递或从方法返回对可变对象的引用数组。仅创建引用副本安全吗?创建浅层副本安全吗?” 这是给我们班的一个研究问题,答案是“两个都不安全。在这种情况下,只有深度拷贝是安全的。” 为什么会这样?如果对象是可变的,这意味着任何引用它们的客户端都可以修改它们。这会导致比赛状态、死锁和其他不有趣的行为。但是,如果您在使用对象之前创建了对象的深度副本,则可以有效地使用对象的快照。这确保了没有其他客户端能够修改它们,从而消除了任何并发性或正确性问题。如果对象是可变的,这意味着任何引用它们的客户端都可

“假设向方法传递或从方法返回对可变对象的引用数组。仅创建引用副本安全吗?创建浅层副本安全吗?”

这是给我们班的一个研究问题,答案是“两个都不安全。在这种情况下,只有深度拷贝是安全的。”


为什么会这样?

如果对象是可变的,这意味着任何引用它们的客户端都可以修改它们。这会导致比赛状态、死锁和其他不有趣的行为。但是,如果您在使用对象之前创建了对象的深度副本,则可以有效地使用对象的快照。这确保了没有其他客户端能够修改它们,从而消除了任何并发性或正确性问题。

如果对象是可变的,这意味着任何引用它们的客户端都可以修改它们。这会导致比赛状态、死锁和其他不有趣的行为。但是,如果您在使用对象之前创建了对象的深度副本,则可以有效地使用对象的快照。这确保了没有其他客户端能够修改它们,从而消除了任何并发性或正确性问题。

在第一种情况下,原始数组元素和对象都可以修改。在第二种情况下,只有对象可以修改,因为我们不再能够访问原始数组。如果执行深度复制,我们将使用完全不同的数组和对象,因此当然是安全的

在第一种情况下,可以修改原始数组元素和对象。在第二种情况下,只有对象可以修改,因为我们不再能够访问原始数组。如果执行深度复制,我们将使用完全不同的数组和对象,因此当然是安全的

“安全”可能意味着很多事情,但在您特定的上下文中,它是关于“您的”私有数据的安全性的(本文将“您”称为某个Java类的编写者)。如果您让您的类的客户端在背后访问并修改您的私有数据,那么您的私有数据就不会安全

因此:

  • 如果返回一个可变对象数组,则必须复制所有这些对象并以新数组返回它们

  • 如果传入一个可变对象数组,则必须再次将它们全部复制并放入新数组中,因为客户端已经对传入的对象进行了引用

  • 实际上,所有这些都需要大量的CPU工作和内存,因此很少进行。你要么把一切都设计成不可变的,要么生活在可变对象固有的危险中。

    安全“可能意味着很多事情,但在你的特定上下文中,它是关于“你的”私有数据的安全性的(本文将“你”称为某个Java类的编写者)。如果您让您的类的客户端在背后访问并修改您的私有数据,那么您的私有数据就不会安全

    因此:

  • 如果返回一个可变对象数组,则必须复制所有这些对象并以新数组返回它们

  • 如果传入一个可变对象数组,则必须再次将它们全部复制并放入新数组中,因为客户端已经对传入的对象进行了引用


  • 实际上,所有这些都需要大量的CPU工作和内存,因此很少进行。你要么将一切设计成不可变的,要么生活在可变对象固有的危险中。

    在这种情况下,“安全”到底意味着什么?这是我要问你的问题。:)这要视情况而定,但在本例中,我假设在处理数组和对象的代码之外进行任何类型的修改。在本文中,“安全”到底意味着什么?这是我要问您的问题。:)这要视情况而定,但在本例中,我假设在处理数组和对象的代码之外进行任何类型的修改。已经出现的答案突出显示,还不完全清楚“浅拷贝”和“深拷贝”是什么意思“深度拷贝”指的是“元素与旧数组元素相同的新数组”吗(即,相同的引用)”或“一个新数组,其元素引用的对象是旧数组元素的副本”?已经出现的答案突出显示,还不完全清楚“浅拷贝”和“深拷贝”的含义是什么“其元素与旧数组的元素相同的新数组(即相同的引用)”或“其元素是对作为旧数组元素副本的对象的引用的新数组”?