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(添加一次,只会扩容一次)
如果扩容后的长度还不够(先算长度,还每扩容,发现不够),会按实际长度扩容