java中String为什么是不可变的?

这是一个大神的csdn账号,我只是最近帮忙写点东西在里面,其实也算不上帮忙,毕竟我是个菜鸟级别的,所以朋友们有兴趣就看一下,如果是大神的话请忽略吧~
参考上一篇文章,再加上网上的资料,我说说java中String为什么是不可变的。仅仅作为一个日后可以参考的学习资料。

String的成员变量

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

    /** Cache the hash code for the string */
    private int hash; // Default to 0
    ...

这个是JDK1.8中String源码的前两个成员变量,可以看到value[]被声明成private和final类型,也就是说不仅外部无法访问String中的这个value,在String对象内部也是不可以改变value的值的,value一旦被赋值就不可再改变。
那么问题来了,我们平常我们不是可以这样的吗?

String s = "123";
        System.out.println(s);
        s = "234";
        System.out.println(s);

输出结果为:

    123
    234

这看起来String的值不是改变了么?但其实String的值并没有改变,第一句String s = “123”创建了一个值为123的String对象,这个对象的引用是s,第二句s = “234”创建了一个新的值为”234”的String对象,并且让之前的引用s指向新的对象。这个过程中s的指向有变化,所以输出s的值时候显示有变化,但是两个String对象在这个过程中本身都没有变化。
恩,我就是这么理解的,有什么不对的地方欢迎大家指出~

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值