/*
2008年9月4日9:37:36
Integer类对象作用于 >= <= 的问题
*/class M
{
public static void main(String[] args)
{
Integer i1 = new Integer(1000);
Integer i2 = new Integer(1000);
if ( i1 == i2) //i1 == i2 为假
{
System.out.println("i1 == i2");
}
if ( i1 >= i2) //为什么i1 == i2 为假, 但 i1 >= i2 却为真? 是不是i1 >= i2表示i1对象的引用(也就是地址) 大于等于 i2对象的地址(也就是i2对象的地址),可如果是这样的话,那21行 i3 <= i4也应该为假啊? 但从输出结果来看,i3 <= i4 为真,这是为什么 请指教
{
System.out.println("i1 >= i2");
} Integer i3 = new Integer(1000);
Integer i4 = new Integer(1008);
if ( i3 <= i4) // 21行
{
System.out.println("i3 <= i4");
} }
}
/*
在JDK 1.6中的运行结果是:
--------------------
i1 >= i2
i1 <= i2
--------------------
*/
2008年9月4日9:37:36
Integer类对象作用于 >= <= 的问题
*/class M
{
public static void main(String[] args)
{
Integer i1 = new Integer(1000);
Integer i2 = new Integer(1000);
if ( i1 == i2) //i1 == i2 为假
{
System.out.println("i1 == i2");
}
if ( i1 >= i2) //为什么i1 == i2 为假, 但 i1 >= i2 却为真? 是不是i1 >= i2表示i1对象的引用(也就是地址) 大于等于 i2对象的地址(也就是i2对象的地址),可如果是这样的话,那21行 i3 <= i4也应该为假啊? 但从输出结果来看,i3 <= i4 为真,这是为什么 请指教
{
System.out.println("i1 >= i2");
} Integer i3 = new Integer(1000);
Integer i4 = new Integer(1008);
if ( i3 <= i4) // 21行
{
System.out.println("i3 <= i4");
} }
}
/*
在JDK 1.6中的运行结果是:
--------------------
i1 >= i2
i1 <= i2
--------------------
*/
Integer i1=new Integer(0);
Integer i2=new Integer(0);
while(i1<=i2&&i1>=i2&&i1!=i2){
//死循环
}
就是说这个问题的。
Integer i2 = new Integer(1000);if(i1==i2){
System.out.println("i1==i2");
}---------------------------------
这里"=="不是作为一个运算符号,它比较的是两个对象的引用是不是指向同一个对象,很明显,i1和i2是两个对象,所以为false
当">="或其他运算符号的时候,它比较的是两个值的大小,问题就出来了,i1和i2指向的不是对象吗?这里就得提到自动包装和自动拆箱机制,当遇到运算值类型,而比较的是对象时...这里它就会自动拆箱,把它作为值来运算...自动包装和拆箱,是java5.0添加的特性...你可以去参考一下这方面的书籍,可能我这里不是说的很清楚,没有书上说的怎么规范...
一旦两个对象的比较用了==,就不是比较其值,或者说属性了,==会比较两者的地址,一般是随机的,没有规律
对象的比较应该用Object类的equals方法,你也可以重写自己的equals方法来比较,
关键是>= ,当>= 作用于两个对象时,是不是这两个对象会自动转化为基本数据类型
装箱,拆箱
我觉的这位老兄说的没错
不过好像在JAVA里没提到过装箱,拆箱
只在C#里介绍过这个概念
就是基本类型和其外覆类的相互转化
即:Integer是对int的装箱
需要int时,你给它一个Integer,会自动拆箱
需要Integer时,你给他一个int,会自动装箱
你的1000不在这个范围自然不等了。
但是可以这样比较
i1.equals(i2)
1) ==是比较内存地址, i1==i2为假是因为内存地址不一样,Integer由于有个缓存,如果是-128到127范围内的话做==比较是true
2) >=和<=是比较值大小,jdk4以后的版本都有利用自动拆箱的功能实现的,比如上述i1 <= i2、i1>=i2其实会拆箱为1000<=1000、1000>=1000