字符串的拼接,常使用到的大概有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字符串拼接的资料请关注小牛知识库其它相关文章!
主要内容:使用连接运算符“+”,使用 concat() 方法,连接其他类型数据对于已经定义的字符串,可以对其进行各种操作。连接多个字符串是字符串操作中最简单的一种。通过字符串连接,可以将两个或多个字符串、字符、整数和浮点数等类型的数据连成一个更大的字符串。 String 字符串虽然是不可变字符串,但也可以进行拼接只是会产生一个新的对象。String 字符串拼接可以使用“+”运算符或 String 的 concat(String str) 方法。 “+”运算符优势是可以连接任
本文向大家介绍python字符串的拼接方法总结,包括了python字符串的拼接方法总结的使用技巧和注意事项,需要的朋友参考一下 这篇文章主要介绍了python字符串的拼接方法总结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 加号连接 1.通过+号连接起来 逗号连接 2.通过都好连接起来 但是,这里值得注意的是,只能用于print打印,赋值组操作
本文向大家介绍jquery拼接ajax 的json和字符串拼接的方法,包括了jquery拼接ajax 的json和字符串拼接的方法的使用技巧和注意事项,需要的朋友参考一下 整理文档,搜刮出一个jquery拼接ajax 的json和字符串拼接的代码,稍微整理精简一下做下分享。 jQuery拼接字符串ajax 或者直接用$(“#表单id”).serialize()直接序列化。。。 上面的插件,不能适用
主要内容:Python字符串和数字的拼接在 Python 中拼接(连接)字符串很简单,可以直接将两个字符串紧挨着写在一起,具体格式为: strname = "str1" "str2" strname 表示拼接以后的字符串变量名,str1 和 str2 是要拼接的字符串内容。使用这种写法,Python 会自动将两个字符串拼接在一起。 【示例】以连续书写的形式拼接字符串: 运行结果: Python教程https://www.xnip.cn/
本文向大家介绍python3 拼接字符串的7种方法,包括了python3 拼接字符串的7种方法的使用技巧和注意事项,需要的朋友参考一下 Python的3.0版本,常被称为Python 3000,或简称Py3k。相对于Python的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0在设计的时候没有考虑向下兼容。 1、直接通过(+)操作符拼接 使用这种方式进行字符串连接的操作效率
本文向大家介绍java常见的字符串操作和日期操作汇总,包括了java常见的字符串操作和日期操作汇总的使用技巧和注意事项,需要的朋友参考一下 一、字符串操作 创建字符串 String s2 = new String("Hello World"); String s1 = "Hello World"; 1.字符串连接 多个字符串链接时,每个字符串之间用+相连,+就是字符串链接,连接之后生成一个新的字符