String,StringBuffer 与 StringBuilder 的比较

本文对比分析了Java中的String、StringBuffer和StringBuilder。String是不可变的,适用于不可变的字符串,而StringBuffer和StringBuilder是可变的,适合于字符串的大量修改。StringBuffer线程安全,效率相对较低,而StringBuilder则没有线程安全性,但效率更高。在进行字符串操作时,根据是否需要线程安全和性能需求选择合适的类。
摘要由CSDN通过智能技术生成

**前言:**String是我们在编写程序的时候最常使用的包装类,他的功能十分多,使用起来也很方便,所以我们对她要有深入的了解,而StringBuffer与StringBuilder是 对String的增强,它们又有哪些特性,接下来我们进行深入讲解。

String

String的结构图

在这里插入图片描述

1.实现的接口

Serializable 说明String的对象可以序列化,可以在网络传输

Conparable 说明String的对象可以进行比较大小

2.String类有多种构造器,常用的:

String s1 = new String();

String s2 = new String(String original);

3.String的源码:

public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence {
    /** The value is used for character storage. */
    private final char value[];
    }

可以看出String用final修饰,不能被继承,

属性private final char value[] 用于存放字符串内容 (很重要),可以看出,String类的本质是一个字符数组,而且用final修饰,赋值以后就不可修改(这里指的是引用地址不可修改,就是不能在指向新的地址,但是内部的字符可以修改),存放在常量池。

**4.创建String对象的方式:**这两种创建方式,内存分布不同

方式1:String s1 = “aaaa”; 红色线

先看常量池是否有”aaaa“的数据空间,如果有,直接指向;如果没有,则创建并指向;s1最终指向常量池的空间地址

方式2:String s2 = new String(“aaaa”) 绿色线

先在堆中创建空间,里面维护了value属性,指向常量池的”aaaa“的空间地址。如果常量池有”aaaa“。直接通过value指向;如果没有,重新创建,再通过value指向。s2最终指向堆中的空间地址。

在这里插入图片描述

5.String的特性 : 常量相加,看的是池;变量相加,是在堆中

String有许多的方法,在这里就不讲述了,主要说一下他的特性

看如下例子

String a = "hello";
String b = "world";

String c = "hello" + "world";
String d = a + b;
请问:c == d   ?      答案:fales

这就涉及到了我们提到的String的特性,c是两个常量相加得到的,d是两个变量相加得到的,这和String的底层设计有关。

StringBuffer(StringBuilder相似)

StringBuf’ffer的结构图

在这里插入图片描述

1.实现的接口:**

Serializable 说明StringBuf’ffer的对象可以序列化,可以在网络传输

2.StringBuffe的源码:

 public final class StringBuffer extends AbstractStringBuilder  implements java.io.Serializable, CharSequence{
    private transient char[] toStringCache;
}

其直接父类AbstractStringBuilder的源码
abstract class AbstractStringBuilder implements Appendable, CharSequence {
    /**
     * The value is used for character storage.
     */
    char[] value;
}

可以看出StringBuffe用final修饰,不能被继承

其父类有属性char[] value,不是用final修饰(这是与String最大的不同之处),value数组存放字符串内容,放在堆中,

3.StringBuffer的构造器

//1.创建了一个大小为16 的char[],存放字符内容
StringBuffer stringBuffer = new StringBuffer();
进入源码,可以看到它是通过这个构造器来创建的
public StringBuffer() {
        super(16);
    }
//2.通过构造器指定char[]的大小
StringBuffer stringBuffer = new StringBuffer(100);
进入源码,可以看到它是通过这个构造器来创建的
public StringBuffer(int capacity) {
        super(capacity);
    }
//通过给定一个String创建
StringBuffer stringBuffer = new StringBuffer("hello");
进入源码,可以看到它是通过这个构造器来创建的
public StringBuffer(String str) { 
        super(str.length() + 16);
        append(str);
    }

4.String 与 StringBuffer 之间的转换

String ——> StringBuffer

String str = “hello”;

StringBuffer b = new StringBuffer(str);


StringBuffer ——> String

StringBuffer b = new StringBuffer(“world”);

String a = b.toString();

总结

  1. StringBuilder 与 StringBuffer 非常相似,都是可变字符序列,而且方法也一样
  2. String是不可变字符序列,效率低,但复用率高
  3. StringBuffer 效率较高(增删),线程安全
  4. StringBuilder 效率最高,线程不安全
  5. 如果字符串存在大量的修改操作,一般使用StringBuilder 与 StringBuffer;如果字符串修改比较少,别多个对象引用,一般用String,比如配置信息
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
StringStringBufferStringBuilder都是Java中用于处理字符串的类。 String是一个不可变的字符串类,也就是说一旦创建了一个String对象,它的值就不能被修改。每次对String进行修改操作时,都会创建一个新的String对象,这样会浪费内存空间和时间。因此,当需要频繁地对字符串进行修改时,使用String并不高效。 StringBufferStringBuilder是可变的字符串类,它们可以被用来进行字符串的修改操作。StringBufferStringBuilder的主要区别在于StringBuffer是线程安全的,而StringBuilder是非线程安全的。这意味着在多线程环境下,如果有多个线程同时访问一个StringBuffer对象,它们是安全的;而多个线程同时访问一个StringBuilder对象时,可能会导致数据错乱。 使用StringBufferStringBuilder的场景通常是在需要频繁地对字符串进行修改的情况下。例如,在循环中拼接字符串、在递归函数中修改字符串等情况下,使用StringBufferStringBuilder可以提高性能。 如果需要将StringBufferStringBuilder转换为String对象,可以使用两种方式。一种是调用它们的toString()方法,将其转换为String对象。另一种是使用String的构造器String(StringBuffer buffer)来创建一个新的String对象,将StringBufferStringBuilder的内容复制到新的String对象中。 总结起来,String是不可变的字符串类,而StringBufferStringBuilder是可变的字符串类,适用于需要频繁修改字符串的场景。转换为String对象可以通过调用toString()方法或使用String的构造器来实现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值