java == 的问题

正怒月神 2019-06-13 05:57:48
由于我.net 用习惯了。
今天java中判断 Double习惯使用了==判断包装类型。
结果让我有点震惊。
谁来告诉我
两个包装类型
//a==b false,
但是一个包装类型,一个值类型
//a==d true
我本来觉得吧。==号会比较左右两边的类型,选择合适的判断方式。
那按照这样来说,>=和<=又不是按照==的方式去看两边变量类型了?
这里就留给大家讨论了
public class TestUnit implements ITest {

@Test
public void Test1()
{
Double a=1.0d;
Double b=2.0d;
Double c=1.0d;
double d=1.0d;

System.out.println("a>b "+(a>b)); //a>b false
System.out.println("a==b "+(a==b)); //a==b false
System.out.println("a<b "+(a<b)); //a<b true

System.out.println("a>=c "+(a>=c)); //a>=c true

System.out.println("a==d "+(a==d)); //a==d true
}
}
...全文
2558 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
巴顿.com 2019-06-24
  • 打赏
  • 举报
回复
装拆箱,jdk1.7
  • 打赏
  • 举报
回复
引用 12 楼 正怒月神的回复:
[quote=引用 11 楼 专注写bug 的回复:] [quote=引用 楼主 正怒月神 的回复:] 由于我.net 用习惯了。 今天java中判断 Double习惯使用了==判断包装类型。 结果让我有点震惊。 谁来告诉我 两个包装类型 //a==b false, 但是一个包装类型,一个值类型 //a==d true 我本来觉得吧。==号会比较左右两边的类型,选择合适的判断方式。 那按照这样来说,>=和<=又不是按照==的方式去看两边变量类型了? 这里就留给大家讨论了
public class TestUnit implements ITest {

    @Test
    public void Test1()
    {
        Double a=1.0d;
        Double b=2.0d;
        Double c=1.0d;
        double d=1.0d;

        System.out.println("a>b "+(a>b));       //a>b false
        System.out.println("a==b "+(a==b));     //a==b false
        System.out.println("a<b "+(a<b));       //a<b true

        System.out.println("a>=c "+(a>=c));     //a>=c true

        System.out.println("a==d "+(a==d));     //a==d true
    }
}
基本数据类型在java中,应该不算对象的说法,Double属于对象类(拆箱和装箱),==比较的是地址,a==d为什么会是true,那是因为自动拆箱造成的,常量池存在相同的数据,则会直接引用,并不会重新开辟新的存储堆内存空间[/quote] 其实他怎么判断的,看结果就能才出来了。 但我更在意的是,为何==不能对包装类型在优化一下。[/quote] 这你得去问高司令,真不知道为何
windward_ 2019-06-17
  • 打赏
  • 举报
回复
引用 5 楼 toward_south的回复:
float double 这些 是不能用 == 来进行比较的
普通类型可以的,包装类不行,包装类用==的话不会拆包,所以比较的是栈内存里指向的地址。
windward_ 2019-06-17
  • 打赏
  • 举报
回复
引用 1 楼 正怒月神的回复:
a==c也是 false,我不小心擦掉了
在Java中,==比较的是指向的地址,比较值的话用equals(),a和c用的是包装类,所以a和c是两个不同的对象。 举个例子:我的手机==你的手机,都是手机,但并不是指的同一个手机,所以结果是fals。 而 你的手机.equals(我的手机) 结果就是true 了,因为同样都是手机。 (例子很生硬哈哈哈)
正怒月神 2019-06-17
  • 打赏
  • 举报
回复
引用 24 楼 qq_39936465 的回复:
java 开始的时候就提倡开源精神,可以自己改,只不过现在的人都偷懒了直接使用别人的代码。当然咯,自己改也会造成通用性问题,现在甲骨文不想改你也没办法。不过任何软件都有自己的优缺点,完美无缺的软件是不存在的。所以不同的需求我们会使用不同的软件。
这点说的没错,现在挺多项目都是混合型编程。 使用多种框架,甚至多种语言的。
qq_39936465 2019-06-17
  • 打赏
  • 举报
回复
引用 23 楼 正怒月神 的回复:
对于这个结果,不用看源码,就能知道比较的是地址了。
其实,我比较纳闷的是,为什么不对==做优化处理。
我个人认为,值类型的包装类,是可以优化比较的。然后针对其他引用类型的比较可以保持原样。
这个在.net中实现了,感觉这么判断更加的贴近编程人员想要的结果。


java 开始的时候就提倡开源精神,可以自己改,只不过现在的人都偷懒了直接使用别人的代码。当然咯,自己改也会造成通用性问题,现在甲骨文不想改你也没办法。不过任何软件都有自己的优缺点,完美无缺的软件是不存在的。所以不同的需求我们会使用不同的软件。
正怒月神 2019-06-17
  • 打赏
  • 举报
