如果使用==语句会产生意外的结果

private void refineWords() { for(String word : words){ Log.i("word", word); if (word == "s" || word == "t" || word == "am" || word == "is" || word == "are" || word == "was" || word == "were" || word == "has" || word == "have" || word == "been" || word == "will" || word == "be" || word == "would" || word == "should" || word == "shall" || word == "must" || word == "can" || word == "could" || word == "the" || word == "as" || word == "it" || word == "they" || word == "their" || word == "he" || word == "she" || word == "his" || word == "her" || word == "him" || word == "its" || word == "in" || word == "on" || word == "a" || word == "at") { Log.i("step", "step Success!!"); words.remove(word); } } } 

我有一个名为“单词”的列表,它包含string。 在这里,Log.i适用于“单词”标签,但“步”语句不会执行。 似乎如果条件不好。 像这个方法永远不会进入它,虽然“单词”列表包含类似的string。 会是什么问题。 请帮忙

你需要使用String.equals() ,而不是====检查两个Object引用是否引用同一个Object

 if("s".equals(word) || "t".equals(word) || ... 

Java语言规范3.0的15.21.3引用平等运算符==和!=开始

虽然==可能用于比较Stringtypes的引用,但是这样的相等性testing确定两个操作数是否引用相同的String对象。 如果操作数是不同的String对象,则结果为false,即使它们包含相同的字符序列。 通过方法调用s.equals(t)可以testing两个strings和t的内容是否相等。

正如其他人所说,你使用object.equals(otherObject)来比较Java中的对象。

但是你的方法是完全错误的。

改为尝试

 Set stopWords = new HashSet(Arrays.asList("s", "t", "am", "is", "are", "was", "were", "has", "have", "been", "will", "be", ...)); 

接着

 private void refineWords() { words.removeAll(stopWords); } 

你应该完成。


此外,请注意,使用当前的代码,您将得到一个ConcurrentModificationException因为您在迭代时尝试更改集合。

所以,如果你不能使用上面的words.removeAll(stopWords) ,那么你必须使用更详细的Iterator.remove()方法:

 private void refineWords() { for (Iterator<String> wordsIterator = words.iterator(); wordsIterator.hasNext(); ) { String word = wordsIterator.next(); if (stopWords.contains(word)) { wordsIterator.remove(); } } } 

在Java中,你需要比较string与equals

 if(word.equals("s") ... 

您可能希望使用equalsIgnoreCase(..)方法进行更精细的细化。