JavaSE(三)深入理解equals()和toString()
一、String类有没有重写toString()和equals()方法?
1、String
方式一:
大部分情况下,我们采用如下这种方法来创建字符串对象 :
String s1 = "hello";
String s2 = "hello";
方式二:
实际上String不属于基本数据类型,而是一个类,那么一定存在构造方法,创建字符串对象时也可以用下面这种写法:
String s3 = new String("Test1");
String s4 = new String("Test1");
那二者有什么区别?
String str1 = "abc"; //这里面直接str1存放的是常量池中的地址值
String str2 = new String("abc"); //这里直接str2存放的是堆中的new String()的地址值,而new String()存放的是跟str1相同指向的常量池的地址值
说白了就是,str1相当于定义了一个常量而没有创建对象,str2是创建了一个新的String对象。
所以使用第一种方法定义的字符串,在判断是否相等时可以直接用“==”;使用第二种方法定义的字符串对象,判断是否相等时要用重写的equals()方法。
2、String类是否重写了equals()方法?
String s1 = "hello";
String s2 = "hello";
String s3 = new String("Test1");
String s4 = new String("Test1");
System.out.println(s1 == s2); //true
System.out.println(s1.equals(s2)); //false
System.out.println(s3 == s4); //false
System.out.println(s3.equals(s4)); //true
System.out.println(s1 == s3); //false
System.out.println(s1.equals(s3)); //false
可见,SUN公司在编写String类时就已经重写了equals()方法,比较的不再是String对象的内存地址,而是字符串的值。
3、String类是否重写了toString()方法?
String x = "你好!";
System.out.println(x.toString()); //你好!
System.out.println(x); //你好!
可见,String类里面也已经重写了toString()方法。
System.out.println(引用); 这里会自动调用”引用的toString()“方法。
二、总结toString()和equals():
在开发中所有的toString()方法和equals()方法都是需要重写的:
1、对于toString(),重写时可根据程序需要将对象的属性值以不同形式呈现;
2、对于equals(),重写时可根据程序的需求,来判断当对象的哪些属性值一样时代表对象相等;
3、基本数据类型比较时可以用“==”来判断;
4、判断两个字符串是否相等,最好不要用“==”,要调用字符串对象的equals()方法。