据我所知,在数组的情况下,JAVA会根据数组的大小检查索引。
因此,不要在循环中多次使用array[i]
,最好声明一个存储array[i]
值的变量,并多次使用该变量。
我的问题是,如果我有这样的课程:
public class MyClass(){
public MyClass(int value){
this.value = value;
}
int value;
}
如果我在其他地方创建了这个类的实例:(MyClass myobject = new MyClass(7)
),并且我必须多次使用对象值,是否可以经常使用myobject.value
或者它会更好声明一个存储该值并使用多次的变量,或者它是否相同?
答案 0 :(得分:4)
在您的情况下,它不会有任何区别,因为引用myobject.value
与引用新的int
变量一样快速有效。
此外,JVM通常能够优化这些类型的东西,除非你拥有高性能的关键代码,否则你不应该花时间担心它。只需专注于编写清晰易读的代码。
答案 1 :(得分:2)
简短回答是肯定的(事实上,在数组的情况下,它不仅需要检查索引限制,而且要计算你要查找的引用的实际内存位置 - 在i = 7中,得到数组的基本位置并添加7个单词 - )。
答案很长,除非你真的使用那个值很多(我的意思很多)并且你因速度而受到限制,所以不值得增加复杂性码。除此之外,本地变量意味着您的JVM使用更多内存,可能会遇到缓存故障,等等。
一般来说,您应该更多地关注算法的效率(O(n)
),而不是担心这些微小的事情。
答案 2 :(得分:2)
Java编译器不是bozo。 He will do that optimization for you.通常,您提供的所有选项之间的速度差异为0。
我说“通常”因为访问原始对象或本地副本并不总是相同。如果您的数组是全局可见的,而另一个线程正在访问它,则这两个表单将产生不同的结果,并且编译器无法将其中一个优化为另一个。有些东西可能会让编译器误以为可能存在问题,即使没有。然后它将不会应用法律优化。
但是,如果您没有做有趣的事情,编译器将会看到您正在做的事情并为您优化变量访问。真的,这就是编译器所做的。这就是它的用途。
您需要至少优化一个级别。这个不适合你。