回复
引用 16 楼 xiaohebian 的回复:
学习了,以后遇到类似的就知道了
引用 22 楼 weixin_44821980 的回复:
[quote=引用 5 楼 toward_south的回复:]float double 这些 是不能用 == 来进行比较的
普通类型可以的,包装类不行,包装类用==的话不会拆包,所以比较的是栈内存里指向的地址。[/quote] 对于这个结果,不用看源码,就能知道比较的是地址了。 其实,我比较纳闷的是,为什么不对==做优化处理。 我个人认为,值类型的包装类,是可以优化比较的。然后针对其他引用类型的比较可以保持原样。 这个在.net中实现了,感觉这么判断更加的贴近编程人员想要的结果。
郝一 2019-06-17
  • 打赏
  • 举报
回复

System.out.println("a==d "+(a==d)); //a==d true

System.out.println("a==d "+(a.equals(d))); //a.equal(d) true

专业收废品 2019-06-16
  • 打赏
  • 举报
回复
a是一点多,b是二点多,你猜呢
佘小码sl 2019-06-16
  • 打赏
  • 举报
回复
==在数据类型中不是属于运算符么?在非字符的时候是比较地址的吧,
勇敢牛牛_ 2019-06-15
  • 打赏
  • 举报
回复
看一下源码,断点调试一下就知道为什么了。
xiaohebian 2019-06-15
  • 打赏
  • 举报
回复
学习了,以后遇到类似的就知道了
正怒月神 2019-06-14
  • 打赏
  • 举报
回复
引用 11 楼 专注写bug 的回复:
[quote=引用 楼主 正怒月神 的回复:] 由于我.net 用习惯了。 今天java中判断 Double习惯使用了==判断包装类型。 结果让我有点震惊。 谁来告诉我 两个包装类型 //a==b false, 但是一个包装类型,一个值类型 //a==d true 我本来觉得吧。==号会比较左右两边的类型,选择合适的判断方式。 那按照这样来说,>=和<=又不是按照==的方式去看两边变量类型了? 这里就留给大家讨论了
public class TestUnit implements ITest {

    @Test
    public void Test1()
    {
        Double a=1.0d;
        Double b=2.0d;
        Double c=1.0d;
        double d=1.0d;

        System.out.println("a>b "+(a>b));       //a>b false
        System.out.println("a==b "+(a==b));     //a==b false
        System.out.println("a<b "+(a<b));       //a<b true

        System.out.println("a>=c "+(a>=c));     //a>=c true

        System.out.println("a==d "+(a==d));     //a==d true
    }
}
基本数据类型在java中,应该不算对象的说法,Double属于对象类(拆箱和装箱),==比较的是地址,a==d为什么会是true,那是因为自动拆箱造成的,常量池存在相同的数据,则会直接引用,并不会重新开辟新的存储堆内存空间[/quote] 其实他怎么判断的,看结果就能才出来了。 但我更在意的是,为何==不能对包装类型在优化一下。
专注写bug 2019-06-14
  • 打赏
  • 举报
回复
引用 楼主 正怒月神 的回复:
由于我.net 用习惯了。
今天java中判断 Double习惯使用了==判断包装类型。
结果让我有点震惊。
谁来告诉我
两个包装类型
//a==b false,
但是一个包装类型,一个值类型
//a==d true
我本来觉得吧。==号会比较左右两边的类型,选择合适的判断方式。
那按照这样来说,>=和<=又不是按照==的方式去看两边变量类型了?
这里就留给大家讨论了
public class TestUnit implements ITest {

@Test
public void Test1()
{
Double a=1.0d;
Double b=2.0d;
Double c=1.0d;
double d=1.0d;

System.out.println("a>b "+(a>b)); //a>b false
System.out.println("a==b "+(a==b)); //a==b false
System.out.println("a<b "+(a<b)); //a<b true

System.out.println("a>=c "+(a>=c)); //a>=c true

System.out.println("a==d "+(a==d)); //a==d true
}
}

基本数据类型在java中,应该不算对象的说法,Double属于对象类(拆箱和装箱),==比较的是地址,a==d为什么会是true,那是因为自动拆箱造成的,常量池存在相同的数据,则会直接引用,并不会重新开辟新的存储堆内存空间
EX_Hentai 2019-06-14
  • 打赏
  • 举报
回复
666 很厉害,跟着学习
正怒月神 2019-06-14
  • 打赏
  • 举报
