java StringBuffer,StringBuilder,String自身连接效率对比

当我们仅仅需要a+b 的时候,两个字符串链接任何方法的效率基本一样,都在0.0001毫秒内就可以完成。不过如果需要1万次,10000万次,就会发现string自身的join速度显著下降

 代码如下 复制代码
package com.java.lang;
 
public class StringTest {
 int MAX = 10000; //1万次累加
 public String Buffer(){
  StringBuffer sb = new StringBuffer();
  for(int i = 0; i < MAX;i++){
   sb.append("abc");
  }
  return sb.toString();
 }
 public String Build(){
  StringBuilder sb = new StringBuilder();
  for(int i = 0; i < MAX;i++){
   sb.append("abc");
  }
  return sb.toString();
 }
 
 public String StringJoin(){
  String a = "";
  for(int i = 0; i < MAX;i++){
   a += "abc";
  }
  return a;
 }
 public static void main(String[] args) {
  StringTest st = new StringTest();
  long t1,t2,t;
  t1 = System.currentTimeMillis();
  st.Buffer();
  t2 = System.currentTimeMillis();
  t = t2 - t1;
  System.out.println("StringBuffer 时间"+t);
 
  t1 = System.currentTimeMillis();
  st.Build();
  t2 = System.currentTimeMillis();
  t = t2 - t1;
  System.out.println("StringBuild 时间"+t);
 
  t1 = System.currentTimeMillis();
  st.StringJoin();
  t2 = System.currentTimeMillis();
  t = t2 - t1;
  System.out.println("String 自身链接 时间"+t);
 
 
 
 
 }
 
}

输出

StringBuffer 时间7
StringBuild 时间3
String 自身链接 时间470
如果改成10万次,那么String基本跑不动了。

测试结果

StringBuffer 时间33
StringBuild 时间13
String 自身链接 时间46068
几乎几何级别增加。

各位客官可能会问StringBuffer 和 StringBuilder有什么区别

StringBuilder
一个可变的字符序列。此类提供一个与 StringBuffer 兼容的 API,但不保证同步。该类被设计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍)。如果可能,建议优先采用该类,因为在大多数实现中,它比 StringBuffer 要快。

在 StringBuilder 上的主要操作是 append 和 insert 方法,可重载这些方法,以接受任意类型的数据。每个方法都能有效地将给定的数据转换成字符串,然后将该字符串的字符追加或插入到字符串生成器中。append 方法始终将这些字符添加到生成器的末端;而 insert 方法则在指定的点添加字符。

例如,如果 z 引用一个当前内容为 “start” 的字符串的生成器对象,则该方法调用 z.append(“le”) 将使字符串生成器包含 “startle”,而 z.insert(4, “le”) 将更改字符串生成器,使之包含 “starlet”。

通常,如果 sb 引用 StringBuilder 的实例,则 sb.append(x) 和 sb.insert(sb.length(), x) 具有相同的效果。每个字符串生成器都有一定的容量。只要字符串生成器所包含的字符序列的长度没有超出此容量,就无需分配新的内部缓冲区。如果内部缓冲区溢出,则此容量自动增大。

将 StringBuilder 的实例用于多个线程是不安全的。如果需要这样的同步,则建议使用 StringBuffer。

时间: 2024-08-01 07:35:06

java StringBuffer,StringBuilder,String自身连接效率对比的相关文章

辨析Java中的String与StringBuffer及StringBuilder字符串类_java

1 StringString:字符串常量,字符串长度不可变. 2 StringBufferStringBuffer:字符串变量(Synchronized,即线程安全).如果要频繁对字符串内容进行修改,出于效率考虑最好使用StringBuffer,如果想转成String类型,可以调用StringBuffer的toString()方法. Java.lang.StringBuffer线程安全的可变字符序列.在任意时间点上它都包含某种特定的字符序列,但通过某些方法调用可以改变该序列的长度和内容.可将字符

详解Java的String/StringBuffer/StringBuilder异同

