我发现Java支持原始类型的常量折叠,但是String
s呢?
例
如果我创建以下源代码
out.write(""
+ "<markup>"
+ "<nested>"
+ "Easier to read if it is split into multiple lines"
+ "</nested>"
+ "</markup>"
+ "");
编译后的代码有什么内容?
组合版? out.write("<markup><nested>Easier to read if it is split into multiplelines</nested></markup>");
还是效率较低的运行时串联版本? out.write(newStringBuilder("").append("<markup>").append("<nested>").append("Easier to readif it is split into multiplelines").append("</nested>").append("</markup>").append(""));
这是一个简单的测试:
public static void main(final String[] args) {
final String a = "1" + "2";
final String b = "12";
System.out.println(a == b);
}
输出:
true
因此,是的,编译器将折叠。
问题内容: 嗨,我遇到过Java编译器使用了称为Constant Folding的东西。这是什么?以及如何影响? 问题答案: 常量折叠是编译器在其中查找包含编译时常量的表达式并将其替换为结果的地方,可有效删除多余的运行时计算。
请考虑以下简单代码: https://godbolt.org/z/i2kby7 您可以看到和都没有优化对的潜在调用。在我的理解中,这是正确的:抽象机器假设变量随时可能发生变化(例如,由于是硬件映射的),因此将初始化常数折叠为检查将是错误的。 > 这里讨论了消除对的读写操作:允许编译器优化本地volatile变量吗?(谢谢内森!)。我认为标准是非常清楚的,那些读写必须发生。但是这些讨论并不包括编译器
问题内容: 考虑这种情况: 通常,您希望编译器内联ONE和两个常量。但是,是否可以保证这种行为?您是否可以在运行时在类路径中部署不带Class1的Class2,并希望它在不考虑编译器的情况下工作,还是这是可选的编译器优化? 编辑:为什么这样做?好吧,我有一个常量,可以在应用程序的两个端之间共享(通过RMI的客户端和服务器),在这种特殊情况下,将常量放在只能位于该划分的一侧的类上会非常方便(因为从逻
看完这些讨论——问题1,问题2,文章 我对Java字符串常量池有以下理解(如果我错了,请纠正我): 编译源代码时,编译器会在我们的程序中查找所有字符串文字(放在双引号中的那些),并在堆区域中创建不同的(无重复)对象,并在称为字符串常量池(方法区域内的区域)的特殊内存区域中维护它们的引用。任何其他字符串对象都是在运行时创建的。 假设我们的代码有以下语句: 当编译上述代码时, 第1行:在堆中创建一个S
当使用文字创建字符串时,它会存储在池中。但当使用new运算符创建字符串对象时,它会将对象存储在堆中。 但是,堆中的对象只是一个指向存储在池中的文本的指针,还是一个存储在堆中的简单字符串对象,符合GC的条件?
问题内容: 我正在编写一个程序,其中用户以以下格式输入字符串: 我需要检查字符串中是否有数字 然后只提取数字。 如果我使用或,则无论输入的内容是什么,程序都无法在字符串中找到数字,但是仅在只有数字的情况下才能使用。 我可以使用什么作为查找和提取的解决方案? 问题答案: 我使用的解决方案如下所示: 我确信这不是一个完美的解决方案,但它满足了我的需求。谢谢大家的帮助。:)