【java面试题】 == 和 equals
"=="比较的机制:== 对比的是栈中的值
基本数据类型是变量值,也就是 int i = 1;在栈中存放的是 i = 1,== 比较的也是这个数值1
引用类型是堆中内存对象的地址 ,String str = new String("hello"); 通过new在堆中开辟了空间,str指向堆中的空间的内存地址,也就是在栈中str等于堆中空间的地址,比如:0x2223,==比较的就是这个地址的值
equals的比较机制:默认也是采用”==“比较,如果不重写equals,它和”==”相同,但通常会重写
在Object类的equals方法的源码中是用的“==”:
public boolean equals(Object obj) {
return (this == obj);
}
但是在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;
}
实现原理是把字符串中的每一个字符拿出来比较,如果都相等则说明这两个字符串相等
面试题:
public class Demo01 {
public static void main(String[] args) {
String name = "zhangsan";
String name1 = new String("zhangsan");
String name2 = name1;
System.out.println(name == name1);
System.out.println(name == name2);
System.out.println(name1 == name2);
System.out.println(name.equals(name1));
System.out.println(name.equals(name2));
System.out.println(name1.equals(name2));
}
}
name == name1 比较的是在栈中存的地址,name的地址是在堆中,name1的地址是在常量池中,所以它们不相等,但如果用equals,那么比较的就不是地址了,比较的是字符串的内容是否相等