String类
String 类对象代表不可变的Unicode字符序列,因此我们可以将String对象称为“不可变对象”。 什么叫做“不可变对象”呢?指的是对象内部的成员变量的值无法再改变。可以看一下它的源码:
我们发现字符串内容全部存储到value[]数组中,而变量value是final类型的,也就是常量(即只能被赋值一次)。 这就是“不可变对象”的典型定义方式。 查看JDK的文档就会发现,String类中每一个看起来会修改String值的方法,实际上都是创建了一个全新的String对象,以包含的字符串内容。而最初的String对象丝毫未动。
例如:
String s = "Google";
System.out.println("s = " + s);
s = "Runoob";
System.out.println("s = " + s);
输出结果为:
s = Google
s = Runoob
奇怪的是,从结果上看是改变了,不是说好的String对象是不可变的嘛,怎么就改变了呢?
原因在于实例中的 s 只是一个 String 对象的引用,并不是对象本身,当执行 s = "Runoob"; 创建了一个新的对象 "Runoob",而原来的 "Google" 还存在于内存中。
String类中常用方法
StringBuffer 和 StringBuilder
当对字符串进行修改的时候,需要使用 StringBuffer 和 StringBuilder 类。和 String 类不同的是,StringBuffer 和 StringBuilder 类的对象能够被多次的修改,并且不产生新的未使用对象。
打开AbstractStringBuilder的源码:
abstract class AbstractStringBuilder implements Appendable, CharSequence {
/**
* The value is used for character storage.
*/
char value[];
//以下代码省略
}
显然,内部也是一个字符数组,但这个字符数组没有用final修饰,随时可以修改。因此,StringBuilder和StringBuffer称之为“可变字符序列”。那两者有什么区别呢?
1. StringBuffer JDK1.0版本提供的类,线程安全,做线程同步检查, 效率较低。
2. StringBuilder JDK1.5版本提供的类,线程不安全,不做线程同步检查,因此效率较高。 建议采用该类。
由于 StringBuilder 相较于 StringBuffer 有速度优势,所以多数情况下建议使用 StringBuilder 类。然而在应用程序要求线程安全的情况下,则必须使用 StringBuffer 类。
常用方法列表:
序号 | 方法描述 |
1 | public StringBuffer reverse() 将此字符序列用其反转形式取代。 |
2 | public StringBuffer append(String s) 将指定的字符串追加到此字符序列。 |
3 | public insert(int offset, int i) 将 int 参数的字符串表示形式插入此序列中。 |
4 | replace(int start, int end, String str) 使用给定 String 中的字符替换此序列的子字符串中的字符。 |
5 | public delete(int start, int end) 移除此序列的子字符串中的字符。 |
public class TestStringBufferAndBuilder 1{
public static void main(String[] args) {
/**StringBuilder*/
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 7; i++) {
sb.append((char) ('a' + i));//追加单个字符
}
System.out.println(sb.toString());//转换成String输出
sb.append(", I can sing my abc!");//追加字符串
System.out.println(sb.toString());
}
}