int a= 1;
Integer b =new Integer(1);
Integer c =new Integer(255);
System.out.println(a==b);
System.out.println(b.equals(a));
System.out.println(c.equals(a));
== 比较两个字符串的内存地址是否相等;
equals比较两个字符串的内容是否相等。
//String中的equals方法
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
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;
}
//Object中的equals方法 其实就是等同于==
public boolean equals(Object obj) {
return (this == obj);
}
//integer中的equels方法
public boolean equals(Object obj) {
if (obj instanceof Integer) {
return value == ((Integer)obj).intValue();
}
return false;
}
在JDK1.5版本中引进字一个新特性,自动拆箱,与自动装箱。
具体点, 当 基本类型(int)与其封装对象(integer)比较时会将 int转化为一个Integer对象。其它调用equals方法比较,而不是直接比较引用。Integer作为int的封装类,可以自动装箱,自动解箱。在作为对象比较的时候是用Integer,对象的比较用"equals()"方法。
Integer使用了缓存数据,直接赋值的时候,Integer使得-128--127之间的数据都是从缓冲数据中进行取,所以所有的地址都是一致的,但是对于new出来的对象,地址都是不一致的。如果将 int a= 1; 改成 Integer a = 1; 那么结果又会变。
封装数据类型在JDK中都做过优化,Integer 从-128到127都是缓存起来的 所以 127以内的比较结果和127以外的比较结果是不一样的。
true,true,false