我正在重新审视数据结构和算法以刷新我的知识,并且我偶尔会遇到这个问题:
通常,几个数据结构确实需要交换底层数组上的一些元素。所以我在ADT1,ADT2中实现swap()方法作为私有非静态方法。好处是,作为一个私有方法,我不需要检查参数,坏事是冗余。但是如果我把swap()方法作为公共静态方法放在一个帮助器类中,我需要每次检查索引的有效性,这使得交换调用在完成许多交换时非常低效。
那我该怎么办?忽略性能下降,或编写小而冗余的代码?
答案 0 :(得分:5)
更好的设计应始终胜过小的低效率。只有在实际证明是一个性能问题时才解决性能问题。
此外,你还在做什么样的检查?是不是自然抛出ArrayIndexOutOfBoundsException
和/或NullPointerException
足够好?
public static Collections.swap(List<?>,int,int
),java.util.Arrays
使{(1}})所有int[], long[], byte[], etc
重载(private static
。
我不确定Josh Bloch是否曾明确说明他为什么这样做,但有人可能会猜测它与他的书 Effective Java 2nd Edition 中的第25项有关:首选列表到数组。是的,使用List
时会出现“性能下降”,但它可以忽略不计,并且有很多优点可以弥补它。
答案 1 :(得分:2)
如果您不需要在私有方法中进行检查,请不要在静态方法中进行检查。这将导致RuntimeException
无效调用,但由于您的所有调用都应该有效,因此就好像您使用了私有方法一样。
答案 2 :(得分:1)
对于您的代码来说,效率低于复制(一些常量调用并不大)总是更好。至少这是我大学教的内容。
代码重复会产生错误。所以你更喜欢你的程序正常工作,而不是更快地工作。
如果你想阻止约束检查:我想到的是你可以接受自然抛出的异常作为polygenelubricants建议,或者为所有基于数组的数据结构创建一个抽象超类。该抽象类将具有不会检查参数的受保护方法交换。它并不完美,但我想一个不检查参数的受保护方法比没有这样做的公共方法更好。