【问题标题】:Equals override for String and IntString 和 Int 的等于覆盖
【发布时间】:2012-01-27 18:04:12
【问题描述】:

我在该列表中有一个列表,我创建了一个对象。通过使用contains() 方法,我想检查对象是否已经存在。为此,我重写了equals() 方法。一切都很完美。但是当我尝试为Stringint 做同样的事情时,equals() 覆盖不起作用。为什么会这样?我刚刚发布了一些示例代码供参考。

public class Test 
{
private int x;

public Test(int n) 
{ 
x = n;
}

public boolean equals(Object o) 
{
return false; 
}

public static void main(String[] args) 
{
List<Test> list = new ArrayList<Test>();
list.add(new Test(3));
System.out.println("Test Contains Object : " + list.contains(new Test(3))); // Prints always false (Equals override)
List<String> list1 = new ArrayList<String>();
list1.add("Testing");
String a = "Testing";
System.out.println("List1 Contains String : " + list1.contains(a)); // Prints true (Equals override not working)
}
}

【问题讨论】:

  • 您没有覆盖 String 对象的 equals 方法。您正在为 Test 对象显式覆盖等于。
  • 我不明白这个问题。您有一个字符串列表,该列表包含您添加的字符串,contains 表示相同。你不能对String 做同样的事情,如果你试图扩展 String,它就不会编译。

标签: java equals


【解决方案1】:

String 和 Integer 都是最终类,因此您不能对它们进行子类化。因此,您不能覆盖它们的 equals 方法。

但是,您可以将 ArrayList 子类化并在现有的基础上创建自己的包含实现。

【讨论】:

  • 即使我实现了包含方法,我也无法覆盖 String 和 Integer,那么需要实现它们吗??
【解决方案2】:

不需要重写 Integer 或 String 的 equals 方法,因为它们已经实现并且运行良好。

但是,如果您仍然想这样做,这将是一种方法 (Delegation Pattern):

public class MyString {
    private String myString;

    @Override
    public boolean equals(Object o) 
        return false;
    }

    // add getter and setter for myString 
    // or delegate needed methods to myString object.
}

当然,那么你必须使用这个类,而不是列表中的 String 类。

【讨论】:

    【解决方案3】:

    关于蒂姆的回答,你可以这样做:

    import java.util.*;
    import java.lang.*;
    import java.io.*;
    
    class Ideone{
        public static void main (String[] args) throws java.lang.Exception
        {
            MyString my = new MyString();
            String testString = "bb";
            my.setMyString(testString);
            System.out.println(my.equals(testString));
        }
    }
    
    class MyString {
        private String myString;
    
        @Override
        public boolean equals(Object o){ 
            return o.equals(myString);
        }
    
        public String getMyString(){
            return myString;
        }
    
        public void setMyString(String newString){
            myString = newString;
        }
    }
    

    输出是true

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多