nineday_java toString与equals
1、object中常用的方法
1>、protected object clone()//负责对象克隆
2>、int hashCode()//获取对象哈希值
3>、boolean equals(object obj);//判断两个对象是否相等
4>、String toString()//将对象转换成字符串形式
5>、protected void finalize()//垃圾回收器负责调用的方法
2、toString
public class ToString {
int year;
int mouth;
int day;
public ToString(int year, int mouth, int day) {
this.year = year;
this.mouth = mouth;
this.day = day;
}
//重写Object中的toString方法
public String toString(){
return year+"年"+mouth+"月"+day+"日";
}
public static void main(String[] args) {
ToString ts=new ToString(1900,8,8);
System.out.println(ts.toString());//1900年8月8日
System.out.println(ts);//1900年8月8日 只要重写toString,程序自动调用toString方法
}
}
3、equals
判断两个对象是否相等
public class equals01 {
int year;
int mouth;
int day;
public equals01(int year, int mouth, int day) {
this.year = year;
this.mouth = mouth;
this.day = day;
}
public static void main(String[] args) {
int a=23;
int b=23;
System.out.println(a==b);//true
/*
对于基本数据类型“==”比较的是数值
*/
equals01 e1=new equals01(2000,8,8);
equals01 e2=new equals01(2000,8,8);
System.out.println(e1==e2);//false 对于引用类型,==比较的是内存地址
System.out.println(e1.equals(e2));// 重写equals之前 false 重写之后true
/*
原因:Object中的equals:
public boolean equals(Object obj){
return (this==obj);//e1==e2 "=="比较两个对象 比较的是内存地址值,故需重写equals
}
*/
}
//重写equals
public boolean equals(Object obj){
int year1=this.year;
int mouth1=this.mouth;
int day1=this.day;
/*int year2=obj.year;
int mouth2=obj.mouth;
int day2=obj.day;
这样的写法是错误的,因为obj 是Object类型的 里面没有year,mouth,day这些属性
解决办法: 向下转型
*/
if(obj instanceof equals01){
equals01 e2=(equals01) obj;
int year2=e2.year;
int mouth2=e2.mouth;
int day2=e2.day;
if(year1==year2&&mouth1==mouth2&&day2==day1) return true;
}
return false;
}
}
上述重写效率太过低
重写equals改良版
public boolean equals(Object obj){
//如果obj为null或者obj不是equals01类型,直接false
if(obj==null ||(!(obj instanceof equals01)))
return false;
//如果内存地址相同 直接true
if(obj==this)
return true;
//如果上述都不是,则可直接强制转换obj
equals01 e2=(equals01) obj;
//return 返回比较后的布尔类型
return this.year==e2.year && this.mouth==e2.mouth && this.day==e2.day;
}
4、String类的toString与equals
/*
注意:
基本类型使用“==”判断是否相等
引用类型使用equals比较是否相等(String类已经把equals与toString方法重写完成。自定义类需要手动重写)
*/
public class StringAndEquals {
public static void main(String[] args) {
String st1=new String("123");
String st2=new String("123");
System.out.println(st1.equals(st2));//true
// 由上可知 String已经重写了equals方法,所以比较字符串必须调用equals方法,不能用==
String st3=new String("好好学习!");
//如果String未重写toString方法,则会出现java.long.String@十六进制数字
System.out.println(st3);//好好学习 可知String已经重写了toString方法
}
}
5、练习
public class student {
int sno;
String school;
public student(){}
public student(int sno,String school){
this.sno=sno;
this.school=school;
}
public String toString(){
return "学号:"+sno+",学校名称:"+school;
}
//当一个学生的学号相同,学校名称也相同时,认为是同一个学生
public boolean equals(Object obj) {
if (this == obj) return true;
if (obj == null || (!(obj instanceof student)))
return false;
student st = (student) obj;
//引用数据类型 比较时使用equals
return this.school.equals(st.school) && this.sno == st.sno;
}
public static void main(String[] args) {
student st=new student(12,new String("二小"));
student st1=new student(12,"二小");
System.out.println(st.equals(st1));//true
}
}
浙公网安备 33010602011771号