前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >“不可变的对象”与“不可变的对象引用”区别

“不可变的对象”与“不可变的对象引用”区别

原创
作者头像
好派笔记
修改2021-10-08 14:52:11
1.3K0
修改2021-10-08 14:52:11
举报
文章被收录于专栏:好派笔记好派笔记
代码语言:javascript
复制
String str = "test";
str = "test1";

我们从下图可以看到,当定义String str = "test1"时,其实不是真正改变了str的内容,而是改变了str的引用。

  那么何为"不可变的对象引用"呢?final只保证引用类型变量所引用的地址不会改变,即一直引用同一个对象,但是这个对象的内容(对象的非final成员变量的值可以改变)完全可以发生改变(比如final int[] intArray;,intArray不允许再引用其他对象,但是intArray内的int值却可以被修改)。

为什么String对象是不可变的?

  要理解String的不可变性,首先看一下String类中都有哪些成员变量。 在JDK1.8中,String的成员变量有以下几个:

代码语言:javascript
复制
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

  其中,成员变量hash并没有用final声明,但是由于第一次调用hashCode()会重新计算hash值,并且以后调用会使用已缓存的值,当然最关键的是每次计算时都得到相同的结果,所以也保证了对象的不可变。

代码语言:javascript
复制
    public int hashCode() {
        int h = hash;
        if (h == 0 && value.length > 0) {
            char val[] = value;

            for (int i = 0; i < value.length; i++) {
                h = 31 * h + val[i];
            }
            hash = h;
        }
        return h;
    }

  在Java中,数组也是对象, 所以value也只是一个引用,它指向一个真正的数组对象。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 为什么String对象是不可变的?
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档