将String与equals()进行比较无效



我有一个jtable和一个对象数组。在我的代码中,我使用for循环和getValueAt()将jtable的行值保存在此数组中。问题是,当我使用equals()将此数组的值与字符串文字进行比较时,它会返回false,尽管值是相同的。

下面是我填充数组的代码:

public void mouseClicked(MouseEvent e) {
            if (e.getClickCount() == 2) {
                JTable target = (JTable) e.getSource();
                if ((target.getSelectedRow() >= 0)
                        && (target.getSelectedColumn() >= 0)) {
                    invoiceRow = target.getSelectedRow();
                    invoiceCol = target.getModel().getColumnCount();
                    invoiceId = (BigDecimal) returnedInvoiceTable
                            .getModel().getValueAt(invoiceRow, 0);
                Object []   invoiceRowData = new Object[invoiceCol];
                    for (int i = 0; i < invoiceCol; i++) {
                        invoiceRowData[i] = returnedInvoiceTable.getModel()
                                .getValueAt(invoiceRow, i);
                    }
                    fillReturned();
                }
            }
        }
    });

这是我将数组中的值与字符串文字进行比较的代码

if (invoiceRowData[8].toString().equals("immediate")) {
} 

这会返回false,尽管两个值相同。当我打印invoiceRowData[8].toString()时,它会打印immediate

可能出了什么问题?

尽管这两个值相同,但返回false。

在每天使用equals()的数百万人中,你会是这个星球上第一个发现这个bug的人,这似乎很奇怪:-)

更有可能的是,年轻的学徒,你在某个地方犯了一个错误,他们实际上并不完全相同。

这可能是由许多因素引起的,例如大小写、与拉丁字母非常相似的非拉丁字符,或者字符串一端或另一端的空格。

如果您真的想知道它们是否不同,请尝试以下操作:

  • 打印出长度
  • 对于开头的每个子字符串(第一个字符、前两个字符等),比较两个字符串的等效部分

如果长度不相同,则可能包含空格。在这种情况下,您可能会考虑在比较之前使用String.trim()来清理它。

如果你找到了一个不匹配的子字符串,那么你已经找到了导致问题的字符,你可以用类似String.codePointAt()的东西来获得每个子字符串的代码点。

最新更新