1.== 可以比较基本数据类型也可以比较引用数据类型,比较基本数据类型时比较的是值是否相等,比较引用类型时比较的是引用地址是否相同
2.equals只适合引用数据类型的比较,默认情况下和==一致都是比较引用地址是否相同
3.但是很多java类库里的类都已经重写了equals方法,用来比较值是否相等,当你自己定义类时,如果没有重写equals方法,那它会是默认情况,所以要注意是不是需要重写equals方法
测试代码如下(没有重写equals方法时)
//定义一个类,生成一个有参构造,此时没有重写equals
public class EqualsObject {
private String name;
public EqualsObject(String name) {
this.name = name;
}
}
public class Test {
public static void main(String[] args) {
EqualsObject equalsObject1 = new EqualsObject("11");
EqualsObject equalsObject2 = new EqualsObject("11");
System.out.println(equalsObject1==equalsObject2);//false
System.out.println(equalsObject1.equals(equalsObject2));//false,此时默认比较的是地址
}
}
测试代码如下(重写equals方法之后)
public class EqualsObject {
private String name;
public EqualsObject(String name) {
this.name = name;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof EqualsObject)) return false;
EqualsObject that = (EqualsObject) o;
return name != null ? name.equals(that.name) : that.name == null;
}
}
public class Test {
public static void main(String[] args) {
EqualsObject equalsObject1 = new EqualsObject("11");
EqualsObject equalsObject2 = new EqualsObject("11");
System.out.println(equalsObject1==equalsObject2);//false
System.out.println(equalsObject1.equals(equalsObject2));//true,此时比较的是值
}
}
4.补充instanceof知识
a instanceof B a的类型与B类型必须是同类或者A与B在同一个继承分支上,且A在下层,这样才是true
//前置类
public class Test1 {
void test(){
System.out.println("我是:Test1");
}
}
class Test2 extends Test1{
@Override
void test() {
System.out.println("我是:Test2");
}
}
class Test3 extends Test2{
@Override
void test() {
System.out.println("我是:Test3");
}
}
public class MainTest {
//继承情况下的比较
public static void main(String[] args) {
//true
Test2 test2 = new Test2();
if(test2 instanceof Test1){
System.out.println(true);
}else {
System.out.println(false);
}
//true
if(test2 instanceof Test2){
System.out.println(true);
}else {
System.out.println(false);
}
//Error:(17, 29) java: 不可比较的类型: java.lang.Class<capture#1, 共 ? extends reflecttest.Test2>和java.lang.Class<reflecttest.Test1>
/*if(test2.getClass() == Test1.class){
System.out.println(true);
}else {
System.out.println(false);
}*/
//true
if(test2.getClass() == Test2.class){
System.out.println(true);
}else {
System.out.println(false);
}
//true
if(test2.getClass().equals(Test2.class)){
System.out.println(true);
}else {
System.out.println(false);
}
//false
if(test2.getClass().equals(Test1.class)){
System.out.println(true);
}else {
System.out.println(false);
}
Test3 test3 = new Test3();
//多级继承 true
if(test3 instanceof Test1){
System.out.println(true);
}else {
System.out.println(false);
}
//false
if(test2 instanceof Test3){
System.out.println(true);
}else {
System.out.println(false);
}
}
}