今天偶然发现了一个有趣小问题
Integer a=new Integer(3);
int b=a;
System.out.println(a==b);//true
//==============================
Integer a=new Integer(3);
int b=3;
System.out.println(a==b);//也是true
a是引用 b是变量 但是结果却是true,我就像是不是引用a里直接存的是3而不Integer对象的地址呢?
然后我就又做了一个测试验证我的想法:
Integer a=new Integer(3);
Integer b=new Integer(3);
int c=3;
如果我的想法成立的话那么,下面的结果都应该是true才对,但是呢结果却出乎我的意料
System.out.println(a==c);//true
System.out.println(a==c);//true
System.out.println(a==b);//false
a==c; b==c 而a!=b很诡异啊
后来我又想如果我开始的想法是错误的,a,b还是分别都指向了一个不同的对象,但是a==c;和b==c结果却是true
那么是什么原因导致的呢?
我想来想去只有一种可能才会产生这种结果,
就是在用==比较基本类型和其包装类的时候==运算符被重载了 它比较的是基本类型变量的值和包装类对象的值 而不是基本类型变量和包装类引用的值
这就是我的发现和一些想法 ,,希望大家也都说出自己的想法,一起学习!!!
Integer a=new Integer(3);
int b=a;
System.out.println(a==b);//true
//==============================
Integer a=new Integer(3);
int b=3;
System.out.println(a==b);//也是true
a是引用 b是变量 但是结果却是true,我就像是不是引用a里直接存的是3而不Integer对象的地址呢?
然后我就又做了一个测试验证我的想法:
Integer a=new Integer(3);
Integer b=new Integer(3);
int c=3;
如果我的想法成立的话那么,下面的结果都应该是true才对,但是呢结果却出乎我的意料
System.out.println(a==c);//true
System.out.println(a==c);//true
System.out.println(a==b);//false
a==c; b==c 而a!=b很诡异啊
后来我又想如果我开始的想法是错误的,a,b还是分别都指向了一个不同的对象,但是a==c;和b==c结果却是true
那么是什么原因导致的呢?
我想来想去只有一种可能才会产生这种结果,
就是在用==比较基本类型和其包装类的时候==运算符被重载了 它比较的是基本类型变量的值和包装类对象的值 而不是基本类型变量和包装类引用的值
这就是我的发现和一些想法 ,,希望大家也都说出自己的想法,一起学习!!!
http://blog.csdn.net/ZangXT/archive/2008/11/19/3334030.aspx
可以看看。
我测试了一下 用的333但是还是会相等
Integer a=new Integer(333);
Integer b=new Integer(333);
int c=333;
System.out.println(a==c);//true
System.out.println(b==c);//true
System.out.println(a==b);//false
你换成1000在看看// Integer a = 100;
// Integer b = 100;
//
// Integer c = 1000;
// Integer d =1000;
// if(a==b)
// System.out.println("oh yes");
// else
// System.out.println("oh no");
//
// if(c==d)
// System.out.println("oh yes");
// else
// System.out.println("oh no");
运行下 你就知道了
Integer a=new Integer(3);
Integer b=new Integer(3);
int c=3; int是一个基本数据类型是放在栈里边的,对象只会新建一个引用指向这个基本数据类型的地址,而不会分配内存来存储地址
System.out.println(a==c);//true 直接在栈中找3这个基本数据类型不会再分配内存地址,找到了后直接包装成Integer对象,也就是新建了一个引用指向这个3,a是new出来的堆中已经有一个3的引用了当然地址与int c=3所包装出来的Integer的地址相同,当然比较的结果为true。提示一句==比较对于基本数据类型来说比较的是值,而引用数据类型(对象类型、复杂数据类型)比较的是地址,因为这些类型由JVM分配的空间里面实际上保存的是地址。
System.out.println(a==c);//true 同上
System.out.println(a==b);//false 然而b是new出来的所以这个为什么等于false了该明白了吧!
Integer a = new Integer(10000);
Integer b = new Integer(10000);
int c = 10000;//只要是int都会去常量池里面找的。
System.out.println(a == c);// true
System.out.println(b == c);// true
System.out.println(a == b);// false楼主肯定没明白的地方是只有Integer(-128~~127)才缓存,而且只要是int不管多大都会缓存的。
Integer a = 3;
Integer b = 3;
int c = 3; System.out.println(a == c);// true
System.out.println(a == c);// true
System.out.println(a == b);// true
} public static void test2() {
Integer a = 3333;
Integer b = 3333;
int c = 3333; System.out.println(a == c);// true
System.out.println(a == c);// true
System.out.println(a == b);// false
}这个才是你测试的例子。 你的那个 a和 c比较,其实是int的比较,不是Integer的比较
明白了,原来我一直都没弄明白4楼和其他人的意思,,一直用new Integer()试验。自己把自己绕进去了,哈哈。谢谢25楼 ,我像这次应该不会理解错了,稍后我再发个帖子写一下,我理解的自动装箱与拆箱。希望大家取看一下,给点建议。