JAVA字符串拼接常见方法汇总

 更新时间:2020年06月11日 11:23:56   转载 作者:''买条秋裤穿  
这篇文章主要介绍了JAVA字符串拼接常见方法,文中讲解非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下

字符串的拼接,常使用到的大概有4种方式:

1.直接使用"+"号

2.使用String的concat方法

3.使用StringBuilder的append方法

4.使用StringBuffer的append方法

由于String是final类型的,因此String对象都是属于不可变对象,因此,在需要对字符串进行修改操作的时候(比如字符串的连接或者是替换),String总是会生成新的对象。

1.“+”

如果不考虑其他,使用“+”号来连接字符串无疑是最方便、最快捷的方式。但是事实上,使用“+”号连接字符串的效率并不高,。

贴出测试用的demo

public class Str {

  public static void main(String[] args) {
    String str1 = "hello";
    String str2 = "wolrd";

    String str = str1 + str2;
    System.out.println(str);
  }

}

贴出Str通过编译之后产生的字节码文件

public class com.fzkj.str.Str {
 public com.fzkj.str.Str();
  Code:
    0: aload_0
    1: invokespecial #1         // Method java/lang/Object."<init>":()V
    4: return

 public static void main(java.lang.String[]);
  Code:
    0: ldc      #2         // String hello
    2: astore_1
    3: ldc      #3         // String wolrd
    5: astore_2
    6: new      #4         // class java/lang/StringBuilder
    9: dup
   10: invokespecial #5         // Method java/lang/StringBuilder."<init>":()V
   13: aload_1
   14: invokevirtual #6         // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
   17: aload_2
   18: invokevirtual #6         // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
   21: invokevirtual #7         // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
   24: astore_3
   25: getstatic   #8         // Field java/lang/System.out:Ljava/io/PrintStream;
   28: aload_3
   29: invokevirtual #9         // Method java/io/PrintStream.println:(Ljava/lang/String;)V
   32: return
}

通过上面的字节码文件可以看出,在执行String str = str1 + str2;这一条语句的时候,其实底层是调用了StringBuilder的append方法来实现,就是说使用“+”号连接字符串的时候,底层会new一个StringBuilder对象,调用该对象的append方法将字符串拼接起来,最后通过toString方法返回拼接之后的值。

也就是字符串str1+str2就等效于下面的代码:

String str1 = "hello";
String str2 = "wolrd";
StringBuilder sb = new StringBuilder();
sb.append(str1).append(str2);
String s = sb.toString();

在数据量很大的时候,比如说循环一万次,那就会创建一万个StringBuilder对象。所以说使用"+"号拼接字符串的效率很低。

最后在看一下使用"+"号拼接str1和str2,100000次的耗时。

public class Str {

  public static void main(String[] args) {
    String str1 = "hello";
    String str2 = "wolrd";

    long startTime = System.currentTimeMillis();
    System.out.println("开始执行时间:"+ startTime);
    for (int i = 0; i < 100000; i++) {
      String str = str1 + str2;
    }
    long stopTime = System.currentTimeMillis();
    System.out.println("结束执行时间:"+ stopTime);
    System.out.println("执行100000次字符串拼接总共耗时:"+(stopTime - startTime)+"ms");

  }
}

开始执行时间:1591326544582
结束执行时间:1591326544601
执行100000次字符串拼接总共耗时:19ms

2.concat

concat源码如下:

  public String concat(String str) {
    int otherLen = str.length();
    if (otherLen == 0) {
      return this;
    }
    int len = value.length;
    char buf[] = Arrays.copyOf(value, len + otherLen);
    str.getChars(buf, len);
    return new String(buf, true);
  }

从concat方法的源码中可以看出来,concat就是申请了一个char数组,将需要拼接的字符串放到这个数组中,最后转换为String返回。

还是记录拼接100000次,总共的耗时

public class Str {

  public static void main(String[] args) {
    String str1 = "hello";
    String str2 = "wolrd";
    // 使用concat连接字符串
    String concat = str1.concat(str2);
    long startTime = System.currentTimeMillis();
    System.out.println("开始执行时间:"+ startTime);
    for (int i = 0; i < 100000; i++) {
      String str = str1.concat(str2);
    }
    long stopTime = System.currentTimeMillis();
    System.out.println("结束执行时间:"+ stopTime);
    System.out.println("执行100000次字符串拼接总共耗时:"+(stopTime - startTime)+"ms");

  }
}

开始执行时间:1591328017552
结束执行时间:1591328017561
执行100000次字符串拼接总共耗时:9ms

3.StringBuffer/StringBuilder

