我正在处理一个处理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对于这样的事情会更好,但这是一个家庭作业,我们不得不使用数组。
答案 0 :(得分:2)
现在我知道数组一旦创建就无法改变长度。
这是真的。
但是指向B
对象实例中的数组的引用可以被更改(因为你没有声明它final
) :
public void cut(int i, int j){
Object[] newArray = new Object[len];
//... copying array content ...
this.array = newArray;
}
谨防线程安全问题这种可变性原因。可变对象通常不赞成......
答案 1 :(得分:0)
如果分配规则允许使用课程Arrays
,则可以使用此代替您自己的cut
方法:
newArray = Arrays.copyOfRange(oldArray, from, to);
答案 2 :(得分:0)
在方法cut
中,您创建了一个B
的新对象,然后为其分配this
引用。这没有你发现的效果,因为this
引用(实际对象)根本没有改变,newObject
仅在此方法中可见,一旦终止,对象就消失了。
当你在同一个类B
时,你不必为了改变它所拥有的数据而创建一个新的Object。您可以创建一个新数组并将原始内容复制到该数组。
要复制内容,您可以使用方法System#arraycopy。如果你没有被允许使用任何jdk帮助功能,那么你可以循环遍历原始数组并将元素复制到新的元素中。