开发者社区> 问答> 正文

为什么Java中的String类型对象创建出来就是不可更改的?

为什么Java中的String类型对象创建出来就是不可更改的?

展开
收起
不语奈何 2020-01-10 10:00:41 1088 0
3 条回答
写回答
取消 提交回答
  • String是final类。

    2020-03-25 09:45:27
    赞同 展开评论 打赏
  • 技术架构师 阿里云开发者社区技术专家博主 CSDN签约专栏技术博主 掘金签约技术博主 云安全联盟专家 众多开源代码库Commiter

    添加final

    2020-01-10 11:15:03
    赞同 展开评论 打赏
  • 精于基础,广于工具,熟于业务。

    1.现象上看,String不可变很简单,给一个已有字符串“abcd”第二次赋值成"abced",不是在原内存地址上修改数据,而是重新指向一个新对象,新地址。 2.源代码层面来看,String类是用final关键字修饰,这说明String不可继承。再看下面,String类的主力成员字段value是个char[]数组,而且是用final修饰的。final修饰的字段创建以后就不可改变。 3.系统层面来讲,Java中的String类型确实是不允许改变其内容的,String类型的对象一旦建立,将在堆内存当中占据一个固定的内存空间,String类型的对象无法改变。 但是你在运算的时候又发现,你定义的String类型的s变量又是可以进行连接的,如"abc"+"def"最终得到的s的值是"abcdef",这似乎看着String类型的对象又是可以改变的,这是自相矛盾吗? 其实,String对象不允许改变内容是正确的,但是可以改变定义的String类型的变量指向,你定义的String s 其实是一个指向String对象的指针,如果不存在对象就为null。 如果你定义了: String s="abc"; 那么将创建一个内容为"abc"的String对象,并且s指向这个对象。 一旦s=s+"abc";这样的操作,那么将创建一个新的String对象来存放新的内容,原先的对象依旧在内存中,但是s不在指向它,那么这个对象就会成为垃圾内存,在某一个特定的时刻有Java虚拟机回收。 如果希望存放的String可以调整大小,而不是创建新的内存来存放新的对象,可以使用StringBuffer这个类来存放。这个内存可以调整大小。而不会抛弃。

    2020-01-10 15:19:41
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
Spring Cloud Alibaba - 重新定义 Java Cloud-Native 立即下载
The Reactive Cloud Native Arch 立即下载
JAVA开发手册1.5.0 立即下载