关于String、StringBuffer、StringBuilder的知识整理

一、String 字符串常量

简要的说, String 类型和 StringBuffer 类型的主要性能区别其实在于 String 是不可变的对象, 因此在每次对 String 类型进行改变的时候其实都等同于生成了一个新的 String 对象,然后将指针指向新的 String 对象,所以经常改变内容的字符串最好不要用 String ,因为每次生成对象都会对系统性能产生影响,特别当内存中无引用对象多了以后, JVM 的 GC 就会开始工作,那速度是一定会相当慢的。

顺便整理一些小知识:

String s1 = "0123";  生成一个对象放在常量池中

String s2 = new String("1231"); 生成了两个对象,一个是通过双引号创建的,一个是通过new创建的

== 判断的是符号左右两个引用是否指向同一个内存地址  ;“equals()”判断两个object是否“一样”


二、StringBuffer 字符串变量(线程安全)

StringBuffer每次结果都会对 StringBuffer 对象本身进行操作,而不是生成新的对象,再改变对象引用。

那么为什么StringBuffer是线程安全的呢?

因为StringBuffer类中的方法都是synchronized(同步)的,synchronized是线程安全的


三、StringBuilder 字符串变量(非线程安全)

java.lang.StringBuilder一个可变的字符序列是5.0新增的。此类提供一个与 StringBuffer 兼容的 API,但不保证同步。该类被设计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍)。如果可能,建议优先采用该类,因为在大多数实现中,它比 StringBuffer 要快。两者的方法基本相同。

 

1.使用String类的场景:在字符串不经常变化的场景中可以使用String类,例如常量的声明、少量的变量运算。

2.使用StringBuffer类的场景:在频繁进行字符串运算(如拼接、替换、删除等),并且运行在多线程环境中,则可以考虑使用StringBuffer,例如XML解析、HTTP参数解析和封装。

3.使用StringBuilder类的场景:在频繁进行字符串运算(如拼接、替换、和删除等),并且运行在单线程的环境中,则可以考虑使用StringBuilder,如SQL语句的拼装、JSON封装等。

posted @ 2018-04-07 23:19  昊Zz  阅读(207)  评论(0编辑  收藏  举报