equals() 方法和==运算符执行的是两个不同的操作。
下面的程序说明了两个不同的字符串(String)对象是如何能够包含相同字符的,但同时这些对象引用是不相等的:
- String s1 = "Hello World";
- String s2 = new String(s1);
- System.out.println(s1.equals(s2)); // 输出true
- System.out.println(s1 == s2); // 输出false
变量 s1 指向由“Hello World”创建的字符串实例。s2 所指的的对象是以 s1 作为初始化而创建的,存放地址不同。因此这两个字符串对象的内容是一样,但它们是不同的对象,这就意味着 s1 和 s2 没有指向同一的对象,因此它们是不==的。
因此,千万不要使用==运算符测试字符串的相等性,以免在程序中出现糟糕的 bug。从表面上看,这种 bug 很像随机产生的间歇性错误
String 类中重写了 equals() 方法用于比较两个字符串的内容是否相等。
语法
public boolean equals(Object anObject)
参数
返回值
如果给定对象与字符串相等,则返回 true;否则返回 false。
- public class Test {
- public static void main(String args[]) {
- String Str1 = new String("runoob");
- String Str2 = Str1;
- String Str3 = new String("runoob");
- boolean retVal;
-
- retVal = Str1.equals( Str2 );
- System.out.println("返回值 = " + retVal );
-
- retVal = Str1.equals( Str3 );
- System.out.println("返回值 = " + retVal );
- }
- }
以上程序执行结果为:
返回值 = true
返回值 = true
通常,仅仅知道两个字符串是否相同是不够的。对于排序应用来说,必须知道一个字符串是大于、等于还是小于另一个。一个字符串小于另一个指的是它在字典中先出现。而一个字符串大于另一个指的是它在字典中后出现。字符串(String)的 compareTo() 方法实现了这种功能。
compareTo() 方法用于按字典顺序比较两个字符串的大小,该比较是基于字符串各个字符的 Unicode 值。
compareTo() 方法的语法格式如下:
str.compareTo(String otherstr);
它会按字典顺序将 str 表示的字符序列与 otherstr 参数表示的字符序列进行比较。如果按字典顺序 str 位于 otherster 参数之前,比较结果为一个负整数;如果 str 位于 otherstr 之后,比较结果为一个正整数;如果两个字符串相等,则结果为 0。
提示:如果两个字符串调用 equals() 方法返回 true,那么调用 compareTo() 方法会返回 0。
实例:
定义一个接口用来实现两个对象的比较。
interface CompareObject{
public int compareTo(Object o); //若返回值是 0 , 代表相等; 若为正数,代表当前对象大;负数代表当前对象小
}
定义一个Circle类,声明redius属性,提供getter和setter方法
定义一个ComparableCircle类,继承Circle类并且实现CompareObject接口。在ComparableCircle类中给出接口中方法compareTo的实现体,用来比较两个圆的半径大小。
定义一个测试类InterfaceTest,创建两个ComparableCircle对象,调用compareTo方法比较两个类的半径大小。
代码如下:
- package com.object_04.interface_05;
-
- public interface CompareObject {
- public int compareTo(Object o);
- //若返回值是 0 , 代表相等; 若为正数,代表当前对象大;负数代表当前对象小
- }
- package com.object_04.interface_05;
- //定义一个Circle类
- public class Circle {
- private double redius; //定义一个半径
-
- public Circle() {
- }
-
- public Circle(double redius) {
- this.redius = redius;
- }
-
- public double getRedius() {
- return redius;
- }
-
- public void setRedius(double redius) {
- this.redius = redius;
- }
-
- public int compareTo(Object o) {
- System.out.println("半径为:"+redius);
- return 0;
- }
- }
- package com.object_04.interface_05;
- //定义一个ComparableCircle类,继承Circle类并且实现CompareObject接口。
- // 在ComparableCircle类中给出接口中方法compareTo的实现体,用来比较两个圆的半径大小
- public class ComparableCircle extends Circle implements CompareObject {
- public ComparableCircle() {
- }
-
- public ComparableCircle(double redius) {
- super(redius);
- }
-
- @Override //重写比较方法
- public int compareTo(Object o) {
- // 运算符预判
- if (o instanceof Circle){
- //如果不进行预判出现ClassCastException 类转换异常
- // 然后进行比较
- if(this.getRedius() == ((Circle) o).getRedius()){
- return 0;
- }else if(this.getRedius() < ((Circle) o).getRedius()){
- return -1;
- }else {
- return 1;
- }
- }
- return 2;
- }
- }
-
-
- ```java
- - package com.object_04.interface_05;
-
- public class InterfaceTest {
- public static void main(String[] args) {
- CompareObject c1 = new ComparableCircle(10);
- // 可以使用多态和本态,优先使用多态(站高望远)
- CompareObject c2 = new ComparableCircle(20);
- int compRs = c1.compareTo(c2);
- System.out.println(compRs);
- switch (compRs) {
- case 0:
- System.out.println("相等");
- break;
- case 1:
- System.out.println("左边大");
- break;
- case -1:
- System.out.println("右边大");
- break;
-
- default:
- break;
- }
-
- }
- }
运行结果: