/*
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
--------------------
*/

解决方案 »

  1.   

    >=和<=的时候变成int进行计算。
      

  2.   

    java puzzler这本书里有个比较有趣的例子
    Integer i1=new Integer(0);
    Integer i2=new Integer(0);
    while(i1<=i2&&i1>=i2&&i1!=i2){
    //死循环
    }
    就是说这个问题的。
      

  3.   

    Integer i1 = new Integer(1000);
    Integer i2 = new Integer(1000);if(i1==i2){
      System.out.println("i1==i2");
    }---------------------------------
    这里"=="不是作为一个运算符号,它比较的是两个对象的引用是不是指向同一个对象,很明显,i1和i2是两个对象,所以为false
    当">="或其他运算符号的时候,它比较的是两个值的大小,问题就出来了,i1和i2指向的不是对象吗?这里就得提到自动包装和自动拆箱机制,当遇到运算值类型,而比较的是对象时...这里它就会自动拆箱,把它作为值来运算...自动包装和拆箱,是java5.0添加的特性...你可以去参考一下这方面的书籍,可能我这里不是说的很清楚,没有书上说的怎么规范...
      

  4.   

    JAVA中只有8种基本类型可以用==比较值是不是相等,即int byte char float long double short boolean
    一旦两个对象的比较用了==,就不是比较其值,或者说属性了,==会比较两者的地址,一般是随机的,没有规律
    对象的比较应该用Object类的equals方法,你也可以重写自己的equals方法来比较,
      

  5.   

    我是不是可以这样理解如果 == 作用于 对象,则是表示这两个对象是否引用同一个对象,相信大家都明白
    关键是>= ,当>= 作用于两个对象时,是不是这两个对象会自动转化为基本数据类型
      

  6.   


    装箱,拆箱
    我觉的这位老兄说的没错
    不过好像在JAVA里没提到过装箱,拆箱
    只在C#里介绍过这个概念
    就是基本类型和其外覆类的相互转化
    即:Integer是对int的装箱
         需要int时,你给它一个Integer,会自动拆箱
         需要Integer时,你给他一个int,会自动装箱
      

  7.   

    在自动装箱时,值如在-128到127之间的时候,会存在内存中被重用。而大于这个范围的值在装箱的时候就被新建成一个Integer对象了。
    你的1000不在这个范围自然不等了。
    但是可以这样比较
    i1.equals(i2)
      

  8.   

    既然是类,就用compareTo比较保险
      

  9.   

    LZ去看下equals == hascode方法
      

  10.   


    1) ==是比较内存地址, i1==i2为假是因为内存地址不一样,Integer由于有个缓存,如果是-128到127范围内的话做==比较是true
    2) >=和<=是比较值大小,jdk4以后的版本都有利用自动拆箱的功能实现的,比如上述i1 <= i2、i1>=i2其实会拆箱为1000<=1000、1000>=1000