【问题标题】:Which is the safer method to define string constants [duplicate]哪个是定义字符串常量的更安全方法[重复]
【发布时间】:2019-12-10 17:14:41
【问题描述】:

我正在使用单独的文件在我的代码中定义一些字符串常量。

下面提供的示例在内存使用或其他标准方面是否会有差异。

public static final String sample1 = "this is a sample string";

public static final String sample2 = "this "+"is a "+"sample "+"string";

public static final String sample3 = sample1+sample2;

因为我将定义大量这样的字符串以用于我的 程序我想知道哪个是正确的方法,以优化内存使用。期待您的建议。

【问题讨论】:

  • 没有区别。
  • 我会推荐第一个选项。
  • @NaveenKulkarni 它们将被编译器组合起来。
  • 请注意,虽然这些都相同,但当您使用前缀时(例如使用多个配置键或指标名称)时,串联通常是一个好主意。
  • @Michu93 不。如果他们是final,他们完全一样。 static 与此无关。

标签: java string memory standards


【解决方案1】:

这些都是(编译时)常量表达式的例子。字节码编译器(例如 javac)将执行连接,以便在已编译的“.class”文件中的常量池中有一个字符串,用于分配给 sample1sample2 的值。而sample3 的值也是一个编译时常量……因为它是另外两个编译时常量变量的串联。

确定什么是常量表达式的规则很长(JLS 15.284.12.4),但是:

  • 字符串字面量是,
  • final 类型为 String 的变量是,前提是它们被初始化为编译时常量表达式,并且
  • 字符串连接是,只要操作数是常量表达式(某些类型,包括String)。

因此,sample1sample2 在性能、语义正确性、内存利用率或代码(“.class”文件)大小方面没有区别。唯一的区别是可读性。 (你可以判断。)

sample3 的值明显不同于sample1sample2。这是一个糟糕的例子。但就这些标准而言,方法是相同的。)

【讨论】:

  • static 没有出现在您的链接中。唯一有效的关键字是final,如“常量变量”中指向#4.12.4 的链接所示。
  • 已修复。 (我本来打算叫>>you
【解决方案2】:

没有区别。 static 变量在第一次遇到类时被初始化。从内存的角度来看,所有 3 个都是相等的,因为它们将相同的 String 加载到内存中。应该首选第一个选项,因为它更具可读性。

【讨论】:

  • 值得澄清的是,它们只加载相同的字符串,因为编译器结合了编译时常量字符串值。
  • @RakibulIslam 不。它的组成字符串是final,编译器在编译时就知道,所以在编译时连接起来。请参阅 JLS。
猜你喜欢
  • 2022-01-17
  • 1970-01-01
  • 1970-01-01
  • 2018-11-17
  • 2011-07-22
  • 1970-01-01
  • 2014-10-31
  • 1970-01-01
  • 2019-01-03
相关资源
最近更新 更多