“java中String对象永远不变”这句话是什么意思?
public
class
Test {
public
static
void
main(String[] args) {
String str1=
"abc"
;
str1+=
"hhh"
;
System.out.println(
"str1:"
+str1);
}
}
我做如上测试,str1的值确实是被改变了,网上说是将str1指向了“hhh”,成为他的引用。那么“String对象永远不变”这句话的意义是什么,有什么作用??
意思是,只能被销毁,不能被改变。虽然看起来,它的值改变了,但改变的方式是销毁了原先的空间,创立了新的空间。而stringbuilder不一样,它改变值的方式是在原来空间的基础上,进行修改,不会销毁原来的对象。
String对象的内容不会改变
这里的str1只是一个字符串的引用,它指向堆中的一个字符串对象。堆中的字符串对象不会改变,但是这引用可以改变
这里的str1 += "hhh"; 表达的意思是str1 = str1 + “hhh”
str1 + "hhh"得到了堆中一个新的字符串,之后str1引用指向了新的对象
因此打印出来的结果是新的字符串对象的结果。
为了查看是否同一个对象,可以在debug的时候,查看这个对象的id
既然这样,我知不知道它变没变有什么影响呢
可变的对象,在使用的时候需要注意谁在使用,如果修改可变对象,需要考虑对其他对象的影响;在接收传递的可变参数时,开发者也要考虑是否要copy一个对象出来,以隔离干扰;另外存在线程安全问题,所以对开发者的要求高。
而不可变对象的使用就随意很多,lrc歌词下载需要了,直接一个等号将引用指向这个对象就好了,需要变更的之后将应用指向新的对象。因为是引用指向了新的对象,因此不存 在对其他对象的影响问题。问题是每次都会构建一个新的对象,似乎浪费了很多内存。不过没关系,这些不可变对象,一般引用的也多,或者一般都是小对象,垃圾 回收器可以轻松的批量回收。
知道是不变的对象,所以可以放心的随便赋值,不担心被影响或者影响别人,所以使用String,Long,Double,BigDecimal都是比较随意的。
但是使用StringBuilder的时候要小心,你的修改影响别人,别人的修改影响你,多线程还会故障
String 是final修饰的
只能说他的内部的value是final修饰的吧
我大概知道了,谢谢大佬!