String、StringBuilder和StringBuffer

               最近好喜欢比较一些相近的东西,比如之前的GETPOST、今天的StringBufferStringBuilder。因为最经常用的是String,所以,将三者放在一起比较……

 

那些年我们用过的字符串对象

               

               首先声明,我好像没有用过StringBuffer。只用了StringStringBuilder。如果你说你没有用过String,那我要怀疑一下你是不是编程人员了。

                    

String

String s="1";
s=s+1;
System.out.print(s); //result :11

StringBuilder

               这个在做考试系统的时候整整拼了四个页面,也是够够的了,当时只恨自己没有写出一个可以很好的调页面的好方法的封装,每次都要去改代码,我也是醉了……

    自己辛苦拼的一个表格:

strbuilder.Append("
"); foreach (ExamQuestionTypeViewModel enQuestionType in listData) { strbuilder.Append(""); strbuilder.Append(""); strbuilder.Append(""); strbuilder.Append(enQuestionType.QuestionTypeName); strbuilder.Append(""); } strbuilder.Append("
");

               这也只是加载所有题型的一个页面,后面的在各难度等级各题型的不同的分数分布表格更是惨不忍睹,考试系统的事以后再吐槽。这里只是想证明一下,StringBuilder是可改变的,上面拼的页面的StringBuilder对象就一直在变化。String却不是这样,你是不是会问,上面的s不是也变了吗,由开始的1变成了11

内存分析s的变化过程:

                 String、StringBuilder和StringBuffer_第1张图片


               我们可以清楚的看到在内存中它是怎样变化的,首先创建了对象s,值为1。当执行s+1时,实际上是又创建了一个对象s,赋值为1+1。这就是String的机制,之前的对象s没有变化,所以String类型是不可改变的对象。每当用String操作字符串时,实际上是在不断的创建新的对象,而原来的对象会变成垃圾回收掉,可想而知这样的执行效率会很低。

 

再说StringBuffer

               它也是一个字符串变量,它的对象是可以扩充和修改的。相当于字符串存在一个缓冲区中,当StringBuffer执行append方法或者insert方法时默认给这个缓冲区添加字符。append方法始终将这些字符添加到缓冲区的末端,insert方法则添加到指定的点。由于StringBuffer的内部实现方式和String不同,所以StringBuffer在进行字符串处理时,不生成新的对象,在内存使用上要优于String类。所以它其实和String有太多相同的方法和功能,只是和String最大的区别就是StringBuffer对象每次修改都会改变对象自身。

 

StringBuilderStringBuffer

首先,它们都是字符串变量

其次,执行速度StringBuilder  > StringBuffer

               由于每个字符串缓冲区都有一定的容量,只要字符串缓冲区所包含的字符串列的长度没有超出此容量,就无需分配新的内部缓冲区数组。如果内部缓冲区溢出,则此容量就自动曾丹。而StringBuilder支持所有相同的操作,不执行同步,所以速度更快。

还有就是StringBuilder不是线程安全的,而StringBuffer是线程安全的。

               当我们在字符串缓冲区被多个线程使用时,JVM不能保证StringBuilder的操作是安全的,虽然它的速度最快,但是可以保证StringBuffer是正确操作的。当然,大多数我们还是在单线程下操作字符串的,所以建议使用StringBuilder,这也就是我拼了四个页面也没有用StringBuffer的原因。

 

对三者使用的总结

     1String,字符串常量,三者中执行速度最慢。操作少量的数据用。

     2StringBuilder,字符串变量,执行速度最快。单线程操作字符串缓冲区下大量数据时用。

     3StringBuffer,字符串变量,执行速度比String快。多线程下操作字符串缓冲区下大量数据用。

 

 

你可能感兴趣的:(-------【GUAI】,●基础知识,●项目实战)