==与equals
==
-
基本数据类型比较的是值是否相等
-
引用类型比较地址是否相同
double a=10.0;
int b=10;
System.out.println(a==b);
//结果为true
String str1="Jim";//str1与str2都是引用类型,若为同一值,则str1与str2都指向常量池里的同一个地址
String str2="Jim";
System.out.println(str1==str2);//比较地址发现地址相同返回true
String aq=new String();//构造方法式新创建一个堆中的对象,并赋给aq其地址值
System.out.println(aq==str1);//结果为false
equals
- Object类的equals比较的是地址是否相同
- String类中重写了equals方法比较两个字符串内容是否相同
此图中,对object类的equals进行了重写
String name1="Tim";
String name2="Jack";
System.out.println(name1.equals(name2));//结果为false,因为字符串不同
现在,我们来仔细分析这段被String类重写的equals方法
- 首先第976行anObject为上转型对象,因为传进来的是一个字符串即String类,将他赋值给了Object类,所以其为一个上转型对象
- 第977和第998 ,979这3行用一个if(==)语句来判断地址是否相同,若地址相同,则内容必定相同返回true;结束
- 若不相同进行第980行,判断anObject是不是String类,如果不是一个String类,return false;
- 如果是则继续,第981行将被anObject进行下转型以便于调用子类新增的方法value。
- 第982行value指的是调用equals方法String对象每个字符组成的char类型数组,然后通 过 .length()方法获取字符个数。
- 983行==号右边为另一个字符串的字符个数,对两者比较,若个数不同,则字符串一定不同,return false,否则进行while循环逐字符判断是否相同。