• 六、Java基础---------equals 与 ==深入讲解


        在我们写程序时经常会去比较两个变量是否相等,一般我们有两种方式去比较:equals==,但是很多情况是不明就里,最后得出错误的结论。本文详解了equals==

        Java程序中测试两个变量是否的两种方式:一种是利用==另一种是equals方法。当时用 == 来判断两个变量是否相等时,如果两个变量是基本数据类型变量且都是数值类型(不一定要去数据类型完全相同),则只要两个变量的值相等就返回true。但是对于两个引用类型变量,他们必须指向同一个对象时,== 才会返回true==不可用于比较两个没有父子关系的对象。下面的程序就示范使用 == 来判断两种类型变量是否相等。

        public void test2()

        {

            int it = 65;

            float fl = 65.0f;

            //将输出true

            System.out.println("6565.0f是否相等?" + (it == fl));

            char ch = 'A';

            //将输出true

            System.out.println("65'A'是否相等?" + (it == ch));

            String str1 = new String("hello");

            String str2 = new String("hello");

            //将输出false

            System.out.println("str1str2是否相等?"

                + (str1 == str2));

            //将输出true

            System.out.println("str1是否equals str2"

                + (str1.equals(str2)));

            //由于java.lang.StringEqualTest类没有继承关系,

            //所以下面语句导致编译错误

            int a=10;

            System.out.println("hello" == a);

        }

        运行上面的程序,可以看到6565.0f'A'相等,对于str1str2,因为他们是引用型变量,他们分别指向两个通过new关键字创建的String对象,因此str1str2两个变量不想等。

       equals原理解析:

       equals方法是Object类提供的实例方法,因此所以引用型变量都可以调用该方法来判断是否与其他变量相等。但是使用这种方法判断两个对象是否相等的标准和使用==是没有区别的。同样要求两个引用变量指向同一个对象才会返回true

        因此这个Object类提供equals方法没有太大的实际意义,如果希望采用自定义的标准则应该重写equals方法,

    String类就是重写了改方法,其判断两个字符串相等的标准是只要两个变量的字符序列相同equals方法就返回true。下面代码即其实现原理。

        public boolean equals(Object anObject) {

            if (this == anObject) {

                return true;

            }

            if (anObject instanceof String) {

                String anotherString = (String) anObject;

                int n = value.length;

                if (n == anotherString.value.length) {

                    char v1[] = value;

                    char v2[] = anotherString.value;

                    int i = 0;

                    while (n-- != 0) {

                        if (v1[i] != v2[i])

                            return false;

                        i++;

                    }

                    return true;

                }

            }

            return false;

        }

    其实用我们自己的方式去重写equals方法,实现让不可能相等的对象相等。

    class Person

    {

        //重写equals方法,提供自定义的相等标准

        public boolean equals(Object obj)

        {

            //不加判断,总是返回true,即Person对象与任何对象都相等

            return true;

        }

    }

    //定义一个Dog空类

    class Dog{}

    public class OverrideEqualsError

    {

        public static void main(String[] args)

        {

            Person p = new Person();

            System.out.println("Person对象是否equals Dog对象?"

                + p.equals(new Dog()));

            System.out.println("Person对象是否equals String对象?"

                + p.equals(new String("Hello")));

        }

    }

       上面的例子定义了一个Person类,该类重写了equals方法,并且该方法总是返回true,也就是Person对象和任意引用类型变量进行equals方法都返回true,这就会造成Person对象和Dog对象相等的闹剧。

       

    总结:

        1.基本数据类型: byte,short,char,int,long,float,double,boolean他们之间的比较,应用双等号(==),比较的是他们的值。

        2.引用类型变量:当他们用(==)进行比较的时候,比较的是他们在内存中的存放地址,所以,除非是同一个new出来的对象,他们的比较后的结果为true,否则比较后结果为false。

        3.如果没有重写Object中equals方法,那么==与equals没有区别,所以我们在使用自定义类时,需要去重写equals方法。(java.lang.String类已重写了该方法,所以String的equals比较的是两个字符串的字符序列,当字符序列相同是返回true,否则返回false。

       希望通过上面Person类对象和Dog类对象相等的闹剧帮助大家去学习equals==的区别。

  • 相关阅读:
    C++ for(char c:s)遍历字符串||for (char c : s)和for (char& c : s)的区别
    二维数组的查找--剑指offer(C++)
    C++学习笔记之--boolalpha
    在C++中matrix.size()和matrix [0] .size()之间的区别是什么?
    C3_note
    用webpack4从零开始构建react脚手架
    php
    正则表达式基础
    DOM
    常用H5
  • 原文地址:https://www.cnblogs.com/yueyazhishang/p/4007375.html
Copyright © 2020-2023  润新知