Java基础 String StringBuffer StringBuilder的异同介绍

一、String StringBuffer StringBuilder的对比

StringStringBufferStringBuilder
字符串类型常量(不可变)变量(可变)变量(可变)
线性安全安全(final修饰)安全(方法synchronized修饰)不安全
性能最慢两者之间最快

1、通过String源码可以看出char被final修饰,不可变
在这里插入图片描述

2、StringBuffer 和 StringBuilder都是继承了AbstractStringBuilder,从AbstractStringBuilder的原码可以看出它们的底层是可变的

在这里插入图片描述
在这里插入图片描述
3、StringBuffer的方法都是synchronized修改时,保持线程同步
在这里插入图片描述
StringBuilder 类在 Java 5 中被提出,它和 StringBuffer 之间的最大不同在于 StringBuilder 的方法不是线程安全的(不能同步访问)由于 StringBuilder 相较于 StringBuffer 有速度优势,所以多数情况下建议使用 StringBuilder 类。然而在应用程序要求线程安全的情况下,则必须使用 StringBuffer 类。

二、String详解

String并不是基本数据类型,而是一个对象。字符串为对象,那么在初始化之前,它的值为null,到这里就有必要提下””、null、new String()三者的区别。null 表示string还没有new ,也就是说对象的引用还没有创建,也没有分配内存空间给他,而””、new String()则说明了已经new了,只不过内部为空,但是它创建了对象的引用,是需要分配内存空间的。
java的虚拟机在内存中开辟出一块单独的区域,用来存储字符串对象,这块内存区域被称为字符串缓冲池。那个java的字符串缓冲池是如何工作的呢?
在这里插入图片描述

        String s1 = "abc";
        String s2 = "abc";
        String s3 = new String("abc");
        String s4 = new String("xyz");
        String s5 = "ab";
        String s6 = "c";
        String s7 = s5+s6;
        String s8 = "ab" + "c";
        System.out.println(s1 == s2);//(1)true 
        System.out.println(s1.equals(s2));//(2)true 
        System.out.println(s1 == s3);//(3)false
        System.out.println(s1.equals(s3));//(4)true
        System.out.println(s1.equals(s7));//(5)true
        System.out.println(s1==s7);//(6)false
        System.out.println(s1==s8);//(7)true

我们来分析、比来看一下:

1、String s1 = “abc”;由于缓冲池中没有abc这个字符串对象,会创建一个对象;
2、String s2 = “abc”;由于缓冲池中已经有了abc这个对象,不会再创建新的对象,故(1)(2)是true;
3、String s3 = new String(“abc”);缓冲池中已有该字符串对象,则缓冲池中不再创建该对象,然后会在内存中创建一个新的字符串对象,创建了一个新的对象,故(3)是false;
4、String s4 = new String(“xyz”);由于没有xyz这个字符串对象,所以会首先创建一个xyz的对象,然后这个字符串对象由作为String的构造方法,在内存中(不是缓冲池中)又创建了一个新的字符串对象,所以这里一共创建了两个对象;
5、String s7 = s5+s6;s7相当于两个对象叠加,会在内存中新创建一个新的字符串对象,故(6)是false;
5、String s8 = “ab” + “c” ;由于常量的值在编译的时候就被确定了,这一句等价于String s8 = ”abc”
所以(8)是true

String 的 compareTo方法也可以比较字符串是否相等:它是先比较对应字符的大小(ASCII码顺序),如果第一个字符和参数的第一个字符不等,结束比较,返回他们之间的差值,如果第一个字符和参数的第一个字符相等,则以第二个字符和参数的第二个字符做比较,以此类推,直至比较的字符或被比较的字符有一方结束。

String s1 = "abc123";
String s2 = "abc123";
String s3 = "abc";
String s4 = "abd";
System.out.println(s1.compareTo(s2));//0
System.out.println(s1.compareTo(s3));//3 
System.out.println(s1.compareTo(s4));//-1

三、String StringBuffer StringBuilder对字符串的修改

1、String
上面已经写到,String是不变的,如果需要改变,只能新建一个对象,通过“+”来改变

String s1 = "abc" + "def";
System.out.println(s1 + "abccc");//abcdefabccc

2、StringBuffer和StringBuilder是通过方法实现修改,且修改之后原有的对象也跟着变了

StringBuilder s11 = new StringBuilder("abc");
StringBuilder s13 = s11.append("xyz");
System.out.println(s11);//abcxyz
System.out.println(s13);//abcxyz
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值