出自《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技术七大问题避坑指南+编程技术开发+...
3、数据传输过程中面临的3大问题包括数据生命周期安全问题,基础设施安全问题,以及( ) A、 数据加密问题 B、 个人隐私安全问题 C、 信息通道问题 D、 传输协议问题 答案: B 4、大数据具有的4V特点是大量、...
当前中国汽车出口存在三大问题。当前中国汽车出口存在三大问题。当前中国汽车出口存在三大问题。当前中国汽车出口存在三大问题。当前中国汽车出口存在三大问题。
锐捷交换机的堆叠,一个大问题
奥氮平使用八大问题汇总.doc
知识:人才盘点最常见的9大问题
AI与机器人的42个大问题.pdf
局域网六大问题,解决方法····································
参考资料-年度目标制定与管理的20大问题.zip
AI与机器人的42个大问题91页(1).zip
寿险意义人生五大问题培训教程PPT45页PPT.ppt
腾讯 AI Lab:42个 AI 与机器人大问题(105页).pdf
全球股票策略:通胀:一个大问题2021.1.29(46页).pdf
问题主要出现在项目中需要上传视频文件,超过500M,但是报错了。 原因是tomcat限制了大小,此问题解决springBoot框架下tomcat启动 模式的文件上传大小限制。
总之,分治法是解决大整数乘法问题的一种有效策略,通过将大问题分解为多个小问题,进而通过小问题的解决方案来构建大问题的解答。这种思维方式在处理复杂问题时具有很大的价值,是计算机科学中不可或缺的一部分。
分治算法的基本思想是将一个复杂的问题分解成两个或更多的相同或相似的子问题,直到最后子问题可以简单地直接求解,原问题的解即子问题的解的合并。 本篇内容旨在通过一个具体的实例——从键盘输入一组整数,并利用...
城市旅行商问题(Traveling Salesman Problem,简称TSP)是一个经典的组合优化问题,它询问一个旅行商如何访问n个城市,每个城市仅访问一次,并返回起点,使得总旅行距离最短。这个问题是NP完全问题,没有已知的...
在计算机科学中,分治算法是一种重要的解决问题的策略,它将一个大问题分解为若干个相同或相似的小问题,然后分别解决这些小问题,最后再将这些小问题的解组合成原问题的解。这种算法通常应用于数据结构、排序、搜索...