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 相加编译器发生了什么?相关推荐

  1. Java String相加底层原理

    代码 String a = "a";String b = "b";String c = "c";String s1 = "a&qu ...

  2. java string string_深入理解Java:String

    在讲解String之前,我们先了解一下Java的内存结构. 一.Java内存模型 按照官方的说法:Java 虚拟机具有一个堆,堆是运行时数据区域,所有类实例和数组的内存均从此处分配. JVM主要管理两 ...

  3. java string对象放在什么区域_java中String对象的存储位置

    packagetest.string.equal;public classMain {/**创建了三个对象,"helloworld对象创建在常量池中",每次new String() ...

  4. java string 对象地址_Java中String对象的存储位置(学习笔记)

    packagetest.string.equal;public classMain {/*** 创建了三个对象,"helloworld对象创建在常量池中",每次new String ...

  5. `java`学习笔记(十二)`Java`--`String``StringBuffer``StringBuilder`

    Java–String&&StringBuffer&&StringBuilder 文章目录 `Java`--`String`&&`StringBuffe ...

  6. Java String类源码阅读笔记

    文章目录 一.前置 二.String类源码解析 1.String类继承关系 2.成员变量 3.构造方法 4.长度/判空 5.取字符 6.比较 7.包含 8.hashCode 9.查询索引 10.获取子 ...

  7. [Java Performance] JIT编译器简介

    使用JIT(Just-In-Time)编译器 JIT编译器概览 JIT编译器是JVM的核心.它对于程序性能的影响最大. CPU只能执行汇编代码或者二进制代码,所有程序都需要被翻译成它们,然后才能被CP ...

  8. Java String API 常用的String方法详解

    标题 String类的特性 Java中String类的构造方法 String类的 intern() 注意还跟jdk有关 如何保证变量S指向的是字符串常量池中的数据呢? 关于String中 new St ...

  9. java --String类解决面试问题

    2019独角兽企业重金招聘Python工程师标准>>> 1.概述 字符串对象是一种特殊的对象.String类是一个不可变的类..也就说,String对象一旦创建就不允许修改 Stri ...

最新文章

  1. CBGS : 三维点云物体检测的类平衡分组和采样(新自动驾驶数据集nScenes第一名算法)...
  2. SAP ABAP用户锁定标识USR02-UFLAG
  3. 关于扫描的一个比较好的网站
  4. 三维重建11:点云的全局特征和局部特征
  5. mysql sqlexception_c-很奇怪-mysql的sql :: SQLException未被其类型捕...
  6. Oracle常用的日期函数
  7. RSA攻击手法及相应例题解析
  8. 高级英语(张汉熙版)第一册学习笔记(原文及全文翻译)——2 - Hiroshima-The “Liveliest“ City in Japan (excerpts)(广岛——日本“最有活力”的城市)
  9. 《嵌入式系统 – NUC980 IoT应用开发实战指南(基于RT-Thread系统)》第3章 NUC980 IoT I2C实践
  10. 手动安装jenkins默认插件
  11. 如何设置payjs的微信jsapi支付目录
  12. 弗洛伊德 震惊二十世纪的一种分析
  13. .py文件转.pyc文件
  14. c3p0连接池拿不到连接导致系统崩溃的问题解决
  15. flt文件matlab,FLT文件格式.pdf
  16. 电子科技大学《图论及其应用》复习总结--第三章 图的连通性
  17. 数学运算中浓度问题解题技巧集锦
  18. 软件测试工具与软件测试管理工具的关系
  19. PyTorch实现 | 车牌OCR识别,《PyTorch深度学习之目标检测》
  20. linux查看websphereMQ版本,Linux上安装WebSphere MQ 7.1

热门文章

  1. Linux 命令 —— scp linux之间复制文件和目录
  2. 初识react-native
  3. linux 进程相关
  4. linux运维、架构之路-MySQL(一)
  5. Quartz.net持久化与集群部署开发详解
  6. 课程作业1:字符型强制转化为整型
  7. acm算法模板(1)
  8. IplImage简介
  9. A new image format for the Web
  10. SVM支持向量机——核函数、软间隔