JAVA_String/StringBuilder/StringBuffer字符串拼接及三者区别

方法一: +

String str1="hello";
String str2="world";
String str=str1+str2;

方法二: concat

当两个量都为String类型且值不为null时,可以用concat方式。

String str1="hello";
String str2="world";
String str=str1.contact(str2);

理论上,此时拼接效率应该最高,因为已经假定两个量都为字符串,做底层优化不需要额外判断或转换

只要存在null的变量,就会报错:
这里写图片描述


方法三: append

当需要拼接至少三个量的时候,可以考虑使用StringBuffer#append()以避免临时字符串的产生

StringBuffer buf=new StringBuffer()
buf.append("a");
if(someCondition){
    buf.append("b");
}

buf.insert(0,"start");//这里前一个参数是插入的下标,后一个参数是插入的数据
buf.append("c");
String d=buf.toString();

当a,b,c拼接起来会很长时,可以给在构造器中传入一个合适的预估容量以减少因扩展缓冲空间而带来的性能开销。


String a="a";
String b="b";
String c="c";
String d=a+b+c;

第4句经JDK编译后其字节码(或)会自动优化为等效于下列代码编译后的字节码

String d=new StringBuilder().append(a).append(b).append(c).toString();

若采用模板+参数来替换占位符的方式或需同时对要拼接日期/数字进行格式化,
可以用String.format()来实现

三者区别:

1.是否可变 : string对象是不可变的,StringBuilder与StringBuffer对象是可变的

String:字符串常量
StringBuffer:字符串变量
StringBuilder:字符串变量
String类中使用字符数组保存字符串,
因为有“final”修饰符
    private final char value[];

StringBuilder与StringBuffer都继承自AbstractStringBuilder类,
在AbstractStringBuilder中也是使用字符数组保存字符串,
    char[] value;

 string对象是不可变的,StringBuilder与StringBuffer对象是可变的

2.三者在执行速度方面的比较:StringBuilder > StringBuffer > String


3.线程安全 : StringBuilder是线程不安全的,而StringBuffer是线程安全的

相同点:
StringBuilder与StringBuffer有公共父类AbstractStringBuilder(抽象类)。

1、StringBuffer 与 StringBuilder 中的方法和功能完全是等价的,
2、只是StringBuffer 中的方法大都采用了 synchronized 关键字进行修饰,因此是线程安全的,
而 StringBuilder 没有这个修饰,可以被认为是线程不安全的。 
3、在单线程程序下,StringBuilder效率更快,因为它不需要加锁,不具备多线程安全
而StringBuffer则每次都需要判断锁,效率相对更低

===============================================

    String:适用于少量的字符串操作的情况

  StringBuilder:适用于单线程下在字符缓冲区进行大量操作的情况

  StringBuffer:适用多线程下在字符缓冲区进行大量操作的情况

java字符串拼接的几种方式

你可能感兴趣的:(util功能实现,JAVA学习)