java语言当中的字符串String有没有重写toString方法,有没有重写equals方法
总结:
1、String类已经重写了equals方法,比较两个字符串不能使用==,必须使用equals。
equals是通用的。
2、String类已经重写了toString方法。
大结论:
java中什么类型的数据可以使用“双等于号”判断
- java中基本数据类型比较是否相等,使用==
java中什么类型的数据需要使用equals判断
- java中所有的引用数据类型统一使用equals方法来判断是否相等。
这是规矩
示例代码:
public class ObjectTest03{
public static void main(String[] args){
// 大部分情况下,采用这样的方式创建字符串对象
String s1 = "Hello";
String s2 = "abc";
//疑问,此种情况下,==和equals比较的结果为什么一样?
System.out.println(s1 == s2);
System.out.println(s1.equals(s2));
// 实际上String也是一个类。不属于基本数据类型。
// 既然String是一个类,那么一定存在构造方法。
String s3 = new String("new1");
String s4 = new String("new1");
// new两次,两个对象内存地址,s3保存的内存地址和s4保存的内存地址不同。
// == 判断的是内存地址。不是内容。
System.out.println(s3 == s4);// false
// 比较两个字符串能不能使用双等号?
// 不能,必须调用equals方法。
// String类已经重写equals方法了。
System.out.println(s3.equals(s4));// true
// String类有没有重写toString方法呢?
String x = new String("自学成才!");
// 如果String没有重写toString()方法,输出结果:java.lang.String@十六进制的地址
// 经过测试:String类已经重写了toString()方法。
System.out.println(x.toString());
System.out.println(x);//x是引用默认调用toString方法
}
}
运行结果:
String对象比较的时候必须使用equals方法
示例代码:
public class ObjectTest04{
public static void main(String[] args){
Student s1 = new Student(11111,"清华大学");
Student s2 = new Student(11111,"清华大学");
System.out.println(s1 == s2);//false
System.out.println(s1.equals(s2));//true
/* Student s1 = new Student(11111,new String("清华大学"));
Student s2 = new Student(11111,new String("清华大学"));
System.out.println(s1 == s2);//false
System.out.println(s1.equals(s2));//false */
}
}
class Student{
//学号
int no;//基本数据类型,比较时使用:==
//学校名称
String school;//引用数据类型,比较时使用:equals方法。
public Student(){
}
public Student(int no,String school){
this.no = no;
this.school = school;
}
// 重写toString方法
public String toString(){
return "学号" + this.no + ",学校名称" + this.school;
}
// 重写equals方法
// 需求:当一个学生的学号相等,并且学校相同时,表示同一个学生。
// 思考:这个equals该怎么重写呢?
// equals方法的编写模式都是固定的。架子差不多。
public boolean equals(Object obj){
if(obj == null && !(obj instanceof Student)) return false;
if(this == obj) return true;
Student t = (Student)obj;
return this.no == t.no && this.school.equals(t.school);
//字符串用双等号比较可以吗?
// 不可以
//return this.no == t.no && this.school == t.school;
}
}
equals方法重写的时候要彻底
示例代码:
public class ObjectTest05{
public static void main(String[] args){
//创建一个User对象u1,构造器中传入Address对象
User u1 = new User("张三",new Address("中国河南","花园街道","11111"));
//创建一个User对象u2,构造器中传入Address对象
User u2 = new User("张三",new Address("中国河南","花园街道","11111"));
System.out.println(u1.equals(u2));//true//重写的equals方法比较的是内容
//创建一个User对象u3,构造器中传入Address对象
User u3 = new User("张三",new Address("中国上海","花园街道","11111"));
System.out.println(u1.equals(u3));//false//重写的equals方法比较的是内容
}
}
class User{
// 用户名
String name;
// 用户的住址
Address addr;
public User(){}
public User(String name,Address addr){
this.name = name;
this.addr = addr;
}
// 重写equals方法
// 重写规则:当一个用户的用户名和家庭住址都相同,表示同一个用户。
// 这个equals判断的是User对象和User对象是否相等。
public boolean equals(Object obj){
if(obj == null && !(obj instanceof User)) return false;
if(this == obj) return true;
User u = (User)obj;
return this.name.equals(u.name) && this.addr.equals(u.addr);
}
}
class Address{
String city;
String street;
String zipcode;
public Address(){}
public Address(String city,String street,String zipcode){
this.city = city;
this.street = street;
this.zipcode = zipcode;
}
// 注意:这里并没有重写equals方法。
// 这里的equals方法判断的是:Address对象和Address对象是否相等。
public boolean equals(Object obj){
// 怎么算是家庭住址相同呢?
// 城市相同,街道相同,邮编相同,表示相同。
if(obj == null && !(obj instanceof Address)) return false;
if(this == obj) return true;
Address a = (Address)obj;
return this.city.equals(a.city) && this.street.equals(a.street) && this.zipcode.equals(a.zipcode);
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/87639.html