2

我需要制作一个我无法直接访问的卡片数组的临时副本,因为它位于另一个名为 Hand 的类中。我得到了一个名为 getHand() 的方法,它返回对我需要在作为 Hand 的子类 RummyHand 类中的副本的数组的引用。变量 rummyHand 是 RummyHand 类中的一个实例变量,是一个 Hand 对象。如果这很重要,我也在日食中工作。

但这都不是:

卡 [] 临时 = 新卡 [8];

temp = rummyHand.getHand();

或这个:

Card[] temp = rummyHand.getHand();

像我想的那样复制了数组。

4

4 回答 4

2

你可以使用Arrays.copyOfSystem.arrayCopy来复制一个数组,或者更简单的 clone():

Card[] temp = rummyHand.getHand().clone();

请注意,使用=运算符永远不会复制任何数据。所做=的只是使变量引用不同的事物。理解这一点很重要,否则它会给你带来很多麻烦。

在(希望有用的)细节中:

new Card[8];

创建一个数组:一个足够大的新内存区域来保存指向 8 张卡片的指针。

Card[] temp

创建一个必须指向某种卡片数组的变量。这

=

中间使变量指向该内存区域。表达方式

rummyHand.getHand();

为您提供不同内存区域的地址。所以这条线

temp = rummyHand.getHand();

只是使temp变量指向该内存区域。copyOf,所有arrayCopyclone工作都是通过创建一个新数组并用原始数组的引用填充它,然后将新数组交给你。

于 2012-10-09T14:20:43.803 回答
0

您可以使用clone复制数组:

Card[] temp = rummyHand.getHand().clone();

这将为您提供与原件长度相同的精确副本。如果您想要复制八个元素长而不管原件的长度,您可以使用Arrays.copyOf

Card[] temp = Arrays.copyOf(rummyHand.getHand(), 8);
于 2012-10-09T14:22:00.650 回答
0

有几种方法可以复制数组。最基本的是创建一个与源数组大小相同的数组,然后遍历源数组的元素并将每个元素添加到新副本中:

Card[] source = rummyHand.getHand();
Card[] temp = new Card[source.length];

// for loop:
for (int i = 0; i < source.length; i++)
    temp[i] = source[i];

但是有一些 Java 实用程序类可以为您执行此操作。见Arrays.copyOf

Card[] temp = Arrays.copyOf(source, source.length);

但请注意,您的新数组将包含与Card源数组相同的引用,这意味着对数组中对象的任何更改都不会更改副本:它们会更改实际对象。如果您需要数组内容的副本,那么您需要使用循环,并在将每个Card内容添加到temp数组之前制作一个副本。

当您执行:temp = rummyHand.getHand();时,您将获得对原始数组的引用,而不是副本,因此您所做的任何更改都会更改rummyHand对象中的数组..

于 2012-10-09T14:22:10.220 回答
0

采用

Card[] hand = rummyHand.getHand();
Card[] temp = new Card[hand.length()];
System.arraycopy(hand,0,temp,0,hand.length());

之后你有一个数组的副本 - 但请记住,对数组中卡片的引用仍然是相同的。因此,如果您更改卡片的属性,temp它也会更改卡片,hand因为两个数组都包含相同的“卡片实例”。

于 2012-10-09T14:25:53.043 回答