Java中 == 和 equals()详解

java中的数据类型分为两种:

一 、基本数据类型:

  byte、short、int、long、float、double、char、boolean

  比较它们需要用  ==  ,比较的是它们的值是否相等

二、引用数据类型:

  也就是对基本数据类型的封装,用 == 比较的是它们的内存地址(其实还是比较的基本数据类型,它们的内存地址不就是int吗)。当new的时候,会给它一个新的内存地址,所以再通过==比较,就会返回false;在Object类中的equals方法其实比较的也是内存地址,用==和equals方法比较结果是一样的,但在一些类中把equals方法重写了,如String、Integer等类中,而不是单纯的比较内存地址了。

  这个equals方法不是固定的,有需要的时候,我们根据情况自己重写。

 

 

下面用简单的代码来测试一下吧,里面的注释要注意看哦!其中的java源码在文章末尾有截图

public class Text{
    public static void main(String[] args){
        String str = "abcd";
        String str1 = "abcd1";
        int i = 1;
        String str2 = new String("abcd");

        //比较的是内存地址,内存地址是什么?一个16进制的整形值
        //java对象内存地址经过哈希算法得出一个int类型数字
        System.out.println( "abcd1" == str1 );
        
        //用的是String的equals方法,对字符串进行挨个比较
        System.out.println( str.equals("abcd") );

        //在javac的时候,虚拟机把字符串自动组合了???
        System.out.println( str.equals('a'+"bcd") );

        //比较的是内存的地址,str2创建的时候,用了一个关键字new,明确告诉虚拟机,我要一个新的,所以字符串"abcd"被当做一个新的创建,并且有一个新的内存地址
        if (str == str2) {
            System.out.println( "str == str2" );
        }else{
            System.out.println( "str != str2" );

            //调用的String里面的hashCode方法(文章末尾有java源码),所以相等.那String中的hashCode方法算的是什么呢?难道是ASCII?
            ////确实是ASCII码,      作者自己算过,
            //  
            //有些地方我们需要重写hashCode方法,什么地方?
            //最常见的是当一个对象被加入收集对象(collection object)时,这两个函数必须自己设计。更细化的定义是:如果你想将一个对象A放入另一个收集对象B里,
       //或者使用这个对象A为查找一个元对象在收集对 象B里位置的钥匙,并支持是否容纳,删除收集对象B里的元对象这样的操作,那么,equals()和hashCode()函数必须开发者自己定义。
       //其他情况下,这两个函数是不需要定义的。 System.out.println( str.hashCode() ); System.out.println( str2.hashCode() ); } //调用String的equals java.lang.String中964行equals方法 //字符串底层是字符数组,所以String中的equals方法用两个char数组,对立面的字符一个一个的比较 // //对象内容的比较才是设计equals()的真正目的,Java语言对equals()的要求如下,这些要求是必须遵循的。否则,你就不该浪费时间: //对称性:如果x.equals(y)返回是“true”,那么y.equals(x)也应该返回是“true”。 //反射性:x.equals(x)必须返回是“true”。 //类推性:如果x.equals(y)返回是“true”,而且y.equals(z)返回是“true”,那么z.equals(x)也应该返回是“true”。 //还有一致性:如果x.equals(y)返回是“true”,只要x和y内容一直不变,不管你重复x.equals(y)多少次,返回都是“true”。 //任何情况下,x.equals(null),永远返回是“false”;x.equals(和x不同类型的对象)永远返回是“false”。 // //有些情况下,我们需要自己重写equals()方法,根据情况而定 if (str.equals(str2)) { System.out.println( "str equals str2" ); }else{ System.out.println( "str is not equals str2" ); } } }

运行结果:

 

 

总结:

    == :    比较的是基本数据类型,比较的是它们的值

   equals():   比较的是引用数据类型,比较的是引用数据类型,不同类型有不同的equals方法,根据不同的数据类型调用不同的equals方法。也可以在特殊情况下重写equals方法。

 

Object中的equals():

String中的equals():

String中的hashCode():

 

posted @ 2015-08-13 11:50  King_J  阅读(11136)  评论(0编辑  收藏  举报