- class Demo2
- {
- public static void main(String args[])
- {
- String s = null;
- s += "abc"; //jvm是如此运行的s = (new StringBuilder(String.valueOf(s))).append("abc").toString());
- System.out.println(s.toString());
- }
- }
复制代码
/**
字符串的拼接(既有“+”号出现)的问题:
一、只有字符串的时候,直接将两个字符串拼接在一起,在方法区常量池寻找,看是否有和拼接后相同的字符串,
若是有,就把已经有的地址值赋值,否则就在常量池开辟空间存放拼接后的字符窜,并把地址值赋值。
例子:
String str1="hello"; //常量池开辟空间存放“hello”,并将地址赋值给str1
String str2="world"; //常量池开辟空间存放“world”,并将地址赋值给str2
String str3="helloworld"; //常量池开辟空间存放“helloworld”,并将地址赋值给str3
String str4="hello"+"world"; //先将两个字符串拼接,在方法区内存中寻找看是否有相同内容的,发现有,就把已经有的地址值赋值给str4.
System.out.println(str3==str4);
结果就是true,因为两者指向了同一个内存地址。
二、若是有变量参与的时候,就会创建new StringBuilder()对象
并且引用型变量会首先调用 String.valueOf(obj),然后String.valueOf(obj)的具体实现是:
return obj == null ? "null" : obj.toString(),
由于obj所属的对象不同,其输出的内容不也不同,
若是没有重写Object类中的tostring()方法,那么就是其内存地址值了,要是重写就是其重写后方法输出。(一般情况都是字符串变量)
然后使用stringbuilder的append()方法将获得字符串添加进容器,最后,stringbuier调用tostring()方法,得到字符串。
即如:String str=s+"aa";//其中s是一个对象的应用,引用性变量(实际上基本数据类型也是适用的)
jvm解析:
String str=(new StringBuilder().append(String.valueof(obj)).append("aa").toString());
String str=(new StringBuilder().append(String.valueof(obj== null ? "null" : obj.toString())).append("aa").toString());
实际上打印的时候,println会再调用引用对象,tostring方法,实际上这个时候都是字符串了,就是默认调用其tostring()方法
}
}
|
|