一、java中的数据类型”==“的含义:
8大基本数据类型:byte short char int long float double boolean 他们之间的比较应使用==,比较
的是他们的值。
复合数据类型(类):当他们用(==)进行比较的时候,比较的是他们在内存中的
存放地址。(除非是同一个new出来的对象,比较结果为true,否则位false)因为每次
new会新开辟内存空间。
eg:
int i=0;
Integer j = new Integer(0);
System.out.println(i==j);
System.out.println(j.equals(i));
本题是一个自动拆装箱的考题(自动拆装箱JDK需在1.5上)
1、基本型和基本型封装型进行“==”运算符的比较,基本型封装型将会自动拆箱变为基本型后再进行比较,因此Integer(0)会自动拆箱为int类型再进行比较,显然返回true;
2、两个Integer类型进行“==”比较,如果其值在-128至127,那么返回true,否则返回false, 这跟Integer.valueOf()的缓冲对象有关,这里不进行赘述。
3、两个基本型的封装型进行equals()比较,首先equals()会比较类型,如果类型相同,则继续比较值,如果值也相同,返回true
4、基本型封装类型调用equals(),但是参数是基本类型,这时候,先会进行自动装箱,基本型转换为其封装类型,再进行3中的比较。
eg:
int a=257;
Integer b=257;
Integer c=257;
Integer b2=57;
Integer c2=57;
System.out.println(a==b);
//System.out.println(a.equals(b)); 编译出错,基本型不能调用equals()
System.out.println(b.equals(257.0));
System.out.println(b==c);
System.out.println(b2==c2);
上面的代码的结果因此为 true, false, false, true;
二、equals()方法介绍:
Java中的所有的类都是继承与Object这个基类的,在Object类中定义了一个equals的方法,
这个方法的初始行为是比较对象的内存地址,但在一些类库当中这个方法被覆盖了,如String、Integer、Date
。这些类当中equals有其自身的实现,而不再是比较类在对内存的存放地址了。
故对于复合数据类型之间equals比较,在没有覆盖equals方法的情况下,他们之间比较的
是内存中存放位置的地址值,跟双等号结果相同。
三、String类的equals()方法
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
//判断是否为String类型的实例
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = value.length;
//判断属性值是否相等
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
可以看出String类中的覆盖了的equals()方法是比较两个字符串长度、内容。