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

标签 java string file arraylist

我正在从 txt 文件中读取句子并创建一组唯一单词。首先,我逐行读取文件。我用空格分割行以将单词作为字符串数组获取。然后,如果这些单词不是我的独特单词 ArrayList,我会将单词添加到 ArrayList 中。然而,存在一些问题。第一个是它还将空 String 添加到唯一字 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 对象解码的字节,您会发现它们不是相同的单词:

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

他们可能使用西里尔字符或其他看起来像“正常”字符但实际上并非如此的字符。

<小时/>

<罢工> 编辑: 更准确地说,第一个 a 是第二个字符串的标准 a 和第一个字符串的西里尔文 а

编辑:它实际上不是西里尔字母a,我很抱歉。它似乎是一个“隐形”角色。正如 khelwood 正确指出的那样,它是一个 BOM

关于Java 比较两个字符串返回 false,尽管字符串相同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49405498/

相关文章:

php - 更改 mysql -joomla 中的文件名并存储在数据库中具有唯一的名称?

c - 使用 C 中的文件管理陷入循环

java - 玩!验证不起作用

java - 如何选择要复制的文件?

java - 使用java的简单控制台应用程序

c - 使用 sscanf 将 C 字符串拆分为标记

java - 将文件中的数字相加

java - 如何检查文件是否为二进制文件?

java - 准备库 .jar 以使用 Maven 和 Git 发布

java - Apache Commons XMLConfiguration - 如何获取给定节点的对象列表?