Java语法—-Java中equals和==的区分

【声明】

欢迎转发,但请保留文章原来出处→_→

生命壹号:http://www.cnblogs.com/smyhvae/

小说来源:http://www.cnblogs.com/smyhvae/p/3929585.html

 

【正文】

平常在学Android和Java语言的时候,总是遇到“equals”和“==”那多少个字符,老感觉差不离;其实依然有部分有别于的,明日索性把它们到底弄精晓。

一 、java个中的数据类型和“==”的意思:

  • 着力数据类型(也称原本数据类型)
    :byte,short,char,int,long,float,double,boolean。他们中间的比较,应用双等号(==),相比较的是她们的值。
  • 引用数据类型:当她们用(==)进行比较的时候,相比较的是他俩在内存中的存放地方(确切的说,是堆内存地址)。

注:对于第贰连串型,除非是同贰个new出来的靶子,他们的可比后的结果为true,不然相比后结果为false。因为每new1次,都会再度开发堆内部存款和储蓄器空间。

 

② 、equals()方法介绍:

JAVA当中全体的类都以连续于Object那一个超类的,在Object类中定义了贰个equals的不二法门,equals的源码是如此写的:

public boolean equals(Object obj) {
    //this - s1
    //obj - s2
    return (this == obj);
}

能够见见,那几个法子的起先暗许行为是比较对象的内部存款和储蓄器地址值,一般的话,意义一点都不大。所以,在一些类库在那之中那么些点子被重写了,如String、Integer、Date。在那么些类个中equals有其自身的兑现(一般都是用来比较对象的分子变量值是或不是一律),而不再是比较类在堆内部存款和储蓄器中的存放地方了。
从而说,对于复合数据类型之间进行equals相比较,在并未覆写equals方法的状态下,他们中间的相比依旧内部存款和储蓄器中的存放地点的地点值,跟双等号(==)的结果同样;倘若被复写,遵照复写的渴求来。

咱俩对下面的两段内容做个计算吧:

 == 的作用:
  基本类型:相比较的便是值是不是一致
  引用类型:相比较的便是地址值是不是一律
equals 的作用:
  引用类型:暗中认可情状下,比较的是地方值。
注:然而,大家能够依据事态要好重写该办法。一般重写都以自动生成,相比对象的成员变量值是不是一律

 

 

三、String类的equals()方法:

前些天我们拿String类来举例:

我们去\src\java\lang目录中找到String类,发现equals方法被重写如下:

 1     public boolean equals(Object anObject) {
 2         if (this == anObject) {
 3             return true;
 4         }
 5         if (anObject instanceof String) {
 6             String anotherString = (String)anObject;
 7             int n = value.length;
 8             if (n == anotherString.value.length) {
 9                 char v1[] = value;
10                 char v2[] = anotherString.value;
11                 int i = 0;
12                 while (n-- != 0) {
13                     if (v1[i] != v2[i])
14                         return false;
15                     i++;
16                 }
17                 return true;
18             }
19         }
20         return false;
21     }

上述代码能够见见,String类中被复写的equals()方法其实是比较三个字符串的剧情。上边大家通过实际代码来看望String类的可比。

① 、举例代码如下:

1 public class StringDemo {
2     public static void main(String[] args) {
3         String s1 = "Hello";
4         String s2 = "Hello";
5         System.out.println(s1 == s2);   // true
6     }
7 }

上边代码中,用“==”比较s1和s2,重临的结果是true。

贰 、稍微改变一下顺序,会有出人意料的意识:

 1 public class StringDemo {
 2     public static void main(String args[]) {
 3         String str1 = "Hello";
 4         String str2 = new String("Hello");
 5         String str3 = str2; // 引用传递
 6         System.out.println(str1 == str2); // false
 7         System.out.println(str1 == str3); // false
 8         System.out.println(str2 == str3); // true
 9         System.out.println(str1.equals(str2)); // true
10         System.out.println(str1.equals(str3)); // true
11         System.out.println(str2.equals(str3)); // true
12     }
13 }

 上方第陆行代码中,大家new了多个对象,用“==”比较s1和s2,返回的结果却是false;而用用“equals”相比s1和s2,重回的结果是true。 

为了分析上边的代码,大家必须首先分析堆内部存款和储蓄器空间和栈内部存款和储蓄器空间,这点很是主要:

