- 简介
- 实例和分析
一.简介
1."=="操作:
对于基本数据类型, 不包含基本数据类型的包装类型, 比较的是基本数据类型的值
对于对象, 比较的是两个对象在内存中的地址
2.equals(): 不处理数据转型
3.在含有算术运算时, 会进行自动拆箱操作
4.Java中Character\Byte\Short\Integer\Long\Boolean这5种包装类都实现常量池技术,
默认创建了数值[-128, 127]的相应类型的缓存数据
二.实例和分析
1.实例
public class IntegerTest {
public static void main(String[] args) {
Integer a = 1;
Integer b = 2;
Integer c = 3;
Integer d = 3;
Integer e = 321;
Integer f = 321;
Long g = 3L;
System.out.println(c == d);
System.out.println(e == f);
System.out.println(c == (a + b));
System.out.println(c.equals(a + b));
System.out.println(g == (a + b));
System.out.println(g.equals(a + b));
}
}
2.分析
c==d, true, 常量池缓存机制, 1个Integer对象
e==f, false, 超出常量池的缓存范围, 2个Integer对象
c==(a+b), true, 在含有算术运算时进行自动拆箱操作,
对a\b进行自动拆箱操作, 比较c(int)的值和a+b(int)的值, 对c进行自动拆箱操作
c.equals(a+b), true, 含有算术运算时会进行自动拆箱操作,
对a\b进行自动拆箱操作, 调用Integer的equals()方法, 对a+b结果进行自动装箱操作,
比较两个Integer对象的值
Integer的equals()方法:
public boolean equals(Object obj) {
if (obj instanceof Integer) {
return value == ((Integer)obj).intValue();
}
return false;
}
判断比较的对象是否是Integer, 如果是则强制转换成Integer, 然后比较它们的值,
如果类型不同直接返回false
g==(a+b), true, 含有算术运算时会进行自动拆箱操作,
对a\b进行自动拆箱操作, 比较g(long)的值和a+b(long)的值, 对g进行自动拆箱操作
g.equals(a+b), false, 含有算术运算时会进行自动拆箱操作,
对a\b进行自动拆箱操作, 调用Long的equals()方法, 对a+b结果进行自动装箱操作,
而a+b结果类型是Integer, 非Long类型
Long的equals()方法:
public boolean equals(Object obj) {
if (obj instanceof Long) {
return value == ((Long)obj).longValue();
}
return false;
}
判断比较的对象是否是Long, 如果是则强制转换成Long, 然后比较它们的值,
如果类型不同直接返回false