java 字符串(String)的对象分析

1、如果字符序列相同的对象是直接取自常量池,则都是同一个,用”==“运算符是true;

2、如果对象不是取自常量池,而是new出来的,则是不同的对象,即使字符序列相同。用”==“运算符是false;

String  s1 = "china";
String  s2 = "good";
final String s3 = "china";	
final String s4 = new String("china")
final String w1 = "china".toString();
final String w2 = s3+"";

String s5 = "chinagood";
String s6 = s1+s2; //在堆里面new的对象
String s10 =s1+"good";//在堆里面new的对象
String s7 = "china"+"good"; //编辑器会处理成一个字符串,就是常量池里面的chinagood
String s8 = s3+"good";    //编辑器会处理成一个字符串,就是常量池里面的chinagood
String s9 = s4+"good";    //编辑器没那么智能,会在堆里面new对象
String s11 = w1 +"good";   //编辑器还是没那么智能,会在堆里面new一个对象
String s12 = w2+"good";  //编辑器会处理成一个字符串,就是常量池里面的chinagood
String s13 = "china"+"good".toString();//编辑器没那么智能,会在堆里面new对象

s5==s6   false
s5==s7    true
s5==s8     true
s5==s9   false      
s5==s10  false
s5 ==  s11  false
s5 == s12   true 
s5== s13 false

小结:

①字符串用+进行拼接时,如果里面只有常量(不管是字面量常量还是自定义常量),则编辑器会自动处理成一个字符串对象(不会在堆里面new对象)并赋值给左边,需要注意的时,编辑器没有那么智能,如果这个表达式里面牵扯到方法的调用,或者表达式的自定义常量的赋值也牵扯到方法调用,new对象之类的,则编辑器处理不了,仍然会在堆里面new对象;

② String a = ”very“+”nice“ ;这条语句,如果此时常量池为空,只会在常量池里面创建一个verynice 的String对象,不会创建very 和nice,理由还是,编辑器会先处理成一个字符串;

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值