Java中字符串的创建以及相加问题

        这几天遇到一个字符串相加是否相等的问题,自己做了一些测试,发现和以前理解的不一样,于是搜索了一下,加上自己的理解,然后整理下来,方便以后自己学习。

        主要做了一下几个测试:

                String s1="happy";
String s2="ha"+ new String("ppy");
String s3="ha"+"ppy";
String s4="happy";
String s5=new String("happy");
System.out.println(s1==s2);
System.err.println(s1==s3);
System.out.println(s1==s4);

System.out.println(s1==s5);

输出的结果依次是:false,true,true,false;

1、字符串的创建过程

        字符串也是类,可以通过构造方法创建,这个很明显是创建的类,分配了堆栈。那么字符串类型直接赋值是怎样一个过程呢?这里涉及到一个东西,就是常量池。常量池是为了避免频繁的创建和销毁对象而影响系统性能,其实现了对象的共享。具体搜索常量池很多相关知识。这种直接赋值的创建方式会将值直接写入常量池中,再次赋值时,先去常量池找,如果有,就直接将内存地址给他,所以s1和s4是指向的同一对象。而s5通过new直接创建对象,创建堆,栈等过程,不会在常量池中去寻找,所以s1和s5的内存是不同的,s5是从新开辟的内存地址。

2、字符串的相加问题

       (1)先看String s3="ha"+"ppy",网上给的解释是:在编译期间,这种拼接会被优化,编译器直接帮你拼好,所以s3相当于直接赋值为“happy”,所以和上面的s4就一致了,直接去常量池中寻找到s1的内存地址,所以会出现s1==s3;

        (2)而相加的过程中一旦出现了对象,就不会做优化,因为这是一个对象,内存不是确定的,没有写死,无法实现优化。而且在相加的过程中,java会先new出一个StringBuilder,然后调用append()方法来将+号两遍的字符串拼接起来,然后toString()之后返回给=号左边的变量,也就是说,最后得到的是一个new出来的字符串,肯定与s1内存地址不同,所以为false。

总结:看起来很简单的东西,其实内部做了很多的考虑和优化,没能真正的理解内部实现机制,就不能很好的分析问题。以上也只是一些肤浅的认识,但能帮我理解一些东西。继续深入的话还有很多知识,以后慢慢学习吧。

参考:https://blog.csdn.net/zhongbeizhoujie/article/details/44549749


  • 8
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值