java String 的+操作导致的问题

不说别的先看代码截图:

结果如下:

很好奇为什么String对象的null加上了""就等于"null"字符串了,先给点资料看看:

这个是我找的一个人博客上的截图,null不是任何对象的类型,那么这个到底是怎么实现的呢?

机制的我又找到了一点资料:

L0
 LINENUMBER 27 L0
 ACONST_NULL
 ASTORE 1
L1
 LINENUMBER 28 L1
 NEW java/lang/StringBuilder
 DUP
 INVOKESPECIAL java/lang/StringBuilder.<init> ()V
 ALOAD 1
 INVOKEVIRTUAL java/lang/StringBuilder.append (Ljava/lang/String;)Ljava/lang/StringBuilder;
 LDC "!"
 INVOKEVIRTUAL java/lang/StringBuilder.append (Ljava/lang/String;)Ljava/lang/StringBuilder;
 INVOKEVIRTUAL java/lang/StringBuilder.toString ()Ljava/lang/String;
 ASTORE 1
L2
 LINENUMBER 29 L2
 GETSTATIC java/lang/System.out : Ljava/io/PrintStream;
 ALOAD 1
 INVOKEVIRTUAL java/io/PrintStream.print (Ljava/lang/String;)这个是我找到的一个字节码的截图,就是java编译器对于+这个操作的优化,算了,直接说吧:当我们在程序中使用了字符串相加的话,编译器就会对这个进行优化,先实例化一个stringbuilder对象,然后把相加的字符串一个个的apend进去,然后就.tostring了,转换成字符串了。其中对于null会转换成null字符串来接收他。源代码如下:
/针对 String 对象
public AbstractStringBuilder append(String str) {
    if (str == null)
        return appendNull();
    int len = str.length();
    ensureCapacityInternal(count + len);
    str.getChars(0, len, value, count);
    count += len;
    return this;
}
//针对非 String 对象
public AbstractStringBuilder append(Object obj) {
    return append(String.valueOf(obj));
}

private AbstractStringBuilder appendNull() {
    int c = count;
    ensureCapacityInternal(c + 4);
    final char[] value = this.value;
    value[c++] = ‘n‘;
    value[c++] = ‘u‘;
    value[c++] = ‘l‘;
    value[c++] = ‘l‘;
    count = c;
    return this;
}

简单易懂,下面给个demo看看:

结果如下:


 
时间: 2024-10-24 20:54:29

java String 的+操作导致的问题的相关文章

java string常见操作题

1.string.操作方法,默认会生成一个新的string保存在常量池中,不会改变原来常量池中的string. 因为常量池,string是final的,一经创建无法改变. 看下面代码: String str = "abcde"; str.toUpperCase(); System.out.println(str); //输出还是abcde,而非ABCDE.因为string是final的,string的改变内容的操作方法会生成一个新的string在常量池中. 2.引用变量指向常量池中的新

[Java 泥水匠] Java Components 之一:Java String (肯定有你不懂的

作者:泥沙砖瓦浆木匠 网站:http://blog.csdn.net/jeffli1993 个人签名:打算起手不凡写出鸿篇巨作的人,往往坚持不了完成第一章节. 1.1 前言 说起String,大家最熟悉不过了.我也是那么说过,但是仿佛这熟悉的里面也有很多细节,或者是我们没掌握的东西.往往有很多旧东西里面爆出很多光点.比如,作者泥瓦匠近期在冬天的牛仔裤里面搜出了一张100现金(不宜乐乎).回到正题,我们下面以下几点讲下String.分两个部分:        基础部分:(JDK源码 文档) 1.2

[Java 泥水匠] Java Components 之一:Java String (肯定有你不懂的)

作者:泥沙砖瓦浆木匠 网站:http://blog.csdn.net/jeffli1993 个人签名:打算起手不凡写出鸿篇巨作的人,往往坚持不了完成第一章节. 1.1 前言 说起String,大家最熟悉不过了.我也是那么说过,但是仿佛这熟悉的里面也有很多细节,或者是我们没掌握的东西.往往有很多旧东西里面爆出很多光点.比如,作者泥瓦匠近期在冬天的牛仔裤里面搜出了一张100现金(不宜乐乎).回到正题,我们下面以下几点讲下String.分两个部分: 基础部分:(JDK源码 文档) 1.2 你好 Str

理解Java String和String Pool

本文转载自: http://blog.sina.com.cn/s/blog_5203f6ce0100tiux.html 要理解 java中String的运作方式,必须明确一点:String是一个非可变类(immutable).什么是非可变类呢?简单说来,非可变类的实例是不能被修改的,每个实例中包含的信息都必须在该实例创建的时候就提供出来,并且在对象的整个生存周期内固定不变.java为什么要把String设计为非可变类呢?你可以问问 james Gosling :).但是非可变类确实有着自身的优势

java String类用法

一.String 首先我们要明确,String并不是基本数据类型,而是一个对象,并且是不可变的对象.查看源码就会发现String类为final型的(当然也不可被继承),而且通过查看JDK文档会发现几乎每一个修改String对象的操作,实际上都是创建了一个全新的String对象. 字符串为对象,那么在初始化之前,它的值为null,到这里就有必要提下"".null.new String()三者的区别.null 表示string还没有new ,也就是说对象的引用还没有创建,也没有分配内存空间

Java String 综述(上篇)

摘要: Java 中的 String类 是我们日常开发中使用最为频繁的一个类,但要想真正掌握的这个类却不是一件容易的事情.笔者为了还原String类的真实全貌,先分为上.下两篇博文来综述Java中的String类.笔者从Java内存模型展开,结合 JDK 中 String类的源码进行深入分析,特别就 String类与享元模式,String常量池,String不可变性,String对象的创建方式,String与正则表达式,String与克隆,String.StringBuffer 和 String

java String、StringBuffer、StringBuilder

 1.简介 String是不可变类,且是线程安全的: StringBuffer是可变类,且是线程安全的: StringBuilder是可变类,且不是线程安全的. 注:“可变/不可变”指对该类对象进行修改操作时,是否会产生新的对象.对String对象进行修改时会产生新的对象, 对StringBuffer和StringBuilder对象修改时不会产生新的对象. String类的定义如下,使用了final关键字: 1 /** The value is used for character storag

java String 类 基础笔记

字符串是一个特殊的对象. 字符串一旦初始化就不可以被改变. String s = "abc";//存放于字符串常量池,产生1个对象 String s1=new String("abc");//堆内存中new创建了一个String对象,产生2个对象 String类中的equals比较字符串中的内容. 常用方法: 一:获取 1.获取字符串中字符的个数(长度):length();方法. 2.根据位置获取字符:charAt(int index); 3.根据字符获取在字符串中

JAVA使用和操作properties文件

java中的properties文件是一种配置文件,主要用于表达配置信息,文件类型为*.properties,格式为文本文件,文件的内容是格式是"键=值"的格式,在properties文件中,可以用"#"来作注释,properties文件在Java编程中用到的地方很多,操作很方便.Properties 类存在于包 Java.util 中,该类继承自 Hashtable. 1. getProperty ( String  key) ,   用指定的键在此属性列表中搜索