将值添加到 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/