==操作符与equals方法
一、==
1、基本类型比较值
只要两个变量的值相等,即为true
int a = 5; if(a == 6) {...}
2、引用类型比较引用(是否指向同一个对象)
只有指向同一个对象时,==才返回true
Person p1 = new Person();
Person P2 = new Person();
System.out.printn(p1 == p2);//false
Person p1 = new Person();
Person P2 = p1;
System.out.printn(p1 == p2);//true
3、注意
用“==”进行比较是,符号两边的数据类型必须兼容(可自动转换的基本数据类型除外),否则编译出错。
Person p1 = new Person();
Test t = new Test();
System.out.printn(p1 == t);//报错。Person类和Test类之间一点关系(父子关系)都没有
二、equals
1、equals()
所有类都继承了Object,也就获得了equals()方法。还可以重写。
- 只能比较引用类型,其作用与“==”相同,比较是否指向同一个对象
- 格式:obj1.equals(obj2)
Person p1 = new Person();
Person P2 = new Person();
System.out.printn(p1 == p2);//false。只有指向同一个对象时,==才返回true
System.out.printn(p1.equals(p2));//false。只能比较引用类型,其作用与“==”相同,比较是否指向同一个对象
2、特例
当用equals方法进行比较时,对类File、String、Data及包装类(WrapperClass)来说,是比较类型及内容而不考虑引用的是否是同一个对象。
- 原因:在这些类中重写了Object类的equals()方法。
String s1 = new String("abc");
String s2 = new String("abc");
System.out.println(s1 == s2);//false。s1和s2分别指向不同的对象
System.out.println(s1.equals(s2));//true。s1、s2的内容相同
三、==与equals总结
对于对象来说:
- 特殊的类,如String、File、Data,使用==比较的是对象(对象的地址),equals比较的是内容
- 除了特殊的类之外的其他普通的类的对象,==和equals比较的都是对象(对象的内存地址)
- 如果想改变某一个类的equals,不想用equals来比较对象的内存地址,就需要重写equals方法。
四、String对象的创建
- 字面量创建对象的时候,只在常量池创建一个对象。
- new创建对象的时候,常量池有对象,堆中也要有对象。
- 字面量方法要比new方法省内存。
五、练习
1、练习1
2、练习2
3、练习3
编写Order类,有int型 orderId,String型的OrderName ,相应的getter()和setter()方法,两个参数的构造器,重写父类的equals()方法:public boolean equals(Object obj),并判断测试类中创建的两个对象是否相等。
//Order.java
public class Order{
public Order(int orderId,String oderName){
this.orderId = orderId;
this.orderName = orderName;
}
int orderId;
String orderName;
public int getOrderId(){
return orderId;
}
public void setOrderId(int orderId){
this.orderName = orderName;
}
public String getOrderName(){
return oderName;
}
public void setOrderName(String orderName){
this.OrderName = orderName;
}
//重写的快捷键:alt+/
//两个order对象的属性都相等,就是对象相等
public boolean equals (Object obj){
boolean flag = false;
if(obj instanceof Order){
Order o = (Order)obj;
if(this.orderId == o.orderId && this.orderName.equals(o.orderName)){
flag = true;
}
}
return flag;
]
}
//Test.java
Order o1 = new Order(123,"a001");
Order o2 = new Order(123,"a001");
System.out.println(o1.equals(o2));//true
Order o1 = new Order(123,"a001");
Order o2 = new Order(123,"a002");
System.out.println(o1.equals(o2));//false
4、练习4
自行定义能满足需要的MyDate类,在MyDate类中覆盖equals方法,使其判断当两个MyDate类型对象的年月日都相同时,结果为true,否则为false
//MyDate.java
public class MyDate{
public MyDate(int year,int month,int day){
this.year = year;
this.month = month;
this.day = day;
}
int year = year;
int month = month;
int day = day;
public boolean equals(Object obj){
int flag = 1;
if(obj instanceof MyDate){
MyDate md = (MyDate) obj;
flag = 0;
if(this.year != md.year){
flag += 1;
}
if(this.month != md.month){
flag += 1;
}
if(this.day != md.day){
flag += 1;
}
}
if()flag == 0){
retrun true;
}else{
retrun false;
}
}
}
//Test.java
MyDate m1 = new MyDate(2030,11,23);
MyDate m2 = new MyDate(2030,11,23);
System.out.println(m1.equals(m2));//true