Java中,创建用new创建一个对象的时候,在堆中分配内存空间,也就是说此时地址是确定的,那么接下来我的疑问就来了。
第一步,看出现问题的场景,示例代码如下:
public static void main(String[] args) throws Exception{
Person p1=new Person();
Person p2=new Person();
System.out.println(p1);
System.out.println(p2);
}
//代码输出如下:
Person@15db9742
Person@6d06d69c
第二步:思考,如果说new对象的时候,堆中内存空间就已经确定了,那么此时p1和p2的地址也就是确定的,System.out.println函数输出的内存地址应该是确定的,也就是说,不论我是先输出p1还是先输出p2,那么地址的输出也应该是相对应的变化,比如,我将上述代码中的两个打印输出调换位置,此时,代码的输出也应该是相应变化的,但是实际上并没有变。示例代码如下:
public static void main(String[] args) throws Exception{
Person p1=new Person();
Person p2=new Person();
System.out.println(p2);
System.out.println(p1);
}
//代码输出如下:
Person@15db9742
Person@6d06d69c
第三步:思考这是为什么????
此问题没有解决。。。
关于println打印的底层代码是hashCode,这里没弄明白,为此,附上几篇链接,随着自己技术的提高,会慢慢解决的。
博客一:java对象是在什么时候创建的 链接:https://www.cnblogs.com/wsw-blog/p/10069917.html
链接:https://www.cnblogs.com/hujingwei/p/5322821.html
链接:https://blog.youkuaiyun.com/fdyufgf/article/details/83551764
hashcode方法返回该对象的哈希码值。
hashCode()方法可以用来来提高Map里面的搜索效率的,Map会根据不同的hashCode()来放在不同的位置,Map在搜索一个对象的时候先通过hashCode()找到相应的位置,然后再根据equals()方法判断这个位置上的对象与当前要插入的对象是不是同一个。
所以,Java对于eqauls方法和hashCode方法是这样规定的:
*如果两个对象相同,那么它们的hashCode值一定要相同;
*如果两个对象的hashCode相同,它们并不一定相同。
博客三:重写System.out.println 链接:https://blog.youkuaiyun.com/qq1072313099/article/details/56843164
博客四:浅谈Java中的hashCode方法 链接:https://www.jianshu.com/p/e2a3cefe8d40