java对象储存问题,hashcode,equals方法,hashcode码是代表储存位置,还是检索键指向标志

在看到hashcode,equal时有个疑问:

        String a = "小乔";
        String te = new String("小乔");
        System.out.println(te.equals(a));
        System.out.println("te:hashcode>>>>"+te.hashCode());
        System.out.println("a:hashcode>>>>>"+a.hashCode());


        ChangeStringBuilder csb = new ChangeStringBuilder(new StringBuilder("小乔"));
        ChangeStringBuilder csb1 = new ChangeStringBuilder(new StringBuilder("小乔"));
        System.out.println(csb.hashCode());
        System.out.println(csb1.hashCode());
        System.out.println(csb.equals(csb1));

String在定义相同值的时候,equal返回true,hashcode值也相同,
StringBuilder定义相同值,equal返回false,hashcode值不同。

问:
java在对象创建的时候,是相同值储存一个地址,不同指针指向,还是创建两个对象,在不同的储存位置?


如果是一个地址,为什么StringBuilder的hashcode码不一样?


hashcode值是代表储存位置,还是检索键?

1个回答

答1:如果创建对象如StringBuilder,则为两个指针,在不同的位置储存
答2:因为不是一个地址,如果创建String,则为一个地址,hashcode也一样,因为String创建后为常量,在常量池中保存
答3: hashcode % 容量才能表示存储位置,如果该对象不用于比较,不用于存放在HashMap、HashSet等容器中,hashcode没有任何意义
有疑问清追问,解决了你的疑问清采纳,谢谢!!!

loney_wolf
轻点 别打脸 谢了
10 个月之前 回复
loney_wolf
轻点 别打脸 想明白了,写了
10 个月之前 回复
Lei_Da_Gou
Lei_Da_Gou 回复loney_wolf: String比较特殊,是放在方法去的常量池中,一个值只会存在一个,有就不会继续创建了,因此 new String("a")两个实例 a1和a2,equals肯定是相等的。但是StringBuffer是普通引用类型,是放在堆中的,所以你new StringBuffer("a")两个实例s1和s2肯定返回是false的。是不可能返回true的。
10 个月之前 回复
Lei_Da_Gou
Lei_Da_Gou 回复loney_wolf: 你要把你的代码贴出来,你如果没重写equals和hashcode方法那么返回的肯定是false,因为这是两个不同的对象,不同的地址,你重写了equals就需要把你的重写的逻辑贴出来,不然我办法给你解释
10 个月之前 回复
loney_wolf
轻点 别打脸 Person p = new Person(); Student s = new Student(); System.out.println(p.equals(s));这个返回的是true,还烦请解读一下,这个地方有点混淆
10 个月之前 回复
loney_wolf
轻点 别打脸 StringBuffer为什么是两个不同地址,String和StringBuffer不都是基于char基础类型实现的么?如果StringBuffer的储存位置是在方法区导致的两个储存位置,那对同一个类,进行两次实例化对比,应该也是返回false吧,但是返回的是true。
10 个月之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问