平行世界中的你还是你吗?--java中的==是否相等

故事背景

  《宇宙追缉令》是黄毅瑜执导的动作科幻类电影,由哥伦比亚三星公司出品,戴尔里·林多、李连杰、杰森·斯坦森领衔主演。影片于2001年11月2日在美国上映。该片讲述了邪恶尤兰,为了成为宇宙最强的人,逐一消灭了一百二十三个宇宙其他空间的分身,并吸收他们的能量,最后剩下一个在洛杉矶当警察的正义尤兰与他展开一场生死决战的故事。

  在故事中,其他数个空间的分身,每杀掉一个自己,其其他分身的功力就会增长。感觉有点恐怖和惊奇,分身是自己还是别人?或者自己是自己吗?值得一看的电影。

数学世界

在数学中,不存在模糊的概念,等号(=)定义了一种真实的数之间的等价关系,满足自反性,传递性,对称性。

自反性:对于所有x,x = x。也就是说,每个值与其自身存在相等关系 。

传递性:如果x = y 并且y = z,那么x = z。

对称性:如果x = y,那么y = x。

java世界

java中存在==用来表示相等的关系,那么它满足自反性,传递性和对称性吗?能否提供一段程序来演示它是否违反了任意性质?

1.自反性的例子

    public static void main(String[] args) {
        int i=5;
        System.out.println("x is int x = x : "+(i==5));

        float f=Float.NaN;

        System.out.println("x is float nan x=x :"+(f==Float.NaN));

        double d=Double.NaN;

        System.out.println("x is double nan x=x :"+(d==Double.NaN));
    }

输出结果:

x is int x = x : true

x is float nan x=x :false

x is double nan x=x :false

从上面的实例来看,==不具有自反性

2.传递性

    public static void main(String[] args) {
        long x = Long.MAX_VALUE;
        double y = (double) Long.MAX_VALUE;
        long z = Long.MAX_VALUE - 1;
        System.out.println((x == y) + ""); // Imprecise!
        System.out.println((y == z) + ""); // Imprecise!
        System.out.println(x == z); // Precise!
    }

输出结果为:

truetruefalse

传递性有问题。

3.对称性

    public static void main(String[] args) {
        int i=5,j=5;
        System.out.println("x y is int x = y : "+(i==j));

        float f=0.53f,f1=0.53f;
        System.out.println("x y is float x = y : "+(f==f1));

        double d=0.3836,d1=0.3836;
        System.out.println("x y is double x = y : "+(d==d1));
    }

输出结果为:

x y is int x = y : truex y is float x = y : truex y is double x = y : true

总结:

总之,java中的==使用时要警惕到float 和double 类型的拓宽原始类型转换所造成的

损失。它们是悄无声息的,但却是致命的。它们会违反你的直觉,并且可以造成非常微妙的错误。

参考资料:

【1】https://baike.baidu.com/tashuo/browse/content?id=7a442b409e380dc8e1b3fb5f&fr=qingtian&lemmaId=69962

【2】java解惑

【3】https://baike.baidu.com/item/%E5%AE%87%E5%AE%99%E8%BF%BD%E7%BC%89%E4%BB%A4/6174641?fr=aladdin

原文地址:https://www.cnblogs.com/davidwang456/p/11615362.html

时间: 2024-08-30 10:38:28

平行世界中的你还是你吗?--java中的==是否相等的相关文章

把https网站中的安全证书导入到java中的cacerts证书库

今天进行tomcat迁服后,程序部告诉我https证书未导入,知道将https进行了导入操作,在这里记录一下 在nginx服务器下将证书的pki文件复制到tomcat服务器中 scp /usr/local/nginx/conf/serer.cer [email protected]:~/ 然后通过导入指令将证书导入到java中  keytool -import -alias cacerts -keystore /usr/java/jdk1.7.0_40/jre/lib/security/cace

python中print()函数的“,”与java中System.out.print()函数中的“+”

python中的print()函数和java中的System.out.print()函数都有着打印字符串的功能. python中: print("hello,world!") 输出结果为:hello,world! java中: System.out.print("hello,world!"); 输出结果为:hello,world! 我们可以看到,这两个函数的用法是一样的 print()函数还有这种用法: print("1+1=",1+1) 输出结

opengl中的Floatbuffer和IntBuffer与java中数据的存储方式不同的解决方法

android OpenGL ES的书中使用了下面代码: 1)创建三个顶点 private IntBuffer triggerBuffer = IntBuffer.wrap(new int[]{ 0,one,0,      -one,-one,0, one,-one,0, }); 2)然后使用triggerBuffer 画顶点 例如:gl.glVertexPointer(3, GL10.GL_FIXED, 0,triggerBuffer ); 经常会出现:Must use a native or

