当前位置: 代码迷 >> 综合 >> Kotlin-17-等号比较(== 、===)
  详细解决方案

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

热度:89   发布时间:2023-10-09 05:37:40.0

目录

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;@Overridepublic 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        : falsedog1.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         :  truename2==name3         :  falsename1==name3         :  falsename1.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         :  trueage3==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 : falseperson1 == person2  : truedog1==dog2          : falsedog1.equals(dog2)   : true