Java 代码中的字符串常量/文字是否会大大降低编译速度?

Java 代码中的字符串常量/文字是否会大大降低编译速度?,java,string,compilation,compile-time,compile-time-constant,Java,String,Compilation,Compile Time,Compile Time Constant,字符串编译时常量(内部化字符串)和文本可以和==进行比较,因为它们在编译时被分配了相同的引用,如果它们以某种方式相等 这是否意味着编译由n个字符串文本组成的代码需要n个log(n)时间来编译 我在这里问这个问题是因为有人可能已经知道答案,我不确定我能不能写一个测试,以可靠的、可复制的或重要的方式来衡量效果。或者该测试将反映现实世界的约束等 我将发布我能想到的任何测试用例,请随意提出一些建议,我会在有时间的时候尽快实现它们 代码中的字符串常量/文字是否会大大降低编译速度 没有 字符串编译时常量(内

字符串编译时常量(内部化字符串)和文本可以和==进行比较,因为它们在编译时被分配了相同的引用,如果它们以某种方式相等

这是否意味着编译由n个字符串文本组成的代码需要n个log(n)时间来编译

我在这里问这个问题是因为有人可能已经知道答案,我不确定我能不能写一个测试,以可靠的、可复制的或重要的方式来衡量效果。或者该测试将反映现实世界的约束等

我将发布我能想到的任何测试用例,请随意提出一些建议,我会在有时间的时候尽快实现它们

代码中的字符串常量/文字是否会大大降低编译速度

没有

字符串编译时常量(内部化字符串)和文本可以和==进行比较,因为它们在编译时被分配了相同的引用,如果它们以某种方式相等

不,他们不是。它们在编译时汇集到.class文件的constants区域中,并在类加载时(分配引用时)被暂存

这是否意味着编译由n个字符串文本组成的代码需要n个log(n)时间来编译

不,这里没有固有的O(N log(N))进程。在任何合理的实现中,池都是通过哈希表实现的O(1),内部也是如此


[当然可以构造一个编译器或
intern()
方法,它是O(N log(N)),或O(N^3)或更糟的,但你的问题中没有任何东西涉及到它。]

我记得上次我试图将大约100KB的文本放入字符串中时,结果不是很好。我相信编译时间也取决于字符串长度,但不确定其趋势为何编译时间会有差异?比较仍然在运行时进行。@DaveNewton字符串比较使用==取决于被插入的字符串,我认为这会发生在字符串文本的编译时。插入发生在编译时,我想问,如果
n
是可插入字符串的数量,为什么会是
n log(n)
编译时。在任何情况下,对于大小合理的字符串来说,任何额外的时间都是微不足道的。
nlog(n)
的概念从何而来?查找插入的字符串是
O(1)
,因此插入字符串文字的时间是
O(n)
,其中
n
是要插入的不同字符串的数量。编译器不会将字符串插入内部,它只是将字符串嵌入到类映像中。实习发生在类初始化时。JLS指定由
String.intern
完成@每个字符串在编译时都存储在哈希表中。或者你问的是运行时?那么你问的是运行时?回答别人问你的问题很有帮助。你需要考虑空间成本以及时间成本。运行时字符串池直到Java 1.3前后才被垃圾收集,因此在此之前它将是一个巨大的空间浪费,因此设计了
intern()。大多数正在执行的Java程序中,有一半的对象是字符数组和包含它们的字符串。是的,在任何合理的实现中,正如我在回答中所说的那样。