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不可变,也就是只支持写,所以可以说是线程安全的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值