您的位置:首页 > 产品设计 > UI/UE

String, StringBuffer, StringBuilder

2011-08-11 18:33 239 查看
1. String 类

String 类是属于不可变类,任何对String的操作都会引起新的String对象的产生

String a = "a"; //假设a指向地址0x0001

a = "b";//重新赋值后a指向地址0x0002,但0x0001地址中保存的"a"依旧存在,但已经不再是a所指向的,a 已经指向了其它地址。

因此String的操作都是改变赋值地址而不是改变值操作

Java代码



String S1 = “abc”;

For(int I = 0 ; I < 10000 ; I ++)

{

S1 + = “def”;

S1 = “abc”;

}

这样操作后,如果GC没有清理,内存中会产生2万个String对象

Java代码



public class test2 {

public static void stringReplace (String text) {

text = text.replace('j' , 'i');

}

public static void main (String args[]) {

String textString = new String ("java");

stringReplace (textString);

System.out.print("textString="+textString); //输出Java

}

}

2. StringBuffer是不可变类,和线程安全的字符串操作类,任何对它指向的字符串的操作都不会产生新的对象。 每个StringBuffer对象都有一定的缓冲区容量,当字符串大小没有超过容量时,不会分配新的容量,当字符串大小超过容量时,会自动增加容量

StringBuffer buf=new StringBuffer(); //分配长16字节的字符缓冲区

StringBuffer buf=new StringBuffer(512); //分配长512字节的字符缓冲区

StringBuffer buf=new StringBuffer("this is a test")//在缓冲区中存放了字符串,并在后面预留了16字节的空缓冲区

setCharAt

charAt

insert

append//添加字符串或者char型数组

setLength 小于长度,会截断字符串

substring

replace

reverse 反转

public void getChars(int srcBegin,//字符串中要复制的第一个字符的索引。

int srcEnd,//字符串中要复制的最后一个字符之后的索引

char[] dst,//目标数组

int dstBegin)//目标数组中的起始偏移量

3. 从 JDK 5.0 开始,为StringBuffer类增添了一个单个线程使用的等价类,即 StringBuilder 。与该类相比,通常应该优先使用

StringBuilder 类,因为它支持所有相同的操作,但由于它不执行同步,所以速度更快。

String StringBuffer StringBuilder 对比

1.jdk版本支持

StringBuilder JDK1.5以后版本支持

2.线程安全

StringBuffer 线程安全

StringBuilder 线程不安全

Java.lang.StringBuffer 线程安全的可变字符序列。类似于 String 的字符串缓冲区,但不能修改。可将字符串缓冲区安全地用于多个线程。可以在必要时对这些方法进行同步,因此任意特定实例上的所有操作就好像是以串行顺序发 生的,该顺序与所涉及的每个线程进行的方法调用顺序一致。

每个字符串缓冲区都有一定的容量。只要字符串缓冲区所包含的字符序列的长度没有超出此容量,就无需分配新的内部缓冲区数组。如果内部缓冲区溢出,则此容量 自动增大。从 JDK 5.0 开始,为该类增添了一个单个线程使用的等价类,即 StringBuilder 。与该类相比,通常应该优先使用 StringBuilder 类,因为它支持所有相同的操作,但由于它不执行同步,所以速度更快。 但是如果将 StringBuilder 的实例用于多个线程是不安全的。需要这样的同步,则建议使用 StringBuffer 。

3.速度

一般情况下,速度从快到慢:StringBuilder>StringBuffer>String.当需要在循环中多次使用字符串拼接时,建 议使用StringBuilder或StringBuffer.当数量级在百万级(这里可能不准确)时,StringBuilder的速度会体现出来.

原文地址:http://www.iteye.com/topic/411571
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: