1.为什么拼接时使用StringBuilder 不用String ?
1.
String是不可变对象,拼接时会创建一个全新的String对象来存放拼接后的结果2.
StringBuilder是可变 字符序列,所有拼接操作都是在同一个对象里面完成,不会产生额外临时对象
StringBuilder.append() 可以理解为追加
2.既然StringBuilder 拼接更高效,为什么不全部使用StringBuilder 而要区分String 和StringBuilder 呢?
两者的设计目标完全不同(
String为不可变,安全,高效复用 为目的,StringBuilder为可变,高效拼接 为目的,Java同时提供俩者是为了在不同的场景下平衡性能,安全,易用性
String的不可变提供了线程安全 (因为内容无法被修改,多个线程同时读取同一个String对象时,不会出现读取到脏数据的情况在
HashMap,HashSet等集合的键必须是稳定的,如果键的内容可变,哈希值(hashCode)会跟着变,导致无法找到对应的value【String的hashCode是根据内容计算的,当内容不变时,hashCode不会变化,是哈希表的理想键】Java为了节省内存设计出字符串常量池 ,相同的字符串只存在一份,所有的引用都指向这个对象,防止出现在修改a的内容后b查看到的内容也被修改
JavaString a = "abc"; String b = "abc"; //a和b指向的是常量池的同一个"abc"对象,内存只占一份
在网络传输,配置信息,密码存储 等场景中,希望用到的是一个不可变的对象-->
String
StringBuilder内部有数组,指针等额外结构,内存占比比String高