最近发现团队成员在Java代码方面的质量不够高,准备写一些基础的文章,供大家参考. 一.定义 String是不可变字符序列.StringBuffer是可变的字符序列.StringBuilder也是可变的字符序列. 1.StringBuffer和StringBuilder的唯一区别 StringBuffer对象是线程安全的,这意味着StringBuffer对象可以同时被多个并行线程修改,因为它所有的方法都被声明为"synchronized(同步)".StringBuilder类是JDK

浅谈java中String StringBuffer StringBuilder的区别_java

* String类是不可变类,只要对String进行修改,都会导致新的对象生成. * StringBuffer和StringBuilder都是可变类,任何对字符串的改变都不会产生新的对象. 在实际使用时,如果经常需要对一个字符串进行修改,例如插入.删除等 * 但StringBuffer和StringBuilder有什么区别呢? StringBuffer是线程安全的,在多线程程序中是很方便使用的,但是程序的效率就会慢一点. StringBuilder不是线程安全的,在单线程中,比StringBuf

String,StringBuffer, StringBuilder 的区别

String,StringBuffer, StringBuilder 的区别 String和StringBuffer的区别,网上资料可以说是数不胜数,但是看到这篇文章,感觉里面做的小例子很有代表性,所以转一下,并自己做了一点总结. 在java中有3个类来负责字符的操作. 1.Character 是进行单个字符操作的, 2.String 对一串字符进行操作.不可变类. 3.StringBuffer 也是对一串字符进行操作,但是可变类. String:是对象不是原始类型.为不可变对象,一旦被创建,就

Java基础13-总结StringBuffer,StringBuilder,数组高级,Arrays,Integer,Character

你需要的是什么,直接评论留言. 获取更多资源加微信公众号"Java帮帮" (是公众号,不是微信好友哦) 还有"Java帮帮"今日头条号,技术文章与新闻,每日更新,欢迎阅读 学习交流请加Java帮帮交流QQ群553841695 分享是一种美德,分享更快乐! 1:StringBuffer(掌握) (1)用字符串做拼接,比较耗时并且也耗内存,而这种拼接操作又是比较常见的,为了解决这个问题,Java就提供了    一个字符串缓冲区类.StringBuffer供我们使用. (

String StringBuffer StringBuilder之间的区别

String  字符串常量 StringBuffer  字符串变量(线程安全) StringBuilder 字符串变量(非线程安全) 简单的说,String类型和StringBuffer类型的主要性能区别其实在于String是不可变的对象,因此在每次对String类型进行改变的时候其实都等同于生成了一个新的String对象,然后将指针指向新的String对象,所以经常改变内容的字符串最好不要用String,因为每次生成对象都会对系统性能产生影响,特别当内存中无引用对象多了以后,JVM的GC就会开

JAVA中StringBuffer与String的区别解析_java

看到这个讲解的不错,所以转一下 在java中有3个类来负责字符的操作. 1.Character 是进行单个字符操作的, 2.String 对一串字符进行操作,不可变类. 3.StringBuffer 也是对一串字符进行操作,是可变类. String:    是对象不是原始类型.    为不可变对象,一旦被创建,就不能修改它的值.    对于已经存在的String对象的修改都是重新创建一个新的对象,然后把新的值保存进去.String 是final类,即不能被继承. StringBuffer:   

StringBuilder、StringBuffer和String三者的联系和区别(转)

  StringBuilder.StringBuffer和String三者的联系和区别  1. String 类    String的值是不可变的,这就导致每次对String的操作都会生成新的String对象,不仅效率低下,而且大量浪费有限的内存空间.    String a = "a"; //假设a指向地址0x0001    a = "b";//重新赋值后a指向地址0x0002,但0x0001地址中保存的"a"依旧存在,但已经不再是a所指向的,

java代码-求大神帮帮~我想把stringbuffer转为String为什么这样不能写

问题描述 求大神帮帮~我想把stringbuffer转为String为什么这样不能写 package work; import java.util.*; public class youxiang { public static void main(String[]args){ Scanner input=new Scanner(System.in); System.out.println("请输入一个字符串"); String s=input.next(); StringBuffer