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

Java比较两个字符串时返回false,尽管字符串相同,java,string,file,arraylist,Java,String,File,Arraylist,我正在读一个txt文件中的句子,并创建一个独特的单词数组。首先,我逐行阅读文件。我用空格分割这些行,将单词作为字符串数组。然后,如果单词不是我唯一的单词ArrayList,我会将该单词添加到ArrayList中。然而,有几个问题。第一个是,它还将空字符串添加到唯一单词ArrayList中。第二个是,它将相同的单词添加了两次,当我比较这两个字符串时,它表现为它们不相等。我的代码如下: ArrayList<String> uniqueWords = new ArrayList&l

我正在读一个txt文件中的句子,并创建一个独特的单词数组。首先,我逐行阅读文件。我用空格分割这些行,将单词作为字符串数组。然后,如果单词不是我唯一的单词ArrayList,我会将该单词添加到ArrayList中。然而,有几个问题。第一个是,它还将空字符串添加到唯一单词ArrayList中。第二个是,它将相同的单词添加了两次,当我比较这两个字符串时,它表现为它们不相等。我的代码如下:

    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)));
0:
1:adalet
2:adalet
9:
false

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

  • 第一个字符串
    adalet
    转换为:
    [-17、-69、-65、97、100、97、108、101、116]
  • 第二个字符串
    adalet
    转换为:
    [9710097108101116]
  • 他们可能使用西里尔字母或其他看起来像“普通”字符但实际上不是的字符


    编辑: 更准确地说,第一个
    a
    是第二个字符串的标准
    a
    ,第一个字符串的标准
    a


    编辑:很抱歉,它实际上不是西里尔语
    a
    。它似乎是一个“不可见”的字符。正如khelwood正确指出的,它是一个
    BOM

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

    您可以在生成列表时删除它

    uniqueWords.add(line[i].replace("\ufeff",""));
    

    可能您在某个地方有一个尾随空格,请尝试:
    System.out.println(uniqueWords.get(1.trim().equalsIgnoreCase)(uniqueWords.get(2.trim())
    当然,在您的
    uniqueWords
    列表中不应该有重复的单词。。。您的拆分中有
    \\s+
    ,这将占用空白。。。是否有特殊字符?寻求调试帮助的问题(“为什么此代码不起作用?”)必须包括所需的行为、特定问题或错误以及在问题本身中重现该问题所需的最短代码。没有明确问题陈述的问题对其他读者没有用处。请参见:如何创建。使用链接改进您的问题-不要通过评论添加更多信息。谢谢PS:您可以简单地使用
    集合
    而不是
    列表
    来实现这一点,索引1处的字符串包含一个。它是不可见的,但它使这个字符串不同于另一个字符串。您是如何从OP@user7很抱歉我不太明白你的问题。你能用一个小例子详细说明一下吗?帖子中的字符串
    adalet
    完全一样。你是怎么找到西里尔语的?这是猜测吗?换句话说,第一个字节[]是从哪个字符串派生的?它们不一样。至少对我来说不是。我所做的就是
    System.out.println(Arrays.toString(s1.getBytes())并在字符串上进行复制和粘贴。这是我从一开始的猜测,但这证实了这一点。