版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/GreatDistance/article/details/89304884
java中==与equals的区别是什么?
1、==
对于基本类型和引用类型 == 的作用是不同的
- 基本类型:比较的是值是否相同;
- 引用类型:比较的是引用是否相同;
代码示例:
String str1 = "Hello World!";
String str2 = "Hello World!";
String str3 = new String("Hello World!");
System.out.println(str1 == str2); // true
System.out.println(str1 == str3); // false
System.out.println(str1.equals(str2)); // true
System.out.println(str1.equals(str3)); // true
代码解读:因为str1和str2指向的是同一个引用,所以 == 也是true,而new String()方法则重新开辟了内存空间,所以 == 结果为false,而euqals比较的是一直是内容是否相同,所以结果都是true。
2、equals
equals本质上就是 == ,只是String 和 Integer等这些类重写了equals方法,把他变成了之比较。
代码示例:
public class Person {
private String name; // 姓名
private String sex; // 性别
public Person(String name, String sex) {
this.name = name;
this.sex = sex;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public static void main(String[] args) {
Person person1 = new Person("张三","男");
Person person2 = new Person("张三", "男");
System.out.println(person1.equals(person2)); // false
}
}
结果为false
查看equals源码就明白了
public boolean equals(Object obj) {
return (this == obj);
}
在Object类中eqlals的本质就是 ==
为什么两个相同值的String对象,为什么返回的就是true?原因是String类重写了equals方法把引用比较改成了值比较,String类中equals源码如下:
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
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;
}
总结: == 对于基本类型来说是值比较,对于引用类型来说比较的是引用;而equals默认情况下是引用比较,只是很多类重写了equals如(String,基本类型对应的包装类)等把它变成了值比较,所以一般情况下equals比较的是值是否相等。