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”。

 	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"
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值