比较整数的奇怪错误

Weird error comparing ints

我有一个奇怪的奇怪的奇怪的错误,首先是 class 给我的错误

public class SpeciePesci {


public static final SpeciePesce[] specie = (new SpeciePesce[]{
    new SpeciePesce(13,"Trota fario", R.drawable.specie_trota_fario, R.string.specie_descrizione_trota_fario),
    new SpeciePesce(14,"Trota iridea", R.drawable.specie_trota_iridea, R.string.specie_descrizione_trota_iridea),
    new SpeciePesce(4,"Trota marmorata", R.drawable.specie_trota_marmorata, R.string.specie_descrizione_trota_marmorata),
    new SpeciePesce(15,"Trota lacustre", R.drawable.specie_trota_lacustre, R.string.specie_descrizione_trota_lacustre),
    new SpeciePesce(195,"Salmerino alpino", R.drawable.specie_salmerino_alpino, R.string.specie_descrizione_salmerino_alpino),
    new SpeciePesce(18,"Salmerino di fonte", R.drawable.specie_salmerino_fonte, R.string.specie_descrizione_salmerino_fonte),
    new SpeciePesce(19,"Carpa", R.drawable.specie_carpa, R.string.specie_descrizione_carpa),
    new SpeciePesce(20,"Tinca", R.drawable.specie_tinca, R.string.specie_descrizione_tinca),
    new SpeciePesce(16,"Temolo", R.drawable.specie_temolo, R.string.specie_descrizione_temolo),
    new SpeciePesce(22,"Persico reale", R.drawable.specie_persico_reale, R.string.specie_descrizione_persico_reale),
    new SpeciePesce(21,"Lucio", R.drawable.specie_lucio, R.string.specie_descrizione_lucio)
});


public static Integer getPosition(Integer id){
    Integer pos=  -1;
    if(195==195){
        Log.d("INT==","195==195  ?? OK");

    }
    if(id==195){
        Log.d("INT==","ID==195  ?? OK");

    }
    for (int i = 0; i < specie.length; i++) {
        if(specie[i].getId()==195){
            Log.d("INT==","getID==195  ?? OK");

        }
        Log.d("INT==",""+specie[i].getId()+"=="+id);
        if (specie[i].getId()==id ) {
                Log.d("INT==","OK");
                pos = i;
                break;
        }
    }
    return pos;
}
}

和另一个class

public class SpeciePesce {
private Integer id;
private String title;
private Integer resourceImage;
private Integer resourceDescription;

public SpeciePesce(Integer id, String title, Integer resourceImage, Integer resourceDescription) {
    this.id = id;
    this.title = title;
    this.resourceImage = resourceImage;
    this.resourceDescription = resourceDescription;
}

public Integer getId() {
    return id;
}

public void setId(Integer id) {
    this.id = id;
}

public String getTitle() {
    return title;
}

public void setTitle(String title) {
    this.title = title;
}

public Integer getResourceImage() {
    return resourceImage;
}

public void setResourceImage(Integer resourceImage) {
    this.resourceImage = resourceImage;
}

public Integer getResourceDescription() {
    return resourceDescription;
}

public void setResourceDescription(Integer resourceDescription) {
    this.resourceDescription = resourceDescription;
}
}

当我调用方法 getPosition(X) 时,假设我收到了具有此类 ID 的项目在数组中的位置;到这里它很简单,它适用于除 195 以外的所有 ID。当它比较 195==195 时,它给了我 false.. 什么可以是??

我确实记录了各种情况..这里是结果

05-23 14:30:28.665      560-560/com.evosw.altosarca D/INT==﹕ 195==195  ?? OK
05-23 14:30:28.665      560-560/com.evosw.altosarca D/INT==﹕ ID==195  ?? OK
05-23 14:30:28.665      560-560/com.evosw.altosarca D/INT==﹕ 13==195
05-23 14:30:28.665      560-560/com.evosw.altosarca D/INT==﹕ 14==195
05-23 14:30:28.665      560-560/com.evosw.altosarca D/INT==﹕ 4==195
05-23 14:30:28.665      560-560/com.evosw.altosarca D/INT==﹕ 15==195
05-23 14:30:28.665      560-560/com.evosw.altosarca D/INT==﹕ getID==195  ?? OK
05-23 14:30:28.665      560-560/com.evosw.altosarca D/INT==﹕ 195==195  << suppose the loop stop here
05-23 14:30:28.665      560-560/com.evosw.altosarca D/INT==﹕ 18==195
05-23 14:30:28.665      560-560/com.evosw.altosarca D/INT==﹕ 19==195
05-23 14:30:28.665      560-560/com.evosw.altosarca D/INT==﹕ 20==195
05-23 14:30:28.665      560-560/com.evosw.altosarca D/INT==﹕ 16==195
05-23 14:30:28.665      560-560/com.evosw.altosarca D/INT==﹕ 22==195
05-23 14:30:28.665      560-560/com.evosw.altosarca D/INT==﹕ 21==195

这是一个有效的例子

05-23 14:35:30.068    3153-3153/com.evosw.altosarca D/INT==﹕ 195==195  ?? OK
05-23 14:35:30.068    3153-3153/com.evosw.altosarca D/INT==﹕ 13==13
05-23 14:35:30.068    3153-3153/com.evosw.altosarca D/INT==﹕ OK
05-23 14:35:30.103    3153-3153/com.evosw.altosarca D/INT==﹕ 195==195  ?? OK
05-23 14:35:30.103    3153-3153/com.evosw.altosarca D/INT==﹕ 13==13
05-23 14:35:30.103    3153-3153/com.evosw.altosarca D/INT==﹕ OK
05-23 14:35:30.103    3153-3153/com.evosw.altosarca D/INT==﹕ 195==195  ?? OK
05-23 14:35:30.103    3153-3153/com.evosw.altosarca D/INT==﹕ 13==13
05-23 14:35:30.103    3153-3153/com.evosw.altosarca D/INT==﹕ OK

可以是什么? :S

这是因为您没有使用原始 int 类型。您正在使用引用 Integer 类型。你的 getPosition() 方法 returns Integer.

在使用 == 运算符比较两个引用时,它实际上是在比较它的引用而不是它的值。如果您想检查两个对象是否有意义相等,请改用 equals()

但请注意,如果您比较的两个 Integer 都小于 128,则比较应该 returns 为真。
注:

    Integer a = 101;
    Integer b = 101;
    Integer c = 1234;
    Integer d = 1234;
    Integer e = a;


    System.out.println(a==b); //true - same reference; for explanation read the attached link
    System.out.println(a==e); //true - same reference; 'e' referencing 'a'
    System.out.println(c==d); //false - diffrent reference
    System.out.println(c.equals(d)); //true - meaningfully equals 

您可以阅读answer了解更多详情。