说明
字符串是一连串的字符序列,Java提供了String和StringBuffer两个类来封装字符串,并提供了系列方法来操作字符串对象。
String类是不可变类,即一旦一个String对象呗创建以后,包含在这个对象的字符串序列是不可改变的,直至这个对象被销毁。
StringBuffer对象则代表一个字符串序列可变的字符串,当一个StringBuffer被创建以后,通过StringBuffer提供的append、insert、reverse、setCharAt、setLength等方法可以改变这个字符串序列对象的字符串序列。一旦通过StringBuffer生成了最终想要的字符串,就可以调用它的toString方法将其转换为一个String对象。
JDK1.5又新增了一个StringBuilder类,它代表了字符串对象。实际上,StringBuilder和StringBuffer基本类似,两个
类的构造器和方法也基本相同。不同的是,StringBuffer是线程安全的,而StringBuilder则没有实现线程安全功能,所以性能略高。因此在通常情况下,如果需要创建一个内容可变的字符串对象,应该优先考虑使用StringBuilder类。
String类提供了大量构造器来创建String对象,其中如下几个有特殊用途:
String():创建一个包含0个字符串序列的String对象(并不是返回null)。
String(byte[]bytes,Charset
charset):使用指定的字符集将指定的byte数组解码成一个新的String对象。String(byte[]bytes,int offset,int length):使用平台的默认字符集将指定的byte数组的offset开始鼓、长度为length的子数组解码成一个新的String对象。
String(byte[]bytes,int offset,int length,String charsetName):使用指定的字符集将指定byte数组的offset开始、长度为length的子数组解码成一个新的String对象。
String(byte[]bytes,String charsetName):使用指定的字符集将指定的byte数组解码成一个新的String对象。
String(char[]values,int offset,int count):将指定字符串数组从offset开始、长度为count的字数组中的字符元素连缀 成字符串。
String(String original):根据字符串直接量来创建一个String对象。也就是说,新创建的String对象时该参数字符串的副本。
String(StringBuffer buffer):根据StringBuffer对象来创建对应的String对象。
String(StringBuilder builder):根据StringBuilder对象来创建对应的String对象。
String类也提供了大量方法来操作字符串对象,下面详细介绍这些常用方法:
- char charAt(int index):取字符串中的指定位置的字符,其中,参数index指的是字符串序数。如下代码:
String s = new String("abcdefghijklmn");
System.out.println("s.charAt(5):" + s.charAt(5));
输出结果:
s.charAt(5):5
- int compareTo(String anotherString):拿当前String对象与anotherString对象比较。如果两个字符串的字符序列相等则返回0;不相等时,从两个字符串第0个字符开始比较,返回第一个不相等的字符差,另一种情况,较长字符串的前面部分恰巧是较短的字符串,返回它们的长度差。
String s1 = new String("abcdefghijklmn");
String s2 = new String("abcdefghij");
String s3 = new String("abcdefghijalmn");
System.out.println("s1.compareTo(s2): "+s1.compareTo(s2);//返回长度差
System.out.println("s1.compareTo(s3): "+s1.compareTo(s3);//返回'k'-'a'的差
输出结果:
s1.compareTo(s2): 4
s1.compareTo(s3): 10
后面关于String的方法还有很多,详细了解可以查询api。这里就不赘述了。
StringBuilder
我们主要讲讲String和StringBuffer以及StringBuilder的区别:
String类是不可改变的,String实例一旦生成就不会再改变了,例如如下代码:
String str = “java” + “struts” + “spring”;上面程序除了使用4个字符串直接常量之外,还会额外生成2个字符串常量,其中“java”和“struts”生成了”javastruts”保存在内存中,接着“javastruts”与“spring”生成“javastrutsspring”字符串,并将它赋给str变量。因为String是不可变的,所以会额外产生很多的临时变量,使用StringBuffer或StringBuilder就可以避免这个问题。
StringBuilder、StringBuffer有两个属性:length和capacity,其中length属性代表了其包含的字符串序列长度,与String对象的length不同的是,StringBuilder、StringBuffer的length是可以改变的,可以通过length()和setLength(int len)方法里访问和修改其字符串序列的长度。capacity属性代表了StringBuilder的容量,capacity通常比length大,程序通常不关心capacity的属性。下面程序示范了StringBuilder类的用法:
public class TestStringBuilder {
public static void main(String[] args) {
StringBuilder sb = new StringBuilder();
//追加字符
sb.append("java");//sb="java";
//插入
sb.insert(0, "hello ");//sb="hello java";
//替换
sb.replace(5, 6, ",");//sb="hello,java";
//删除
sb.delete(5, 6);//sb="hellojava";
System.out.println(sb.toString());
//反转
sb.reverse();//sb="avajolleh";
System.out.println(sb.toString());
System.out.println(sb.length());//输出9
System.out.println(sb.capacity());//输出16
//改变StringBuilder的长度,将只保留前面部分
sb.setLength(5);//sb="avajo";
System.out.println(sb.toString());
}
}
上面的程序中示范了StringBuilder的基本操作,这些操作改变了StringBuilder里的字符序列,这就是StringBuilder与String之间最大的区别:StringBuilder的字符序列是可变的。
另外一个区别是String覆盖了equals方法和hashCode方法,而StringBuilder并没有覆盖这两个方法。