Java包含不能按预期工作,因为“someString”!=“someString”

时间:2012-09-23 11:41:08

标签: java string list equals contains

我想检查字符串List中是否包含字符串值val,并将其称为stringList。

我这样做

if(stringList.contains(val)){
  System.out.println("The value is in there");
}
else{
  System.out.println("There's no such value here");
}

但似乎总是不包括价值。这是因为具有相同字符的两个String值实际上并不相等吗?对于“自制”类,我可以实现hashCode()和equals()并解决这个问题,我可以为String数据做什么?

编辑:

这里概述了我获得val的方式:

List<String> stringList = new ArrayList<String>();
    stringList.add("PDT");
stringList.add("LDT");
stringList.add("ELNE");

String myFile = "/folder/myFile";
InputStream input = new FileInputStream(myFile);
CSVReader reader = new CSVReader(new InputStreamReader(input), ',','"', 1);
String[] nextLine;
try {
    while ((nextLine = reader.readNext()) != null) {
    if (nextLine != null) {
        if (nextLine[6] != null){
          String val = nextLine[6];
            if(stringList.contains(val)){
            System.out.println("Success");
            }
        }
    }
}

5 个答案:

答案 0 :(得分:10)

ArrayList.contains()使用Object.equals()检查是否相等(hashCode()中没有List)。这适用于字符串。可能,你的字符串确实没有包含在列表中......

您可能忽略了一些空白或大/小写或编码差异......

答案 1 :(得分:4)

听起来不对:contains使用equals而不是==,所以如果字符串在列表中,则应该找到它。这可以在indexOf使用的超类AbstractListArrayList方法中进行验证。

在您进行修改之后,请确保在执行trim之前contains字符串,否则它们可能包含newline个字符。

答案 2 :(得分:4)

请更多代码!

这有效:

import java.util.*;

public class Contains {
    public static void main(String[] args) {
        List<String> stringList = new ArrayList<String>();
        stringList.add("someString");
        String val = new String("someString");
        if (stringList.contains(val)) {
            System.out.println("The value is in there");
        } else {
            System.out.println("There's no such value here");
        }
    }
}

答案 3 :(得分:1)

尝试以下操作,首先通过迭代列表并分别检查每个元素来使检查更具体。当你点击你期望相同的元素时,这就是你应该看的东西。检查它们是否真的相同。也许有个案差异? (或者其他一些难以捉摸的但是像白色空间一样明显的区别?)

答案 4 :(得分:1)

尝试覆盖equals(){},以便您可以指定哪个属性需要比较相等....:P