【问题标题】:String Pool in the JVM [closed]JVM中的字符串池[关闭]
【发布时间】:2013-06-10 06:47:54
【问题描述】:

我真的对字符串池感到困惑

在这种情况下会创建多少个对象

String a=new String("Hi"); //1
String b=new String("Hi"); //2
String c="hi"; //3

如果在第 2 和第 3 个字符串的情况下创建了一个对象,那么为什么它在 (a==b) 的情况下返回 FALSE....

【问题讨论】:

标签: java string


【解决方案1】:

为什么在 (a==b) 的情况下返回 FALSE

因为您使用的是new String,因此为那些Strings 获取了新的对象引用。

注意把代码改成

String a = "Hi"; //1
String b = "Hi"; //2

将使System.out.println(a == b);打印true

进一步解释:The String Pool

【讨论】:

  • @JoachimSauer 对,做了一个测试来验证我的陈述(与Integer pooling 混淆)。删除了答案的那部分。
【解决方案2】:

在 Java 中,对于非原始类型,== 运算符比较引用,而不是值。

如果你创建了一堆等价的字符串字面量,比如:

String sLit1 = "test";
String sLit2 = "test";

(sLit1 == sLit2) 将是 true,因为 Java 不会为每个新的 String 文字分配新的内存,它只是将它们都指向内存中的相同位置。但是,当您创建 String 对象时:

String sObj = new String("test") 

Java 总是创建一个新对象,该对象在内存中占据一个新位置。所以sLit1 == sObj 永远是false

这意味着== 产生true 当且仅当两个参数引用同一个对象。要比较字符串,请使用equals 方法,如(sObj.equals(sLit1))

【讨论】:

  • Thanx,但还有一件事,如果我使用 inturn() 方法,它也会在 new 关键字的情况下返回 true
  • 另外,由于您也是新用户,请查看tour
【解决方案3】:

它不是一个对象,你正在使用 new 关键字创建字符串,所以 jvm 在堆中创建这些字符串,因此两个对象的地址不同。

并且 == 检查对象地址,这就是它返回错误的原因。

如果是字符串 c="hi";

这不是使用 new 创建的,因此这些文字是在字符串池中创建的。jvm 对这些文字有一个实习过程。

如果还有一个 String d="hi";然后 c==d 将返回 true。

【讨论】:

  • java String 中 compareTo 的用途是什么?我无法理解它的输出
  • compareTo 是 Comparable 接口的方法,由 String 类实现,用于比较两个对象。
【解决方案4】:

这里,

String c = "Hi"; 

将在字符串文字池中创建字符串文字,这是为java中的字符串文字提供的单独内存。 当你写

String c = "Hi";
String d = "Hi";

它们将在字符串常量池中引用相同的文字。 和 == 运算符检查引用变量是否引用同一个对象

因此,c == d 将返回 true。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-29
    • 1970-01-01
    • 1970-01-01
    • 2020-07-26
    • 2011-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多