3

据我了解,如果是数组,JAVA 会根据数组的大小检查索引。因此array[i],与其在循环中多次使用,不如声明一个存储 的值的变量array[i],并多次使用该变量。

我的问题是,如果我有这样的课程:

public class MyClass(){

    public MyClass(int value){
      this.value = value;
    }

    int value;
}

如果我在其他地方创建这个类的一个实例:(MyClass myobject = new MyClass(7)),并且我必须多次使用对象值,是否可以myobject.value经常使用或者声明一个存储该值并多次使用的变量会更好,还是会一样?

4

3 回答 3

4

在您的情况下,它不会有任何区别,因为引用与引用新变量 myobject.value一样快速有效。int

此外,JVM 通常能够优化这些事情,除非你有高性能的关键代码,否则你不应该花时间担心它。只需专注于编写清晰易读的代码。

于 2012-09-02T21:19:37.973 回答
2

简短的回答是肯定的(实际上,在数组的情况下,它不仅要检查索引限制,还要计算您要查找的引用的实际内存位置 - 如 i=7,获取数组并添加 7 个单词-)。

长答案是,除非您真的大量使用该值我的意思是很多)并且您确实由于速度而受到限制,否则不值得增加代码的复杂性。此外,局部变量意味着您的 JVM 使用更多内存,可能会遇到缓存错误,等等。

一般来说,你应该更多地担心你的算法(the O(n))的效率,而不是这些小事情。

于 2012-09-02T21:21:11.700 回答
2

Java 编译器不是笨蛋。他会为你做优化。通常,您提供的所有选项之间的速度差异为 0。

我说“通常”是因为是否访问原始对象或您的本地副本并不总是相同的。如果您的数组是全局可见的,并且另一个线程正在访问它,那么这两种形式将产生不同的结果,并且编译器无法将其中一种优化为另一种。有可能某些东西让编译器误以为可能有问题,即使没有。然后它不会应用合法的优化。

但是,如果您没有做有趣的事情,编译器会看到您在做什么并为您优化变量访问。真的,这就是编译器所做的。这就是它的用途。

您需要在此之上至少优化一个级别。这个不适合你。

于 2012-09-02T21:39:04.683 回答