我在我的小Java应用程序中发现了一个奇怪的(至少对我来说)行为。我有一个app.jar从命令行运行,做一个简单的任务。任务是从给定的列表中找到重复的值并删除它们。这个应用程序是用JDK-7开发的,用JRE-7运行。
从我PC的命令行中一切正常,但是当在虚拟机(Windows-7)和相同的JRE中运行相同的JAR时,它不会删除重复,也不会发生任何错误。
下面是我的代码:public List<String> removeDuplicatedFin(List<String> coreList,
Map<String, String> strToRemoveMap) {
for (int y = 0; y < coreList.size(); y++) {
String str = coreList.get(y).getPosts().get(0).getMyStr();
String id = coreList.get(y).getPosts().get(0).getId();
if (strToRemoveMap.get(str) != null
&& strToRemoveMap.get(str).equals(idPost)) {
coreList.get(y).getPosts().remove(0);
}
}
return coreList;
}
coreList是主列表
strToRemoveMap包含要删除的值
有什么想法或帮助吗?
Thanks in advance
非常感谢您的回复。最后,我发现出现这种异常是因为我正在比较两个字符串与示例
if(str1.equals(str2))
我不知道为什么当我改变
if(str1 == str2)
效果很好。然而,在Eclipse和我的PC中,它也与equals()一起工作。
我需要更多地了解这类事情,而不仅仅是……
谢谢,祝你今天愉快。
与你可能认为你已经发现的相反,在Java中比较两个字符串的正确的方法是使用String.equals
;参见如何比较Java中的字符串。
存在str1 == str2
为false
, str1.equals(str2)
为true
的情况。两个相等的字符串不一定是同一个对象。
但是,str1 == str2
不可能是true
, str1.equals(str2)
不可能是false
;String.equals
的规范不允许。
如果您真的遇到了似乎是的情况,那么最可能的解释是您有竞争条件或由另一个线程的行为引起的内存异常。在没有看到实际代码的情况下,很难更具体。
这也可以解释为什么你的(实际的)代码在某些情况下工作,而不是在其他情况下。与并发相关的bug只出现在某些平台上是很正常的。例如,它们可能依赖于操作系统或Java版本,也可能依赖于系统的物理内核数量。
无论如何,您的(假定的)示例方法无法编译。因为coreList
是List<String>
, coreList.get(y)
会给你一个String
。但是String
没有声明getPosts()
方法,所以你有coreList.get(y).getPosts()
的三个地方将是编译错误。
我怀疑您已经修改了显示问题的实际代码。但这样做,你就把它变成了一些荒谬的东西。