将值添加到 String 数组时,我遇到了一个奇怪的问题,该数组稍后涉及使用哈希映射的数组排序。我有一个文件名 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) 但是当打印到显示器时它们是相同的。

菲尔

最佳答案

永远不要使用 == 运算符来比较字符串的内容。 == 检查它是否是同一个对象。改为写 last.equals(matchedArray.get(i))equals() 方法检查对象是否相等,而不是它们是否相同。在 String 的情况下,它检查两个字符串是否由相同的字符组成。这可能会消除您的奇怪行为。

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

关于java - 替代子串,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11744852/

10-10 08:36