Java String为什么是不可变类,StringBuffer与StringBuilder区别

Posted 记忆力不好

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java String为什么是不可变类,StringBuffer与StringBuilder区别相关的知识,希望对你有一定的参考价值。

熟悉Java的都知道String类是不可变,但String类为什么设计成不可变类,如何做到不可变没有仔细想过。

String为什么设计成不可变类?

1.符合Java字符串池的设计方式。    
String s1="abc";
String s2="abc";
      Java通过字符串池的设计方式节省内存空间,如一段代码只会生成一个对象放在常量池当中。s1和s2都指向这个对象,如果String类可变,通过s1这个引用就可以修改这个对象,那其他引用就会受影响。
2.安全性。       JDK提供的众多API当中,大多的参数都是String类型,如类加载函数,数据库的连接,Sql语句,Socket的参数等。如果String类可以被修改就会造成安全漏洞。而且多线程情况下,String类数据也可以保护数据不被其他线程修改。

String怎么实现不可变?

public final class String  
    implements java.io.Serializable, Comparable<String>, CharSequence   
    private final char value[];
从String类的源码中可以看到,String是通过char value[]保存字符的。而且声明为private final,并且不提供我们写value的接口。所以String类不能够修改。
(其实String类并不是不能修改,可以通过java的反射机制,获取到string对象的class对象,把value属性private修改为可访问类型,然后就可以直接访问对象value属性了)

StringBuffer和StringBuilder的区别 StringBUffer和StringBuilder都是可变的字符串类,StringBuffer和StringBuilder类的区别也在于StringBuffer是线程安全的,很多方法都有synchronized关键字,如下代码。StringBuilder不是线程安全的,所以一般情况下StringBuilder的性能要好。
 //StringBuffer类的源码   
public synchronized void ensureCapacity(int minimumCapacity) 
        if (minimumCapacity > value.length) 
            expandCapacity(minimumCapacity);
        
    

    /**
     * @since      1.5
     */
    public synchronized void trimToSize() 
        super.trimToSize();
    

    /**
     * @throws IndexOutOfBoundsException @inheritDoc
     * @see        #length()
     */
    public synchronized void setLength(int newLength) 
        super.setLength(newLength);
    

    /**
     * @throws IndexOutOfBoundsException @inheritDoc
     * @see        #length()
     */
    public synchronized char charAt(int index) 
        if ((index < 0) || (index >= count))
            throw new StringIndexOutOfBoundsException(index);
        return value[index];
    

以上是关于Java String为什么是不可变类,StringBuffer与StringBuilder区别的主要内容,如果未能解决你的问题,请参考以下文章

在Java中String类为什么要设计成final?String真的不可变吗?其他基本类型的包装类也是不可变的吗?

为什么java String是固定的 为什么字符串是不可变的

Java中String为什么是不可变的

Java中String为什么是不可变

Java 中的 String 为什么是不可变的?(转)

Java String类为什么不可变?