==和equals()的区别
首先"=="是关系运算符,equals()是方法。但是同时他们的结果都返回布尔值;
我们首先思考一下什么时候经常用到"=="?
①基本类型数据做比较
②String(特殊的引用类型做比较)
1、“==”的比较
- 基本类型,比较的是值
- String类型,比较的是地址
(基本类型比较简单,String类型就复杂了许多)
我们日常大多都会遇到String类型的比较,我们以下面为例,深入一下String类型比较。
public static void main(String[] args) {
String s1="1";
String s2="1";
String s3=new String("1");
String s4="11";
String s5="1"+"1";
String s6=s1+s2;
String s7="1"+s3;
System.out.println(s1==s2); //true
System.out.println(s1==s3); //false
System.out.println(s4==s5); //true
System.out.println(s4==s6); //false
System.out.println(s4==s7); //false
}
针对于String类型我们要考虑到一个常量池的概念,由于String默认是由final修饰的,String类型的对象默认都存放在常量池中。
①String s1="1"相当于创建了一个对象,其实s1创建的时候它会先调用String的equals()方法判断常量池中是否有该对象,如果没有就创建对象;如果有就会返回该对象的引用。
②s4和s5相等是因为String是常量,s5="1"+"1"在编译期间就已经确定了,s5="1"+"1"编译后的结果相当于s5="11"。
③对于其它的+号连接对象而产生的对象都不会加入到常量池中,相当于创建了一个新对象,比较地址后当然返回的为false了。
2、equals()的比较
equals用于String类型和对象引用类型的比较。
为什么把String类型和对象类型分开来讲,因为String类型是特殊的引用类型。
源码分析
2.1
String类中的equals方法(String类型是Object的子类,它默认重写了equals方法):
public boolean equals(Object anObject) {
if (this == anObject) { //先比较地址是否相同
return true;
}
if (anObject instanceof String) { //判断是否是String类型或其子类
String anotherString = (String)anObject;
int n = length();
if (n == anotherString.length()) {
int i = 0;
while (n-- != 0) {
if (charAt(i) != anotherString.charAt(i))
return false;
i++;
}
return true;
}
}
return false;
}
源码很直观,一个String类型变量和另一个对象的变量做比较(另一个对象可以是Stirng类型,也可以是任意类),当两个变量的地址相同直接返回true,不同时走下一步,另一个对象强转为String类型,两个变量的字符一 一比较。
2.2
自定义类中的equals方法,如:
A aa = new A();
B bb = new B();
aa.equals(bb);
public boolean equals(Object obj) {
return (this == obj);
}
aa调用的是Object类的equals方法,是对地址的比较。