博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java 字符串使用+号的时候 到底发生了什么
阅读量:6859 次
发布时间:2019-06-26

本文共 2746 字,大约阅读时间需要 9 分钟。

hot3.png

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://my.oschina.net/oschenxiaomo/blog/611807

你可能感兴趣的文章
[04]javascript的数据类型
查看>>
[CC-SEABUB]Sereja and Bubble Sort
查看>>
JS设置cookie、读取cookie、删除cookie
查看>>
我的博客园的CSS和html设置
查看>>
数论基础(维诺格拉多夫著,裘光明译) 勘误
查看>>
vue-cookies的使用
查看>>
Code Signal_练习题_Make Array Consecutive2
查看>>
双向循环链表 初始化 插入 删除
查看>>
C#设计模式:职责链模式(Chain of Responsibility)
查看>>
Knockout.js随手记(2)
查看>>
条件注释判断IE浏览器
查看>>
Hibernate,删除对象时错误。
查看>>
C#中Cookies的读取
查看>>
冬季养生进补20招
查看>>
20179311《网络攻防实践》第四周作业
查看>>
《thinking in Java》第三章 控制程序流程
查看>>
《游戏引擎架构》笔记一
查看>>
pythoy-生成器
查看>>
Redis 分布式锁进化史
查看>>
Java 集合系列05之 LinkedList详细介绍(源码解析)和使用示例
查看>>