专栏首页好派笔记“不可变的对象”与“不可变的对象引用”区别
原创

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

String str = "test";
str = "test1";

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

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

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

  要理解String的不可变性,首先看一下String类中都有哪些成员变量。 在JDK1.8中,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

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

    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也只是一个引用,它指向一个真正的数组对象。

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

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

我来说两句

0 条评论
登录 后参与评论

相关文章

  • “不可变的对象”与“不可变的对象引用”

    什么是不可变的对象呢?我们都知道String是不可变的,如果有涉及大量的字符串拼接我们最好不要用String,虽然我们在代码中可以这样写: String str...

    用户1148394
  • 可变对象与不可变对象

    前阵子我们聊了下函数的参数传递以及变量赋值的一些内容:关于函数参数传递,80%人都错了。

    Crossin先生
  • 可变对象与不可变对象

      可以这样认为,操作该对象之前先将其复制一份,然后对该复制的对象进行操作,原来的对象不发生变化

    py3study
  • Java 可变对象和不可变对象

    作者:幽鸿   Mar 14, 2016 10:21:27 PM

    幽鸿
  • Python可变对象和不可变对象

    Python中一切皆对象,每个对象都有其唯一的id,对应的类型和值,其中id指的是对象在内存中的位置。根据对象的值是否可修改分为可变对象和不可变对象。其中,

    oYabea
  • Python中的可变对象和不可变对象

    Python中,数值类型(int和float)、字符串str、元组tuple都是不可变类型。而列表list、字典dict、集合set是可变类型。

    py3study
  • python可变对象和不可变对象的解释

    数据类型分为可变、不可变。可变对象表示可以原处修改该数据对象,不可变对象表示必须创建新对象来保存修改后的数据。

    py3study
  • 117-可变与不可变对象的效率

    python是一种解释型的语言,执行效率要比C这样的编译型语言差得多,但是也应该注意它的效率。 python的各种数据类型,按更新模型可以分为可变类型(如列表...

    凯茜的老爸
  • Python入门之python可变对象与不可变对象

    本文分为如下几个部分 概念 地址问题 作为函数参数 可变参数在类中使用 函数默认参数 类的实现上的差异 概念 可变对象与不可变对象的区别在于对象本身是否可变。 ...

    Jetpropelledsnake21
  • Python可变对象与不可变对象原理解析

    1. python不允许程序员选择采用传值还是传引用。Python参数传递采用的肯定是“传对象引用”的方式。实际上,这种方式相当于传值和传引用的一种综合。如果函...

    砸漏
  • Python - 可变和不可变对象

    小菠萝测试笔记
  • JAVA final 与 不可变对象

    参考: https://www.journaldev.com/129/how-to-create-immutable-class-in-java http:/...

    平凡的学生族
  • Python解惑之对象可变与不可变

    面向对象的语言,普遍存在的一个问题就是对象的可变(mutable),与对象的不可变(immuatable)。它是重要的,理解这个概念对于我们认识面向对象,避免掉...

    double
  • 详细分析Python可变对象和不可变对象

    在 Python 中一切都可以看作为对象。每个对象都有各自的 id, type 和 value。

    砸漏
  • Python 对象引用与可变性

    Python 中的变量都是引用式的,这个概念很容易在写代码的时候引入 bug,还不易察觉。这篇文章就是讲述 Python 中对象的引用和可变性,然而首先要抛弃变...

    CS实验室
  • python新手学习可变和不可变对象

    python中有可变对象和不可变对象,可变对象:list,dict.不可变对象有:int,string,float,tuple.

    砸漏
  • 由 System.arraycopy 引发的巩固:对象引用 与 对象 的区别

    作者:林冠宏 / 指尖下的幽灵 腾讯云+社区:https://cloud.tencent.com/developer/user/1148436/acti...

    林冠宏-指尖下的幽灵
  • 由 System.arraycopy 引发的巩固:对象引用 与 对象 的区别

    首先明确一点,System.arraycopy 操作的是数组,效果是深复制。 是不是觉得怎么和你印象的中不一样? 重点来了,对于对象数组,例如: User[]...

    林冠宏-指尖下的幽灵
  • 详解Python中的可哈希对象与不可哈希对象(二)

    前言:我们经常会听见很多的概念,哈希值,哈希表,可哈希对象,不可哈希对象,散列表,字典,映射,等等,那么这么多的概念后面到底又有什么区别和联系,它们的本质又是怎...

    小草AI

作者介绍

好派笔记

秦皇岛经济技术开发区易云软件开发服务部技术总监

秦皇岛经济技术开发区易云软件开发服务部 · 技术总监 (已认证)

专栏

精选专题

活动推荐

扫码关注云+社区

领取腾讯云代金券