回复
引用 8 楼 toward_south 的回复:
[quote=引用 7 楼 正怒月神 的回复:] [quote=引用 5 楼 toward_south 的回复:] float double 这些 是不能用 == 来进行比较的
值类型的float和double可以的,java中的包装类型不行[/quote] public static void main(String[] args) { double m = 2.21111111111111111111111111111111111111; double n = 2.211111111111111111111111111111111111111111; System.out.println(n == m); //true System.out.println(n > m); //false } float 和double 超过各自的精度的时候 == 比较就不正常了 [/quote] 这么长久会用bigdecmal了,不会用double了。。。。。
qq_39936465 2019-06-14
  • 打赏
  • 举报
回复
个人觉得==比较一直都是比较的是地址,只不过基本类型因为存放在栈内存,相同地址必定值相等。而包装类存放在堆内存,所以用==比较包装类无法比较出值是否相当。当包装类和基本类型比较时,包装类可以转换的都被转换为基本类型,等于2个基本类型的比较。
大隐藏于寺 2019-06-14
  • 打赏
  • 举报
回复
首先要明确Double属于引用类型,然后再有在Java SE 8《Java语言规范》的15.21.3章节硬性规定的.至于为什么不加入你说的特性,原因不清楚,java开发人员应该有自己的考虑.链接 http://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.21.3 原文如下: 15.21.3. Reference Equality Operators == and != If the operands of an equality operator are both of either reference type or the null type, then the operation is object equality. It is a compile-time error if it is impossible to convert the type of either operand to the type of the other by a casting conversion (§5.5). The run-time values of the two operands would necessarily be unequal (ignoring the case where both values are null). At run time, the result of == is true if the operand values are both null or both refer to the same object or array; otherwise, the result is false. The result of != is false if the operand values are both null or both refer to the same object or array; otherwise, the result is true. While == may be used to compare references of type String, such an equality test determines whether or not the two operands refer to the same String object. The result is false if the operands are distinct String objects, even if they contain the same sequence of characters (§3.10.5). The contents of two strings s and t can be tested for equality by the method invocation s.equals(t). 翻译过来: 如果判等操作符的操作数都是引用类型或空类型,那么该操作就是对象判等操作。 如果两个操作数中其中一个的类型不允许通过强制类型转换(第5.5节)而转换为另一个的类型,那么就是一个编译时错误。这两个操作数运行时的值将必须是不等的。 在运行时,如果操作数的值都是null,或者都引用相同的对象或数组,==的结果为true,否则,结果为false。如果操作数的值都是null,或者都引用相同的对象或数组,!=的结果为false,否则,结果为true。 虽然==可以用来比较string类型的引用,但是这种判等测试确定的是两个操作数引用的是否是同一个String对象。如果两个操作数是有区别的String独享,那么结果为false,即使它们包含相同的字符序列(第3.10.5节)。两个字符串s和t的内容可以通过方法调用s.equals(t)来测试它们是否相等。
maradona1984 2019-06-14
  • 打赏
  • 举报
回复
首先Double有常量池,==可能会相等,然后Double直接和double ==的话会自动拆箱,也可能相等
toward_south 2019-06-13
  • 打赏
  • 举报
回复
引用 7 楼 正怒月神 的回复:
[quote=引用 5 楼 toward_south 的回复:] float double 这些 是不能用 == 来进行比较的
值类型的float和double可以的,java中的包装类型不行[/quote] public static void main(String[] args) { double m = 2.21111111111111111111111111111111111111; double n = 2.211111111111111111111111111111111111111111; System.out.println(n == m); //true System.out.println(n > m); //false } float 和double 超过各自的精度的时候 == 比较就不正常了
加载更多回复(7)
【为什么学习Java?】 1.因为Java是全球排名第一的编程语言,Java工程师也是市场需求最大的软件工程师,选择Java,就是选择了高薪。2.Java语言常年霸占着三大市场:互联网和企业应用,这是Java EE的长期优势和市场地位;大数据平台,主要有Hadoop、Spark、Flink等,他们都是Java或Scala(一种运行于JVM的编程语言)开发的;Android移动平台。这意味着Java拥有最广泛的就业市场。【我将如何教你?】 本课程囊括了Java语言的基本知识点,可以在短时间内带领学生概览Java语言的全貌,先了解再深入,花最少量的钱,做最快的实验,看你是否对Java感兴趣,有信心。绝对是一门小白学习的必修课程!本课程分为三大模块: 初识篇:主要以Java的环境安装及基础语法为主要内容,帮助学员解决Java基础语法问题,并对Java做一定的介绍,为后续的进阶课程内容展开做好语言基础。进阶篇:带你玩转Java进阶必学的类库和各类API知识,搞清Java最重要的核心编程思想面向对象编程。扩展篇:本篇包含了JDBC、GUI、网络编程、多线程编程等Java高阶应用技巧和核心原理。【报名须知】课程采取录播模式,课程永久有效,可无限次观看课件、课程案例代码完全开放给你,你可以根据所学知识,自行修改、优化【如何开始学习?】PC端:报名成功后可以直接进入课程学习移动端:下载CSDN学院或CSDN

62,612

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