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); } }