【问题标题】:Is Java String immutable? [duplicate]Java 字符串是不可变的吗? [复制]
【发布时间】:2013-09-05 11:20:50
【问题描述】:

我不明白这段代码,为什么我的字符串c 没有在main 方法中更改,而是在changeString 中更改。你能给我解释一下吗?

class MainClass {
    public static void main(String[] args) {
        String c = "lalala";
        changeString(c);
        System.out.println("str in main = "+c);
    }

    public static void changeString(String str) {
        str = str + "CHANGE!!!";
        System.out.println("str in changeString = "+str);
    }

}

结果:

str in changeString = lalalaCHANGE!!!
str in main = lalala

【问题讨论】:

  • 在 Java 中可能有一千个重复的问题。检查此页面右侧面板上相关部分的内容
  • 此链接将向您解释 Java 中字符串的概念 [检查此][1] [1]:javarevisited.blogspot.in/2010/10/…
  • 我正在写一个答案。如果您想了解变量的工作原理,您真的应该阅读python.net/~mwh/hacks/objectthink.html。尽管这篇文章是用 Python 编写的,但在使用值引用的语言中,这个概念是相同的。 TL;DR - 变量是绑定到对象的名称,而不是保存对象的存储桶

标签: java string immutability


【解决方案1】:

是的,java 字符串是不可变的。

changeString 中,您传入对字符串lalala 的引用,然后将引用 更改为指向lalalaCHANGE!!! 的引用。原始字符串对象没有改变,main 中的引用仍然指向那个原始对象。

如果您要使用 StringBuilder 而不是字符串,并将 CHANGE!!! 附加到该 StringBuilder,那么您会看到在 main 中查看它时所反映的更改:

class MainClass {
    public static void main(String[] args) {
        StringBuilder c = new StringBuilder("lalala");
        changeString(c);
        System.out.println("str in main = "+c.toString());
    }

    public static void changeString(StringBuilder str) {
        str.append("CHANGE!!!");
        System.out.println("str in changeString = "+str.toString);
    }

}

在这个更改后的版本中,您将获得:

str in changeString = lalalaCHANGE!!!
str in main = lalalaCHANGE!!!

【讨论】:

  • 此链接将向您解释 Java 中字符串的概念 [检查此][1] [1]:javarevisited.blogspot.in/2010/10/…
  • @yantrakaar 你为什么要对我发表评论?也许直接对 OP 发表评论?
【解决方案2】:

Java 字符串是不可变的吗?

字符串是不可变的,这意味着你不能改变对象本身,但你可以改变引用。

因此,当您在 changeString 方法中执行此操作时:

str = str + "CHANGE!!!";

创建了一个新的字符串内存对象。但是您在 main 方法中的 c 引用仍然指向旧的 sting 内存对象,因此会打印出 lalala

【讨论】:

    【解决方案3】:

    当然,字符串是不可变的:

    注意:String 类是不可变的,因此一旦创建了 字符串对象不能更改。 String 类有许多 方法,其中一些将在下面讨论,似乎修改 字符串。由于字符串是不可变的,这些方法真正做的是 创建并返回一个包含结果的新字符串 操作。

    http://docs.oracle.com/javase/tutorial/java/data/strings.html

    str = str + "CHANGE!!!";
    

    此代码返回一个不同的字符串并将其引用替换为您的变量,但原始字符串没有改变。

    【讨论】:

      【解决方案4】:

      是的,Java String 是不可变的。

      字符串是常量;它们的值在创建后无法更改。

      And String in java has very special treatment

      在此处阅读更多信息:


      【讨论】:

      • @downvoter 你能评论一下吗?
      猜你喜欢
      • 2013-05-08
      • 1970-01-01
      • 2019-10-15
      • 1970-01-01
      • 2015-03-30
      • 2015-08-19
      • 2015-07-02
      • 2011-03-24
      • 1970-01-01
      相关资源
      最近更新 更多