通过查阅资料以及测试,总结了==和equals在
String型
封装的基本数据类型
创建的数据类型中的区别
话不多说上代码
/**
* Created by zongyuheng on 2019/5/9.
*/
public class Test {
public static void main(String[] args) {
System.out.println("String区别--------------------");
String str1 = new String("str");
String str2 = new String("str");
System.out.println("==比较 :"+ (str1 == str2));
System.out.println("equal比较:"+ str1.equals(str2));
System.out.println("整型区别--------------------");
Integer ter1 = new Integer(1);
Integer ter2 = new Integer(1);
System.out.println("==比较 :"+ (ter1 == ter2));
System.out.println("equal比较:"+ ter1.equals(ter2));
System.out.println("实例对象区别--------------------");
Person p1 = new Person("小红","21");
Person p3 = new Person("小红","21");
System.out.println("==比较 :" + (p1 == p3));
System.out.println("equal比较:" + p1.equals(p3));
}
}
class Person{
private String name;
private String grade;
public Person(String name , String grade){
this.name = name;
this.grade = grade;
}
}
运行结果:
String区别--------------------
==比较 :false
equal比较:true
整型区别--------------------
==比较 :false
equal比较:true
实例对象区别--------------------
==比较 :false
equal比较:false
结果解析
1.String 和 Integer结果一样
==比较 :false
equal比较:true
2.自己创建的类结果都是
==比较 :false
equal比较:false
首先由于Integer属于封装类,所以这三种都属于类,实例化都可以当作对象来处理,贴个图,对于对象分析内存
==只是比较两个对象的地址 p1=0x9788 p3=0x5643 所以理所当然输出的是false
equals 方法请看下面源码
public boolean equals(Object obj) {
return (this == obj);
}
基本上就是相当于 == 是等效的,所以自己创建的类结果都是false可以理解
至于String 与Integer为何会出现 equal比较:true的情况,是因为这两种类型都对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;
}
Integer.equals方法
public boolean equals(Object obj) {
if (obj instanceof Integer) {
return value == ((Integer)obj).intValue();
}
return false;
}
(未完待续)