出自《java puzzle》
作为一项热身活动,我们来测试一下你对BigInteger的了解程度。下面这个程序将打印出什么呢?
import java.math.BigInteger;
public class BigProblem {
public static void main(String[ ] args) {
BigInteger fiveThousand = new BigInteger("5000");
BigInteger fiftyThousand = new BigInteger("50000");
BigInteger fiveHundredThousand = new BigInteger("500000");
BigInteger total = BigInteger.ZERO;
total.add(fiveThousand);
total.add(fiftyThousand);
total.add(fiveHundredThousand);
System.out.println(total);
}
}
你可能会认为这个程序会打印出555000。毕竟,它将total设置为用BigInteger表示的0,然后将5,000、50,000和500,000加到了这个变量上。如果你运行该程序,你就会发现它打印的不是555000,而是0。很明显,所有这些加法对total没有产生任何影响。
对此有一个很好理由可以解释:BigInteger实例是不可变的。String、BigDecimal以及包装器类型:Integer、Long、Short、Byte、Character、Boolean、Float和Double也是如此,你不能修改它们的值。我们不能修改现有实例的值,对这些类型的操作将返回新的实例。起先,不可变类型看起来可能很不自然,但是它们具有很多胜过与其向对应的可变类型的优势。不可变类型更容易设计、实现和使用;它们出错的可能性更小,并且更加安全[EJ Item 13]。
为了在一个包含对不可变对象引用的变量上执行计算,我们需要将计算的结果赋值给该变量。这样做就会产生下面的程序,它将打印出我们所期望的555000:
import java.math.BigInteger;
public class BigProblem {
public static void main(String[] args) {
BigInteger fiveThousand = new BigInteger("5000");
BigInteger fiftyThousand = new BigInteger("50000");
BigInteger fiveHundredThousand = new BigInteger("500000");
BigInteger total = BigInteger.ZERO;
total = total.add(fiveThousand);
total = total.add(fiftyThousand);
total = total.add(fiveHundredThousand);
System.out.println(total);
}
}
本谜题的教训是:不要被误导,认为不可变类型是可变的。这是一个在刚入门的Java程序员中很常见的错误。公正地说,Java不可变类型的某些方法名促使我们走上了歧途。像add、subtract和negate之类的名字似乎是在暗示这些方法将修改它们所调用的实例。也许plus、minus和negation才是更好的名字。
对API设计来说,其教训是:在命名不可变类型的方法时,应该优选介词和名词,而不是动词。介词适用于带有参数的方法,而名词适用于不带参数的方法。对语言设计者而言,其教训与谜题2相同,那就是应该考虑对操作符重载提供有限的支持,这样算数操作符就可以作用于诸如BigInteger这样的数值型的引用类型。由此,即使是初学者也不会认为计算表达式total + fiveThousand将会对total的值产生任何影响。
分享到:
相关推荐
Vue技术七大问题避坑指南+编程技术开发+编程问题+编程案例Vue技术七大问题避坑指南+编程技术开发+编程问题+编程案例Vue技术七大问题避坑指南+编程技术开发+编程问题+编程案例Vue技术七大问题避坑指南+编程技术开发+...
非线性极小极大问题的分数阶粒子群算法 摘要:本文提出了一种解决非线性极小极大问题的新算法,结合分数阶粒子群算法和极大熵函数法。该算法首先利用极大熵函数法将目标函数转化成可微函数,然后利用分数阶粒子群...
本文主要探讨了一类非线性极小极大问题的求解方法,采用改进的粒子群优化算法结合极大熵函数法提出了一种新的有效算法。针对目标函数不光滑的特点,通过极大熵函数将无约束和有约束的极小极大问题转化为光滑函数的无...
六起特大矿难暴露煤矿安全五大问题.doc
选择财务软件需要注意六大问题.pdf
AI与机器人的42个大问题.pdf
AI与机器人的42个大问题91页(1).zip
徐小平解答创业团队比较关心的9大问题(DOC7页).docx
腾讯 AI Lab:42个 AI 与机器人大问题(105页).pdf
HSBC-亚太地区-互联网行业-亚洲互联网业ESG的10大问题-2020.7.27-45页.pdf
0/1背包问题解决方案
总之,分治法是解决大整数乘法问题的一种有效策略,通过将大问题分解为多个小问题,进而通过小问题的解决方案来构建大问题的解答。这种思维方式在处理复杂问题时具有很大的价值,是计算机科学中不可或缺的一部分。
第一大问题:高级别自动驾驶汽车技术开发难度超出预期。高级别自动驾驶涉及的技术复杂,其中关键部件如AI芯片、集成电路、激光雷达等尚处于研发初级阶段。例如,L4级以上车载芯片主要由国际大厂如英特尔等提供,而...
问题描述 图G=(V,E)的一个团是图G的一个完全子图,即该子图中任意两个相异的顶点都有一条边相连。最大团问题就是要找出图G中顶点数最多的一个团。 基本要求 (1) 用回溯法来求解最大团问题。 (2) 用分支限界法来...
分治法是一种解决问题的策略,它将大问题分解为小问题,然后逐个解决小问题以得到最终答案。在这个例子中,我们定义了一个名为`maxVale`的函数,它接受数组的起始索引`low`、结束索引`high`以及整数数组`array`作为...
城市旅行商问题(Traveling Salesman Problem,简称TSP)是一个经典的组合优化问题,它询问一个旅行商如何访问n个城市,每个城市仅访问一次,并返回起点,使得总旅行距离最短。这个问题是NP完全问题,没有已知的...
这种策略特别适用于可以分解为独立子问题的大问题。分治策略的一个典型应用是快速排序算法,其中数组被分解为两个子数组,每个子数组被独立排序,然后再合并成一个有序数组。 ### 分析设计策略示例 #### 递归算法...
《八数码问题C++源代码解析》 八数码问题,又称滑动拼图或15拼图,是人工智能领域中的一个经典问题,它基于九宫格的布局,目标是通过有限次的移动操作将打乱的数字方块恢复到初始的有序状态。在这个问题中,每个...
FFT算法的核心思想是分治策略,它将大问题分解为小问题,然后通过合并解来求解原问题。在FFT中,这种分治是通过递归地将序列分为偶数项和奇数项来实现的,然后对子序列进行DFT,最后再通过特定的组合公式得到完整...