【问题标题】:String confusion in java [duplicate]java中的字符串混淆[重复]
【发布时间】:2013-12-22 04:52:00
【问题描述】:

来自 oracle 文档

字符串是immutable,字符串也是常量;他们的价值观 创建后无法更改。因为他们是 不可变的,它们可以共享。字符串缓冲区支持可变字符串。

但我总是可以做到以下几点:

String name="SO";

name="SE"; 

我可以改变这个值,所以它怎么可能是不可变的,据说出于安全原因也像数据库连接等。

请原谅我问了这么基本的问题,但我需要理解。

【问题讨论】:

  • 好吧,伙计,如果根据您的所有回答,如果 JVM 在变量的值发生更改时创建新对象,是否成本不高,它可以很好地更新现有引用的值而不是创建新对象并在内存中占用不必要的空间?对不起这种问题。

标签: java string immutability


【解决方案1】:

name="SE" 通过这样做,您正在更改 name 变量的值,而不是 String 对象 SO 本身。 String 在某种意义上是不可变的,String 对象SO 一旦创建就不能修改。通过name = name+"TEST";会在内存中创建一个新的String对象SOTEST,而不是现有的String对象SO会被修改。

更多详情请查看herehere。有很多例子和解释。

【讨论】:

    【解决方案2】:

    是的,您可以更改name 变量指向的字符串。但是让我们看看执行以下代码序列时会发生什么:

    String name = "SO"; //line 1
    name = "SE"; //line 2
    

    在第 1 行:创建了一个新的 String 对象,该对象包含值“SO”;

    在第 2 行:创建了一个新的 String 对象,该对象包含值“SE”;您的 name 变量值发生变化,因为它指向另一个引用,即第二个 String 对象;第一个 String 对象(“SO”)仍在堆上,但不再被引用,并且可供将来的垃圾回收(如果有)使用。

    这里你要明白的是,一旦包含字符序列 {'S', 'O'} 的字符串对象被构造出来,被该字符串对象包裹的字符序列就永远不会再改变了。例如。您不能使该对象包装字符序列 {'S', 'E'}。这就是不变性的全部意义所在。

    【讨论】:

      【解决方案3】:

      在您提供的示例中,您创建了两个Strings。首先创建StringSO,并将引用分配给name。然后创建一个新的StringSE,并将该引用分配给name。您从未真正修改过创建的第一个 String

              String temp = "SO";
              String name = temp;
              name = "SE";
              System.out.println(temp.equals("SO")); //prints true;
              System.out.println(temp == name); //compares references prints false
      

      【讨论】:

        【解决方案4】:

        当您更改 String 引用的值时,实际上是 创建了新对象。您的引用现在已链接到这个新对象。

        String myValue = "old"; -> 虚拟机创建字符串对象“旧”
        myValue = "new"; -> 虚拟机创建字符串对象“新”; “旧”对象仍然存在,但任何引用都链接到它,所以我们可以说:“旧”丢失了

        【讨论】:

          【解决方案5】:

          请看下面来自internet的图片:

          大云是存储对象的堆,s 是对对象的引用(在您的问题中,您使用名称作为引用)

          当您执行 s = "abcd" 时,会在堆中创建一个新对象,并且 s 是对它的引用。 (如顶部箭头所示)

          重要的一点:

          当您执行类似 s = "abcdef" 或 s = s + "ef" 之类的操作时,无法更改不可变字符串对象 "abcd",因此创建了一个新对象,并且 s 失去了对旧字符串的引用(如图所示虚线),现在引用新字符串(由底部箭头显示)。

          我假设的旧对象在某个时候被垃圾收集器拾取。

          【讨论】:

            猜你喜欢
            • 2016-11-20
            • 2017-05-16
            • 2013-06-13
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-04-16
            • 1970-01-01
            相关资源
            最近更新 更多