Java比较两个字符串返回false,尽管字符串是相同的

C.A*_*lar 2 java string file arraylist

我正在从txt文件中读取句子并创建一系列独特的单词.首先,我逐行阅读文件.我用空格分割线条,将单词作为String数组.然后,如果单词不是我的唯一单词ArrayList,我将该单词添加到ArrayList.但是,存在一些问题.第一个是它还将空字符串添加到唯一字ArrayList.第二个是它添加相同的单词2次,当我比较这两个字符串时,它就像它们不相等.我的代码如下:

    ArrayList<String> uniqueWords = new ArrayList<>();
    Scanner scan = new Scanner(new File("input.txt"));
    while(scan.hasNext())
    {
        String []line = scan.nextLine().split("\\s+");
        for(int i = 0;i<line.length;i++)
        {
            if(uniqueWords.indexOf(line[i])==-1)
            {
                uniqueWords.add(line[i]);
            }

        }

    }

    System.out.println("0:"+uniqueWords.get(0));
    System.out.println("1:"+uniqueWords.get(1));
    System.out.println("2:"+uniqueWords.get(2));
    System.out.println("9:"+uniqueWords.get(9));
    System.out.println(uniqueWords.get(1).equalsIgnoreCase(uniqueWords.get(2)));
Run Code Online (Sandbox Code Playgroud)

输出如下:

0:?
1:?adalet
2:adalet
9:
false
Run Code Online (Sandbox Code Playgroud)

Ben*_*Ben 5

如果您查看这两个String对象解码的字节,您将看到它们不是相同的单词:

  1. 第一个String adalet转换为:[-17, -69, -65, 97, 100, 97, 108, 101, 116]
  2. 第二个String adalet转换为:[97, 100, 97, 108, 101, 116].

他们可能使用西里尔字符或其他看起来像"正常"字符但实际上不是.


编辑: 更准确地说,第一个aa第二个String 的标准,?第一个是西里尔文的标准.

编辑:这实际上不是西里尔文a,我的道歉.它似乎是一个"隐形"角色.正如凯尔伍德正确指出的那样BOM.


khe*_*ood 5

索引一处的字符串包含BOM。它是不可见的,但它使该字符串与其他字符串不同。

您可以在构建列表时将其删除。

uniqueWords.add(line[i].replace("\ufeff",""));
Run Code Online (Sandbox Code Playgroud)