字符串类和其他包装类的 valueOf() 方法


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

上面的 print 语句打印 false,当分别使用 IntegerLongvalueOf()方法时,原因非常清楚两个对象(IntegerLong (具有不同的类型,因此它们不相等。

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

System.out.println( String.valueOf(1).equals(String.valueOf(1l)) );  // true

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

答案是关于Integer#equals的实现:

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

您不输入 if 语句,因为它们属于不同的类型

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

正如你所说,IntegerLong不同的类型,所以equals返回 false

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

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

很简单

,数字 1 的String表示形式相等,与您用于检索该值的内容无关。 valueOf 方法被重写以处理整数和长整型。

你的第一个实验和你的第二个实验根本没有可比性。

简单;无论数字 1 来自整数、长整型、字节还是其他什么,String.valueOf(1( -> "1"。所以你正在运行System.out.println("1".equals("1"((,这是真的。

这是因为在Java中有特定的后缀,用于long(1L(,float(1.4f(和double(-3.123d(。

没有任何后缀,例如 1234 它被假定为 int。例如,如果是 3.1234,则假定它是双精度。

后缀是大写还是小写并不重要。

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

结果为 true,因为 String.valueOf(1)String.valueOf(1l) 都会生成一个字符串,该字符串表示具有纯数字字符的数字。 例如:

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

最新更新