等于String和Int的覆盖

时间:2012-01-27 18:04:13

标签: java equals

我在列表中有一个列表,我创建了一个对象。通过使用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)
}
}

3 个答案:

答案 0 :(得分:11)

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

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

答案 1 :(得分:3)

不需要覆盖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类。

答案 2 :(得分:0)

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

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