我感觉这问题被问的频率有点高, 那是因为考的知识点比较多
面试官:出个题:
Integer a = new Integer(5);
Integer b = new Integer(5);
System.out.println(a == b); // false
我:false,太简单了嘛。 == 比较的是两个对象的地址哦,你看:
它的作用是判断两个对象的地址是不是相等。即,判断两个对象是不是同一个对象:
-
基本数据类型==比较的是值
-
引用数据类型==比较的是内存地址
你要是:System.out.println(a.equals(b)); \\ false
面试官:那这个呢:
int a = 5;
Integer b = new Integer(5);
System.out.println(a == b); // true
我:你想考我装箱拆箱嘛?其实,b看到了对面那个哥们是基本类型,我也是基本类型包装的呀,我把衣服一脱,那么就是基本类型了,那就是上面的结论了。b拆箱即可。
装箱:自动将基本数据类型转换为包装器类型
拆箱:自动将包装器类型转换为基本数据类型
基本类型有:
- byte(1字节):Byte
- short(2字节):Short
- int(4字节):Integer
- long(8字节):Long
- float(4字节):Float
- double(8字节):Double
- char(2字节):Character
- boolean(未知):Boolean
在装箱的时候自动调用的是Integer的valueOf(int)方法。而在拆箱的时候自动调用的是Integer的intValue方法
valueOf:
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
intValue:
public int intValue() {
return value;
}
面试官:聊一下equals
我:equals是顶层父类Object的方法之一
// 你看,object默认调用的== , 你对象如果不重写,可能会发上重大事故
public boolean equals(Object obj) {
return (this == obj); // 比较对象的地址值
}
顺带说一下Object的hashcode方法
// Returns a hash code value for the object.
// 说白了,调用本地方法返回的就是该对象的地址值
public native int hashCode();
Equals的作用也是判断两个对象是否相等。但它一般有两种使用情况:
-
情况1:类没有覆盖 equals() 方法。则通过 equals() 比较该类的两个对象时,等价于通过
==
比较这两个对象。 -
情况2:类覆盖了 equals() 方法。一般,我们都覆盖 equals() 方法来比较两个对象的内容是否相等;若它们的内容相等,则返回 true (即,认为这两个对象相等)。
Integer a = new Integer(5);
Integer b = new Integer(5);
System.out.println(a.equals(b));
可以看一下Integer的equals方法:
// 重写了Object的equals的方法
public boolean equals(Object obj) {
if (obj instanceof Integer) {
// 比较value
return value == ((Integer)obj).intValue();
}
return false;
}
hashcode的例子:
public static void main(String[] args) {
Set<Integer> set = new HashSet<>();
set.add(1);
set.add(1);
System.out.println(set.toString());
}
解释: 在添加1的时候,先判断hashcode是否相同,如果相同,继续判断equals比较值,这样的好处是,如果hashcode相同就直接返回false了,减少了一次equals的判断,因为通常hashcode的值判断是否相等比较快,而equals相对于hashcode来讲慢一些。所以,如果不重写hashcode,我们看到object的hashcode是对象的内存值,那么set添加1判断的时候,hashcode永远不相等,那么就永远返回false,不管添加1,还是2,都是false。