请提供一个对i的声明,将下面的循环转变为一个无限循环:
while (i <= j && j <= i && i != j) {
}
噢,不,不要再给我看起来不可能的循环了!如果i <= j 并且 j <= i,i不是肯定等于j吗?这一属性对实数肯定有效。事实上,它是如此地重要,以至于它有这样的定义:实数上的≤关系是反对称的。Java的<=操作符在5.0版之前是反对称的,但是这从5.0版之后就不再是了。
直到5.0版之前,Java的数字比较操作符(<、<=、>和>=)要求它们的两个操作数都是原始数字类型的(byte、char、short、int、long、float和double)[JLS 15.20.1]。但是在5.0版中,规范作出了修改,新规范描述道:每一个操作数的类型必须可以转换成原始数字类型[JLS 15.20.1,5.1.8]。问题难就难在这里了。
在5.0版中,自动包装(autoboxing)和自动反包装(auto-unboxing)被添加到了Java语言中。如果你对它们并不了解,请查看:http://java.sun.com/j2se/5.0/docs/guide/language/autoboxing.html [Boxing]。<=操作符在原始数字类型集上仍然是反对称的,但是现在它还被应用到了被包装的数字类型上。(被包装的数字类型有:Byte、Character、Short、Integer、Long、Float和Double。)<=操作符在这些类型的操作数上不是反对称的,因为Java的判等操作符(==和!=)在作用于对象引用时,执行的是引用ID的比较,而不是值的比较。
让我们更具体一些,下面的声明赋予表达式(i <= j && j <= i && i != j)的值为true,从而将这个循环变成了一个无限循环:
Integer i = new Integer(0);
Integer j = new Integer(0);
前两个子表达式(i <= j 和j <= i)在i和j上执行解包转换[JLS 5.1.8],并且在数字上比较所产生的int数值。i和j都表示0,所以这两个子表达式都被计算为true。第三个子表达式(i != j)在对象引用i和j上执行标识比较,因为它们都初始化为一个新的Integer实例,因此,第三个子表达式同样也被计算为true,循环也就永远地环绕下去了。
你可能会感到奇怪,为什么语言规范没有修改为:当判等操作符作用于被包装的数字类型时,它们执行的是值比较。答案很简单:兼容性。当一种语言被广泛使用之后,以违反现有规范的方式去改变现有程序的行为是让人无法接受的。下面的程序过去总是保证可以打印false,因此它必须继续保持此特征:
public class ReferenceComparison {
public static void main(String[] args) {
System.out.println(
new Integer(0) == new Integer(0));
}
}
判等操作符在其两个操作数中只有一个是被包装的数字类型,而另一个是原始类型时,执行的确实是数值比较。因为这在5.0版之前是非法的,所有在这里没有任何兼容性的问题。让我们更具体一些,下面的程序在1.4版中是非法的,而在5.0版中将打印true:
public class ValueComparison {
public static void main(String[] args) {
System.out.println(
new Integer(0) == 0);
}
}
总之,当两个操作数都是被包装的数字类型时,数值比较操作符和判等操作符的行为存在着根本的差异:数值比较操作符执行的是值比较,而判等操作符执行的是引用标识的比较。
对语言设计者来说,如果判等操作符一直执行的都是数值比较(谜题13),那么生活可能就要简单得多、快乐得多。也许真正的教训应该是:语言设计者应该拥有高质量的水晶球,以预测语言的未来,并且做出相应的设计决策。严肃一点地讲,语言设计者应该考虑语言可能会如何演化,并且应该努力去最小化在演化之路上的各种制约影响。
分享到:
相关推荐
文章讨论的核心概念是“资源诅咒”,这是一种现象,其中自然资源丰富的地区往往经济发展缓慢甚至贫困。文章通过北京市密云区太师屯镇后八家庄村的实际案例,深入分析了这一现象的两个极端表现:自然资源的诅咒和政策...
在封闭经济环境中,资源诅咒并不明显,因为资源的开发和利用主要在内部循环,经济的多元化发展可能得到保障。但在开放经济中,情况就大不相同。当资源产品主要依赖出口,且加工度较低时,这种依赖性会导致经济结构...
在Python编程领域,矩阵代码动画是一种视觉效果,它模拟了电影《黑客帝国》中的经典画面,数字和字母如雨般倾泻而下,营造出一种科技感和神秘...对于喜欢挑战和创新的Python爱好者来说,这是一个极富趣味性的学习项目。
理解类加载机制有助于避免类冲突和循环依赖问题。 7. **性能优化**:虽然 Java 自带垃圾回收,但过度创建对象、不必要的同步、数据库连接管理不当等都会影响性能。了解 JVisualVM 工具进行性能分析,使用 Profiler ...
- 银行业正处在一个大分化时代的早期阶段,两种发展路径——良性循环和恶性循环,将决定银行的未来方向。 这份报告详尽地探讨了美国大型银行在2021年面临的机遇和挑战,以及它们如何在后疫情时代重塑战略,以适应...
这个项目以“42项诅咒”为名,暗示了42个具有挑战性的编程任务,旨在提升编程者对C语言的理解和应用能力。在深入探讨这个项目之前,我们先来了解一下C语言的基本知识。 C语言是一种强大的、结构化的编程语言,由...
Hillel的诅咒,这里指的是Hillel Wayne,一位知名的Python教育者,他通过一系列的教学资源,帮助初学者快速掌握Python编程。"start_py"系列就是他的教学成果之一,旨在为新手提供一个友好的入门平台。 Python的核心...
1. **基础语法**:变量声明(var, let, const)、数据类型(字符串、数字、布尔、数组、对象)、控制流(条件语句、循环)。 2. **函数**:定义函数、参数、返回值、函数表达式(匿名函数、箭头函数)。 3. **作用域...
2. **Java编程结构**:项目可能包含了控制流程语句,如if-else、for、while循环,以及switch-case结构,用于实现条件判断和迭代操作。同时,可能也使用了异常处理机制(try-catch-finally),以确保程序在遇到错误时...
谜题32:循环者的诅咒 谜题33:循环者遇到了狼人 谜题34:被计数击倒了 谜题35:一分钟又一分钟 Java谜题4——异常谜题 谜题36:优柔寡断 谜题37:极端不可思议 谜题38:不受欢迎的宾客 谜题39:您好,再见 ...
完整的曲目,长循环,短循环,介绍和变体包括(共443个音频文件)。 曲目列表: 主题: ⦁为了荣耀 ⦁ 主主题 ⦁冒险的呼唤 ⦁英雄时代 ⦁友谊 ⦁皇家卫队 战斗: ⦁国王瀑布 ⦁战斗 ⦁背叛 ⦁北方部落 ⦁艰苦的战斗...
在这个"groovy培训:完整的apache groovy开发人员诅咒"中,我们将深入探讨Groovy语言的核心概念和实际应用。 1. **Groovy语法的简洁性** Groovy的语法比Java更为简洁,它支持行内注释、闭包和缩进。例如,Groovy中...
文中并没有提及波兹曼的书名是对文化的诅咒,而是说在当前环境中,娱乐至上的观念对文化产生了诅咒般的影响,意味着文化可能失去其深度和严肃性。 (三)文章片段介绍了一种名为芦苇的植物,讲述了芦苇与竹子的生命...
新机制循环:玩循环卡时,它会在抽牌堆中随机排列,而不是被丢弃。 清洗:有一些特殊的可清洗诅咒,通常无法使用。 他们可以通过在战斗中达成某个目标,释放其隐藏力量来进行清洗。 请注意,只会针对当前战斗清除...
11. **资源诅咒理论**:资源丰富的国家经济发展水平较低可能是因为过度依赖资源出口,产业结构单一,当资源价格波动或枯竭时,经济受影响较大。 12. **有效辐射分布**:有效辐射通常由高纬度向低纬度逐渐减少,因此...
1. **遥感技术和地理信息系统**:在自然灾害监测中,遥感技术用于获取地理信息,如地形、植被覆盖、气象条件等,而地理信息系统则用于处理、分析和预测这些数据,帮助决策者制定防灾减灾策略。 2. **自然地理特征与...
他前往麒麟森林寻找解除诅咒的途径,途中见证了人类对自然资源的掠夺,如黑帽大人的铁工场破坏森林,与森林生物的冲突,以及白狼神与珊为代表的自然守护者的反抗。 电影中的幽灵公主珊,是一个复杂而引人深思的角色...
主人公阿席达卡因救族人而受诅咒,他认识到人类与动物之间的斗争本质上是生存权的争夺。铁镇的人类砍伐森林以求生存,但这一行为同时也威胁到了动物和森林的生存,预示着人类的自掘坟墓。 阿席达卡的矛盾在于他既...