也许我在Java上工作了很长时间,但实际上并没有真正了解它的一些基础知识。
我确实知道==
用于对象引用相等,而.equals()
用于对象值相等。
Integers
:Integer x = 1, y = 1;
System.out.println(x == y); // true
为什么?由于使用了对象引用相等,因此它们都是不同的对象,因此应该为false。
getClass()
返回值:String s1 = "a", s2 = "b";
System.out.println(s1.getClass() == s2.getClass()); // true
为什么?同样如上,使用对象引用。两者都使用
getClass
将返回单独的Class对象。 我是否错过了某些东西,或者我的思维太厌倦了Java编码?
最佳答案
整数对象
Integer x = 1, y = 1;
System.out.println(x==y); // true, why?
发生这种情况的原因是,对于
byte
范围(-128至+127)中的值,java使用了缓存的Integer对象,该对象存储在Integer的内部类IntegerCache中。每次创建值在-128到+127之间的Integer对象时,都会返回相同的对象(而不是创建新对象)。相反,对于
byte
范围之外的值,比较为false
:Integer x = 999, y = 999;
System.out.println(x==y); // false
类对象
String s1 = "a", s2 = "b";
System.out.println(s1.getClass() == s2.getClass()); // true. Why?
这是正确的,因为两个对象的类都是
String
,并且每个JVM每个类对象只有一个副本(就像一个单例)。从每个String的getClass()
返回的类对象是相同的类对象(String.class
)。