平行世界中的你还是你吗?--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!
}
输出结果为:
true
true
false
传递性有问题。
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 : true
x y is float x = y : true
x 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
平行世界中的你还是你吗?--java中的==是否相等的更多相关文章
- java中replaceAll反斜杠\ or java中replaceAll 括号[
java中replaceAll反斜杠\ String s=new String("this is a \\"); s.replaceAll("\\",&qu ...
- python中print()函数的“,”与java中System.out.print()函数中的“+”
python中的print()函数和java中的System.out.print()函数都有着打印字符串的功能. python中: print("hello,world!") 输出 ...
- 【问题记录】MySQL中时间戳转日期格式和Java中时间戳转日期格式偶尔不一致
背景: MySQL的某个字段存放着一些时间戳格式的时间. 问题描述: Java程序将MySQL中的时间戳字段取出来,在Java程序中转成yyyy-MM-dd HH:mm:ss格式的时候,偶尔会出现转化 ...
- Java中的堆栈区别
在函数中定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中分配. 当在一段代码块定义一个变量时,Java就在栈中为这个变量分配内存空间,当超过变量的作用域后,Java会自动释放掉为该变量所分配 ...
- Java中有关Null的9件事
对于Java程序员来说,null是令人头痛的东西.时常会受到空指针异常 (NPE)的骚扰.连Java的发明者都承认这是他的一项巨大失误.Java为什么要保留null呢?null出现有一段时间了,并且我 ...
- Java中的访问控制权限
简介 Java中为什么要设计访问权限控制机制呢?主要作用有两点: (1)为了使用户不要触碰那些他们不该触碰的部分,这些部分对于类内部的操作时必要的,但是它并不属于客户端程序员所需接口的一部分. (2) ...
- 个人对Java中多态的一些简单理解
什么是多态 面向对象的三大特性:封装.继承.多态.从一定角度来看,封装和继承几乎都是为多态而准备的.这是我们最后一个概念,也是最重要的知识点. 多态的定义:指允许不同类的对象对同一消息做出响应.即同一 ...
- 转:在java中使用dom4j解析xml
JAVA 使用Dom4j 解析XML Java DOM4J Parser - Parse XML Document Dom4j下载及使用Dom4j读写XML简介 在java中使用dom4j解析xml ...
- Java中的抽象类
含有抽象方法的类,抽象方法即用abstract修饰的方法,即父类只知道其子类应该含有该方法,但无法知道子类如何实现这些方法 抽象类限制规定子类必须实现某些方法,但不关注实现细节 抽象类中可以包含普通方 ...
- Java中实现PHP中的urlencode与rawurlencode
php手册中对urlencode这样说明 在java中 URLEncoder做了这样注释 也就是说java中对星号"*"是不进行编码的 也就是说URLEncoder之后还是&quo ...
随机推荐
- python 36 进程池、线程池
目录 1. 死锁与递归锁 2. 信号量Semaphor 3. GIL全局解释器锁:(Cpython) 4. IO.计算密集型对比 4.1 计算密集型: 4.2 IO密集型 5. GIL与Lock锁的区 ...
- python 14 装饰器
目录 装饰器 1. 开放封闭原则 装饰器 1. 开放封闭原则 扩展是开放的,增加新的功能:修改源码(修改已经实现的功能)是封闭的. 在不改变源码及调用方式的前提下额外增加新的功能. # 版一: imp ...
- Leetcode之分治法专题-169. 求众数(Majority Element)
Leetcode之分治法专题-169. 求众数(Majority Element) 给定一个大小为 n 的数组,找到其中的众数.众数是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素. 你可以假设数组是 ...
- asp.net comp雷达图
<system.web> <httpHandlers> <add path="ChartImg.axd" verb="GET,HEAD,PO ...
- springboot-vue前后端分离session过期重新登录
springboot-vue前后端分离session过期重新登录 简单回顾cookie和session cookie和session都是回话管理的方式 Cookie cookie是浏览器端存储信息的一 ...
- set和push方法压入栈顶的值获取方法
向值栈里面放数据(储存的位置在root域里面) 向值栈放数据有多种方式,往往我们只用其中一种 1.set方法压栈 1)在Action中获取值栈对象,使用set()方法向值栈存放数据 ActionCon ...
- HDU 5984 题解 数学推导 期望
Let’s talking about something of eating a pocky. Here is a Decorer Pocky, with colorful decorative s ...
- NLP(十五) 聊天机器人
对话引擎 1.了解目标用户 2.理解用于沟通得语言 3.了解用户的意图 4.应答用户,并给出进一步线索 NLTK中的引擎 eliza,iesha,rude,suntsu,zen import nltk ...
- lightoj 1126 - Building Twin Towers(dp,递推)
题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1126 题解:一道基础的dp就是简单的递推可以设dp[height_left][ ...
- CODE[VS] 1294 全排列
1294 全排列 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 查看运行结果 题目描述 Description 给出一个n, 请输出n的所有全 ...