0

我是 Java 编程新手,我想创建多个字符串,为此我编写了下面的代码。为什么它为两个字符串对象生成相同的哈希码?

   class SingletonClass {
            public static String mystring="this"; 
        }
        public class SingletonObjectDemo {
            public static void main(String args[]) {
                String str = SingletonClass.mystring;
                String str2 = SingletonClass.mystring;
                System.out.println("String str  "+str.hashCode());
                System.out.println("String str1  "+str2.hashCode());
                    }
        }
4

5 回答 5

2

它为两个字符串对象生成相同的哈希码……因为它们是同一个对象。

于 2012-05-16T08:58:39.947 回答
1

它们在内存中引用相同的对象,本质上没有区别..

于 2012-05-16T08:59:26.183 回答
0

您说您“想要创建多个字符串”,但您使用的是名为 SingletonObjectDemo 的东西。单例的要点是,无论您“创建”多少次,都只会有一个对象,因此您无法创建多个对象。正如 Louis 解释的那样,这就是哈希码返回相同的原因。

于 2012-05-16T09:01:06.903 回答
0

似乎您将对象与对它们的引用混淆了。当您编写时,String str = "a", str2 = "a";您不是创建两个字符串,而是将两个包含完全相同引用的变量声明为字符串常量“a”。

此外,如果它们是两个对象,String str = new String("a"), str2 = new String("a")那么hashCodes仍然是相同的,因为对于相等的对象,它们的哈希码必须匹配——这是哈希码的基本原则。

但是,如果你说, write Object o = new Object(), o2 = new Object(),现在哈希码是不同的,因为没有两个实例Object是相等的(这是根据定义,而不是某些不可避免的逻辑)。

于 2012-05-16T09:02:59.667 回答
0

这是一个好的哈希码的属性。

如果 A 和 B 是满足 A.equals(B) 的对象,则应具有以下属性。

A.hashCode().equals(B.hashCode())

您可以在此处阅读有关 hashCode 和 equals()的信息

于 2012-05-16T09:03:19.163 回答