图片 1

看完上边的图,再结合方面包车型地铁代码,就一目精通了。今后大家得以给协调出一道面课题:

面试题:请解释字符串比较之中“==”和equals()的分化?

  •  ==:比较的是七个字符串内存地址(堆内部存储器)的数值是还是不是等于,属于数值比较;
  •  equals():比较的是三个字符串的剧情,属于内容相比。

从此进行字符串相等判断的时候都利用equals()。

③ 、再一次转移程序:

1 public class ObjectDemo{
2     public static void main(String[] args) {
3         String s1 = "Hello";
4         String s2 = new String("Hello");
5         s2 = s2.intern();
6         System.out.println(s1 == s2);       //  true
7         System.out.println(s1.equals(s2));  //  true
8     }
9 }

上述代码的第4行中,java.lang.String的intern()方法”abc”.intern()方法的重返值依然字符串”abc”,表面上看起来好像这么些艺术没什么用处。但骨子里,它做了个小动作:检查字符串池里是或不是留存”abc”这么两个字符串,若是存在,就回来池里的字符串;假如不设有,该办法会
把”abc”添加到字符串池中,然后再回去它的引用。

 

肆 、相比八个目的的值:

代码如下:

 1 package com.smyh;
 2 
 3 public class ObjectDemo {
 4     public static void main(String args[]){
 5         Student student1 = new Student("生命壹号",22,"成都");
 6         Student student2 = new Student("生命壹号",22,"成都"); 
 7         System.out.println(student1==student2);
 8         System.out.println(student1.equals(student2));
 9     }
10 }
11 class Student {
12     private String name;
13     private int age;
14     private String address;
15     public Student(String name,int age,String address){
16         this.name = name;
17         this.age = age;
18         this.address = address;
19     }
20     //重写Object类中的equals方法(比较两个对象的值是否相等)
21     public boolean equals(Object obj){
22         //为了提高效率:如果两个内存地址相等,那么一定是指向同一个对内存中的对象,就无需比较两个对象的属性值(自己跟自己比,没啥意义嘛)
23         if(this==obj){
24             return true;
25         }
26         
27         //为了提供程序的健壮性
28         //我先判断一下,obj是不是学生的一个对象,如果是,再做向下转型,如果不是,直接返回false。
29         //这个时候,我们要判断的是对象是否是某个类的对象?
30         //记住一个格式:对象名 instanceof 类名。表示:判断该对象是否是该类的一个对象       
31         if(!(obj instanceof Student)){        
32             return false;                
33         }
34         
35         //如果是就继续
36         Student s = (Student)obj;//强制转换,即向下转型(毕竟Object类型没有具体的对象属性)        
37         return this.name.equals(s.name) && this.age == s.age && this.address.equals(s.address);//判断两个对象的属性值是否相等
38     }
39 }

上述代码中,首先判断传递进入的靶子与最近指标的地方是或不是等于,如若相等,则肯定是同二个堆内部存款和储蓄器中的指标。因为传递进入的参数是Object类型,所以任何对象都足以接过。一旦接收进来,就将Object类型的对象向下转型,然后判断具体的属性值。

 运转效果:

图片 2

骨子里,如若是在Eclipse中做开发以来,上边重写的equals()方法其实是可以自动生成的:

图片 3

自动生成后的equals()方法如下:

 1     @Override
 2     public boolean equals(Object obj) {
 3         if (this == obj)
 4             return true;
 5         if (obj == null)
 6             return false;
 7         if (getClass() != obj.getClass())
 8             return false;
 9         Student other = (Student) obj;
10         if (address == null) {
11             if (other.address != null)
12                 return false;
13         } else if (!address.equals(other.address))
14             return false;
15         if (age != other.age)
16             return false;
17         if (name == null) {
18             if (other.name != null)
19                 return false;
20         } else if (!name.equals(other.name))
21             return false;
22         return true;
23     }

 

能够看看:大家休戚相关重写的equals()方法和自动生成的equals()方法,二者功效是一样的。

【参考】

参报考博士博士客:

http://www.cnblogs.com/zhxhdean/archive/2011/03/25/1995431.html

http://www.cnblogs.com/zhxhdean/archive/2011/03/26/1996468.html

以及张海忠先生的摄像讲解。

相关文章