经典问题:String什么时候创建对象。

转载自:https://www.cnblogs.com/darkclouds/p/11695166.html
:https://www.cnblogs.com/fatfatdachao/p/3220975.html

关于String str = new String(“abc”)创建对象

//问题1:

以下code生成几个String对象
   String a="abc";
   String b="abc";
   String c=new String("abc");
   String d=c.intern();
   
//答案:2个。

String源码中有一个value属性,保存着String对象的值,类型是char[],这说明了String的本质:字符串是字符的序列

执行String a= “abc”时,先在堆中创建一个String对像,jvm虚拟机会在栈中创建三个char类型的值:‘a’ ‘b’ ‘c’,然后在堆中创建一个String对象,值为char三个所组成是数组{‘a’,‘b’,‘c’},最后会将这个String放到字符串常量中去。
继续执行String c= new String(“abc”)时,由于在字符串池中已经有"abc",会直接共享字符串池中的"abc",之后在堆中新建一个String对象,所以为新建两个String对象。

//问题2:

输出结果为:
String a = "a";
String b = "b";
String str1 = "ab";
String str2 = "a"+"b";
String str3 = a+b;
System.out.println(str1 == str2);//答案:ture
System.out.println(str1 == str3);//答案:false

第一个答案:程序会将+自动优化让str2=“ab”,所以直接乘str1先前放在字符串池中的"ab"
第二个答案:系统会自动让两个String类型的值进行相加,然后自动使用new关键字构造方法

总结

1.当我们new String(“abc”)时有可能是创建1个对象也有可能创建2个,具体原因看字符串池中是否有相对应的值
2.String str = "abc"时有可能创建0个对象也有可能创建1个,具体原因看字符串池中是否有相对应的值
2.当我们进行a+b时系统会自动new关键字自动构造方法出来

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值