java中的可变与不可变个人理解笔记

两者概念:

首先我们可以从ppt上看到的图包括几个要素:箭头-代表引用,双线箭头表示引用不可修改,圈表示可变对象,双圈表示不可变对象。

不可变:个人觉得可以理解为指向的不可变-final修饰的,以及内容的不可变-不可变对象(基本数据类型加上他们的封装类还有String)。
可变:除了以上两种不可变,剩下的就属于指向可变,以及内容可变的。

可变::可变对象指的意思就是,对象也就是圈以内的值是可以改变的。

final修饰的指向不可变的意思:
比如
int a=0;
a=9;就会报错。我们可以理解为。在a=9的时候本应该创建并指向一个新的值,但是a因为被final修饰所以他无法指向新的,而且a是int型的所以他属于内容不可变,那么这里a的值就相当于被限制死了。没法指向新的,本身也无法改变。
而如果我们让
int b=6;
final int a=b;如果修改b=9,这个时候输出a任然还会是6,因为b=9实际上是属于跳转到另外一个值去了(并不是对象)。而a还是指向原来的那个地方。

不可变对象的意思:比如int对应的包装类integer的话,指向的就不是单独的一个值,而是一个对象,也就是一个圈,而且还是双线圈。他们每次改变
integer a=7;
integer a=9;
实际上是创建了一个新的圈,同时指向也到了新圈,圈里有个新的值,而原来的圈所指向的值仍然存在并且不会改变。圈所表示的也就是对象。

一些使用的例子

比如说final String a=“abc”;这个就可以发现,a没有办法更新,因为他被final修饰以后指向也无法改变了。而她又是不可变对象所以他的对象值也没办法改变什么。
作用
个人理解:我们有时候需要一个贯穿全程的对象,也就是随着程序运行,某个值需要随着程序改变。那我们就可以选择一个可变对象,在每个部分中让一个a等于他,这样a修改了,对象在全局上值也改变了,不会出现应该变化而不变的情况。
反过来,如果不希望一个值被修改只希望它被引用,那么就可以使用不可变对象。

注意事项/积累

一:
String a= “abc”;//a指向的是常量池
String b= new String “abcd”;//b指向的是堆
这也是为什么a指向的abc不需要花圈的原因

要注意String这种不可变对象,不会被删除,一直都存在,所以这是有一定的风险的。

StringBuilder a=new StringBuilder(“abc”);
如果执行了比如 b.add(a.toString())
这个时候,a就会由可变的stringBuilder转化为不可变的String。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值