天天看点

Kotlin-17-等号比较(== 、===)

目录

1、Java中的 ==

2、Java中的 equals()

3、两者的区别

3、对于基本数据类型的==比较

4、Kotlin中的== 与 ===

1、Java中的 ==

Java中的== 直接比较的是两个对象的堆内存地址,如果相等,则说明这两个引用实际上指向的是同一个对象地址的。

2、Java中的 equals()

Java中的equals() 比较会先看两个对象是否指向于同一个对象地址,如果不是,则比较两个对象的属性值是否相等。

下面Dog实体类中的equals()方法是Java中对实体类的通用重写。从下面可以看出,当我们调用equals()比较的时候,会先比较两个对象是否==,然后会比较两个对象的属性值是否相等,如果相等,就会返回true。

public class Dog {
    String name;
    int age;

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof Dog)) return false;

        Dog dog = (Dog) o;

        if (age != dog.age) return false;
        return name != null ? name.equals(dog.name) : dog.name == null;
    }
}
           

3、两者的区别

  •    == 就只比较两个对象指向的内存地址是否一样
  •   equals()比较的是两个对象的属性值是否一样
Dog dog1=new Dog("小黑",3);
  Dog dog2=new Dog("小黑",3);

  System.out.println("dog1==dog2        : "+(dog1==dog2));
  System.out.println("dog1.equals(dog2) : "+dog1.equals(dog2));

  //输出结果
   dog1==dog2        : false
   dog1.equals(dog2) : true
           

3、对于基本数据类型的==比较

对于基本的数据类型(byte,int ,short,char ,float ,double,long,boolean )来说 ,它们是作为常量在方法区的常量池里面以HashSet策略存储起来的,对于字符串"abc" 来说,一个常量只会对应一个地址,无论有多少个"abc",都只会存储在一个地址,因此它们的引用都只会指向同一个地址, 基本的数据类型和String常量是可以用 == 直接比较的

从下面可以看出name1和name2 看似是创建了两个对象,但是其实他们的值 “ZhangSan” 所在常量池中的内存地址是一样的,所以他们的结果一样。

注意:new String() 会将 name3对象存放在堆内存中,而不是常量池中,所以他们的内存地址是不一样的。只要是通过new出来的对象都会存放在堆内存中。如果不是很理解,可以看一些内存的文章。
String name1 = "ZhangSan";
 String name2 = "ZhangSan";
 String name3 = new String("ZhangSan");

 System.out.println("name1==name2         :  "+(name1==name2));
 System.out.println("name2==name3         :  "+(name3==name2));
 System.out.println("name1==name3         :  "+(name1==name3));
 System.out.println("name1.equals(name3)  :  "+name1.equals(name3));

  //输出结果
  name1==name2         :  true
  name2==name3         :  false
  name1==name3         :  false
  name1.equals(name3)  :  true
           
对于基本数据的包装类型(Byte,Short,Character,Integer,Float,Double,Long,Boolean)除了Float和Double之外,其他六种都是实现了常量池的,因此对于这些类型,也可以通过 == 来判断是否相等.
Integer age1=127;
  Integer age2=127;
  Integer age3=128;
  Integer age4=128;

  System.out.println("age1==age2         :  "+(age1==age2));
  System.out.println("age3==age4         :  "+(age3==age4));

  //输出结果
  age1==age2         :  true
  age3==age4         :  false

           
因为Integer在常量池的存储范围是[-128,127],在这个范围内是直接存储到常量区的,超出这个范围则会在堆内存中创建一个新的对象的来保存这个值,因而m,n指向了两个不同的对象地址,因而不相等.

4、Kotlin中的== 与 ===

== 对应于Java中的 equals() 

===对应于 Java中的 ==

val person1 = Person("ZhangSan", 18)
 val person2 = Person("ZhangSan", 18)

 println("person1 === person2 : ${person1 === person2}")
 println("person1 == person2  : ${person1 == person2}")

 val dog1 = Dog("小黑", 3)
 val dog2 = Dog("小黑", 3)

 println("dog1==dog2          : " + (dog1 === dog2))
 println("dog1.equals(dog2)   : " + (dog1 == dog2))

//输出结果
 person1 === person2 : false
 person1 == person2  : true
 dog1==dog2          : false
 dog1.equals(dog2)   : true