【问题标题】:Strings Immutability字符串不变性
【发布时间】:2011-09-21 04:34:22
【问题描述】:

有人告诉我java中的字符串是不能改的,下面的代码呢?

name="name";
name=name.replace('a', 'i');

它不会改变name 字符串吗? 另外,replace() 的实现在哪里;相比于();等于();假如? 我只是在这里使用这些函数,但它们实际上是在哪里实现的?

【问题讨论】:

  • 请注意 1) 变量不是对象 并且; 2)String.replace方法返回一个new String对象——原对象不变。

标签: java string immutability


【解决方案1】:

String.replace() 返回一个新字符串。

“name”是一个String对象的引用,所以它可以被重新赋值为指向name.replace(),但它会指向一个新的对象。

这里是javadoc for String,您可以在其中了解所有方法的作用。

【讨论】:

  • name 所引用的原始对象会发生什么情况?
  • 如果“name”是对该对象的唯一引用,那么该对象就消失了,将被垃圾回收。如果其他东西持有对该对象的引用,那么它将一直存在。
  • 不,它不会立即被 GC,但可能会在字符串池中存储一段时间,以防再次需要它。
  • 是的。我没有说什么时候会被垃圾回收。
【解决方案2】:

这是一个将引用变量(名称)与它所引用的字符串对象(“名称”)混淆的经典案例。他们是两种截然不同的野兽。 String 永远不会改变(忽略反射类型 kludges),但引用变量可以根据需要引用尽可能多的不同字符串。你会注意到,如果你刚刚调用了

name.replace('a', 'i');

什么都没有发生。仅当您将 name 变量分配给不同的字符串(由 replace 方法返回的字符串)时,您才能看到更改。

【讨论】:

    【解决方案3】:

    试试这个,自己看看:

    String name = "name";
    String r    = name.replace( 'a', 'i' );
    System.out.println( name );// not changed 
    System.out.println( r    ); // new, different string 
    

    如果将新的 ref 分配给 r,则原始对象不会改变。

    我希望这会有所帮助。

    【讨论】:

    • 这实际上并不能证明不变性。
    【解决方案4】:

    如果您的代码是 name="name"; name.replace('a', 'i'); //assignment to String variable name is neglected System.out.print(name)

    输出: name

    这是因为 name.replace('a','i') 会将替换的字符串 nime 放入字符串池中,但引用未指向字符串变量名。

    每当你尝试修改一个字符串对象时, java 检查结果字符串是否在字符串池中可用 如果可用,可用字符串的引用指向字符串变量 else new在字符串池中创建字符串对象,创建对象的引用指向字符串变量。

    【讨论】:

      猜你喜欢
      • 2015-04-15
      • 1970-01-01
      • 2011-04-05
      • 2010-12-05
      • 1970-01-01
      • 2018-12-17
      • 2016-07-04
      • 2010-10-03
      • 1970-01-01
      相关资源
      最近更新 更多