首页 > 解决方案 > java中的字符串相等检查

问题描述

以下两种说法的区别:

  1. String s = "Hello";
  2. String s = new String("Hello');

在第一个语句中,赋值运算符 - 用于将字符串文字分配给 String 变量s。在这种情况下; JVM首先检查字符串常量池中是否已经存在同一个对象。如果它可用,那么它会创建另一个对它的引用。如果相同的对象不可用,则它会创建另一个内容为“Hello”的对象并将其存储到字符串常量池中。

第二个语句中,new运算符用于创建字符串对象。在这种情况下,JVM总是在不查看字符串常量池的情况下创建一个新对象。

我对下面提供的代码的怀疑是语句的输出

System.out.println(a.hashCode() + " " + b.hashCode());

根据规则,这里两个对象都应该有不同的内存位置,但是显示了它们的哈希码true

import java.util.HashMap;
import java.util.Map;

class TestStringEquality 
{ 
public static void main (String[] args) 
{ 

    String a = new String("abcd");
    String b = new String("abcd");

    System.out.println(a == b);
    System.out.println(a.hashCode() + " " + b.hashCode());
    System.out.println(a.equals(b));

    Map<String, String> map = new HashMap<>();

    map.put(new String("abcd"), "abcd");
    map.put(new String("abcd"), "wxyz");


    System.out.println(map);
} 
}

我得到的输出如下:

false
2987074 2987074
true
{abcd=wxyz}

标签: javastringmemoryhashcode

解决方案


根据https://docs.oracle.com/javase/8/docs/api/java/lang/String.html#hashCode上的 API 表 ——字符串哈希码中使用的公式取决于长度和内容的字符串,而不是内存位置。因此,具有不同内存位置的两个相同字符串应该给出相同的哈希码。


推荐阅读