Java 我需要复制一组卡片,但我只得到了需要复制的阵列的地址
我需要制作一个卡数组的临时副本,我无法直接访问该数组,因为它位于另一个名为Hand的类中。我得到了一个名为getHand()的方法,该方法返回对类RummyHand中我需要的数组的引用,该类是Hand的子类。变量rummyHand是rummyHand类中的一个实例变量,是一个Hand对象。如果这很重要的话,我也在eclipse中工作 但这两者都不是: 卡[]临时=新卡[8] temp=rummyHand.getHand() 或者这个: 卡片[]温度=rummyHand.getHand() 已像我所想的那样复制了阵列。您可以使用或复制阵列,或者更简单地说,复制() 请注意,使用Java 我需要复制一组卡片,但我只得到了需要复制的阵列的地址,java,arrays,eclipse,Java,Arrays,Eclipse,我需要制作一个卡数组的临时副本,我无法直接访问该数组,因为它位于另一个名为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());