String
String(出现在JDK1.0时代) 被final修饰,不可被继承,不可变字符序列
String:适用于少量的字符串操作的情况
String 属于不可变类,即一旦String对象被创建以后,对象中的字符序列是不可改变的,直至这个对象被销毁
String a = "12345";
a = "234567890";
System.out.println(a); //输出为234567890
上面实例中a的值好像被改变了,其实是a指向了新的字符串对象, “12345”这个对象并没有被改变,如果没有被再次引用,则会被垃圾回收
String实例化有两种方式:
方式1:String a = "12345";
//通过字面量方式为字符串赋值,此时的字符串存储在方法区的字符串常量池
方式2:String a = new String("12345");
//通过new+构造器方式实例化字符串,字符串对象存储在堆中,但是字符串的值仍然存储在方法区的常量池
StringBuffer
StringBuffer(出现在JDK1.0时代) 线程安全的可变字符序列
StringBuilder:适用于单线程下在字符缓冲区进行大量操作的情况
StringBuffer类中的方法都添加了synchronized关键字,保证线程安全
StringBuffer被创建以后,通过StringBuffer提供的append()、insert()、reverse()、setCharAt()、setLength()等方法可以改变字符串对象的字符序列,不会产生新的对象
StringBuffer stringBuffer = new StringBuffer("abcde");
stringBuffer.append("fgh");
System.out.println(stringBuffer); //输出abcdefgh
StringBuffer生成的字符串,可以调用toString()方法将其转换为一个String对象
StringBuilder
StringBuilder(出现在JDK1.5时代) 非线程安全的可变字符序列
StringBuilder:适用于单线程下在字符缓冲区进行大量操作的情况
StringBuilder使用方法和StringBuffer基本一样
StringBuilder stringBuilder = new StringBuilder("abcde");
stringBuilder.append("fgh");
System.out.println(stringBuilder); //输出abcdefgh
StringBuilder是1.5新引入的,其前身就是StringBuffer。StringBuilder的效率比StringBuffer稍高,如果不考虑线程安全,StringBuilder作为首选
线程安全性方面,StringBuffer允许多线程进行字符操作,因为在源代码中StringBuffer的很多方法都被关键字synchronized 修饰了,而StringBuilder没有