由于String在Java项目中使用非常广泛,为了解决重复创建String对象,引入字符串常量池,当创建一个字符串对象时,先在字符串常量池中查看(equals)是否存在相同值的字符串对象,存在则直接引用,不存在则创建并加入到字符串常量池。但是通过new方法创建的字符串对象不检查常量池,而是直接在堆区或栈区创建一个新的对象,也不会把对象放入池中。
String是不可变的,属性由final修饰,一旦创建则不能改变。当一个字符串在多线程共享,被频繁访问时,省去同步以及锁等待的时间,提高性能。String对象拼接时,都会创建一个新的对象。
StringBuffer和StringBuilder对象值是可变的,并且改变后对象的引用不变。底层内存中存储方式与String相同,都是有序的char字节数组。当一个对象被创建时,设置默认数组大小,当随着值越来越大,超过默认值,将创建一个新的数组,并将原数组的值复制到新数组上,丢弃原数组。 StringBuffer是线程安全,StringBuilder线程不安全。StringBuffer类中方法都由synchronized修饰,StringBuilder性能更优。