• String对象不可改变的特性及内存机制


    JAVA中字符串类型String是不允许改变其内容的,下列语句是如何运行的:
    String s=new String("ABCD");
    s=s+"123";


    最佳回答:
    确实,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+123+new Date()这样的操作,那么将创建一个新的String对象来存放新的内容,原先的对象依旧在内存中,但是s不在指向它,那么这个对象就会成为垃圾内存,在某一个特定的时刻有Java虚拟机回收。
    如果希望存放的String可以调整大小,而不是创建新的内存来存放新的对象,可以使用StringBuffer这个类来存放。这个内存可以调整大小。而不会抛弃。

    其他回答
    1.新建对象String,内容为ABCD,开辟一块空间存进去,把内存地址返回给s
    2.新建对象String,内容为s的内容加上字符串123的内容转为字符串后的内容,开辟一块空间存进去,把内存地址返回给s
    以上内存均指jvm中的内存

    内容来自:

    https://zhidao.baidu.com/question/540899123.html

    参考博客:

    http://blog.csdn.net/renfufei/article/details/15815121

     

  • 相关阅读:
    Linux运维笔记
    回到顶部过渡js代码
    好想你红枣
    鼠标点击区域问题
    ie6 hover 子元素无效bug
    IE6和7下text-indent导致inline-block标签消失的bug
    星星评分js代码
    洛谷P3147 [USACO16OPEN]262144 2048 合并 倍增 动归 递推
    洛谷P1114 “非常男女”计划
    洛谷P1108 低价购买 动态规划
  • 原文地址:https://www.cnblogs.com/expiator/p/7881720.html
Copyright © 2020-2023  润新知