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一样的
字符串,如果存在会指向同一个地址的