String、StringBuffer和StringBuilder的区别和选择

1.String、StringBuffer和StringBuilder的区别

1)StringBuilder和StringBuffer非常类似,均代表可变的字符序列,而且方法也一样。

2)String保存的是字符串常量,里面的值在常量池里不能更改,每次String类的更新实际上就是更新地址,效率低,但是常量池里的常量可以被其他String指向地址使用,复用率高。总结:不可变字符串序列,效率低,但是复用率高。

3)StringBuffer保存的是字符串变量,在堆里面的值可以更改,每次StringBuffer的更新实际上可以更新内容,不用更新地址,效率高,看源码有synchronized关键字,做了同步处理,可在多线程使用,线程安全。总结:可变字符串序列,效率较高(增删),线程安全。

4)StringBuilder保存的是字符串变量,该类提供一个与StringBuffer兼容的API,但看源码没有synchronized关键字,没有做同步处理,线程不安全。该类被设计用作StringBuffer的一个简易替换,用在字符串缓冲区被单个线程使用的时候,如果可能,建议优先采用该类,因为在大多数实现中,它比StringBuffer要快。总结:可变字符串序列,效率高,线程不安全。

5)String使用注意说明:string s="a";//创建了一个字符串 s+="b";//实际上原来的“a”字符串对象已经丢弃了,现在又产生了一个字符串s+"b"(也就是"ab"),如果多次执行这些改变字符串内容的操作,会导致大量副本字符串对象残留内存中,降低效率,如果这样的操作放到循环中,会极大影响程序的性能。总结:如果我们对String做大量修改,不要用String。

2.String、StringBuffer和StringBuilder的选择

1)如果字符串存在大量的修改操作,一般使用StringBuffer或StringBuilder

2)如果字符串存在大量的修改操作,并在单线程的情况,使用StringBuilder

3)如果字符串存在大量的修改操作,并在多线程的情况,使用StringBuffer

4)如果我们的字符串很少修改,被多个对象引用,使用String,比如配置信息等

你可能感兴趣的:(Java基础,java,开发语言)