指教!String对象永远不变,啥意思?

“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修饰的吧

我大概知道了,谢谢大佬!

发布了79 篇原创文章 · 获赞 2 · 访问量 2253

猜你喜欢

转载自blog.csdn.net/liuji0517/article/details/104874020