`

jvm对String常量加法的优化

    博客分类:
  • java
阅读更多
今天一个同事问我一道题目
String a = "ab"; 
String b = "a" + "b"; 
System.out.println((a == b));这个的结果是什么?为什么? 

String a = "ab"; 
String str = "b"; 
String b = "a" + str; 
System.out.println((a == b)); 
这个的结果是什么?为什么? 

String a = "ab"; 
final String str = "b"; 
String b = "a" + str; 
System.out.println((a == b)); 
这个的结果是什么?为什么?   

我一看觉得全都应该是false, 因为string+string会要重新创建对象嘛,这个知道的。
结果在eclipse的运行结果却是:
true
false
true
觉得十分不解, 问同事为何?
回答是:对于第一个,在JAVA代码进行编译时,JAVA编译器已经将String b="a"+"b";优化成String b="ab"; 然后,因为JVM中对字符串的操作是在栈中,所以在运行是,发现栈中已经有了"ab"所以就直接引用。故第一个是TRUE。
-----------------------------------------------------------------------
看来是jvm对常量加法有优化,在编译器能直接得到结果
对于第二个,因为str是变量,所以
String str = "b";
String b = "a" + str;
就不能优化成b="ab";

对于第三个,很明显了, str声明成了final的, 又变成了常量
所以又能简化成b="ab"了
分享到:
评论

相关推荐

    JVM指令手册.pdf

    包括加法、减法、乘法、除法等指令,如 `iadd`、`isub`、`imul`、`idiv` 等,它们对栈顶的两个int型数值进行运算,并将结果压回栈顶。 8. **类型转换系列** 如 `i2l`、`i2f`、`i2d` 用于将int类型转换为long、...

    java8rt.jar源码-mini-jvm:Go语言实现的JVM,实现了部分字节码的解释执行,学习JVM使用

    字符串常量,即String name = "hello, 世界" main方法中可以读取到命令行参数 对象字段读写、静态字段读写 方法重载、方法重写、接口方法调用、形参全部为int类型的static方法调用 支持虚方法表 native方法调用(本地...

    java面试题

    19. **String s=new String("xyz")创建对象数量**:这行代码创建了两个对象,一个是常量池中的"xyz",另一个是堆内存中新创建的String对象。 20. **length()方法**:数组有length属性,而不是length()方法;String...

    JAVA 从零学习用于复习

    - 长整型常量需以`l`或`L`结尾,如`123L`。 总结,Java学习涉及广泛的主题,从基本语法到高级特性,如多线程、网络编程和数据库交互。理解并熟练掌握这些概念是成为Java开发者的基石。在复习过程中,应注重实践,...

    java与j2ee面试锦集

    System.gc()是建议进行垃圾回收的,但实际何时执行由JVM决定。 9. **String对象创建**:`String s = new String("xyz");`创建了两个对象,一个在常量池,一个在堆。而`String s = "xyz";`只创建了一个对象在常量池...

    Java完美编程(第三版)

    可以使用双引号来创建字符串常量或变量,例如`String name = "John Doe";`。 **1.3.2 Concatenation of Strings** 字符串连接是指将两个或多个字符串组合成一个新的字符串。Java使用`+`操作符来进行字符串连接。...

    Java程序员面试题集常见题目经典精选汇总大全(1-50).docx

    以上只是Java面试中常见的部分知识点,Java程序员需要掌握的远不止这些,包括但不限于集合框架、多线程、网络编程、IO流、设计模式、数据库连接、JVM内存管理等。在实际面试中,还需要深入理解这些概念并能应用到...

    JAVA面试题(上).pdf

    在Java中,字符串对象的创建通常涉及到字符串常量池的使用,new String("xyz")实际上在堆上创建了两个对象。 内部类和静态嵌套类的区别在于,内部类可以访问外部类的所有成员,包括私有成员,而静态嵌套类则不能。...

    学会这些java面试题让你吊打面试官

    在Java SE 7之前,switch仅支持`byte`、`short`、`char`和`int`,Java SE 7开始支持枚举类型,Java SE 14引入了对`String`的支持。 以上是Java面试中常见的核心知识点,掌握这些内容将有助于提升面试自信,有效...

    spotify java面试题库.docx

    Integer与int在常量池中有优化策略差异。 13. Spotify(11.5)和Spotify(-11.5)的值取决于上下文,这可能是某种计算或音乐平台的API。 14. Overload是方法重载,可以改变参数列表但不能改变返回类型。Override是方法...

    Preliminary-questions-Java-Program.rar_applet javascript

    Java Application是独立的、完整的程序,可以直接通过Java虚拟机(JVM)执行。Java Application的执行始于main()方法,这是程序的入口点。编写Java Application时,你将接触到类的加载、实例化和控制流程管理。 在...

    Java程序员面试题.pdf

    一个是在常量池中的"xyz",另一个是堆内存中新创建的引用`s`指向的"xyz"实例。 3. 类型转换表达式`System.out.println("value is " + ((x>4)?99.9:9));`中,如果`x>4`,则输出`value is 99.9`,否则输出`value is 9...

    常出现的JAVA试题

    D选项"简单易学"虽然对Java语言来说是正确的,但不是JVM的执行特点。 4. **Java语言特点**:Java是面向对象的、安全的、可移植的,且支持分布计算。编译执行是错误的,因为Java代码被编译成字节码,然后由JVM解释...

    java学习资料,是我自己学的时候总结的一些知识点,希望可以帮助初学者,又不好的地方大家给出建议,一起学习

    Java的运算符包括加法,当两边之一是String时,会进行字符串拼接。分支结构如if...else和switch,其中switch需要注意case穿透问题,通常使用break来避免。循环结构有for、while和do...while。return语句用于结束方法...

    java程序员面试必备的32个要点

    `创建了两个对象,一个是常量池中的"xyz",另一个是堆内存中的新String对象。`String s = "xyz";`只会创建一个对象。 10. **Math.round方法**:`Math.round(11.5)`返回12,`Math.round(-11.5)`返回-11。round方法会...

    java 综合面试题

    除此之外,面试中可能还会涉及异常处理、多线程、集合框架的深入理解(如HashMap、LinkedList、ArrayList的区别)、IO流、设计模式、反射、垃圾回收机制、JVM内存模型等相关知识。理解并熟练掌握这些知识点对于通过...

    Java面试宝典 面试胸有成竹

    面试中,展示自己的专业能力和对Java的理解至关重要。以下是一些Java面试中常见的知识点详解: 1. Java源文件与类的关系:一个`.java`源文件可以包含多个类,但只能有一个公开的(public)类,且该公共类的名称必须...

    Java面试宝典2017

    34. StringBuffer是线程安全的字符串操作类,String是不可变的,每次对String的操作都会产生新的String对象。 35. 使用String.split()方法可以根据逗号分割字符串。 36. 数组有length属性,而String有length()方法...

Global site tag (gtag.js) - Google Analytics