摘要:编译器发生了什么通过查看文件可以知道在编译的过程中间就将加直接处理成了但是如果是这样查看文件可以看出是而且可以看到表示在栈内存生成了一个引用变量指向堆内存的。
package com.spring; public class Day01 { public static void main(String[] args) { String b="aa"+"bb"; } }
String b="aa"+"bb"编译器发生了什么?
通过查看class文件可以知道:
// Compiled from Day01.java (version 1.5 : 49.0, super bit) public class com.spring.Day01 { // Method descriptor #6 ()V // Stack: 1, Locals: 1 public Day01(); 0 aload_0 [this] 1 invokespecial java.lang.Object() [8] 4 return Line numbers: [pc: 0, line: 10] Local variable table: [pc: 0, pc: 5] local: this index: 0 type: com.spring.Day01 // Method descriptor #15 ([Ljava/lang/String;)V // Stack: 1, Locals: 2 public static void main(java.lang.String[] args); 0 ldc[16] 2 astore_1 [b] 3 return Line numbers: [pc: 0, line: 17] [pc: 3, line: 19] Local variable table: [pc: 0, pc: 4] local: args index: 0 type: java.lang.String[] [pc: 3, pc: 4] local: b index: 1 type: java.lang.String }
在编译的过程中间就将加直接处理成了"aabb";
但是如果是这样:
package com.spring; public class Day01 { public static void main(String[] args) { String b="bb"; String c ="aa"+b; } }
查看class文件:
// Compiled from Day01.java (version 1.5 : 49.0, super bit) public class com.spring.Day01 { // Method descriptor #6 ()V // Stack: 1, Locals: 1 public Day01(); 0 aload_0 [this] 1 invokespecial java.lang.Object() [8] 4 return Line numbers: [pc: 0, line: 10] Local variable table: [pc: 0, pc: 5] local: this index: 0 type: com.spring.Day01 // Method descriptor #15 ([Ljava/lang/String;)V // Stack: 3, Locals: 3 public static void main(java.lang.String[] args); 0 ldc[16] 2 astore_1 [b] 3 new java.lang.StringBuilder [18] 6 dup 7 ldc [20] 9 invokespecial java.lang.StringBuilder(java.lang.String) [22] 12 aload_1 [b] 13 invokevirtual java.lang.StringBuilder.append(java.lang.String) : java.lang.StringBuilder [25] 16 invokevirtual java.lang.StringBuilder.toString() : java.lang.String [29] 19 astore_2 [c] 20 return Line numbers: [pc: 0, line: 16] [pc: 3, line: 17] [pc: 20, line: 19] Local variable table: [pc: 0, pc: 21] local: args index: 0 type: java.lang.String[] [pc: 3, pc: 21] local: b index: 1 type: java.lang.String [pc: 20, pc: 21] local: c index: 2 type: java.lang.String }
可以看出是new StringBuffer("aa").append("bb").toString();
而且可以看到astore_1 [b]表示在栈内存生成了一个引用变量指向堆内存的"bb"。而"aa"则没有引用变量指向。(可以查看JAVA指令集了解这些内容)
非常量字会串相加时,由于相加的变量中存放的是字符串的地址引用,
因为在编译时无法确切地知道其他具体的值,也就没有办法对其进行优化处理,这时为了
达到连接的效果,其内部采用了 StringBuffer 的机制进行处理。
堆内存java虚拟机可以直接使用。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/64345.html
摘要:因此,这三个类是各有利弊,应当根据不同的情况来进行选择使用当字符串相加操作或者改动较少的情况下,建议使用这种形式当字符串相加操作较多的情况下,建议使用,如果采用了多线程,则使用。 1.包装类与自动拆箱装箱 int a1= 1000;int a2=1000;if(a1==a2){System.out.println(yes);} ==的比较,基本数据类型看的是值是否相等,引用数据类型...
摘要:在本文,笔者将与大家概览的体系结构与工作方式。将第条和第条指令分别是将两个局部变量入栈,然后相加。最后一条指令是,这条指令执行完后当前的这个方法对应的这些部件会被回收,局部变量区的所有值将全部释放,寄存器会被销魂,在栈中与这个方 Java之所以号称一次编译,到处运行,主要原因是JVM屏蔽了各个计算机平台相关的软件(大多指系统)或者硬件之间的差异,使得与平台相关的耦合统一由JVM提供者来...
摘要:而所有的数据运算都是采用补码进行的。补码解决负数加法运算正负零问题,弥补了反码的不足。通过使用访问修饰符可以使实例变量对子类可见暂时在学习基础语法知识的时候可以暂时忽略实例变量这部分内容,这部分内容主要被使用在面向对象的部分,但是极其重要。 showImg(https://segmentfault.com/img/remote/1460000019264541?w=600&h=242)...
摘要:经典的基础面试题集锦经典的基础面试题集锦,欢迎收藏和分享。类变量或者说静态变量是通过这个关键字来声明的。非静态变量在每一个对象实例上都有单独的一份值。对象允许程序和数据进行封装,以减少潜在的干涉。 经典的Java基础面试题集锦 经典的Java基础面试题集锦,欢迎收藏和分享。 问题:如果main方法被声明为private会怎样? 答案:能正常编译,但运行的时候会提示main方法不是pub...
摘要:所以就想把一大串缩短点,将二进制中的三位用一位表示。以可以大写也可以小写开头版本可以表示二进制了八进制的数据表现形式由组成。结果把系数基数的权次幂相加即可。因为语言采用的是码来编码的。 1_(常量的概述和使用)* A:什么是常量(constant) 在程序执行的过程中其值不可以发生改变 B:Java中常量的分类 字面值常量 自定义常量(面向对象部分讲) C:字面值常量的...
阅读 2800·2021-10-08 10:12
阅读 3889·2021-09-22 15:45
阅读 2443·2019-08-30 15:52
阅读 2537·2019-08-29 18:44
阅读 2564·2019-08-29 12:37
阅读 1066·2019-08-26 13:36
阅读 2486·2019-08-26 13:34
阅读 1373·2019-08-26 12:20