1.String创建对象问题

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”。
java 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个对象

下面是这些编译过后的代码,来帮助理解
java 反编译过后的class文件 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"

猜你喜欢

转载自www.cnblogs.com/chenghuanhuaning/p/11255654.html