目录
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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)