csdn原有一篇文章:
public class Test1 {
public static void main(String[] args) {
Integer i1 = 127;
Integer i2 = 127;
if (i1 == i2) {
System.out.println("i1==i2");
} else {
System.out.println("i1!=i2");
}
Integer i3 = 128;
Integer i4 = 128;
if (i3 == i4) {
System.out.println("i3==i4");
} else {
System.out.println("i3!=i4");
}
}
}
输出是:
i1==i2
i3!=i4 解释:
在用Integer比较的时候是会分两种情况的,当取值在-128~127之间时,是用原生数据类型,也就是int去作比较,除此之外都是用Integer,也就是比较它们的地址,所以才得出了以上的结果!现在:
public class Test {
private static void modify(Integer i){
i++;
}
public static void main(String[] args) {
Integer i1 = 100;
Integer i2 = 200;
modify(i1);
modify(i2);
System.out.println(i1);
System.out.println(i2);
}
}
输出:
100
200如果按照上面解释中的说法,是不是应该输出的是 100 201呢?
public class Test1 {
public static void main(String[] args) {
Integer i1 = 127;
Integer i2 = 127;
if (i1 == i2) {
System.out.println("i1==i2");
} else {
System.out.println("i1!=i2");
}
Integer i3 = 128;
Integer i4 = 128;
if (i3 == i4) {
System.out.println("i3==i4");
} else {
System.out.println("i3!=i4");
}
}
}
输出是:
i1==i2
i3!=i4 解释:
在用Integer比较的时候是会分两种情况的,当取值在-128~127之间时,是用原生数据类型,也就是int去作比较,除此之外都是用Integer,也就是比较它们的地址,所以才得出了以上的结果!现在:
public class Test {
private static void modify(Integer i){
i++;
}
public static void main(String[] args) {
Integer i1 = 100;
Integer i2 = 200;
modify(i1);
modify(i2);
System.out.println(i1);
System.out.println(i2);
}
}
输出:
100
200如果按照上面解释中的说法,是不是应该输出的是 100 201呢?
Integer b = new Integer(20);
System.out.println(a==b);
你这样做的时候, 如果是用基本类型相比, 那应该是相等的吧, 但结果是不等的. debug看地址也是不同的
因为Integer类是immutable的(不可变的),就如同String一样
在原帖里,有人也分析了jdk源码
http://topic.csdn.net/u/20090523/14/443E23D0-6266-4E7D-B4C3-0FBC94AAA23B.html
基本类型所对应的类,比如int所对应的Integer,它们在被传递的时候,虽然传递的是对象,但是在方法里对对象所做的改变,在此方法以外对对象不造成任何影响。
刚刚debug了一下 -128~127之间i1和i2的id和值都是一样的
大于这个区间后i1和i2的值一样 但id不一样 这个id应该是指在内存中的地址吧..
也就是说当Integer对象取值范围在-128~127之间时他们的值如果相等那地址也是一样的
不知道说得对不对