String、StringBuilder、StringBuffer的深入解析

String不同于基本的数据类型(byte,boolean,char,short,int,long,float,double,(void));

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

String基于final的类,那么就有人会问,为什么String类是final的呢
这就要从场景来分析了,首先来看下使用频率,String是一个高频使用的字符类。而定义了final后,就说明了该变量是不可修改的,同时所修饰的类是不可以被继承的。
一切归根接地来说都是为了安全。

并不是说final修饰的就不可以改变。下面的代码是编译通过的。
        final int []array = {1,5,3};
        array[2] = 1;
String的本质是char数组,而将其私有化导致无法访问才是问题的根本。
再看如下场景
HashSet<String> hs = new HashSet<String>();
String s1="a";
String s2="ab";
hs.add(s1); hs.add(s2);
String s3=s1; s1+="b";
System.out.println(hs);
//输出
//[a, ab]

再看另外一个场景
HashSet< StringBuilder > hs = new HashSet< StringBuilder >();
StringBuilder s1 = new StringBuilder("aa");
StringBuilder s2 = new StringBuilder("aab");
hs.add(s1); hs.add(h2);
//一切到这都是没有任何问题的,转折在此
StringBuilder s3 = s1;

s3.append("b");

s3是指向s1的地址的,s3的修改会带动s1的修改。

//那么输出为
//[ab]

HashSet会自动合并重复的的对象,而在HashMap中,key是不允许出现重复的,会发生覆盖现象。这是程序员没注意到的意外就发生了。

StringBuilder和StringBuffer的不同
StringBuilder可变,同时是非线程安全的。
StringBuffer可变,是线程安全的(synchronized)
String不可变,也就是只支持写,所以可以说是线程安全的。

你可能感兴趣的:(java)