浅析==和equals的区别

    技术2022-07-13  71

    浅析==和equals的区别

    编程过程中我们会经常使用==和equals,但是对其中的原理有一些迷迷糊糊的地方,这里我就来简单来说一说我的看法,借鉴了网上前辈们的一些看法,自己也有一些自己的感受,下面我就来说一下。(希望小伙伴们能够积极指正不足之处,小白勿喷,)

    1. ==

    1.1 返回值类型:boolean

    1.2 底层原理:

    1.2.1 比较基本数据类型(byte,short,int,long,float,double,char,boolean)——直接比较数值,数值一样为true,反之为false。 简单举一个例子代码如下:

    int num1 = 5; int num2 = 5; int num3 = num1; System.out.println(num1==num2); //true System.out.println(num2==num3); //true

    1.2.2 引用数据类型(除了基本数据类型之外的数据类型)——比较引用对象的内存地址指向是否一致。 举一个自定义实体类例子,代码如下:

    //Apple为自定义的一个实体类 Apple apple1 = new Apple(100, "红富士"); Apple apple2 = new Apple(100, "红富士"); Apple apple3 = apple1; //new关键字相当于创建一个新的对象,两个对象指向的内存地址当然不同,所以返回false System.out.println(apple1==apple2); //false //没有创建新的对象,相当于对象指针的传递,传递的是同一个内存地址,所以返回true System.out.println(apple1==apple3); //true

    引用数据类型中较特殊的String,代码如下:

    String s1 = "Programming"; String s2 = new String("Programming"); String s3 = s1; String s4 = "Program" + "ming"; System.out.println(s1 == s3); //true System.out.println(s1 == s2); //false System.out.println(s1 == s4); //true System.out.println(s2 == s4); //false

    2. equals方法

    2.1 返回值类型:同==

    2.2 底层原理:

    在讲equals之前我们需要知道一件事,首先我们需要明白equals是属于Object超级父类里面的一个方法,所以基本数据类型不能使用该方法,而引用数据类型(前提该引用数据类型没有重写equals方法)调用该方法的时候都是默认调用的父类里面的equals方法,下面让我们看一下Object类里面的equals方法的源代码吧。 代码如下:

    public boolean equals(Object obj) { return (this == obj); }

    (看了上面的代码我们可以知道equals底层实现还是调用的==的原理)

    前面我已经强调了,前提是没有重写equals方法。 下面这个Apple类就没有重写equals方法,测试代码如下:

    Apple apple1 = new Apple(100, "红富士"); Apple apple2 = new Apple(100, "红富士"); Apple apple3 = apple1; System.out.println(apple1.equals(apple2)); //false System.out.println(apple1.equals(apple3)); //true

    其中的String就是个例外,ta就重写了equals方法,源代码如下:

    public boolean equals(Object anObject) { //1.先比较内存地址是否一致,如果一致返回true,否则就进行下一步判断 if (this == anObject) { return true; } //2.判断这个对象是否是这个特定类或者是它的子类的一个实例,不一致直接返回false 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; }

    测试代码举例,如下图:

    String s1 = "Programming"; String s2 = new String("Programming"); String s3 = s1; String s4 = "Program" + "ming"; System.out.println(s1 .equals(s3) ); //true System.out.println(s1 .equals(s2) ); //true System.out.println(s1 .equals(s4) ); //true System.out.println(s2 .equals(s4) ); //true

    总结: 如果我们想要在自定义实体类中也能使用equals方法,可以参照String类中的重写的模式,设计出适合实际项目开发的equals方法。

    Processed: 0.012, SQL: 10