文档章节

java 字符串使用+号的时候 到底发生了什么

陈小默
 陈小默
发布于 2016/01/30 19:20
字数 543
阅读 137
收藏 5
点赞 1
评论 0
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 <String "aabb"> [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 <String "bb"> [16]     
  2  astore_1 [b]     
  3  new java.lang.StringBuilder [18]     
  6  dup     
  7  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  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虚拟机可以直接使用


© 著作权归作者所有

共有 人打赏支持
陈小默
粉丝 5
博文 36
码字总数 31230
作品 0
武汉
程序员
Java开发每日复盘2018_0514

今天主要跟大家分享3个部分: 一、「Java的核心机制」 二、「Java命名规范」 三、「Java数据类型相关」 下面我们来一个一个的说: 「Java核心机制」 Java是一种强制面向对象的解释型语言(O...

ZeroOSTalk ⋅ 05/14 ⋅ 0

ThreadLocal可能引起的内存泄露

  threadlocal里面使用了一个存在弱引用的map,当释放掉threadlocal的强引用以后,map里面的value却没有被回收.而这块value永远不会被访问到了. 所以存在着内存泄露. 最好的做法是将调用thr...

天天顺利 ⋅ 06/15 ⋅ 0

java编程学习常见面试题及答案

Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于PC、数据中心、游戏控制台、科学超级计算机、移动电话和互...

Java小辰 ⋅ 05/22 ⋅ 0

Java编程学习常见的几大代码,Java开发者常犯的一些错误

Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于PC、数据中心、游戏控制台、科学超级计算机、移动电话和互...

Java小辰 ⋅ 05/17 ⋅ 0

Java多线程学习(二)synchronized关键字(2)

系列文章传送门: Java多线程学习(一)Java多线程入门 Java多线程学习(二)synchronized关键字(1) java多线程学习(二)synchronized关键字(2) Java多线程学习(三)volatile关键字 Ja...

一只蜗牛呀 ⋅ 04/16 ⋅ 0

Android JNI学习(四)——JNI的常用方法的中文API

本系列文章如下: Android JNI(一)——NDK与JNI基础 Android JNI学习(二)——实战JNI之“hello world” Android JNI学习(三)——Java与Native相互调用 Android JNI学习(四)——JNI的常用方法...

隔壁老李头 ⋅ 05/09 ⋅ 0

Python和Java的硬盘夜话

点击上方“程序员小灰”,选择“置顶公众号” 有趣有内涵的文章第一时间送达! 本文转载自公众号 码农翻身 这是一个程序员的电脑硬盘,在一个叫做“学习”的目录下曾经生活着两个小程序,一个...

bjweimengshu ⋅ 05/16 ⋅ 0

MyBatis传入参数与parameterType

传入简单类型 Java代码: MAPPER : 2. 传入List JAVA代码: 单独传入list时,foreach中的collection必须是list,不不管变量的具体名称是什么。比如这里变量名为idList, collection却是list。 ...

为了美好的明天 ⋅ 05/17 ⋅ 0

升级到JDK9的一个BUG,你了解吗

概述 前几天在一个群里看到一个朋友发了一个demo,说是JDK的bug,昨天在JVM的一个群里又有朋友发了,觉得挺有意思,分享给大家,希望大家升级JDK的版本的时候注意下是否存在这样的代码,如果...

你假笨 ⋅ 06/06 ⋅ 0

JAVA程序员面试题整理(较全面)

以下是在面试中可能会遇到的问题,话不多说,往下看 1、面向对象的特征有哪些方面? 2、访问修饰符public,private,protected,以及不写(默认)时的区别? 3、String 是最基本的数据类型吗? ...

编程大侠 ⋅ 04/09 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

IDEA创建SpringMVC+Mybatis+Maven项目

视频如下(加载有点慢请见谅,服务器不太好): 视频

影狼 ⋅ 12分钟前 ⋅ 0

前阿里P8架构师:精准定制Java架构师学习计划!

可以说,Java是现阶段中国互联网公司中,覆盖度最广的研发语言,掌握了Java技术体系,不管在成熟的大公司,快速发展的公司,还是创业阶段的公司,都能有立足之地。 有不少朋友问,除了掌握J...

java高级架构牛人 ⋅ 15分钟前 ⋅ 0

zookeper学习

https://blog.csdn.net/u012152619/article/category/6470028

~少司命~ ⋅ 16分钟前 ⋅ 0

Spring MVC ,JSON,JQuery,不懂JQuery,跳过了

/spring-mvc-study/src/main/webapp/course_json.jsp <%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%><!DOCTYPE html PUBLIC "-//W3C//DTD ......

颖伙虫 ⋅ 17分钟前 ⋅ 0

2018上海云栖大会workshop-日志数据采集与分析对接

摘要: 日志数据采集与分析对接 课程描述 通过日志服务采集用户、数据库、业务等访问数据。演示对于业务日志分析与处理,程序日志查询与监控,打通日志与数据仓库对接案例。 日志种类 网站访...

阿里云云栖社区 ⋅ 18分钟前 ⋅ 0

mahout demo

package com.datamine.CollaborativeFiltering.mysql; import org.apache.mahout.cf.taste.impl.neighborhood.NearestNUserNeighborhood; import org.apache.mahout.cf.taste.impl.recommend......

xiaomin0322 ⋅ 19分钟前 ⋅ 0

red hat openstack 12配置要求

安装 openstack 之前,一般要规划整个系统中,到底要多少台机器来参与openstack, 根据rhosp12的官方文档: 最低要求是3台物理机,1台作为director,一台作为 controller ,一台作为computer....

tututu_jiang ⋅ 20分钟前 ⋅ 0

Rocket-Chip在GitHub上的各个源码

在github上通过搜索Rocket-chip可以得到36个结果:其中 https://github.com/freechipsproject/rocket-chip https://github.com/ucb-bar/riscv-boom https://github.com/ucb-bar/fpga-zynq (......

whoisliang ⋅ 26分钟前 ⋅ 0

【HAVENT原创】CentOS 6.5 下 Nginx 的安装与配置

nginx是轻量级的Web服务器、反向代理服务器及邮件服务器,具有占用内存少,并发能力强的优点,已被广泛应用。本文介绍目前最新版本 1.12.2 的安装。 各版本nginx下载地址:http://nginx.org/...

HAVENT ⋅ 32分钟前 ⋅ 0

查看linux系统重启之前的log -- last_kmsg

当 Linux Kernel 出现 BUG 的时候,后走入 panic flow,这个时候由于 Kernel 出现了严重的问题,adbd 也无法响应 adb 连接请求,这个时候想透过读取 Kernel Log Buffer 来看 Kernel Log 是不...

zyzzu ⋅ 32分钟前 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部