char[]和Stirng 和StringBuilder 的区别
char[] 字符串数据
String = char[] 数据+操作(不改变char[]数据内容)
StringBuilder = char[] 数据+操作(改变char[]数据内容)
1、 三者在执行速度方面的比较:StringBuilder >StringBuffer > String
在字符串处理中C#提供了String、StringBuffer、StringBuilder三个类。那么他们到底有什么优缺点,到底什么时候该用谁呢?下面我们从以下几点说明一下:
String一旦赋值或实例化后就不可更改,如果赋予新值将会重新开辟内存地址进行存储。而StringBuffer类使用append和insert等方法改变字符串值时只是在原有对象存储的内存地址上进行连续操作,减少了资源的开销。因此:当需要进行频繁修改字符串的操作时先建立StringBuffer类对象进行操作,将最后结果转化成String类对象返回,这样效率会高很多。
StringBuffer(StringBuilder)其实可以看做“基本数据类型”String的包装类(Wrapper),就像int与之对应的Integer等关系。StringBuffer有缓存的,如果你声明一个字符串只是接收传过来的参数,然后进行业务逻辑处理,那么假如你用很多个StringBuffer类型的对象,就比较浪费内存。这样用String就更好。
2、 在字符串拼接时,String 对象的速度并不会比 StringBuffer对象慢。
String 对象的字符串拼接其实是被 JVM 解释成了StringBuffer 对象的拼接,所以这些时候String 对象的速度并不会比StringBuffer 对象慢,而特别是以下的字符串对象生成中, String 效率是远要比 StringBuffer 快。
String S1 = “This is only a” + “ simple” + “ test”;
StringBuffer Sb = new StringBuilder(“This is only a”).append(“ simple”).append(“test”);
你会很惊讶的发现,生成String S1 对象的速度简直太快了,而这个时候 StringBuffer 居然速度上根本一点都不占优势。其实这是 JVM 的一个把戏,在 JVM 眼里,这个
String S1 = “This is only a” + “ simple” + “test”;
其实就是:
String S1 = “This is only a simple test”;
所以当然不需要太多的时间了。但大家这里要注意的是,如果你的字符串是来自另外的 String 对象的话,速度就没那么快了,譬如:
String S2 = “This is only a”;
String S3 = “ simple”;
String S4 = “ test”;
String S1 = S2 +S3 + S4;
这时候 JVM 会规规矩矩的按照原来的方式去做
3、在线程安全方面不同
StringBuffer 字符串变量(线程安全)
StringBuilder 字符串变量(非线程安全)
三者使用总结:在操作少量变动的数据时,使用String;
在单线程中操作大量数据的字符串时,使用StringBuilder;
在多线程中操作大量数据的字符串时,使用StringBuffer。
StringBuilder的工作原理和使用方法
1 import java.util.Arrays; 2 3 public class StringBuilderDemo { 4 public static void main(String[] args) { 5 6 //StringBuilder 的工作原理 7 //'0','\u0000' 8 char[] buf = new char[10];//{0,0...\u0000}缓冲区数据 9 //有效数据数量 和 缓冲区大小 如:有效数量=0,容量大小=10 10 int size = 0;//代表缓冲区中有效数据数量 11 //向缓冲区中追加:'牛''奶' 12 buf[size++] = '牛';//{'牛',0,0,0,...,0} 13 buf[size++] = '奶';//{'牛','奶',0,0,...,0} 14 //在追加"巧克力" 15 buf[size++] = '巧'; 16 buf[size++] = '克'; 17 buf[size++] = '力'; 18 //有效数量:size = 5 19 System.out.println(size);//5 20 //输出有效字符串:牛奶巧克力 21 System.out.println(Arrays.copyOf(buf, size)); 22 //添加"翻滚吧牛宝宝",如果容量不够就需要扩容 23 if(size+5 > buf.length){ 24 buf = Arrays.copyOf(buf, buf.length*2); 25 } 26 buf[size++] = '翻'; 27 buf[size++] = '滚'; 28 buf[size++] = '吧'; 29 buf[size++] = '牛'; 30 buf[size++] = '宝'; 31 buf[size++] = '宝'; 32 //输出有效字符串:牛奶巧克力翻滚吧牛宝宝 33 System.out.println(Arrays.copyOf(buf, size)); 34 //在0位置插入:"泥马" 35 //向后移动2个位置: 36 for(int i=size-1; i>=0; i--){ 37 buf[i+2] = buf[i]; 38 } 39 //泥马牛奶巧克力翻滚吧牛宝宝 40 buf[0] = '泥'; 41 buf[1] = '马'; 42 size+=2; 43 //输出有效字符串:泥马牛奶巧克力翻滚吧牛宝宝 44 System.out.println(Arrays.copyOf(buf, size)); 45 46 //正常使用 47 StringBuilder s = new StringBuilder();//new char[16]默认 48 StringBuilder s2 = new StringBuilder(10);//new char[10] 49 s2.append("牛奶"); 50 s2.append("巧克力"); 51 System.out.println(s2.capacity());//容量10 52 s2.append("翻滚把牛宝宝");//发生自动扩容 53 s2.insert(0, "泥马");//自动移动 54 System.out.println(s2.length());//有效字符数量 55 System.out.println(s2.capacity());//容量22 56 System.out.println(s2);//复制有效部分 57 } 58 }