Android必备回顾:9、为什么说_String_是不可变的

目录

代码验证

源码验证


为什么说 String 是不可变的?

那么要谈到 String 是否可变,那么我们可以从两个方面入手。
第一个我们可以通过代码来验证它。
第二个我们也可以在,String的源码中找到相关的答案。

代码验证

我们先从代码方面来看一看,为什么说它是不可变的呢?
这里给大家准备了一个demo。那么我们来看一下

    public void testString(){
        String str = new String("abc");
        System.out.println(str.hashCode());
        str+="a";
        System.out.println(str.hashCode());
        str+="b";
        System.out.println(str.hashCode());
//        String str2 = "abcab";
//        System.out.println(str2.hashCode()+" "+str.hashCode());
    }

我们先看这里,我先 new 了一个spring 参数为abc,然后我往 abc 里面,有加入a 字符,还有加入b 字符。
那么这三次打印,如果说是不可变的,那么它的 hashCode 的值应该就是不一样的。

如果它是能够变化的,那么这一个对象中的内容,就应该是可以修改的。
那么这三个 hashCode 的值它就应该是相同的,对不对?


来我们来验证,看一下效果。

96354
2987071
92599299

我们会发现这三个 hashcode 的值不一样,也就是说我们对 String 的内容进行改变的过程中,那么这个 String 对象他已经不再是同一个对象了。

那么接下来,我再创建一个新的 str2 的对象。那么经过最后一次的拼接以后,那么上面它原来的值应该是 abcab 


所以我创建了一个对象,这个对象的内容。和它前面的连接符连接以后的结果是相同的。

        String str2 = "abcab";
        System.out.println(str2.hashCode()+" "+str.hashCode());

那么如果说这个 str2 和上面的这个 str,它是同一个对象。那么我们的 hashCode 就应该相同,否则就应该是不一样的。


那我们再来看一看验证的结果。

96354
2987071
92599299
92599299 92599299

我们会发现最后一行的打印,两个 hashCode 的值,完全是相同的。
也就是说:在 String 进行处理的时候,那么只需要它的内容是相同的,我们就认为是同一个对象。
那么经过各种变化以后,最后的结果是 abcab,而我们新建的这个 str2 也是abcab。那么这两个对象我们就把它认为是同一个对象。这也就是,为什么 java 中我们会说 String 是不可变的。

源码验证

当然同时在 String 这个类的源码中,我们也可以看到 String 这个类。
那么它在内定义的时候就把它定义成了 final 类型。所以我们说它是一个不可变的类

public final class String implements Serializable, Comparable<String>, CharSequence {

并且它的数据,这个 String 的长度,也是不可以修改,

它的 UID 也是不可修改的


同时它里面的内容也是不能修改的。所以我们说 String 它是一个不可变的类。

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

被开发耽误的大厨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值