1、==
对于基本类型,比较值是否相同
对于引用类型,比较引用是否相同
eggs:
String x = "string";
String y = "string";
String z = new String("string");
System.out.println(x==y); //输出true
System.out.println(x==z); //输出 false
代码解读:因为z 重新开辟了一块内存出来,所以与x比较时引用位置不同,故为false;
此处有人可能会问,为何 x 和 y创建之后引用会想同,明显x和y不是一个对象,这里会涉及到一个知识点,String:字符串常量池
字符串常量池
JVM为了提高性能和减少内存开销,在实例化字符串常量的时候进行了一些优化
-
为字符串开辟一个字符串常量池,类似于缓存区
-
创建字符串常量时,首先坚持字符串常量池是否存在该字符串
-
存在该字符串,返回引用实例,不存在,实例化该字符串并放入池
故此处当创建了一个x时发现常连池没有,则此时在常量池创建“string”并返回给x一个引用,再创建y时发现字符串常量池已经存在“string”,故此时创建y时会返回一个“string”的引用,此时用==比较x、y时会返回一个true,因为他俩引用了同一个东西
equals 解读
equals 的本质就是 ==,因为 String 和 Integer 重写了 equals,把他变成了直接对值进行比较,我们看一下equals对于对象的比较
public class Student {
private String name;
public Student(String name) {
super();
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Student s1 = new Student ("张三");
Student s2 = new Student ("张三");
System.out.println(s1 .equals(s2)); // 输出false
为何输出false?我们看下equals与源码
public boolean equals(Object obj) {
return (this == obj);
}
这就明白了,一般情况下equals就相当于==
String s1 = new String("李四");
String s2 = new String("李四");
System.out.println(s1.equals(s2)); // 输出true
这是为何,我们看下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;
}
String重写了equals方法,改为了直接对值的比较,故上述相等