喜欢java,但却很遗憾的发现它并不完美,虽然瑕不掩瑜,但有些问题在没发现之前总会埋下诸多隐患。
java中的基本类型float有着很严重的精度缺失问题,好在可以通过java.math.BigDecimal来弥补,但BigDecimal毕竟是一个类,有着对象的创建销毁等繁琐的事情,况且java中类本身没有destroy()方法,这就把一切对象的彻底销毁后内存的回收,变成了一个不可测的变数,纵使你调用了gc(),但此方法的执行时机却又是未知的;所以这就要求程序员要尽可能少的创建对象(当然这还与java本身的确非常消耗内存有关),当对象一旦不用,尽可能的置为null,否则当程序运行几次后就会发现内存占有率高居不下,甚至有导致死机可能。BigDecimal还有一点要引起注意的是,两个对象即使值确实相等,但它们相比较时也可能会引起不等的结果,举个例子如:BigDecimal testA = new BigDecimal(200)和BigDecimal testB = new BigDecimal(200.00),也许你认为testA.equals(testB)==true;但结果是false。然而testA.toString().equals(testB.toString())==true,这是因为testB.toString()的值为200,在进行类型转换时,它已把小数点后的两个零去掉了。但新问题是,有时你又会发现testA.toString().equals(testB.toString())==true并不是经常的成立(这个问题我还没有搞清楚,以后再补上来吧),不过,为false的情况我的确碰到过,所以为了解决这个问题,我通常的做法是将它们的小数点位数补起后再进行比较,这样是肯定不会出错了,如testA = testA.setScale(2,5);testB = testB.setScale(2,5);当然了你可以根据需要将小数点位数设多或设置少一点,setScale()中第一位数为设置的小数点位数,第二位是四舍五入的界值,你可以随意修改,如6,就是大于等于6是就进位。还有testA = testA.setScale(2,5)这种写法在用BigDecimal时将会一直出现,因为它必须要通过给自身返回值来替代已经存在的值,如果你这样写testA.add(new BigDecimal(0)),那你会发现你的结果并不是想象中的200,而是0。当然加减乘除都是一样的。至于刚才的比较为何不用testA.floatValue(),当然还是因为会造成精度丢失的缘故了,当然如果你的小数位数不超过5位的话,也是可以的,如果是超过5位,那就和第五位的值有关了(因为它仅保留五位小数),显示如果第五位大于等于五,即使第六位为零,也会在第五位上加一,否则后面的只会被截掉!
分享到:
相关推荐
在JDK 1.8版本中,`ConcurrentHashMap`中的`computeIfAbsent`方法存在一个潜在的死循环问题。这个bug主要出现在并发操作时,当`ConcurrentHashMap`需要进行扩容并且`computeIfAbsent`正在执行计算的过程中,可能会...
在本例中,我们讨论的是JDK的11.0.10版本,这是一个重要的中间版本,提供了一些关键的增强和修复。 JDK 11是Java的一个长期支持(LTS)版本,这意味着它将得到Oracle长达至少6年的技术支持,包括安全更新和性能优化...
Java JDK 1.8.0_25 是Oracle公司发布的Java开发工具包(Java Development Kit)的一个重要版本,主要用于Java程序的开发、编译和运行。这个版本在发布时是相对较新的,它包含了Java编译器(javac)、Java运行环境...
JDK 1.8.0_131是1.8版本的一个更新,它包含了bug修复、安全更新和性能改进。每个小版本的更新都是为了提高稳定性和兼容性,确保开发者可以使用一个更加可靠和安全的环境。例如,_131这个版本可能修复了之前版本中的...
JDK 1.7.0_80是Oracle公司发布的Java 7的一个更新版本,其版本号中的"80"表示该版本的更新次数或修补级别。这个版本在Java 7的基础上修复了一些已知问题,提高了性能,并增加了新的功能。 首先,让我们详细了解一下...
版本的不断更新、升级,无非是对bug的修复、新功能的增加、优化等,在JDK版本中,JDK1.8变得备受关注,也成了各大公司面试中常常被问及的话题。 jdk1.8新特性: 1.Java 8允许我们给接口添加一个非抽象的方法实现,只...
Java 8,也称为JDK 1.8,是Java发展历程中的一个重大里程碑,因为它引入了许多创新特性,极大地提升了开发效率和代码质量。JDK 1.8.0_152是这个版本的一个更新,修复了之前的bug,提升了性能,并添加了一些新的安全...
每个JDK的更新(如u25、u111等)通常会修复之前版本中的bug,提高性能,以及添加一些新的特性和功能。例如,u181可能是为了修复安全漏洞或性能优化,而u201可能包含了一些重要的安全更新。这些版本的JDK适用于...
标题 "jdk6 jboss5 webservice bug" 暗示了这是一个关于Java开发环境中,具体是JDK 6和JBoss Application Server 5版本中Web服务(Webservice)出现的问题。这个问题可能是由于某些兼容性、配置错误或者已知的bug...
版本的不断更新、升级,无非是对bug的修复、新功能的增加、优化等,在JDK版本中,JDK1.8变得备受关注,也成了各大公司面试中常常被问及的话题。 一、JDK1.8优点概括 1、速度更快 由于底层结构和JVM的改变,使得JDK...
在Java开发过程中,JDK(Java Development Kit)是不可或缺的一部分,它包含了运行和构建Java应用程序所需的所有工具和库。在JDK中,测试用例扮演着至关重要的角色,确保代码的质量和稳定性。本文将深入探讨JDK中常...
在本文中,我们将详细探讨JDK 1.8.0_161版本中的关键特性和更新。 ### 1. Java 8新特性 JDK 1.8.0是Java 8的主要版本,引入了许多创新特性,旨在提高代码的可读性、简洁性和性能。以下是一些主要的新特性: #### ...
随JDK 1.8.0_202提供的“jdk-8u202-windows-x64最后一个不收费的jdk版本windows版.docx”文档,详细介绍了这个版本的特点、安装步骤和使用指南,对于初学者和开发者来说是一份宝贵的参考资料。 总结,JDK 1.8.0_202...
3. **ArrayList通过构造函数传入非指定泛型的List**(JDK中不算Bug的Bug) Java的ArrayList是一个动态数组,它在创建时可以指定泛型类型以保证类型安全。然而,在旧版本的JDK中,如果通过构造函数传入了一个非指定...
6. **兼容性和稳定性**:每个JDK版本都会对前一版本的bug进行修复,并提供新的功能和改进。JDK1.6.26在保持向后兼容的同时,提升了整体性能和稳定性。 7. **性能优化**:在JDK1.6.26中,Oracle对JVM进行了优化,...
JDK 17.0.2相比于之前的版本,可能包含了一些增强和修复的bug,虽然具体的更新内容没有在标题和描述中明确给出,但通常JDK每个新版本都会引入一些新的特性和改进。例如,JDK 17引入了Loom项目的一部分,探索虚拟线程...
版本的不断更新、升级,无非是对bug的修复、新功能的增加、优化等,在JDK版本中,JDK1.8变得备受关注,也成了各大公司面试中常常被问及的话题。 jdk1.8新特性: 1.Java 8允许我们给接口添加一个非抽象的方法实现,只...
JDK1.8中ConcurrentHashMap中...JDK1.8中ConcurrentHashMap中computeIfAbsent死循环bug问题是一个严重的bug,它可能会导致程序的死循环和崩溃。开发者需要小心避免这个问题,以确保程序的稳定性和可靠性。
JDK 8u191作为稳定版,包含了自JDK 8发布以来的所有安全更新、性能优化和bug修复。这个版本确保了系统的安全性,并对一些已知问题进行了改进,提高了整体的稳定性和兼容性。尽管后续有更多版本发布,但8u191因其免费...
Linux JDK 1.8 141 是Java Development Kit(JDK)的一个版本,专为Linux操作系统设计。JDK是Java编程语言的核心组件,包含了编译器、调试器、Java虚拟机(JVM)以及一系列的工具,用于开发、运行和调试Java应用程序...