Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/313.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_Eclipse - Fatal编程技术网

Java 我需要复制一组卡片,但我只得到了需要复制的阵列的地址

Java 我需要复制一组卡片,但我只得到了需要复制的阵列的地址,java,arrays,eclipse,Java,Arrays,Eclipse,我需要制作一个卡数组的临时副本,我无法直接访问该数组,因为它位于另一个名为Hand的类中。我得到了一个名为getHand()的方法,该方法返回对类RummyHand中我需要的数组的引用,该类是Hand的子类。变量rummyHand是rummyHand类中的一个实例变量,是一个Hand对象。如果这很重要的话,我也在eclipse中工作 但这两者都不是: 卡[]临时=新卡[8] temp=rummyHand.getHand() 或者这个: 卡片[]温度=rummyHand.getHand() 已像我

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

但这两者都不是:

卡[]临时=新卡[8]

temp=rummyHand.getHand()

或者这个:

卡片[]温度=rummyHand.getHand()

已像我所想的那样复制了阵列。

您可以使用或复制阵列,或者更简单地说,复制()

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

在(希望有用的)细节方面:

创建一个数组:一个足够容纳指向8张卡的指针的新内存区域

Card[] temp
创建一个变量,该变量必须指向某种类型的卡片数组。

=
在中间使变量指向该内存区域。表情

rummyHand.getHand();
为您提供不同内存区域的地址。那么这条线呢

temp = rummyHand.getHand();
只需将
temp
变量指向该内存区域即可
copyOf
arrayCopy
clone
所有操作都是通过创建一个新数组并用原始数组中的引用填充它,然后将新数组交还给您来完成的。

您可以使用以下方法复制数组:

Card[] temp = rummyHand.getHand().clone();
这将为您提供与原件长度相同的精确副本。如果希望复制的八个元素的长度与原始元素的长度无关,则可以使用:


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

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

// for loop:
for (int i = 0; i < source.length; i++)
    temp[i] = source[i];
但请注意,新数组将包含与源数组相同的
引用,这意味着对数组中对象的任何更改都不会更改副本:它们将更改实际对象。如果您需要数组内容的副本,则需要使用循环,在将每个
卡添加到
temp
数组之前,为其制作一份副本

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

使用

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

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

为什么不使用System.arraycopy()?“比什么快多了!”罗伯特说?请注意,我提到了
Arrays.copyOf
。出于说明的目的,我加入了for循环。有更简单的方法——例如克隆或java.util.array。@gustafc你说得很对。我已经相应地更新了答案。
Card[] temp = Arrays.copyOf(rummyHand.getHand(), 8);
Card[] source = rummyHand.getHand();
Card[] temp = new Card[source.length];

// for loop:
for (int i = 0; i < source.length; i++)
    temp[i] = source[i];
Card[] temp = Arrays.copyOf(source, source.length);
Card[] hand = rummyHand.getHand();
Card[] temp = new Card[hand.length()];
System.arraycopy(hand,0,temp,0,hand.length());