Java的+号详解 与 字符串拼接的底层逻辑

+号详解:

    1 左右两边是数值型,做加法运算
    2 有一边是字符串,则拼接     
    3 两个字符串相加与两个字符相加截然不同
      数据库性别字段   到底用字符,还是字符串需要考量
      
    注意运算顺序:从左到右运算

字符串拼接的底层逻辑:

        前置知识:Java有字符串常量池的,凡是直接=出来的字符串对象(不是new的)都在常量池中

        全是常量拼接:有编译器的常量优化,相当于直接拼接,没有运算的

        有变量参与:

                Java8前:底层新new一个空stringbuilder对象,然后将=两边一个个放入拼接()调用append方法,每放入一 个就是一个新的stringbuilder对象,最后转为string对象(toString方法,底层就是new String())效率低

                java8后:jvm会估算拼接后的总长度,会先new一个空的stringbuilder对象,然后将=两边的字符串字符放入这个对象的底层数组中(不调用append方法,直接放入底层数组),最后转为string对象(toString方法,底层就是new String()),效率稍微高点

注意1:如果是有大量的字符串拼接,还是用stringbuilder好,不要用+号,否则会创建很多对象(很多stringbuilder对象和中间过程的string对象),影响效率

注意2:字符串常量池的对象和new出来的对象物理地址是不同的,==判断出来也是false-》面试题

                编译器的常量优化:如果字符串常量池有,会直接取,==判断的是true

注意3:stringbuilder底层:

        默认创建一个长度16的字节数组

        添加内容长度(字符串长度)小于16,直接存入

        大于16,数组会扩容为 原长度*2+2(添加一次,只会扩容一次)

                如果扩容后的长度还不够(先算长度,还每扩容,发现不够),会按实际长度扩容

        

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值