Java语言规范15.28规定了Java的常量表达式可以表示原始类型或者字符串;它们不但可以由纯粹的字面量构成,还可以包含能在编译时确定结果的运算,包括+、-、~、!、*、/、%、<<、>>、>>>、<、>、<=、>=、==、!=、&、|、^、&&、||、? :,还有指向上述类型的常量(final变量)的表达式。
所以下面的abc不会在运行时创建多个String,而是编译时就已经合并为一个String了。
public class JavaConstantExpression {
public static void main(String[] args) {
final long maxLong = Long.MAX_VALUE;
// results in a single String constant
String abc = "the integer " + (true ? maxLong : 0) + " is big";
}
}
编译的.class文件:
Compiled from "JavaConstantExpression.java"
public class JavaConstantExpression extends java.lang.Object
SourceFile: "JavaConstantExpression.java"
minor version: 0
major version: 50
Constant pool:
const #1 = Method #4.#13; // java/lang/Object."<init>":()V
const #2 = String #14; // the integer 9223372036854775807 is big
const #3 = class #15; // JavaConstantExpression
const #4 = class #16; // java/lang/Object
const #5 = Asciz <init>;
const #6 = Asciz ()V;
const #7 = Asciz Code;
const #8 = Asciz LineNumberTable;
const #9 = Asciz main;
const #10 = Asciz ([Ljava/lang/String;)V;
const #11 = Asciz SourceFile;
const #12 = Asciz JavaConstantExpression.java;
const #13 = NameAndType #5:#6;// "<init>":()V
const #14 = Asciz the integer 9223372036854775807 is big;
const #15 = Asciz JavaConstantExpression;
const #16 = Asciz java/lang/Object;
{
public JavaConstantExpression();
Code:
Stack=1, Locals=1, Args_size=1
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: return
LineNumberTable:
line 1: 0
public static void main(java.lang.String[]);
Code:
Stack=1, Locals=4, Args_size=1
0: ldc #2; //String the integer 9223372036854775807 is big
2: astore_3
3: return
LineNumberTable:
line 5: 0
line 6: 3
}
而下面代码的比较也会相等:
public class StringConstant {
public static void main(String[] args) {
String a = "123" + "456";
String b = "12" + 3456;
System.out.println(a == b); // true
}
}
即便混搭了字符串与数字的运算也没关系。
分享到:
相关推荐
常量折叠的概念是指在编译期间,编译器会将一些表达式计算好,不需要在运行时进行计算。 常量折叠的发生条件是编译期常量之间进行运算。编译期常量是指编译的时候就可以确定其值的常量,包括字面量、编译期常量进行...
常量折叠(Constant Folding)是Java编译器优化的一种技术,主要用于在编译阶段计算表达式的值,如果该表达式的所有操作数都是已知的常量,则可以在编译时计算出结果,并将该结果替换到程序中,从而避免运行时进行...
此外,ExpressionJ还提供了优化功能,例如常量折叠(constant folding)和表达式简化,这可以在一定程度上提高计算效率。但是,对于非常复杂的表达式,可能需要考虑其他的优化策略,比如预编译表达式或者使用更专业...
5. **优化**:在某些情况下,解析器可能包含对表达式的优化,例如常量折叠(预先计算已知结果的表达式)和死代码消除。 6. **性能**:解析速度和内存使用是衡量解析器性能的重要指标,尤其是当解析大量或复杂表达式...
- **优化**:可能需要对表达式进行优化,例如常量折叠、消去冗余计算等。 - **测试**:编写丰富的测试用例以验证计算器的正确性,包括边界条件和异常情况。 在实验文档中,你需要包含以下内容: - **需求分析**:...
3. **语义分析**:在语法树上执行类型检查,确保所有操作符与操作数匹配,同时进行常量折叠、求值优化等处理。 4. **代码生成**:对于解释器,这一步是直接执行;对于编译器,则会生成目标代码。在这个案例中,我们...
这包括类型检查、作用域解析、常量折叠以及对上下文的其他理解。例如,Java的语义分析器会检查变量是否在使用前已被正确声明,操作数类型是否匹配运算符,以及方法调用的参数数量和类型是否正确。在Java中,类加载器...
5. **代码优化**:在这个步骤,编译器可能会对中间代码进行各种优化,如删除冗余操作、常量折叠、死代码消除、循环展开等,以提高程序的运行效率。 6. **目标代码生成**:最后,中间代码被转换为目标机器语言,通常...
3. **语义分析**:这个阶段对AST进行检查,确保程序的正确性,如类型检查、作用域解析和常量折叠。此外,编译器还需要在此阶段生成中间代码,如三地址码,便于后续优化。 4. **代码生成**:最后,编译器将中间代码...
常量折叠是指在编译阶段就计算出表达式的值,如常量的加减运算,这样在运行时就无需再次计算。死代码消除则是指删除那些在程序运行中不会被执行的代码,提高运行效率。 总的来说,Java语法糖如自动装箱和自动拆箱,...
- 在Java中,可以使用正则表达式或自定义的扫描器类来实现词法分析器。例如,可以创建一个`Token`类来存储每个记号的类型和值,然后通过遍历源代码字符串匹配不同的模式。 2. **语法分析**: - 语法分析器根据...
5. **优化**:在生成字节码的过程中,编译器可能会进行一些优化,如删除无用的代码、常量折叠、局部变量合并等,以提高程序的运行效率。 6. **生成类文件**:最后,编译器将字节码写入到相应的.class文件中,每个类...
4. **优化**:为了提高程序的运行效率,编译器可能还会进行一些优化,比如删除无用代码、常量折叠、方法内联等。 5. **错误和警告报告**:如果源代码存在错误或潜在问题,编译器会向开发者报告错误信息和警告,帮助...
这包括类型检查、常量折叠、作用域管理等。在这个阶段,编译器会检查变量是否已声明,类型是否匹配,并进行必要的类型转换。Java中的类和接口可以用来表示语言的类型系统,帮助实现语义分析。 四、目标代码生成 ...
优化阶段旨在提高生成代码的效率,可能包括删除冗余计算、常量折叠、循环展开等。Java的编译器Javac就包含了一些基本的优化。 6. **目标代码生成**: 最后,编译器将中间代码转换为特定机器架构的目标代码,通常...
高级编译器可能会包含优化步骤,比如常量折叠(提前计算常数表达式的结果)、消元(简化冗余计算)和代码布局改进,以提高计算效率。 8. **用户界面**: 对于用户友好性,"ExpressionCalculate"可能提供了图形...
这一阶段还需要考虑优化,如死代码消除、循环展开和常量折叠等,以提升程序的运行效率。 在实际项目中,为了调试和测试编译器,会创建一系列测试用例,包括各种正常情况和边界情况。这些测试用例可以帮助验证编译器...
优化阶段旨在改进代码的效率,如删除冗余计算、进行常量折叠等。最后,代码生成将优化后的抽象语法树转换为目标机器的指令。 在Java环境下,编译原理的应用尤为重要,因为Java是一种跨平台的编译型语言。JVM(Java...
这包括类型检查、常量折叠、作用域解析等任务。在Java中,这通常涉及到类、对象、方法的调用,以及数据类型的匹配。 实验中提到的“递归下降语法制导翻译法”是一种常用的语义分析方法。递归下降分析基于语法的递归...
这包括类型检查、常量折叠和作用域分析等。在Java中,类型系统严格,语义分析尤为重要。 4. **中间代码生成**:编译器通常会生成一种高级的中间表示(如三地址码或抽象语法树),以便进行优化和目标代码生成。这种...