C++中的类型判断,其余java中的 instanceof 做比较

这是RTTI(运行阶段类型识别)的问题,c++有三个支持RTTI的元素: 1. dynamic_cast 操作符     如果可能的话,dynamic_cast操作符将使用一个指向基类的指针来生成一个指向派生类的指针:否则,该操作符返回空指针.这是最常用的 RTTI组件,它不能回答“指针指向的是哪类对象”这样的问题,但他能回答“是否可以安全地将对象的地址赋给特定类型的指针”这样的问题.如: class A{} class B: public A{} class C: public B{} 然后有

java中的null注意事件总结

对于Java程序员来说,null是令人头痛的东西.时常会受到空指针异常(NPE)的骚扰.连Java的发明者都承认这是他的一项巨大失误.Java为什么要保留null呢?null出现有一段时间了,并且我认为Java发明者知道null与它解决的问题相比带来了更多的麻烦,但是null仍然陪伴着Java. 我越发感到惊奇,因为java的设计原理是为了简化事情,那就是为什么没有浪费时间在指针.操作符重载.多继承实现的原因,null却与此正好相反.好吧,我真的不知道这个问题的答案,我知道的是不管null被Ja

转!!Java中关于Null的9个解释(Java Null详解)

对于Java程序员来说,null是令人头痛的东西.时常会受到空指针异常(NPE)的骚扰.连Java的发明者都承认这是他的一项巨大失误.Java为什么要保留null呢?null出现有一段时间了,并且我认为Java发明者知道null与它解决的问题相比带来了更多的麻烦,但是null仍然陪伴着Java. 我越发感到惊奇,因为java的设计原理是为了简化事情,那就是为什么没有浪费时间在指针.操作符重载.多继承实现的原因,null却与此正好相反.好吧,我真的不知道这个问题的答案,我知道的是不管null被Ja

转:在java中使用dom4j解析xml

在java中使用dom4j解析xml 虽然Java中已经有了Dom和Sax这两种标准解析方式 但其操作起来并不轻松,对于我这么一个初学者来说,其中部分代码是活生生的恶心 为此,伟大的第三方开发组开发出了Jdom和Dom4j等工具 鉴于目前的趋势,我们这里来讲讲Dom4j的基本用法,不涉及递归等复杂操作 Dom4j的用法很多,官网上的示例有那么点儿晦涩,这里就不写了 首先我们需要出创建一个xml文档,然后才能对其解析 xml文档: <?xml version="1.0" encod

浅谈Java中的补零扩展和补符号位扩展

今天,魏屌出了一道题,题目如下: 定义一个大头序的byte[]a={-1,-2,-3,-4},转换成short[]b.问b[0]和b[1]分别是多少? 乍一看,这题不难,无非就是移位操作,再进行组合.但是呢?对于用Java的童鞋来说,这里面有一个坑,稍不注意可能就踩进去了.在说之前,我先把代码和答案贴出来吧. 看到这里,可能有的童鞋比较奇怪,为啥要&0xff,这不相当于没变化吗?非也,不信我举个例子. 答案是-127和129.很奇怪不是吗?我想的明明都是-127啊!!! 解答这个问题之前,我们先

大话Java中的哈希(hash)结构(一)

o( ̄▽ ̄)d 小伙伴们在上网或者搞程序设计的时候,总是会听到关于“哈希(hash)”的一些东西.比如哈希算法.哈希表等等的名词,那么什么是hash呢? 一.相关概念 1.hash算法:一类特殊的算法(注意哦,hash算法并不是某个固定的算法,而是一类特殊功能算法的统称). 2.哈希表(hash table).哈希映射(hash map).哈希集合(hash set):一种基于hash算法的数据结构. 3.哈希函数:在hash算法中的核心函数. 4.map:译为“映射”,是一种从键(key)到值

Java中异常处理和设计(转)

在程序设计中,进行异常处理是非常关键和重要的一部分.一个程序的异常处理框架的好坏直接影响到整个项目的代码质量以及后期维护成本和难度.试想一下,如果一个项目从头到尾没有考虑过异常处理,当程序出错从哪里寻找出错的根源?但是如果一个项目异常处理设计地过多,又会严重影响到代码质量以及程序的性能.因此,如何高效简洁地设计异常处理是一门艺术,本文下面先讲述Java异常机制最基础的知识,然后给出在进行Java异常处理设计时的几个建议. 若有不正之处,请多多谅解和指正,不胜感激. 请尊重作者劳动成果,转载请标明