这两个类都继承了同一个抽象类AbstractStringBuilder;而这两个类的append方法都是调用的父类中的append方法。

  public AbstractStringBuilder append(String str) {
    if (str == null)
      return appendNull();
    int len = str.length();
    ensureCapacityInternal(count + len);
    str.getChars(0, len, value, count);
    count += len;
    return this;
  }

而它俩的区别就是StringBuffer的append方法上加了synchronized关键字,因此是线程安全的。

public class Str {

  public static void main(String[] args) {
    String str1 = "hello";
    String str2 = "wolrd";
    
    StringBuffer sb = new StringBuffer();
    long startTime = System.currentTimeMillis();
    System.out.println("开始执行时间:"+ startTime);
    for (int i = 0; i < 100000; i++) {
      sb.append(str1);
    }
    long stopTime = System.currentTimeMillis();
    System.out.println("结束执行时间:"+ stopTime);
    System.out.println("StringBuffer执行100000次字符串拼接总共耗时:"+(stopTime - startTime)+"ms");

    StringBuilder sb1 = new StringBuilder();
    long startTime1 = System.currentTimeMillis();
    System.out.println("开始执行时间:"+ startTime1);
    for (int i = 0; i < 100000; i++) {
      sb1.append(str1);
    }
    long stopTime1 = System.currentTimeMillis();
    System.out.println("结束执行时间:"+ stopTime1);
    System.out.println("StringBuilder执行100000次字符串拼接总共耗时:"+(stopTime1 - startTime1)+"ms");
  }
}

开始执行时间:1591328952926
结束执行时间:1591328952933
StringBuffer执行100000次字符串拼接总共耗时:7ms
开始执行时间:1591328952934
结束执行时间:1591328952936
StringBuilder执行100000次字符串拼接总共耗时:2ms

StringBuilder的性能比StringBuffer的性能要好点。
从上面的结果中,可以得出一个结论,那就是这四种的效率由快到慢依次是:
StringBudiler>StringBuffer>concat>+

事实上,在拼接的字符串很少的情况下,concat的效率其实是比StringBuilder的效率还要高的。
所以在实际的使用过程中,要根据自己的需求选择使用。。

以上就是JAVA字符串拼接常见方法汇总的详细内容,更多关于JAVA字符串拼接的资料请关注脚本之家其它相关文章!

相关文章

  • 自己动手在Spring-Boot上加强国际化功能的示例

    自己动手在Spring-Boot上加强国际化功能的示例

    这篇文章主要介绍了自己动手在Spring-Boot上加强国际化功能的示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-04-04
  • java如何获取系统CPU、内存占用

    java如何获取系统CPU、内存占用

    这篇文章主要介绍了java如何获取系统CPU、内存占用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-10-10
  • JAVA中的引用与对象详解

    JAVA中的引用与对象详解

    本文主要介绍了JAVA中引用与对象的相关知识。具有很好的参考价值,下面跟着小编一起来看下吧
    2017-02-02
  • 使用Java开发实现OAuth安全认证的应用

    使用Java开发实现OAuth安全认证的应用

    这篇文章主要介绍了使用Java开发实现OAuth安全认证的应用的方法,OAuth安全认证经常出现于社交网络API应用的相关开发中,需要的朋友可以参考下
    2015-11-11
  • java中堆内存与栈内存的知识点总结

    java中堆内存与栈内存的知识点总结

    在本篇文章里小编给大家整理的是关于java中堆内存与栈内存的知识点总结,有需要的朋友们可以跟着学习下。
    2019-12-12
  • JAVA自定义异常使用方法实例详解

    JAVA自定义异常使用方法实例详解

    这篇文章主要介绍了JAVA自定义异常使用方法实例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-06-06
  • java中map和对象互转工具类的实现示例

    java中map和对象互转工具类的实现示例

    这篇文章主要介绍了java中map和对象互转工具类的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-08-08
  • Spring Boot启动过程(六)之内嵌Tomcat中StandardHost、StandardContext和StandardWrapper的启动教程详解

    Spring Boot启动过程(六)之内嵌Tomcat中StandardHost、Standar

    这篇文章主要介绍了Spring Boot启动过程(六)之内嵌Tomcat中StandardHost、StandardContext和StandardWrapper的启动教程详解,需要的朋友可以参考下
    2017-04-04
  • spring aop的简单使用方法详解

    spring aop的简单使用方法详解

    这篇文章主要介绍了spring aop的简单使用方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-10-10
  • Spring Cloud升级最新Finchley版本的所有坑

    Spring Cloud升级最新Finchley版本的所有坑

    这篇文章主要介绍了Spring Cloud升级最新Finchley版本的所有坑,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-08-08

最新评论