1.String 字符串常量
String这个类被final修饰,当我们每次改变String值时,每次改变都等同于生成
一个新的String,然后指针指向新的String。所以我们频繁的改变String值时,
会频繁的生成新的对象,生成多的无用对象后,jvm就开始gc回收无用的对象,
速度就会变慢。
基于这种情况,String中引入了常量池,String s = “123” ; 这种String的赋值方式,会先从常量池中查找是否存在值相同的字符串,如果存在则不创建,直接从常量池中取出;如果不存在,则新建字符串,并放入常量池中。
但是:String s = new String(“123”);像这种情况不会去检查常量池,而是直接在堆中创建一个新的对象,当然也不会添加到常量池中。
注意: public native String intern();这个方法的返回值是
a string that has the same contents as this string, but is guaranteed to be from a pool of unique strings.
意思是:如果常量池中存在常量,则返回一个唯一的常量。如果没有,则返回 ” “
2.StringBuffer 字符串变量(线程安全)
当使用StringBuffer时,频繁改变字符串时,改变的是StringBuffer本身,
不会生成新的对象。StringBuffer是一个类似与String的字符串缓冲区,可以安全
的作用于多个线程,在必要的时机进行同步。所有的操作就好像串行顺序发生的,顺序
与所涉及的每一个线程调用方法的顺序一致。
3.StringBuilder字符串变量(非线程安全)
StringBuidler是StringBuffer的一个简单的替换,用在字符串缓冲区被单
个线程使用。在大部分情况下,StringBuilder会比StringBuffer速度快。
注意:StringBuilder和StringBuffer都继承AbstractStringBuilder这个类,存储的底层是一个char数组,默认的大小是16个字符.
StringBuilder与StringBuffer相比就是其中一些方法没有被synchronize修饰。