【问题标题】:java String's immutabilityjava字符串的不变性
【发布时间】:2014-05-06 23:01:35
【问题描述】:

如果我跑,

String s1="abc";

那么两者之间有什么区别:

String s2=new String(s1);

String s2="abc";

这就是我的困惑:

Head First Java 说:“如果字符串池中已经存在具有相同值的字符串,则 JVM 不会创建重复项,它只是将您的引用变量引用到现有条目。”在我看来观点是 s1 已经创建了“abc”,s2 只是引用它。我说的对吗?

【问题讨论】:

  • 就我而言,写String s2 = new String(s1); 从来没有正当理由。即使内容相等,您也不应该编写依赖于两个字符串引用不相等的代码。如果你不这样做,那么String s2 = s1; 也可以。

标签: java string immutability string-pool


【解决方案1】:

当您编写 String s2="abc"; 并且 "abc" 已经在池中时,您将不会得到重复 - 您将获得对现有 String 的引用。

但是如果你写new String(something),你会得到一个新的String,不管池中是否有匹配的String

【讨论】:

  • 没错!!!我就是这么想的。感谢您确定这一点。由于伯克利的“CS61B 数据结构”说它们是相同的......我认为他只是说错了。
【解决方案2】:

String Constant Pool 在这种情况下出现,如下图所示。

我认为它会帮助您从视觉上理解它。

String s1="abc"; // s1 will go to String constant pool

String s2=new String(s1); // any object created by "new" keyword will go to Heap

String s2="abc"; // s1 and s2 both will refer to same string in constant pool

【讨论】:

  • 你说“new”创建的任何对象都会去Heap,但是为什么str1在Constant Pool而不在Heap?你能解释一下第一行的整个过程“String str1=新字符串(“java5”)“?非常感谢!!!!
  • "java5" 是一个字符串文字,它将进入字符串常量池。你有没有注意到图中的变量 str1 位于堆内的顶部位置。
  • 我希望你现在明白了,并且会记住下一次 JAVA 面试。 :)
【解决方案3】:

new 关键字将强制在堆中创建一个新的字符串对象,即使它已经存在于字符串池中

【讨论】:

    猜你喜欢
    • 2010-12-05
    • 1970-01-01
    • 1970-01-01
    • 2015-04-15
    • 1970-01-01
    • 1970-01-01
    • 2011-04-05
    • 2018-12-17
    • 2022-06-28
    相关资源
    最近更新 更多