1

我正在处理一个处理 Java 数组操作的任务。现在我必须删除数组中间的元素。现在我知道数组一旦创建就不能改变长度。所以我决定创建一个新对象,并将以前的引用指向我的新数组。

public class A{
  public static void main(String[] args){
    B test = new B(val);
    test.cut(2,4);
    test.display();
  }

class B{    
  private Obj[] array;

  B(Obj val){
    construct something
  }

  public void cut(int i, int j){
     B newObject = new B(val);
        ...
     newObject.array = this.array;
     newObject = this;
  }
}

问题是当我显示测试对象时,它只会显示原始测试对象内容而不是 newObject 内容。由于这是一个 void 方法,我不能返回一个对象。那么如何引用新对象呢?我的 cut 方法的最后两行似乎根本没有效果。我知道 ArrayList 更适合这样的事情,但这是我们被迫使用数组的家庭作业。

4

3 回答 3

2

现在我知道数组一旦创建就不能改变长度。

这是真的。

但是指向对象实例内的数组的引用可以更改(因为您没有声明它):Bfinal

public void cut(int i, int j){

   Object[] newArray = new Object[len];

    //...  copying array content ...

   this.array = newArray;
}

当心诸如可变性导致的线程安全问题。可变对象通常不受欢迎...

于 2013-10-07T07:46:58.050 回答
0

如果分配规则允许使用 class Arrays,则可以使用以下方法代替您自己的cut方法:

newArray = Arrays.copyOfRange(oldArray, from, to);
于 2013-10-07T07:52:38.980 回答
0

在该方法中cut,您创建一个新对象,B然后将this引用分配给它。正如您所发现的那样,这没有效果,因为this引用(实际对象)根本没有改变, ThenewObject仅在此方法内部可见,一旦终止,对象就消失了。

当你在同一个班级B时,你不必仅仅为了改变它所持有的数据而创建它的新对象。您可以创建一个新数组并将原始内容复制到其中。

要复制内容,您可以使用System#arraycopy 方法。如果不允许您使用任何 jdk 帮助功能,那么您可以遍历原始数组并根据需要将元素复制到新数组中。

于 2013-10-07T07:54:52.817 回答