4

将值添加到字符串数组时,我遇到了一个奇怪的问题,该数组稍后会使用哈希映射进行数组排序。我有一个文件名 XFR900a,并使用以下代码将 XFR900 部分添加到数组中;

private ArrayList<String> Types = new ArrayList<String>();

...

Types.add(name.substring(0,(name.length() - 1));
System.out.println(name.substring(0,(name.length() - 1));

我什至打印了给出“XFR900”的行,但是当我改用以下代码时,稍后的数组排序行为会有所不同;

Types.add("XFR900");
System.out.println(name.substring(0,(name.length() - 1));

这只是手动完成的子字符串部分,非常混乱。

是否有任何好的替代子字符串,因为那里必须有一些奇怪的非 ascii 字符?

菲尔

更新

谢谢大家的评论。这是稍后比较字符串的一些代码;

    for (int i=0;i< matchedArray.size();i++){

        //run through the arrays
        if (last == matchedArray.get(i)) {
            //add arrays to a data array
            ArrayList data = new ArrayList();
            data.add(matchedArray1.get(i));
            data.add(matchedArray2.get(i));
            data.add(matchedArray3.get(i));
            data.add(matchedArray4.get(i));
            data.add(matchedArray5.get(i));
            //put into hash map 
            map.put(matchedArray.get(i), data);
        }
        else {
            //TODO
            System.out.println("DO NOT MATCH :" + last + "-" + matchedArray.get(i));

如您所见,我添加了一个测试 System.out.println("DO NOT MATCH" ... 下面是一些输出;

不匹配:FR99-XFR900 不匹配:XFR900-XFR900

我只在 XFR900a 文件名上运行子字符串。问题是最后打印的测试行 !=matchedArray.get(i) 但是当打印到显示器时它们是相同的。

菲尔

4

3 回答 3

3

您永远不应该使用==运算符来比较字符串的内容。==检查它是否是同一个对象。last.equals(matchedArray.get(i))改为写。该equals()方法检查对象是否相等,而不是它们是否相同。如果String它检查两个字符串是否包含相同的字符。这可能会消除你的奇怪行为。

PS:==on string 的行为有点不可预测,因为java虚拟机做了一些优化。如果两个字符串相等,则 jvm 可能对两者使用相同的对象。这是可能的,因为String对象无论如何都是不可变的。如果您手动记下子字符串,这将解释行为上的差异。在一种情况下,jvm 进行了优化,在另一种情况下则没有。

于 2012-08-02T12:48:42.757 回答
0

使用.equals()而不是==因为它们是字符串!

if (last.equals(matchedArray.get(i))) {}
于 2012-08-02T12:51:09.620 回答
0

如果您想检查值,切勿使用 == 运算符,因为运算符将检查对象引用相等性,使用等于运算符检查值而不是引用,即

for (int i=0;i< matchedArray.size();i++){

//run through the arrays if (last.equals(matchedArray.get(i))) { // Line edited //add arrays to a data array ArrayList data = new ArrayList(); data.add(matchedArray1.get(i)); data.add(matchedArray2.get(i)); data.add(matchedArray3.get(i)); data.add(matchedArray4.get(i)); data.add(matchedArray5.get(i)); //put into hash map map.put(matchedArray.get(i), data); } else { //TODO System.out.println("DO NOT MATCH :" + last + "-" + matchedArray.get(i));
于 2015-07-24T13:18:18.197 回答