String 和StringBuffer和StringBuilder

来源:互联网 发布:南方电网面试 知乎 编辑:程序博客网 时间:2024/05/16 14:32

 1. 值类型来看

String 常量。是一个对象不是原始类型,一旦值被创建就不可以改变,一旦值发生变化那么就是重新创健了一个新的对象,把值存放进去

Stringbuffer和StringBuilder是变量。Stringbuffer是一个变量,对值的修改不能像String那样通过赋值符号修改而是通过他的append函数,一旦创健就会在内容中分配一块空间并默认是null,字符串连接操作中StringBuffer的效率要比String高

2.性能来看

String str = new String("welcome to ");
str += "here";
的处理步骤实际上是通过建立一个StringBuffer,然后调用append(),最后
再将StringBuffer toSting();
这样的话String的连接操作就比StringBuffer多出了一些附加操作,当然效率上要打折扣.

3.存储来看

Stringbuffer 有append()方法 
Stringbuffer其实是动态字符串数组 
append()是往动态字符串数组添加,跟“xxxx”+“yyyy”相当那个‘+’号 
跟String不同的是Stringbuffer是放一起的 
String1+String2 和Stringbuffer1.append("yyyy")虽然打印效果一样,但在内存中表示却不一样 
String1+String2 存在于不同的两个地址内存 
Stringbuffer1.append(Stringbuffer2)放再一起,地址相同。

4.来自http://www.cnblogs.com/rpp506815950/archive/2012/11/07/2758646.html

看看以下代码:
将26个英文字母重复加了5000次,

  1.         String tempstr = "abcdefghijklmnopqrstuvwxyz";
  2.         int times = 5000;
  3.         long lstart1 = System.currentTimeMillis();
  4.         String str = "";
  5.         for (int i = 0; i < times; i++) {
  6.             str += tempstr;
  7.         }
  8.         long lend1 = System.currentTimeMillis();
  9.         long time = (lend1 - lstart1);
  10.         System.out.println(time);

得到的结果每次不一定,一般为 1563左右。
我们再看看以下代码

  1.         String tempstr = "abcdefghijklmnopqrstuvwxyz";
  2.         int times = 5000;
  3.         long lstart2 = System.currentTimeMillis();
  4.         StringBuffer sb = new StringBuffer();
  5.         for (int i = 0; i < times; i++) {
  6.             sb.append(tempstr);
  7.         }
  8.         long lend2 = System.currentTimeMillis();
  9.         long time2 = (lend2 - lstart2);
  10.         System.out.println(time2);

得到的结果为 16 有时还是 0

 4.StringBuilder与 StringBuffer

    StringBuilder:线程非安全的

    StringBuffer:线程安全的

    当我们在字符串缓冲去被多个线程使用是,JVM不能保证StringBuilder的操作是安全的,虽然他的速度最快,但是可以保证StringBuffer是可以正确操作的。当然大多数情况下就是我们是在单线程下进行的操作,所以大多数情况下是建议用StringBuilder而不用StringBuffer的,就是速度的原因。

 

           对于三者使用的总结: 1.如果要操作少量的数据用 = String

                        2.单线程操作字符串缓冲区 下操作大量数据 = StringBuilder

                        3.多线程操作字符串缓冲区 下操作大量数据 = StringBuffer





原创粉丝点击