【发布时间】:2016-12-14 15:28:33
【问题描述】:
字符串编译时常量(内部化字符串)和文字可以与 == 进行比较,因为如果它们以某种方式相等,则在编译时为它们分配相同的引用。
这是否意味着编译由 n 个字符串字面量组成的代码需要 n log(n) 时间来编译?
我在这里问这个问题是因为有人可能已经知道答案,我不确定我是否可以编写一个测试来以可靠、可重复或重要的方式测量效果。或者该测试将反映现实世界的约束等。
不过,我会发布我能想到的任何测试用例,欢迎提出一些建议,我会尽快实施。
【问题讨论】:
-
我记得上次我尝试将大约 100 kB 的文本放入 String 时,结果不太好。我相信编译时间也取决于字符串长度,但不确定其趋势
-
为什么编译时间会在这里不同?比较仍然在运行时进行。
-
@DaveNewton 使用 == 的字符串比较依赖于被实习的字符串,我认为会在字符串文字的编译时发生。
-
实习发生在编译时,我问如果
n是可实习字符串的数量,为什么会是n log(n)编译时间。在任何情况下,任何额外的时间对于合理大小的字符串都是微不足道的。 -
n log(n)的概念从何而来?查找实习字符串是O(1),因此实习字符串文字的时间是O(n),其中n是实习的不同 字符串的数量。编译器不实习字符串,它只是将字符串嵌入到类图像中。实习发生在班级初始化时。 JLS 指定它由String.intern完成。 docs.oracle.com/javase/specs/jls/se8/html/jls-3.html#jls-3.10.5
标签: java string compilation compile-time compile-time-constant