java中几个常见的问题
1.正确使用equals方法
Object的equals方法容易抛出空指针异常,应使用常量或确定有值的对象来调用equals方法
例如:
//不能使用一个值为null的引用类型变量来调用非静态方法,否则会抛出异常
String str = null;
if (str.equals("java")) {
...
}
else {
...
}
如果运行上面的程序则会抛出空指针异常,但是我们把第二行的条件判断语句改为下面这样的话,就不会抛出空指针异常,else语句可以得到执行:
String str = null;
if ("java".equals(str)) {
...
}
else {
...
}
但是更推荐用java.util包下的Objects类中的equals方法来判断:
Objects.equals(null, "java);
Objects的equals方法源码如下所示:
public static boolean equals(Object a, Object b) {
// 可以避免空指针异常,如果a==null就不会执行到a.equals(b)
return (a == b) || (a != null && a.equals(b));
}
2.整型包装类值的比较
所有整型包装类值的比较必须使用equals方法
例如:
Integer x = 3;
Integer y = 3;
System.out.println(x == y); // true
Integer a = new Integer(3);
Integer b = new Integer(3);
System.out.println(a == b); // false
System.out.println(a.equals(b)); // true
当使用自动装箱方式创建一个Integer对象并且数值在-127 - 128时,会将创建的Integer对象缓存起来,当下次再次出现该值时,直接从缓存中取出对应的Integer对象,所以x和y引用的是相同的Integer对象。
当如果想比较整型包装类的值时,因为a和b是不同的对象,所以用“==”比较的地址返回的是false,此时应当用equals方法进行比较。
3.BigDecimal
3.1 BigDecimal的用处
浮点数之间的等值判断,基本数据类型不能用==来比较。具体原理和浮点数的编码方式有关,这里就不再多提。
float a = 1.0f - 0.9f;
float b = 0.9f - 0.8f;
System.out.println(a); // 0.100000024
System.out.println(b); // 0.099999964
System.out.println(a == b); // false
上述结果是由于浮点数的精度丢失引起的,那么我们应该如何解决这个问题呢?一种很常用的方法就是:使用BigDecimal类来定义浮点数的值,再进行浮点数的运算操作。
BigDecimal a = new BigDecimal("1.0");
BigDecimal b = new BigDecimal("0.9");
BigDecimal c = new BigDecimal("0.8");
BigDecimal x = a.subtract(b); // 0.1
BigDecimal y = b.subtract(c); // 0.1
System.out.println(x == y); // true
3.2 BigDecimal的比较
a.compareTo(b):返回-1表示小于,0表示相等,1表示大于。
BigDecimal a = new BigDecimal("0.9");
BigDecimal b = new BigDecimal("0.8");
System.out.println(a.compareTo(b)); // 1
3.3 BigDecimal保留几位小数
通过setScale()方法设置保留几位小数以及保留规则。
BigDecimal a = new BigDecimal("1.255433");
BigDecimal b = a.setScale(3, BigDecimal.ROUND_HALF_DOWN);
System.out.println(b); // 1.255
3.4 BigDecimal的使用注意事项
我们在使用BigDecimal时,为了防止精度丢失,推荐使用它的BigDecimal(String)的构造方法来创建对象,或者使用BigDecimal的valueOf方法,而不能使用BigDecimal(double)的方式,因为该方法存在精度丢失的风险。
java中几个常见的问题的更多相关文章
- JAVA中enum的常见用法
JAVA中enum的常见用法包括:定义并添加方法.switch.遍历.EnumSet.EnumMap 1.定义enum并添加或覆盖方法 public Interface Behaviour{ void ...
- Java中枚举的常见用法
在JDK1.5以后引入了一种新的类型,就是枚举(enum).enum是用来声明枚举类型数据,它可以像数组一样存储许多的元素,但是不同于数组的是,它除了数字不能存储以外, 其他类型的如字母.特殊符号.汉 ...
- Java中9种常见的CMS GC问题分析与解决
1. 写在前面 | 本文主要针对 Hotspot VM 中"CMS + ParNew"组合的一些使用场景进行总结.重点通过部分源码对根因进行分析以及对排查方法进行总结,排查过程会省 ...
- Java中避免空指针常见的方法
什么是空指针? 当一个变量的值为null时,在Java里表示一个不存在的空对象,没有实际内容,没有给它分配内存,null也是对象成员的默认值.所以,一个对象如果没有进行初始化操作,这时如果调用这个对象 ...
- java中包命名常见规则
做java的都知道java的包.类.接口.枚举.方法.常量.变量等等模型都有一套约定的命名规则! 学习每一种语言都应该学习对应语法和命名规则,以保持一个良好的编码风格.一来显示自己的专业.二来方便阅读 ...
- java中获取ServletContext常见方法
http://blog.sina.com.cn/s/blog_3fe961ae0100wjnf.html 1.在javax.servlet.Filter中直接获取 ServletContext con ...
- java中几种常见字符集与乱码介绍
1. ASCII和Ansi编码 字符内码(charcter code)指的是用来代表字符的内码 .读者在输入和存储文档时都要使用内码,内码分为 单字节内码 -- Single-Byte chara ...
- Java中几种常见排序算法
日常操作中常见的排序方法有:冒泡排序.快速排序.选择排序.插入排序.希尔排序等. 冒泡排序是一种简单的排序算法.它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数 ...
- Java中的一些常见错误
1.空指针错误 在java数组的使用中,有时候需要对字符串数组中的元素进行对比.那么当元素不为null时,程序会正常运行:然而,一旦对比的元素为null,那么程序就会出现空指针错误. 解决方法:加入保 ...
- K:java中枚举的常见用法
用法一:常量 在JDK1.5 之前,我们定义常量都是: public static fianl.....现在好了,有了枚举,可以把相关的常量分组到一个枚举类型里,而且枚举提供了比常量更多的方法. ...
随机推荐
- 自绘LISTVIEW的滚动条(Delphi实现)
因项目需要准备对LISTVIEW的滚动条进行自绘.于是在网上搜了一下,问题没解决,却搜出一篇令人不愉快的帖子 .确实,那时候实力是不够的,但现在应该是没问题了,为这个目的才不断磨练自己的. LISTV ...
- teamcity build web project arguments
/p:Configuration=%system.Configuration% => Release /p:DeployOnBuild=%system.DeployOnBuild% => ...
- .NET与Java互通AES算法加密解密
/// <summary>AES加密</summary> /// <param name="text">明文</param> /// ...
- win10 uwp ApplicationView
原文:win10 uwp ApplicationView 本文和大家介绍一个重要的类,他可以用来设置窗口,如设置启动大小,设置是否允许截图,是否进入全屏,所有和窗口有关的,都可以在他这里设置. 可以使 ...
- 零元学Expression Blend 4 - Chapter 10 用实例了解布局容器系列-「StackPanel」
原文:零元学Expression Blend 4 - Chapter 10 用实例了解布局容器系列-「StackPanel」 本系列将教大家以实做案例认识Blend 4 的布局容器,此章介绍的布局容器 ...
- spring.net的简单使用(二)资源配置
主要对资源配置做进一步的解析. 对资源位置的配置是在spring节点的context下,resource节点配置. spring.net的资源是可以设置在三种不同的位置的, 1.配置文件中 <r ...
- C#实现任意源组播与特定源组播
IP组播通信需要一个特殊的组播地址,IP组播地址是一组D类IP地址,范围从224.0.0.0 到 239.255.255.255.其中还有很多地址是为特殊的目的保留的.224.0.0.0到224.0. ...
- Hexo+NexT(四):Hexo站点及Next主题配置详解
采用Hexo及NexT搭建好网站以后,有些效果不是我们需要的,Hexo及NexT提供了强大的定制功能,本文章将要讲解的就是如何在对网站进行配置及调整,达到博主需要的效果. 本文章配置环境是Hexo 3 ...
- python trojan development 2nd —— use python to send mail and listen to the key board then combine them
请勿用于非法用途!!!!!本人概不负责!!!原创作品,转载说明出处!!!!! from pynput.keyboard import Key,Listener import logging impor ...
- Java 程序员的大数据入门指南
项目 GitHub 地址:https://github.com/heibaiying/BigData-Notes ✒️ 前 言 大数据常用技术栈思维导图 大数据常用软件安装指南 一.Hadoop 分布 ...