黑马程序员技术交流社区

标题: 请教基本数据包装中==,!=和>,>=,<,<=所比较的区别。 [打印本页]

作者: 刘汉文    时间: 2013-12-29 00:43
标题: 请教基本数据包装中==,!=和>,>=,<,<=所比较的区别。
由一道无限循环题所引发的思考。
从例子上看出,显然前后比较的依据不同,才会产生最后的ture,
那么>,>=,<,<=比较的是对象的基本数据类型数值,而==,!=比较的是内存地址值。
那么求教下原理。

package mine;

public class Demo {

        public static void main(String[] args)
        {
                Integer i=new Integer(2);
                Integer j=new Integer(2);
               
//                while(i<=j && j<=i && i!=j )
//                {
//                        System.out.println("******");
//                }
               
                System.out.println(i==j);
                System.out.println(i.toString()==j.toString());
                System.out.println(i.hashCode()==j.hashCode());
                System.out.println(i.equals(j));
                System.out.println((i<=j ));
                System.out.println((i<=j && j<=i ));
                System.out.println((i<=j && j<=i && i!=j));

               
        }

}
作者: wyf880204    时间: 2013-12-29 01:49
分别打印
false是因为2个不同引用所以假
false比较字符串的方法错了 应该是equals
true 2在int范围内  是一个对象所以哈希值相等所以正确
true比较内容 所以正确
true拆箱 2<=2 正确
true 2>=正确
true也是正确的
作者: 刘汉文    时间: 2013-12-29 09:41
wyf880204 发表于 2013-12-29 01:49
分别打印
false是因为2个不同引用所以假
false比较字符串的方法错了 应该是equals

这都回答了些什么啊?
作者: 布鲁Go    时间: 2013-12-30 11:11
本帖最后由 布鲁Go 于 2013-12-30 11:19 编辑

说说我的理解。
从“==”符号入手。。
这个==符号是这样,当比较的东西是基本数据类型的时候,就比较内容,当比较的东西是引用数据类型的时候,就比较内存地址,所以,你可以看到i==j为false。
Integer.tosting()  方法返回的也是string  类型,不属于基本数据类型,所以,同理,比地址,false。
而Integer.hashcode()  返回的是int 类型,为基本数据类型。。所以,比内容。为true。
本来(i.equals(j))这个也应该是false的。但是因为integer复写 了从object那继承过来的equals 方法,改为比较内容,所以,也为true。
最后,至于> < >=  之类的,为什么比较的也是内容,我的理解是,他们都是比较运算符,但应该本身无法比较引用数据类型。举个例子,你不能说我大于你,或者石头大于萝卜,就算是地址应该也不能比较,牛栏山未必就大于石头坑,五岳山未必就大于黑风洞,这不科学。。。然后因为现在的版本又能拆箱,所以,自然就比较内容了。我觉得如果早期的版本,用>  之类的比是会报错的。  
至于!=号,我觉得还是可以比较对象的。boolean 值刚好和==相反嘛,毕竟,石头不一定大于萝卜,但石头还是一定不等于萝卜的,无论什么对象,应该都是具备是否一样的可比较性的。
恩,这样应该就解释了上面所有的现象了。不过都是自己的推测,感觉java的设计者应该在设计的时候是这么思考的。毕竟程序语言本身也是现实的一种抽象。

最后,我觉得这个东西的关键在于java 对于== 号和equals 的设定。
基本数据类型==号比内容,
引用数据类型==号比内存地址!
而equals只能比对象, 底层调用==号。

恩,有些啰嗦,不过都是自己的理解,不敢说一定正确,希望对你有用。





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2