Java中的常量连接

时间:2013-11-25 19:23:26

标签: java

如果我有常量

public static final String PREFIX = "meter.";

public static final String READING = "reading";

public static final String LEVEL = "level";

我的代码是

run() {
dao.set("meter.reading", x);
dao.set("meter.level", y);
}

鉴于run()每天会被调用数百万次,

如下所示编写上面的代码会因为串联而降低我的性能吗?我想保持常量与前缀分开,因为它们在各种上下文中使用和不带前缀

run() {
dao.set(PREFIX+READING, x);
dao.set(PREFIX+LEVEL, y);
}

5 个答案:

答案 0 :(得分:6)

这不会降低性能,因为您使用的是编译时常量表达式。

PREFIX+READING

编译器将为您连接它,它将与您尝试过的字符串文字具有相同的性能。

JLS, Section 15.28定义了常量表达式:

  

编译时常量表达式是表示基本类型值的表达式或不突然完成的字符串,仅使用以下内容组成:

(其他选项)

  
      
  • 一元运算符+, - ,〜,和! (但不是++或 - )(§15.15.3,§15.15.4,§15.15.5,§15.15.6)
  •   

(其他选项)

  
      
  • 引用常量变量的简单名称(第6.5.6.1节)(§4.12.4)。
  •   

(其他选项)

  

String类型的编译时常量表达式总是“实例化”,以便使用String.intern方法共享唯一实例。

答案 1 :(得分:0)

没有任何其他方法可以使用strings进行连接。因此它不会生效。或者您可以使用StringBuffer进行更多连接操作

String test = new StringBuffer().append("aaaa").append("bbb").toString();

答案 2 :(得分:0)

字符串是不可变的,因此每次调用run()时都必须创建一个新的字符串对象。这是一个简单的操作,我怀疑你会遇到任何麻烦,因为你没有使用巨型字符串和高性能应用程序。

你应该没事。

答案 3 :(得分:0)

我认为性能影响微乎其微,但显然我错了。为什么不呢

public static final String PREFIX = "meter.";

public static final String READING = PREFIX + "reading";

public static final String LEVEL = PREFIX + "level";

答案 4 :(得分:0)

我认为它将被优化并且在String实习生缓存中,并且它将使用StringBuilder(取决于您的jDK,在较旧的JDK中它将使用StringBuffer)来构造该缓存副本一次。在我的系统上打印true然后true,请注意我在此测试中对两个字符串正确使用'=='。因为这些字符串都是对同一个缓存的String的引用。

public static final String PREFIX = "meter.";
public static final String READING = "reading";
public static final String C = PREFIX + READING;

public static void main(String[] args) {
  String a = PREFIX + READING;
  {
    String b = PREFIX + READING;
    System.out.println(a == b);
    System.out.println(a == C);
  }
}