java不同对象的hashcode为什么一样

class A{
    private String b;
    A (String q){
        this.b=q;
    }
    A(){};
   void xianShi(){
       System.out.println(b.hashCode());
   }
}
public class Main extends A{
    public static void main(String[]args){
      A f=new A("3232");
      A g=new A("32321");
      A h=new A("3232");
     f.xianShi();
     g.xianShi();
     h.xianShi();
    }
}

我的理解是,f和h是两个处于独立内存空间的对象,他们内部各有一个String b;,也就是无论他们的b赋什么值,他们的b的内存都不一样。但是请看,这个码中,对象f和h中的b的哈希值为何时相同的

万物都是对象,f是对象,h也是对象,f和h里的b也是对象,所有的对象都是独立的,这句话没错,所以,所有的对象都有自己独立的空间,而f里面包含了b,这叫对象的组合,嵌套,所以即使b在f里面,b也有自己独立的地址,而不是说b在f里面,b就失去了自己,没有自己的地址了。
而至于f里的b和h里的b为啥hashCode相同,请查看String类重写的hashCode方法

哈希表是结合了直接寻址和链式寻址两种方式,所需要的就是将需要加入哈希表的数据首先计算哈希值,其实就是预先分个组,然后再将数据挂到分组后的链表后面,随着添加的数据越来越多,分组链上会挂接更多的数据,同一个分组链上的数据必定具有相同的哈希值,java中的hash函数返回的是int类型的,也就是说,最多允许存在2^32个分组,也是有限的,所以出现相同的哈希码就不稀奇。

A对应中的b属性是字符串类型,字符串是存储在常量池中,新建字符串是,如果常量池中已经存在该字符串,那么会指向它。对应你的代码中,f 和 h中b都是执行常量池中的“3232”,所以f和h对象的b属性对应的哈希码是一样的

string 是引用类型的 我们使用的时候变量只记录它的地址 创建一个string对象会现在字符串常量池里面找 如果有了直接返回其地址。 f 和 h 确实是分开的两个空间 ,但是3232这个字符串在常量池里只有一份。也就是 f h 中的b 都引用了同一个地址 所以hash code一样的

字符串,如果存在会指向同一个地址的