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中几个常见的问题的更多相关文章

  1. JAVA中enum的常见用法

    JAVA中enum的常见用法包括:定义并添加方法.switch.遍历.EnumSet.EnumMap 1.定义enum并添加或覆盖方法 public Interface Behaviour{ void ...

  2. Java中枚举的常见用法

    在JDK1.5以后引入了一种新的类型,就是枚举(enum).enum是用来声明枚举类型数据,它可以像数组一样存储许多的元素,但是不同于数组的是,它除了数字不能存储以外, 其他类型的如字母.特殊符号.汉 ...

  3. Java中9种常见的CMS GC问题分析与解决

    1. 写在前面 | 本文主要针对 Hotspot VM 中"CMS + ParNew"组合的一些使用场景进行总结.重点通过部分源码对根因进行分析以及对排查方法进行总结,排查过程会省 ...

  4. Java中避免空指针常见的方法

    什么是空指针? 当一个变量的值为null时,在Java里表示一个不存在的空对象,没有实际内容,没有给它分配内存,null也是对象成员的默认值.所以,一个对象如果没有进行初始化操作,这时如果调用这个对象 ...

  5. java中包命名常见规则

    做java的都知道java的包.类.接口.枚举.方法.常量.变量等等模型都有一套约定的命名规则! 学习每一种语言都应该学习对应语法和命名规则,以保持一个良好的编码风格.一来显示自己的专业.二来方便阅读 ...

  6. java中获取ServletContext常见方法

    http://blog.sina.com.cn/s/blog_3fe961ae0100wjnf.html 1.在javax.servlet.Filter中直接获取 ServletContext con ...

  7. java中几种常见字符集与乱码介绍

    1.  ASCII和Ansi编码 字符内码(charcter code)指的是用来代表字符的内码 .读者在输入和存储文档时都要使用内码,内码分为  单字节内码 -- Single-Byte chara ...

  8. Java中几种常见排序算法

    日常操作中常见的排序方法有:冒泡排序.快速排序.选择排序.插入排序.希尔排序等. 冒泡排序是一种简单的排序算法.它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数 ...

  9. Java中的一些常见错误

    1.空指针错误 在java数组的使用中,有时候需要对字符串数组中的元素进行对比.那么当元素不为null时,程序会正常运行:然而,一旦对比的元素为null,那么程序就会出现空指针错误. 解决方法:加入保 ...

  10. K:java中枚举的常见用法

    用法一:常量   在JDK1.5 之前,我们定义常量都是: public static fianl.....现在好了,有了枚举,可以把相关的常量分组到一个枚举类型里,而且枚举提供了比常量更多的方法. ...

随机推荐

  1. .NET中System.Diagnostics.Stopwatch、System.Timers.Timer、System.Threading.Timer 的区别

    1.System.Diagnostics.Stopwatch Stopwatch 实例可以测量一个时间间隔的运行时间,也可以测量多个时间间隔的总运行时间. 在典型的 Stopwatch 方案中,先调用 ...

  2. 树莓派3B 无显示器,无键盘,无Linux系统,无网线 配置WIFI连接

    #1.基本需求#2.烧写镜像#3.用有线网(网线)连接PC,实现远程操作树莓派#4.接入无线网,通过其它电脑远程控制树莓派#5.使用PC共享的热点Wifi远程控制树莓派 #1.基本需求 树莓派 USB ...

  3. Qt5---ftp上传功能(可直接克隆某个小模块,查看QT下FTP的socket原理)

    http://blog.csdn.net/freeape/article/details/52802163

  4. qt源码的submodules要怎么使用

    请问我下载了submodules里面的源代码,怎么使用?http://download.qt.io/official_releases/qt/5.7/5.7.1/submodules/如下载了qweb ...

  5. delphi 读写文本文件(函数比较全)

    需要两个按钮和两个Richedit控件,采用默认名称即可. procedure TForm1.Button1Click(Sender: TObject);  //写文件 var wText: Text ...

  6. 遗漏的SQL语句

    一.简单查询 1.限制返回行数 使用TOP n [PERCENT]选项限制返回的数据行数,TOP n说明返回n行,而TOP n PERCENT时,说明n是表示一百分数,指定返回的行数等于总行数的百分之 ...

  7. java-mysql(2) Prepared statement

    上一篇学习了java如何链接配置mysql,这篇学习下java如何处理sql预处理语句(PreparedStatement),首先是一个sql预处理的例子: package core; import ...

  8. 你必须了解的java内存管理机制(三)-垃圾标记

    本文在个人技术博客不同步发布,详情可用力戳 亦可扫描屏幕右侧二维码关注个人公众号,公众号内有个人联系方式,等你来撩... 相关链接(注:文章讲解JVM以Hotspot虚拟机为例,jdk版本为1.8) ...

  9. Spring Boot 集成配置 HTTPS

    这是泥瓦匠的第108篇原创 文章工程: * JDK 1.8 * Maven 3.5.2 * Spring Boot 1.5.9.RELEASE ## 一.HTTPS 是什么 问:什么是HTTP? 答: ...

  10. 音视频技术“塔尖”之争,网易云信如何C位出道?

    音视频技术“塔尖”之争,网易云信如何C位出道? 社交+美颜.抖音短视频.在线狼人杀.直播竞答.子弹短信……,过往两三年间,互联网新产品和新玩法层出不穷,风口不断切换.这些爆红的网络应用背后,都有一些共 ...