System.out.println( Integer.valueOf(1).equals(Long.valueOf(1)) ); // false
在分别使用Integer
和Long
类valueOf()
方法时,上面的print语句打印为false,原因很清楚两个对象(Integer
和{{1 }})有不同的类型,所以它们不相等。
但是,如果将整数值1 和长值1l 传递给字符串类的Long
方法,我的print语句将打印为true
valueOf()
我无法理解它们之间的确切区别。
我需要解释。
答案 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)
正如您所说,Integer
和Long
是不同的类型,因此equals
会返回 false 。
但是,在比较两个String
时,如果值为相同(即),则equals
会返回 true 。
Long
或Integer
到String
的转换由其代表的数字决定。 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"