1.String创建对象问题
1.1 字符串常量池
定义:jvm针对字符串存储的一个特定内存区域。且里面内容都具有唯一性
1.2 创建对象单个说明
(1).String s = “abc” 在创建这个对象时,会在常量池中看有没有abc这个字符串;如果没有 此时还会在常量池中创建一个;如果有 则不创建。
(2).String s1 = “a” +“b”+“c” 在字符串常量相加时,编译器编译时产生的字节码,会把如 “a” +“b”+"c"优化为“abc”。所以只会产生一个对象
(3).String s = new String(“abc”); 在创建这个对象时因为使用了new关键字,所以肯定会在堆中创建一个对象。然后会在常量池中看有没有abc这个字符串;如果没有 此时还会在常量池中创建一个;如果有 则不创建。所以一共会产生两个对象
(4).String s = “abc”;String s1= s + “ab”; 在变量与常量进行相加时,‘+’可以理解:为利用加号进行拼接字符串。执行过程如下
(1.在底层内部中会生成新的StringBuilder对象,调用SringBuilder中的append方法进行拼接。大概执行代码如下:
new StringBuilder.append(s).append("ab");
(2.最后拼接完成之后会调用StringBuilder.toString()方法返回一个String的对象“abcab”。
new StringBuilder.append(s).append("ab").toString();
//StringBuilder.toString的JDK源码
@Override
public String toString() {
// Create a copy, don't share the array
return new String(value, 0, count);
}
(3.所以第二个语句会产生3个对象
特殊情况
(5).String s = “c”;String s1 = “a”+“b”+s+“d”+“f” ; 在底层内部进行判断时,在未出现变量之前的部分字符串还满足(2)中的情况,所以会进行自动拼接变成“ab”,出现了变量之后就不符合(2)中的情况,所以后面的字符串不会进行拼接。所以最后变为了:“ab”+s+“d”+“f”; 所以第二个语句中会产生5个对象
1.3面试题
1.String s1 = "a" +"b"+"c"; //1个对象
2. String s2 = "a"; //1个对象
String s3= s2 +"bc"; //3个对象
3.String s4 = new String("你") + s2 + "b"; //5个对象
-----------------下面代码与上面代码没有联系-------------------------------
1.String s6 = "a";
2.String s7= "b" +"c" + s6; //3个对象
3.String s8= s6 + "d" +"f" ; //4个对象
4.String s9= "ab" + "cd" + s6 + "b" +"c" //5个对象
下面是这些编译过后的代码,来帮助理解
1.String s1 = "abc";
2.String s2 = "a";
String s3 = s2 + "bc";
3.String s4 = new String("你") + s2 + "b";
-----------------下面代码与上面代码没有联系-------------------------------
1.String s6 = "a";
2.String s7 = "bc" + s6;
3.String s8 = s6 + "b" + "c";
4.String s9= "abcd" + s6 + "b" +"c"