美文网首页七七八八打印zi
Java基础(三):String、StringBuilder与S

Java基础(三):String、StringBuilder与S

作者: AlvinL | 来源:发表于2015-03-22 22:19 被阅读505次

    Java中有三种字符串类型:StringStringBuilderStringBuffer,那么它们之间有什么区别呢,又应该在怎样的场景中使用?

    String

    String是字符串常量,一旦创建之后就不可以改变其内容,即是immutable(不可变)的,其类的部分定义如下:

    /** The value is used for character storage. */
    private final char value[];
    
    /** The offset is the first index of the storage that is used. */
    private final int offset;
    
    /** The count is the number of characters in the String. */
    private final int count;
    

    其中value[]是用来存储字符串的,被声明为final,因此只能赋值一次,之后不能再被修改。有些同学可能会问,String在赋值之后,是可以被重新赋值的啊,其实,它是创建一个新的String来实现的。如下代码:

    public static void main(String[] args) 
    {   
        String a = "hello";
        System.out.println(a.hashCode());
        a = "world";
        System.out.println(a.hashCode());
    }
    

    输出的两行结果不一样的,说明a被重新赋值之后,跟赋值前不是同一个对象。

    StringBuffer

    StringBufferString区别是,前者是可变的,是字符串变量,而且,StringBuffer是线程安全的。如果需要频繁修改字符串内容,就可以使用StringBuffer
    StringBuffer 上的主要操作是 appendinsert 方法,可重载这些方法,以接受任意类型的数据。每个方法都能有效地将给定的数据转换成字符串,然后将该字符串的字符追加或插入到字符串缓冲区中。append 方法始终将这些字符添加到缓冲区的末端;而 insert 方法则在指定的点添加字符。

    StringBuilder

    StringBuilder也是一个字符串变量,但它是非线程安全的。这个类是在JDK5.0新增的,它是设计作为StringBuffer的一个简易替换,用于单线程使用的情况(很普遍)。由于它是非线程安全,因此在效率上是快于线程安全的StringBuffer

    三者区别

    • String是字符串常量,StringBufferStringBuilder是字符变量
    • StringBuffer是线程安全的,StringBuilder是非线程安全的

    使用场景

    • 如果只操作少量数据,建议使用String;单线程操作大量数据,使用StringBuilder;多线程操作大量数据则使用StringBuffer
    • 不要使用String+来进行频繁的字符串拼接操作,应用使用StringBufferStringBuilder
    • 为了获得更好的性能,在构造 StirngBufferStirngBuilder 时应尽可能指定它们的容量。当然,如果你操作的字符串长度(length)不超过 16 个字符就不用了,当不指定容量(capacity)时默认构造一个容量为16的对象。不指定容量会显著降低性能
    • StringBuilder一般使用在方法内部来完成类似"+"功能,因为是线程不安全的,所以用完以后可以丢弃。StringBuffer主要用在全局变量中。

    相关文章

      网友评论

        本文标题:Java基础(三):String、StringBuilder与S

        本文链接:https://www.haomeiwen.com/subject/xoqgxttx.html