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

Java 为什么它为两个字符串对象生成相同的哈希代码?,java,reference,hashmap,Java,Reference,Hashmap,我是Java编程新手,我想创建多个字符串,为此我编写了下面的代码。为什么它为两个字符串对象生成相同的哈希代码 class SingletonClass { public static String mystring="this"; } public class SingletonObjectDemo { public static void main(String args[]) {

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

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

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

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

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

您说“想要创建多个字符串”,但您使用的是一种称为SingletonObjectDemo的东西。单例的要点是,无论您“创建”了多少次,都只有一个对象,因此您不能创建多个对象。正如Louis所解释的,这就是哈希代码返回相同结果的原因。

您说“要创建多个字符串”,但您使用的是一种称为SingletonObjectDemo的东西。单例的要点是,无论您“创建”了多少次,都只有一个对象,因此您不能创建多个对象。正如Louis所解释的,这就是哈希代码返回相同结果的原因。

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

此外,如果它们是两个对象,比如在
String str=new String(“a”)、str2=new String(“a”)
中,那么
hashCode
s仍然是相同的,因为对于相等的对象,它们的hashCode必须匹配——这是hashCode的基本原则


但是,如果你写了
Object o=new Object(),o2=new Object()
,那么hashcode就不同了,因为没有两个
Object
的实例是相等的(这是根据定义,而不是某些不可避免的逻辑)。

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

此外,如果它们是两个对象,比如在
String str=new String(“a”)、str2=new String(“a”)
中,那么
hashCode
s仍然是相同的,因为对于相等的对象,它们的hashCode必须匹配——这是hashCode的基本原则


但是,如果你写了
Object o=new Object(),o2=new Object()
,那么hashcode就不同了,因为没有两个
Object
的实例是相等的(这是根据定义,而不是某些不可避免的逻辑)。

这是好的hashcode的属性

如果A和B是A等于(B)的对象,则以下属性应保持不变

A.hashCode().等于(B.hashCode())


您可以阅读hashCode和equals()

这是好的hashCode的特性

如果A和B是A等于(B)的对象,则以下属性应保持不变

A.hashCode().等于(B.hashCode())



您可以阅读hashCode和equals()

的相关内容,但我将字符串的两个不同对象指定为str、str2No
str
str2
是对同一
String
对象的两个不同引用。在任何情况下,具有相同内容的两个字符串始终具有相同的哈希代码,因此只要
str
str2
都是
“this”
,它们将具有相同的哈希代码。@user1335578不,您不是。您将相同的静态字符串分配给两个方法本地引用。即使它们有不同的引用,hashCode()也会是相同的。(为了澄清@Chip的说法,这是因为
str
str2
具有相同的内容——它们都是
“this”
),但我将字符串的两个不同对象分配为str,str2No
str
str2
是对同一
String
对象的两个不同引用。在任何情况下,具有相同内容的两个字符串始终具有相同的哈希代码,因此只要
str
str2
都是
“this”
,它们将具有相同的哈希代码。@user1335578不,您不是。您正在将相同的静态字符串分配给两个方法本地引用。即使它们有不同的引用,hashCode()也会是相同的。(为了澄清@Chip的声明,这是因为
str
str2
具有相同的内容——为了完整性,它们都是
“this”
),我将在下面的答案中添加一点,即对于两个不同的字符串对象,仍然会得到相同的哈希代码,其中包含相同的字符。请参阅。您的误解是代码
String str
定义了一个对象。实际上,这段代码只声明了对某个现有对象的引用。对象通常是用
new
创建的,但是对于字符串,也有定义字符串对象的文本(如
“this”
)。代码
String str=SingletonClass.mystring
只是将一个引用分配给另一个引用,没有进行对象克隆。为什么这个问题的答案都不被接受?只需单击您最喜欢的答案左侧的大纲复选标记…为了完整性,我将在下面的答案中添加一个选项,即对于两个不同的字符串对象,您仍然可以获得相同的哈希代码,其中包含相同的字符。请参阅。您的误解是代码
String str
定义了一个对象。实际上,这段代码只声明了对某个现有对象的引用。对象通常是用
new
创建的,但是对于字符串,也有定义字符串对象的文本(如
“this”
)。代码
String str=SingletonClass.mystring
只是将一个引用分配给另一个引用,没有进行对象克隆。为什么没有