码迷,mamicode.com
首页 > 编程语言 > 详细

关于Java传值&传引用的一道题

时间:2015-07-23 12:05:54      阅读:111      评论:0      收藏:0      [点我收藏+]

标签: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传值&传引用的一道题

标签:java   hashcode   equals   网易   传引用   

原文地址:http://blog.csdn.net/xiaokfc/article/details/47018595

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!