关于整数,字符串和双精度的Java

时间:2015-02-28 06:37:49

标签: java string int boolean

因此,我正在为周末的高中比赛练习,我无法弄清楚为什么这个问题会回来错误

String str = "12"; 
Integer num = new Integer(12); 
Double val = new Double(12.0); 
System.out.print(str.equals(num)); 
System.out.print(" " + num.equals(val)); 

3 个答案:

答案 0 :(得分:3)

如果您查看equalsString课程的Integer方法,您会看到原因:

<强> String.equals:

public boolean equals(Object anObject) {
    if (this == anObject) {
        return true;
    }
    if (anObject instanceof String) {
        String anotherString = (String)anObject;
        int n = count;
        if (n == anotherString.count) {
        char v1[] = value;
        char v2[] = anotherString.value;
        int i = offset;
        int j = anotherString.offset;
        while (n-- != 0) {
            if (v1[i++] != v2[j++])
            return false;
        }
        return true;
        }
    }
    return false;
    }

<强> Integer.equals:

public boolean equals(Object obj) {
if (obj instanceof Integer) {
    return value == ((Integer)obj).intValue();
}
return false;
}

如您所见,因为所有12"12"12.2都是instances of different classes,因此equals会返回false

答案 1 :(得分:2)

因为它们是具有相同值的不同类型"12"不等于12

即,"12"1212.0是3种不同的类型

答案 2 :(得分:0)

原因是因为你正在创建3个新对象,而Java是一种基于引用的语言,这3行:

String str = "12"; 
Integer num = new Integer(12); 
Double val = new Double(12.0);

所以你应该第一次理解,这就是你在这里创建3个新对象。

第二个是检查equals方法在每个类中的作用。 对于头等舱

System.out.print(str.equals(num)); 

在这一行中,你从String类调用equals方法,所以如果去检查String类中的方法,你会看到:

public boolean equals(Object anObject) {
        if (this == anObject) {
            return true;
        }
        if (anObject instanceof String) {
            String anotherString = (String) anObject;
            int n = value.length;
            if (n == anotherString.value.length) {
                char v1[] = value;
                char v2[] = anotherString.value;
                int i = 0;
                while (n-- != 0) {
                    if (v1[i] != v2[i])
                            return false;
                    i++;
                }
                return true;
            }
        }
        return false;
    }

所以你应该注意的第一件事是这个方法返回true的可能性只有两种: 第一个是,两个对象都指向相同的引用,这意味着你做这样的事情:

String str = "12";
String strb = str;

,第二个是作为引用传递的Object将是一个String类,永远不会发生。 因为在这一行:

System.out.print(str.equals(num)); 

您正在发送一个Integer作为参数。所以第二种情况永远不会发生。

对于下一个案例:

System.out.print(" " + num.equals(val)); 

你应该在Integer类中分析equals方法,你应该看到类似这样的东西:

 public boolean equals(Object obj) {
        if (obj instanceof Integer) {
            return value == ((Integer)obj).intValue();
        }
        return false;
    }

在这里,你看,这个方法检查返回true的可能性的唯一方法是,你发送一个Integer作为参数。(它表示来自Integer类的引用)。

我希望,这对你有帮助。 问候。