String类和其他包装类的valueOf()方法

时间:2013-12-01 07:48:12

标签: java

System.out.println( Integer.valueOf(1).equals(Long.valueOf(1)) );   // false

在分别使用IntegerLongvalueOf()方法时,上面的print语句打印为false,原因很清楚两个对象(Integer和{{1 }})有不同的类型,所以它们不相等。

但是,如果将整数值1 长值1l 传递给字符串类的Long方法,我的print语句将打印为true

valueOf()

我无法理解它们之间的确切区别。
我需要解释。

6 个答案:

答案 0 :(得分:3)

答案是关于Integer#equals

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

您没有输入if语句,因为它们具有不同的类型

在第二个版本中,您获得true因为.. 1在字符串表示中是相同的。

答案 1 :(得分:1)

正如您所说,IntegerLong不同的类型,因此equals会返回 false

但是,在比较两个String时,如果值为相同(即),则equals会返回 true

LongIntegerString的转换由其代表的数字决定。 Integer 1和Long 1具有相同的数字,因此将两者都转换为String会得到相同的结果("1")。

答案 2 :(得分:1)

很简单,第一个的String表示是相同的,与用于检索该值的内容无关。重写valueOf方法以使用整数和长整数。

您的第一个实验和第二个实验完全没有可比性。

答案 3 :(得分:1)

简单;无论数字1是来自int,long,byte还是其他,String.valueOf(1) - > “1”。所以你正在运行System.out.println(“1”.equals(“1”)),这是真的。

答案 4 :(得分:1)

那是因为在Java中有特定的后缀,长(1L),浮点(1.4f)和双(-3.123d)..

没有任何后缀,例如1234它被认为是一个int。如果它的例如3.1234,则假定它是双倍的。

如果后缀是大写或小写,则无关紧要。

答案 5 :(得分:1)

Integer.valueOf(1).equals(Long.valueOf(1)) // false

是的,因为Integer.ValueOf(1)会产生Integer个实例而Integer.equals(Object)期望Object也是类型Integer

 String.valueOf(1).equals(String.valueOf(1l)) // true

结果是正确的,因为String.valueOf(1)String.valueOf(1l)都会产生一个字符串,表示一个带有普通字符数字的数字。例如:

String.valueOf(12335454654465421L); will result in "12335454654465421"