引用不可变和对象不可变

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

1String str = "test"; 2str = "test1";

这样写是没有错的,这是不是和我们所说的String类型时不可变的违背了呢?其实不然,我们这里看到str“改变”了值,其实不是不是真正改变了,而是改变了str的引用。我们从下图可以看到当定义String str = "test1"时,Java实际上做了这个操作

630246-20161021001747638-1818840685

在我们再一次赋值str = "test1"时,Java实际上做了下面这个操作: 630246-20161021002032935-1613836399

"test"变量其实并没有改变,改变的只是str的引用,将str的引用重新指向在常量池中新创建的"test1"变量,这即是"不可变的对象"。

1/** 2 * @Author XHP @Date 2022/4/17 @Version 1.0 3 */ 4public class test01 { 5 private final User user = new User(); 6 7 public static void main(String[] args) { 8 9 test01 test01 = new test01(); 10 test01.user.setName("keven"); 11 System.out.println(test01.user.getName()); 12 test01.user.setName("turbo"); // final关键字不影响本身是可改变的对象 13 System.out.println(test01.user.getName()); 14 } 15}

那么何为"不可变的对象引用"呢?字面意思当然就是和上面相反,允许它改变str的引用重新指向"test1"字符串变量。即是在定义变量时加上final关键字。我们看以下代码:首先有一个User类,这个类中的name变量是普通变量,可以通过setName方法赋值。

我们在main方法中来试验一把final关键字的“不可变的对象引用”。

1class User { 2 private String name; 3 4 public String getName() { 5 return name; 6 } 7 8 public void setName(String name) { 9 this.name = name; 10 } 11}

以上便是“不可变对象”与“不可变的对象引用”的区别

点赞
收藏

评论区

加载中...

相关推荐

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

String、StringBuffer、StringBuilder的区别

String字符串常量StringBuffer字符串变量(线程安全)StringBuilder字符串变量(非线程安全) 简要的说,String类型和StringBuffer类型的主要性能区别其实在于String是不可变的对象,因此在每次对String类型进行改变的时候其实都等同于生成了一个新的String

深入不可变类 -- 谈谈Java String与包装类的底层实现

深入不可变类——谈谈String与包装类的底层实现一、走进不可变类不可变类是指在创建实例后该例变量不可以改变的类。比如String类和包装类。定义不可变类需要遵守:1.成员变量设置为priavte,final修饰2.提供带参构造器对成员变量进行初始化3.只提供getter,

一文弄懂Java中String的所有小秘密

简介String是java中非常常用的一个对象类型。可以说java中使用最多的就是String了。那么String到底有哪些秘密呢?接下来本文将会一一讲解。String是不可变的String是不可变的,官方的说法叫做immutable或者constant。String的底层其实是一个Char的数组。priv

Java中有趣的String、StringBuffer与StringBuilder

String介绍  String类属于java.lang包中,String类是不可变类,任何对String的改变都会引发新的String对象的生成。  创建String的两种方式:  1.通过构造器创建:StringstrnewString("Iamastring.");2.通过变量赋值:String

Python学习之路(43)——自定义容器(container)

Python中常见的容器类型包括dict、tuple、list和string。其中,tuple和string是不可变容器,dict和list是可变容器。其区别在于,不可变容器一旦赋值后,其元素不能进行修改。然而,有时针对特殊需求,我们还需要自定义容易。1、自定义不可变容器类型:需要定义\_\_len\_\_和\_\_getitem\_\_方法;2