在课堂上我们正在构建一个可扩展的数组类。在创建这个时,我们创建了一个迭代数组的方法,然后我们创建了另一个使用完全相同的代码迭代列表的方法,但是不是调用前面的方法,而是重写了同一段代码。当我问我的教授我们为什么要重写代码而不是调用保存相同代码的早期方法时,他说它归结为效率。在重写一段代码和使用相同的代码调用方法之间效率如何变化?
班级代码
private void checkSize(int index){
if (index >= myArray.length){
throw new ArrayIndexOutOfBoundsException();
}
}
public void set(int index, T obj){
if (index >= myArray.length){
reinitalizeArray(index+1);
}
myArray[index] = obj;
}
为什么你可以通过调用checkSize()来尝试catch来重写set中的if语句?
private void checkSize(int index){
if (index >= myArray.length){
throw new ArrayIndexOutOfBoundsException();
}
}
public void set(int index, T obj){
try{
this.checkSize(index);
myArray[index] = obj;
}catch (ArrayIndexOutOfBoundsException exception){
reinitalizeArray(index+1);
}
}
答案 0 :(得分:0)
嗯,当您重复使用代码时,效率当然会更好,因为您不必重写它,而只需要测试一次。
性能可能会有所不同,具体取决于列表的实现。如果它是一个ArrayList,它应该不会有太大变化。如果它是另一个实现,它可能会产生巨大的差异。假设您使用了LinkedList。每次调用get(index)都会迭代整个列表,直到达到index元素,而对数组或ArrayList的相同调用将直接引用该元素并返回它。或者假设您使用Vector作为实现。在这种情况下,同步就在最重要的位置。
另外,代码至少会在"获得"元素:array [index]或list.get(index)
答案 1 :(得分:0)
Java代码是相同的,但生成的代码会有所不同。当您使用实数类型(例如List或Vector)时,编译的代码将包含对访问方法([])的直接引用,但是当您使用完全相同的代码和泛型类型(Enumeration)时,编译的代码将包含间接引用首先必须获得真正的类型,然后获得正确的访问方法。 我个人认为,在大多数情况下,以这种方式获得的表现并不值得。保持简短。
答案 2 :(得分:0)
你的"重用" variant使用流控制的异常。
这是不好的做法,应该保留例外以报告不可避免的错误,而不是简单地捕获预期的案例。
在性能方面也很糟糕,因为如果发生异常,会创建并初始化Exception对象,暂停正常的程序流,VM开始搜索匹配的catch块,然后从那里恢复执行。这也会给垃圾收集带来更多压力,因为异常需要在以后进行垃圾收集。
在你的建议中对checkSize()的调用也是完全超级的,因为如果数组太小,赋值myArray[index] = obj;
会抛出完全相同的异常。