Java - 在函数内创建具有常量值的字符串

时间:2016-10-12 20:49:07

标签: java string memory-management

哪一个更好?

autocmd Filetype css setlocal tabstop=4

OR

public class A {
      private static final String DOSOMETHING_METRICS = "doSomethingmetrics";
      private static final String SAYSOMETHING_METRICS = "saySomethingmetrics";
      public void doSomething() {
            ...
            System.out.println("Metrics for " + DOSOMETHING_METRICS + "is something");
      }
      public void saySomething() {
            ...
            System.out.println("Metrics for " + SAYSOMETHING_METRICS + "is something");
      }
}

我认为方法1在内存优化的情况下获胜,因为编译器只分配了一次内存,垃圾收集器不需要解除分配在每个函数调用中创建的字符串。但是,我认为良好的编码实践建议变量应该绑定到必须使用的范围,并且常量应该定义为它们首先在方法2中胜出的程序中使用。

你对此有何看法?哪个方面更重要?这里的函数将被多次调用(至少要说100K次)。

2 个答案:

答案 0 :(得分:6)

在这两种情况下,这些都是JLS 4.12.4中定义的常量变量。所以不仅是字符串" doSomethingmetrics"和#34; saySomethingmetrics"实习生,但是#34; doSomethingmetrics的指标是"和#34; saySomethingmetrics的度量标准是"。 (是的,你需要在"之前添加空格"。)

第一个版本逻辑上的堆栈略小,但我希望JIT能够优化它。

我会使用你认为最具可读性的形式。如果您想确切了解特定应用中的性能,那么正如以往一样,正确的做法是测试两种方式。

查看javap -v的结果,看起来第二种方法实际上具有轻微的优势,因为非连接的字符串甚至不需要出现在常量池中因为没有办法接触他们。所以你应该看到你的类文件在这方面变得越来越小。但同样,我非常怀疑它会有什么不同。

答案 1 :(得分:1)

  

我认为方法1在内存优化的情况下获胜

在这两种情况下,你的字符串常量都会转到string pool并存储在那里。在第二种情况下,您需要重新分配空间以便在堆栈框架中引用您的变量。这就是为什么我认为第一个是首选的(但编译器可以优化第二种情况,它们将是相同的)。