Java中String、StringBuffer、StringBuilder详解
StringBuffer和StringBuilder实现了Appendable(可拼接的)接口,所以其是可变的字符串
1. String
String在Java中经常使用,以至于有的时候很多初学者把它当做一个基本数据类型。但其实,你每次将一个字符串赋给一个变量,或者输出一个字符串,其实都是创建了一个字符串对象。比如说System.out.println(“hello world”);其实就是创建了一个字符串对象。
- String本质是一个引用对象,属于String类,当我们创建一个String类型的字符串的时候,本质上是建了一个String对象。
- 而在String类的源码中,String对象的创建本质是一个char数组。所以由于数组长度的不可变性,则决定了String字符串的字符序列是不可变的
String s = "Hello";
相当于
char[] data = {'H','e','l','l','o'};
String s = new String(data);
String s = “hello”;
以下代码并没有hello的字符串改变,而是新建了一个String对象指向s变量,hello和world同时存在堆内存中
String s = “world”;
2. StringBuffer(线程安全的,效率较低)
- StringBuffer代表一个字符序列可变的字符串。被创建以后可通过StringBuffer类提供的一系列方法来改变字符串。当需要使用这个StringBuffer字符串时,必须使用toString()方法将其转换为字符串对象。
- StringBuffer类中有一个transient 修饰的暂态char数组。创建对象时默认数组长度为16,当对象中容量占用超过一半时,数组会扩容。但是扩容效率低,推荐将初始StringBuffer长度定在一个合适的大小。
//创建一个空的StringBuffer对象,默认大小16
StringBuffer sb = new StringBuffer();
//通过String字符串创建StringBuffer对象,大小为字符串长度加16
StringBuffer sb = new StringBuffer("Hello");
//通过append方法追加字符串
sb.append(“world”);
//输出StringBuffer对象
System.out.println(sb.toString());
3. StringBuilder(线程不安全的,效率较高)
- StringBuilder与StringBuffer用法基本一致,但由于StringBuffer为线程安全的,效率较低。StringBuilder没有实现线程安全,则效率略高。通常情况下,应该考虑使用StringBuilder。