标签:java hashcode equals 网易 传引用
<pre name="code" class="java">public class JavaTestDemo1 { public static void main(String[] args) { Integer v1 = new Integer(1); Integer v2 = v1; doSomething(v2); System.out.println(v2); System.out.println(v1 == v2); System.out.println(v1.equals(v2)); } public static void doSomething(Integer i) { i = new Integer(10); } }
上面代码的执行结果是:
1 true true
分析:
Java对象在参数中是传引用的方式传递的,初始化v1和v2指向同样的地址空间。
那下面就提出2个疑问:
1.Java函数参数中,对象是传引用的方式,为什么v2的值仍是1而不是10
2.按理来说,在doSomething中v2应该指向Integer(10)所在的内存地址,那为什么v1.equals(v2)的值会是true?
让我们先了解一下Java基类Object中hashCode和equals的作用:
hashCode()方法被用来获取给定对象的唯一整数。这个整数被用来确定对象被存储在HashTable类似的结构中的位置。默认的,Object类的hashCode()方法返回这个对象存储的内存地址的编号。
也就是说,如果两个对象指向不同的地址,那么equals的值肯定返回false。
先解答第一个问题:
为什么v2的值是1而不是10:因为在doSomething中做的事如下:新建了一个i对象,指向v2,然后让这个i对象重新指向new Integer(10)的地址,使之完全脱离了与v1,v2的关系。所以v1, v2的值仍是1(注,Integer,Double等本身的value也是用final声明的,不可改变的)。
第二个问题:
v1,v2始终指向同一个对象,那用equals肯定是返回true咯。 况且我们看看Integer的原源就可以发现,Integer已经重写了Obejct中的equals函数,只要数值相同,即使指定不同地址的Integer对象进行equals比较返回结果也是true
public boolean equals(Object obj) { if (obj instanceof Integer) { return value == ((Integer)obj).intValue(); } return false; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:java hashcode equals 网易 传引用
原文地址:http://blog.csdn.net/xiaokfc/article/details/47018595