java 为什么它为两个字符串对象生成相同的哈希代码?

s4n0splo  于 2022-12-02  发布在  Java
关注(0)|答案(5)|浏览(256)

我是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());
                    }
        }
icomxhvb

icomxhvb1#

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

htrmnn0y

htrmnn0y2#

它们在记忆中引用同一个对象,在本质上没有区别。

flvtvl50

flvtvl503#

当你写String str = "a", str2 = "a";的时候,你不是在创建两个字符串,而是声明了两个变量,它们包含了对字符串常量“a”的完全相同的引用。
即使它们是两个对象,如String str = new String("a"), str2 = new String("a")中的hashCode仍然是相同的,因为对于相同的对象,它们的哈希码必须匹配--这是哈希码的基本属性。
但是,如果你写Object o = new Object(), o2 = new Object(),现在哈希码会不同,因为没有两个Object的示例是相等的(根据Object类的相等性定义)。

rqcrx0a6

rqcrx0a64#

你说你"想要创建多个字符串",但是你使用的是一个名为SingletonObjectDemo的东西。单例的意义在于,无论你"创建"多少次,都只有一个对象,所以你不能创建多个对象。正如Louis所解释的,这就是为什么哈希代码返回相同的结果。

5w9g7ksd

5w9g7ksd5#

这是一个好的散列码的属性。
如果A和B是对象,使得A.等于(B),那么下面的性质应该成立。
A.hashCode().相等(B.hashCode())
您可以阅读有关hashCode和equals()here的内容

相关问题