Java String类和其他包装器类的valueOf()方法
上面的print语句prints false,当分别使用Java String类和其他包装器类的valueOf()方法,java,Java,上面的print语句prints false,当分别使用Integer和Long类valueOf()方法时,原因很明显,这两个对象(Integer和Long)具有不同的类型,因此它们不相等 但是,如果将整数值1和长值1l传递给字符串类的valueOf()方法,则我的print语句将输出true System.out.println( Integer.valueOf(1).equals(Long.valueOf(1)) ); // false 我无法理解他们之间的确切区别 我需要对此进行解释
Integer
和Long
类valueOf()
方法时,原因很明显,这两个对象(Integer
和Long
)具有不同的类型,因此它们不相等
但是,如果将整数值1和长值1l传递给字符串类的valueOf()
方法,则我的print语句将输出true
System.out.println( Integer.valueOf(1).equals(Long.valueOf(1)) ); // false
我无法理解他们之间的确切区别我需要对此进行解释。正如您所说,
Integer
和Long
是不同的类型,因此equals
返回false
但是,当比较两个字符串时,如果值相同(即),等于
返回真
Long
或Integer
到String
的转换由其表示的数字决定Integer
1和Long
1具有相同的数字,因此将两者转换为String
会得到相同的结果(“1”
)。答案在于实现:
您不需要输入if
语句,因为它们的类型不同
在第二个版本中,您得到的是true
,因为。。1在字符串表示法中是相同的。很简单,数字1的字符串表示法与检索该值的方法无关。valueOf
方法被重写以处理整数和长整数
你的第一个实验和第二个实验根本不可比。简单;不管数字1是来自int、long、byte还是其他字符串,String.valueOf(1)->“1”。所以您运行的是System.out.println(“1”。等于(“1”)),这是正确的。这是因为在Java中有特定的后缀,用于long(1L)、float(1.4f)和double(-3.123d)
如果没有任何后缀,例如1234,则假定其为int。如果其为例如3.1234,则假定其为double
后缀是大写还是小写并不重要
public boolean equals(Object obj) {
if (obj instanceof Integer) {
return value == ((Integer)obj).intValue();
}
return false;
}
是的,因为Integer.ValueOf(1)
会产生一个Integer
实例,而Integer.equals(Object)
期望对象也是一个Integer
类型
Integer.valueOf(1).equals(Long.valueOf(1)) // false
结果是正确的,因为String.valueOf(1)
和String.valueOf(1l)
都会生成一个表示数字的字符串,该字符串用普通数字字符表示。例如:
String.valueOf(1).equals(String.valueOf(1l)) // true
阅读javadoc。两者都返回相同的字符串:“1”。“1”等于“1”。因为(int)1
和(long)1
的字符串表示形式相等。还有((int)1)==((long)1))
。
String.valueOf(1).equals(String.valueOf(1l)) // true
String.valueOf(12335454654465421L); will result in "12335454654465421"