【问题标题】:String literals vs string objects hashcode [duplicate]字符串文字与字符串对象哈希码 [重复]
【发布时间】:2017-12-15 22:58:30
【问题描述】:

我读到声明为文字的字符串是在字符串常量池上创建的 String s1 = "Hello"; String s2 = "Hello"; -> 这不会创建新对象,而是引用 s1 引用。

在堆内存和字符串常量池上都创建了用 new 关键字声明的字符串 String s3 = new String("Hello"); -> 这将在堆中创建一个新对象。 但它会在字符串常量池中创建一个新常量还是使用 s1 中的常量?

我有以下代码。 所有 s1、s2 和 s3 的哈希码返回相同。

public class question1 {

  public static void main(String[] args) {

    String s1 = "Hello";
    String s2 = "Hello";
    String s3 = new String("Hello");

    System.out.println(s1 == s2);
    System.out.println(s1 == s3); // not sure why false result, s3 will create a separate constant in the pool? There is already a constant with value "Hello" created by s1. Please confirm if s3 will again create a constant.
  }
}

我知道== 比较对象。 字符串常量池中是否定义了两个“Hello”,一个来自 s1,一个来自 s3?

【问题讨论】:

  • hashCode 与引用相同无关。 hashCode 只关心.equals,而不关心==s3 根本不在常量池中。
  • == 测试两个对象是否完全相同。 new 总是 创建一个新的、单独的对象。
  • 把hashcode想象成你的生日,你和你的邻居可能是同一天出生,但你不是同一个人!
  • s3 将使用由 s1 创建的相同常量,还是会在池中创建一个单独的常量以及对象?

标签: java string object


【解决方案1】:

字符串字面量会自动“实习”,将它们放在一个池中。这最大限度地减少了所需的实例数量。因此,这两个文字使用相同的 String 实例。 hashCode() 以一致的方式对 String 的内容进行操作。如果两个 String 实例具有相同的字符,那么它们将具有相同的哈希码。

【讨论】:

  • 意思是,那么我们在常量池中有两个常量? s1 创建了一个常量,s3 在堆中创建了一个对象,然后 s3 也创建了一个常量?还是要使用s1创建的常量?
  • 字符串字面量会自动实习,而“new String()”会导致在堆中创建字符串对象,但不会在字符串常量池中创建类似的字符串。要在字符串常量池中创建类似的字符串,请在该新字符串对象上调用 inter()。
  • s3 既不在池中创建常量,也不重用已放置在池中的常量
猜你喜欢
  • 2023-03-15
  • 2012-08-23
  • 2010-09-12
  • 2016-09-06
  • 2013-01-20
  • 2011-08-18
  • 2019-08-08
  • 1970-01-01
相关资源
最近更新 更多