gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:22:33 25 4
gpt4 key购买 nike

哪个更好?

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");
}
}

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

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

您对此有何看法?哪个方面更重要?这里的函数将被调用多次(假设至少 10 万次)。

最佳答案

在这两种情况下,这些都是 常量变量,如 JLS 4.12.4 中定义的那样.因此,不仅字符串“doSomethingmetrics”和“saySomethingmetrics”被驻留,“Metrics for doSomethingmetrics something”和“Metrics for saySomethingmetrics something”也是如此。 (是的,您需要在"is"之前添加一个空格。)

第一个版本逻辑上有一个稍微小一点的堆栈,但我希望 JIT 无论如何都能优化它。

我会使用您认为最易读的任何形式。如果您想确切了解您的特定应用的性能,那么与以往一样,正确的做法是对两种方式进行测试。

查看 javap -v 的结果,看起来第二种方法实际上有一个轻微的优势,因为未连接的字符串甚至不需要出现在常量池,因为无法到达它们。所以你应该看到你的类文件以这种方式变得越来越小。但同样,我非常怀疑它会产生任何影响。

关于Java - 在函数内部创建具有常量值的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40008102/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com