一、String
1、String 类代表字符串。Java 程序中的所有字符串字面值(如 "abc" )都作为此类的实例实现。
2、字符串是常量;它们的值在创建之后不能更改。字符串缓冲区支持可变的字符串。因为 String 对象是不可变的,所以可以共享。
3、string的常用方法
(1)1、length() 字符串的长度,String length() 是针对数组来说的
例:char chars[]={'a','b'.'c'};
String s=new String(chars);
int len=s.length();
(2)charAt() 截取一个字符
例:char ch;
ch="abc".charAt(1); 返回’b'
(3)startsWith()和endsWith()
startsWith()方法决定是否以特定字符串开始, endWith()方法决定是否以特定字符串结束
(4)equals()和==
equals()方法比较字符串对象中的字符,==运算符比较两个对象是否引用同一实例。
例:String s1="Hello";
String s2=new String(s1);
s1.eauals(s2); //true
s1==s2;//false
(5)substring()截取一段字符。它有两种形式,遵循前闭后开的原则。
第一种是:String substring(int startIndex);
第二种是:String substring(int startIndex,int endIndex)
(6)replace() 替换
它有两种形式,第一种形式用一个字符在调用字符串中所有出现某个字符的地方进行替换,形式如下:
String replace(char original,char replacement)
例如:String s="Hello".replace('l','w');
第二种形式是用一个字符序列替换另一个字符序列,形式如下:
String replace(CharSequence original,CharSequence replacement)
用后一个字符串替换前一个字符
(7)java.lang.String.contains() 方法返回true,当且仅当此字符串包含指定的char值序列 返回值为boolean
(8)concat()连接字符串:string1.concat(string2);
(9)String trim() 返回字符串的一个副本,开头和结尾的空格去除。
二、StringBuffer
1、StringBuffer是线程安全的可变字符序列。一个类似于 String
的字符串缓冲区,但不能修改。虽然在任意时间点上它都包含某种特定的字符序列,但通过某些方法调用可以改变该序列的长度和内容。
2、可将字符串缓冲区安全地用于多个线程。可以在必要时对这些方法进行同步,因此任意特定实例上的所有操作就好像是以串行顺序发生的,该顺序与所涉及的每个线程进行的方法调用顺序一致。
3、StringBuffer上的主要操作是 append 和 insert方法,可重载这些方法,以接受任意类型的数据。每个方法都能有效地将给定的数据转换成字符串,然后将该字符串的字符追加或插入到字符串缓冲区中。append方法始终将这些字符添加到缓冲区的末端;而 insert方法则在指定的点添加字符。
三、StringBuilder
1、一个可变的字符序列。此类提供一个与 StringBuffer兼容的 API,但不保证同步。该类被设计用作 StringBuffer的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍)。如果可能,建议优先采用该类,因为在大多数实现中,它比 StringBuffer要快。
2、在 StringBuilder上的主要操作是 append和 insert方法,可重载这些方法,以接受任意类型的数据。每个方法都能有效地将给定的数据转换成字符串,然后将该字符串的字符追加或插入到字符串生成器中。append方法始终将这些字符添加到生成器的末端;而 insert方法则在指定的点添加字符。
例如:
如果 z引用一个当前内容为 "start" 的字符串的生成器对象,则该方法调用 z.append("le")将使字符串生成器包含 "startle",而 z.insert(4, "le")将更改字符串生成器,使之包含 "starlet"。
3、通常,如果 sb 引用 StringBuilder的实例,则 sb.append(x)和 sb.insert(sb.length(), x)具有相同的效果。每个字符串生成器都有一定的容量。只要字符串生成器所包含的字符序列的长度没有超出此容量,就无需分配新的内部缓冲区。如果内部缓冲区溢出,则此容量自动增大。
4、将 StringBuilder的实例用于多个线程是不安全的。如果需要这样的同步,则建议使用 StringBuffer。
四、String、StringBuffer、StringBuilder的区别
1、String是字符串常量,StringBuffer、StringBuilder是字符串变量
(1) 因为我们经常会做这样的操作:
String s = "asd";
s = s+1;
System.out.print(s);// result : asd1
感觉上s是变了,其实不是。在JVN中是这样执行这段代码的:先为s开辟一个存储空间,来存储asd,在执行s = s + 1时,再为s开辟存储空间来存s + 1
原来的s是不变的,所以String是常量。
由于这种机制,每当用String操作字符串时,实际上是在不断的创建新的对象,而原来的对象就会变为垃圾被GC回收掉,所以效率很低。
(2)看下面的操作:
String str = “a” + “ b” + “ c”;
StringBuilder builder = new StringBuilder(“a”).append(“ b”).append(“ c”);
感觉上是String比StringBuilder快了一些,但是如果换一下:
String s1 = "a";
String s2 = "b";
String s3 = "c";
String s4 = s1 + s2 + s3;
这样就能看出来了。
2、三者在执行速度方面的比较:StringBuilder > StringBuffer > String
3、StringBuilder与 StringBuffer:StringBuilder:线程非安全的;StringBuffer:线程安全的
当我们在字符串缓冲去被多个线程使用是,JVM不能保证StringBuilder的操作是安全的,虽然他的速度最快,但是可以保证StringBuffer是可以正确操作的。当然大多数情况下就是我们是在单线程下进行的操作,所以大多数情况下是建议用StringBuilder而不用StringBuffer的,就是速度的原因。
4、总结:
对于三者使用的总结:
(1)如果要操作少量的数据用 = String
(2)单线程操作字符串缓冲区 下操作大量数据 = StringBuilder
(3)多线程操作字符串缓冲区 下操作大量数据 = StringBuffer