[JAVA笔记]-基础-String,StringBuilder,StringBuffer

String, StringBuilder ,StringBuffer

String和StringBuilder,StringBuffer的效率对比

推荐使用StringBuilder,因为StringBuilder拼接字符串的效率更高


public class Demo_String_StringBuilder {
    @Test
    public void GetStringResult(){
        long start = System.currentTimeMillis();
        String s = "";
        for (int i = 1; i <= 100000; i++){
            s+=i;
        }
        long end = System.currentTimeMillis();
        System.out.println("String的执行时间是:" + (end - start));
    }

    @Test
    public void GetStringBuilderResult(){
        long start = System.currentTimeMillis();
        StringBuilder sb = new StringBuilder();
        for (int i = 1; i <= 100000; i++){
            sb.append(i);
        }
        long end = System.currentTimeMillis();
        System.out.println("StringBuilder的执行时间是:" + (end - start));
    }
    @Test
    public void GetStringBufferResult(){
        long start = System.currentTimeMillis();
        StringBuffer sbf = new StringBuffer();
        for (int i = 1; i <= 100000; i++){
            sbf.append(i);
        }
        long end = System.currentTimeMillis();
        System.out.println("StringBuffer的执行时间是:" + (end - start));
    }
}
  • 结果: image.png

StringBuilder和StringBuffer的对比

  • 相同点:StringBuilder和StringBuffer的功能是完全一致的
  • 不同点:
    • StringBuffer是JDK1.0出现的,线程安全(同步)的,效率低
    • StringBuilder是JDK1.5出现的,线程不安全(不同步)的,效率高

String和StringBuilder的本质区别是?

  • String是一个不可改变的字符序列

public class Demo1_String {
    //string类比较特殊,直接写一个双引号""就是创建了一个对象
    public static void main(String[] args) {
        String s = "abc";
        s = "def";//s只是记录了一个新对象的地址值,对象"abc"本质没有发生任何变化
        System.out.println(s);
    }
}
  • 结果: image
  • 查看部分源码如下, Sring是由final修饰的不可变字符序列 image
  • StringBuilder是一个可以改变的字符序列

public class Demo2_StingBuilder {
    public static void main(String[] args) {
    //StingBuilder:字符序列可变,字符串的缓冲区(提高效率)
        StringBuilder sb = new StringBuilder("1234567890");
        sb.delete(0,2);
        System.out.println(sb);
    }
}
  • 结果: image

常见的字符串拼接,该选择谁?

如非对安全有特别需要, 日常拼接String即可, 如果数量比较大,需要高效处理,建议选择效率高的StringBuilder. 考虑线程安全可以使用StringBuffer.

String用加号拼接的原理


String拼接: image


对比StringBuilder拼接: image

问题扩展

在工作中你们如果在业务层去拼接sql,使用String类型去接收吗?

  • 如果SQL语句拼接的内容较少的话,也可以使用String拼接
  • 但如果SQL语句拼接的内容很多,就应该使用StringBuilder

应用场景

  • 少量的字符串拼接使用String
  • 在项目中如果频繁的拼接字符串,推荐使用StringBuilder
  • 多线程下在字符缓冲区进行大量操作的情况下使用StringBuffer
Java  String 
更新时间:2019-10-18 14:56:52

本文由 Alicyu 创作,如果您觉得本文不错,请随意赞赏
采用 知识共享署名4.0 国际许可协议进行许可
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名
原文链接:https://www.alicyu.com/archives/string
最后更新:2019-10-18 14:56:52

Your browser is out of date!

Update your browser to view this website correctly. Update my browser now

×