Java、类成员还是方法局部变量:哪一个性能更好?

Java、类成员还是方法局部变量:哪一个性能更好?,java,class,methods,reference,Java,Class,Methods,Reference,我想知道类成员变量和方法局部变量在性能上的区别。这里是解释 这是针对类成员变量的 public class Foo{ static String ref; public static void union(String a, String b){ ref= a+b; } } public class Foo{ public static void union(String a, String b){

我想知道类成员变量和方法局部变量在性能上的区别。这里是解释

这是针对类成员变量的

    public class Foo{
      static String ref;
      public static void union(String a, String b){
       ref= a+b;
       }
    }
      public class Foo{

      public static void union(String a, String b){
       String ref= a+b;
       }
    }
这是针对局部变量的方法

    public class Foo{
      static String ref;
      public static void union(String a, String b){
       ref= a+b;
       }
    }
      public class Foo{

      public static void union(String a, String b){
       String ref= a+b;
       }
    }

假设我经常调用这个函数,在第二个示例中,JVM是否每次引用ref时都会创建(如果是,我是否应该像第一个示例那样编写?)或者JVM创建一次并始终使用它?

类字段将从类内的多个方法中可用,而
局部变量只能从方法内访问。只有当类字段确实是类的属性时,才能使用
类字段,否则请将其保留为本地字段。

此处需要区分两件事:

  • 变数
  • 物体
在这两种情况下,将为表达式
a+b
创建一个新的
String
对象

使用类字段存储结果时,每次都使用相同的内存。内存在堆的某个地方。但是:如果您同时从多个线程调用该方法,它们都将使用相同的内存来存储结果,并且它们将覆盖结果。这意味着一个线程可能会看到另一个线程的结果,这是不好的

使用局部变量时,每个方法调用都会使用新内存。但这是调用堆栈上的本地内存,实际上不需要任何成本。另外,您可以同时从多个线程调用您的方法


因此,您应该使用第二个代码段。

您的第一个示例将无法编译:您无法从静态上下文访问实例字段。您应该删除
静态
方法修饰符。对不起,我编辑了。我忘了写静态关键字@tt_emrah不要担心什么是最有效的,担心什么是正确的,相信Java做正确的事情。@Louis Wasserman是的,你是对的,只是好奇:)事实上,用法取决于上下文。你不能决定哪一个更好,除非你知道它将要被实现的条件!它们都有各自的目的/用途。若要比较同一类的多个对象的类字段呢?每次我用不同的参数调用方法时,JVM都会创建一个新对象并与ref链接,对吗?我选择哪一个不同?是的,不同。在第二个示例中,在执行方法
union
之后,您无法再访问
ref
。在第一个示例中,您仍然可以通过编写
Foo.ref
来访问结果。是的,我知道这一点,但我只是想知道性能的不同。在第二个示例中,我知道JVM在堆栈evey方法调用中创建了一个引用。这是正确的吗?它会降低性能成本吗?实际上,局部变量不会带来任何成本。它们可能比类成员字段更便宜,因为Java优化器可能在某些情况下完全消除它们。对于类成员字段,这通常是不可能的。