0

可能重复:
如何比较 Java 中的字符串?

我写了这段代码:

    public String[] removeDuplicates(String[] input){

    int i;
    int j;
    int dups = 0;
    int array_length = input.length;
    for(i=0; i < array_length; i++){
        //check whether it occurs more than once
        for(j=0; j < array_length; j++){
            if (input[i] == input[j] && i != j){
                dups++; //set duplicates boolean true
                input[j] = null;  //remove second occurence
            } //if cond
        } // for j
    } // for i
    System.out.println("Category contained " + dups + " duplicates.");
    return input;
}

它应该检查一个字符串数组是否包含一个或多个重复项。但是,即使我这样定义数组:

String[] temp = new String[2];
temp[0] = "a";
temp[1] = "a"; 

if 条件未被“触发”。我误解了 && 的工作原理吗?在我看来,程序应该首先检查两个字符串是否相同(它们是...),然后检查两个索引是否相同。如果不是,它应该执行操作。但是,这些程序似乎不这么认为。

4

5 回答 5

5

Java 中最常见的错误之一是在引用对象时假定 aString是对象。当您使用时,==您是在比较参考文献,而不是它们的内容。这就是为什么.equals()需要比较它们的内容。

顺便说一句,您可以删除重复项

public static String[] removeDuplicates(String[] input){
    return new HashSet<String>(Arrays.asList(input)).toArray(new String[0]);
}
于 2012-09-20T15:04:40.520 回答
4

Java 中的==运算符检查两个对象是否相同,而不是它们是否相等。两个字符串可能具有相同的内容,并且比较是否相等。您需要equals改用:

if (i != j && input[i].equals(input[j])){
}

如果元素null之间允许值input,则需要在null条件中添加检查以避免异常:

if (i != j && input[i] != null && input[i].equals(input[j])){
}
于 2012-09-20T15:01:21.353 回答
2

永远不要用来==检查两个对象是否具有相同的值。采用equals()

==将检查它们的内存位置(如果两个对象实际上只有一个),equals()这种方法会告诉您两者是否代表相同的信息。

于 2012-09-20T15:01:30.600 回答
2

在使用字符串(以及任何非原始类型)时,请记住 == 通过引用而不是值进行比较。改为使用equals()

if (input[i].equals(input[j]) && i != j){
    dups++; //set duplicates boolean true
    input[j] = null;  //remove second occurence
} //if cond

作为一个经验法则,当你想检查两个对象是否完全是同一个对象时,使用 == (你可以把它想象成两个指针都引用相同的地址)。

于 2012-09-20T15:01:43.937 回答
1

您应该String.equals用于检查字符串内容。==操作员只检查对象引用:

if (input[i] != null && input[i].equals(input[j]) && i != j) {
于 2012-09-20T15:02:18.383 回答