JAVA String 相加编译器发生了什么?
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: 1public Day01();0 aload_0 [this]1 invokespecial java.lang.Object() [8]4 returnLine 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: 2public static void main(java.lang.String[] args);0 ldc <String "aabb"> [16]2 astore_1 [b]3 returnLine 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: 1public Day01();0 aload_0 [this]1 invokespecial java.lang.Object() [8]4 returnLine 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: 3public static void main(java.lang.String[] args);0 ldc <String "bb"> [16]2 astore_1 [b]3 new java.lang.StringBuilder [18]6 dup7 ldc <String "aa"> [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 returnLine 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虚拟机可以直接使用。
JAVA String 相加编译器发生了什么?相关推荐
- Java String相加底层原理
代码 String a = "a";String b = "b";String c = "c";String s1 = "a&qu ...
- java string string_深入理解Java:String
在讲解String之前,我们先了解一下Java的内存结构. 一.Java内存模型 按照官方的说法:Java 虚拟机具有一个堆,堆是运行时数据区域,所有类实例和数组的内存均从此处分配. JVM主要管理两 ...
- java string对象放在什么区域_java中String对象的存储位置
packagetest.string.equal;public classMain {/**创建了三个对象,"helloworld对象创建在常量池中",每次new String() ...
- java string 对象地址_Java中String对象的存储位置(学习笔记)
packagetest.string.equal;public classMain {/*** 创建了三个对象,"helloworld对象创建在常量池中",每次new String ...
- `java`学习笔记(十二)`Java`--`String``StringBuffer``StringBuilder`
Java–String&&StringBuffer&&StringBuilder 文章目录 `Java`--`String`&&`StringBuffe ...
- Java String类源码阅读笔记
文章目录 一.前置 二.String类源码解析 1.String类继承关系 2.成员变量 3.构造方法 4.长度/判空 5.取字符 6.比较 7.包含 8.hashCode 9.查询索引 10.获取子 ...
- [Java Performance] JIT编译器简介
使用JIT(Just-In-Time)编译器 JIT编译器概览 JIT编译器是JVM的核心.它对于程序性能的影响最大. CPU只能执行汇编代码或者二进制代码,所有程序都需要被翻译成它们,然后才能被CP ...
- Java String API 常用的String方法详解
标题 String类的特性 Java中String类的构造方法 String类的 intern() 注意还跟jdk有关 如何保证变量S指向的是字符串常量池中的数据呢? 关于String中 new St ...
- java --String类解决面试问题
2019独角兽企业重金招聘Python工程师标准>>> 1.概述 字符串对象是一种特殊的对象.String类是一个不可变的类..也就说,String对象一旦创建就不允许修改 Stri ...
最新文章
- CBGS : 三维点云物体检测的类平衡分组和采样(新自动驾驶数据集nScenes第一名算法)...
- SAP ABAP用户锁定标识USR02-UFLAG
- 关于扫描的一个比较好的网站
- 三维重建11:点云的全局特征和局部特征
- mysql sqlexception_c-很奇怪-mysql的sql :: SQLException未被其类型捕...
- Oracle常用的日期函数
- RSA攻击手法及相应例题解析
- 高级英语(张汉熙版)第一册学习笔记(原文及全文翻译)——2 - Hiroshima-The “Liveliest“ City in Japan (excerpts)(广岛——日本“最有活力”的城市)
- 《嵌入式系统 – NUC980 IoT应用开发实战指南(基于RT-Thread系统)》第3章 NUC980 IoT I2C实践
- 手动安装jenkins默认插件
- 如何设置payjs的微信jsapi支付目录
- 弗洛伊德 震惊二十世纪的一种分析
- .py文件转.pyc文件
- c3p0连接池拿不到连接导致系统崩溃的问题解决
- flt文件matlab,FLT文件格式.pdf
- 电子科技大学《图论及其应用》复习总结--第三章 图的连通性
- 数学运算中浓度问题解题技巧集锦
- 软件测试工具与软件测试管理工具的关系
- PyTorch实现 | 车牌OCR识别,《PyTorch深度学习之目标检测》
- linux查看websphereMQ版本,Linux上安装WebSphere MQ 7.1