Java 为什么它为两个字符串对象生成相同的哈希代码?
我是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[]) {
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、str2Nostr
和str2
是对同一String
对象的两个不同引用。在任何情况下,具有相同内容的两个字符串始终具有相同的哈希代码,因此只要str
和str2
都是“this”
,它们将具有相同的哈希代码。@user1335578不,您不是。您将相同的静态字符串分配给两个方法本地引用。即使它们有不同的引用,hashCode()也会是相同的。(为了澄清@Chip的说法,这是因为str
和str2
具有相同的内容——它们都是“this”
),但我将字符串的两个不同对象分配为str,str2Nostr
和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
只是将一个引用分配给另一个引用,没有进行对象克隆。为什么没有