System.out.println( Integer.valueOf(1).equals(Long.valueOf(1)) ); // false
上面的 print 语句打印 false,当分别使用 Integer
和 Long
类valueOf()
方法时,原因非常清楚两个对象(Integer
和 Long
(具有不同的类型,因此它们不相等。
但是,如果将整数值 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在字符串表示中是相同的。
正如你所说,Integer
和Long
是不同的类型,所以equals
返回 false。
但是,当比较两个String
时,如果值相同(即相同(,则equals
返回 true。
Long
或Integer
转换为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"