`
jgnan
  • 浏览: 87475 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

每天JAVA简单教学:简单数据类型、地址比较和值比较

阅读更多
昨天说了布朗运算,今天详细解释一下其中的==运算符和Object的equals方法。

首先,在说这些之前,我们来补充说明一下JAVA的数据类型。在JAVA里面,有2种数据类型,第一种叫primitive(简单数据类型),另一种是Object.

简单数据类型的特点是:
1)类名是关键字
2)没有包名,没有方法可以访问,不是Object的子类

可以看出,这类数据是常用的数据,而且为了节省空间,它们没有继承Object,去除类多于的方法,节省了内存空间。

常用的简单数据类型包括:
int,long,short,double,float,byte,char,boolean,void
关于其可存储的数值范围大家可以去网上搜索

需要特别说明的是,void只适用于定义函数返回类型,不能用于运算。

为什么会提及简单类型运算呢?因为要说明==运算符和equals方法,会涉及到它们。

我们首先看看以下代码:
package operator;

public class EqualComparation
{
    public static void main(String[] args)
    {
        int a=1;
        int b=1;
        System.out.println(a == b);
    }
}


相信大家可以马上回答上面的输出结果是true
接下来,我们可以看看JDK1.5的新特性:简单数据类型和对象类型数据的比较:
package operator;

public class EqualComparation
{
    public static void main(String[] args)
    {
        Integer a=1;
        int b=1;
        System.out.println(a == b);
    }
}


上面的结果也是true哦,因为jdk1.5很只能的能把基础数据类型转换为对应的对象,然后再进行值比较。

为了更好地让大家了解这个改进,我来演示以下上述的代码在1.4时代要怎么实现:
package operator;

public class EqualComparationForJDK14
{
    public static void main(String[] args)
    {
        Integer a= Integer.valueOf(1);
        int b=1;
        System.out.println(a.equals(Integer.valueOf(b)));
    }
}


简单类型在以前一定要先转换为对象才可以和对象比较哦,当然你把对象转换为简单类型比较更加保险。

为什么?因为以下对象之间的比较使用==和equals方法往往是不一样的。

equals方法,是Object的一个public方法,用于对比两个对象之间的的异同。那它和==比较有什么不同呢?当==用于对象之间的比较时,类似于C的===,比较的是两个对象的hashCode。而这个hashCode是由存储对象的地址位得来的,为了保证每个对象的唯一性。在Object里面我们可以通过hashCode()来查看当前实例的hashCode代码。

来看看Object.equals(Object)代码:
    public boolean equals(Object obj) {
	return (this == obj);
    }


然后它的说明里面已经说明了这个方法是对比两个对象的hashCode返回的值。理论上,每个new出来的Object之间的hashCode是不一样的:
package object;

public class HashCodeDemo
{
    public static void main(String[] args)
    {
        Object a = new Object();
        Object b = new Object();
        System.out.println(a.hashCode());
        System.out.println(b.hashCode());
    }
}


你可以看到这个例子里面,两个hashCode是不一样的。

所以,对于对象值的比较,我们建议大家调用equals方法,并且如果你的类如果涉及到对比运算的话,也最好重写这个方法,实现你的比较逻辑。

让我们最后来看看Integer.equals(Object)方法
     public boolean equals(Object obj) {
	if (obj instanceof Integer) {
	    return value == ((Integer)obj).intValue();
	}
	return false;
    }


所以,如果我们直接用==对比两个Integer类,实际上会去对比两个实例的hashCode,而且调用的不是Integer类本身的hashCode,而是Object父类的hashCode。可以看看下面的两端代码:

首先是Integer的hashCode方法
    public int hashCode() {
	return value;
    }


这个value就是Integer保存的int值,这个理论上来说,会使以下的代码显示true:
    Integer a =1;
    System.out.println(a.hashCode());
    System.out.println(new Integer(1).hashCode());
    System.out.println(a == new Integer(1));


但是实际上我们发现了,实际最后的结果是false。而且从第一行和第二行显示的内容可以知道a.hashCode()和new Integer(1).hashCode()都是1。

所以我们就清楚了以下几点:
1)==用于进行简单数据类型之间的比较
2)==用于比较两个对象是否同一实例
3).equals方法用于比较两个对象的值,我们可以根据实际需要重写特定对象的equals()方法以实现同类对象之间的特定比较逻辑。

今天到此为止,明天谈谈类型强转。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics