Java中常见的陷阱题及答案

作者:Hosee 时间:2021-08-10 16:32:11 

1、找奇数:


public static boolean isOdd(int i){
return i % 2 == 1;
}

上面的方法真的能找到所有的奇数么?

A:没有考虑到负数问题,如果i为负则不正确。应该return i%2 == 0

2. 浮点数相减


System.out.println(2.0-1.9);

A:Java中的简单浮点数类型float和double不能够进行运算。不光是Java,在其它很多编程语言中也有这样的问题。在大多数情况下,计算的结果是准确的,但是多试几次(可以做一个循环)就可以试出类似上面的错误。当然加减乘除都有可能有问题,

比如:


System.out.println(0.05+0.01);
System.out.println(1.0-0.42);
System.out.println(4.015*100);
System.out.println(123.3/100);

这是因为有些十进制有限位数的小数,到二进制里面可能会变成无限循环小数,在浮点数中不能表示而损伤精度。

解决方法:

1. 如果是判断a-b是否等于c,或者a+b是否等于c的,可以使用


if(0.05+0.01-0.06 < 0.0000001)
{
}

2. 在《Effective Java》这本书中提到一个原则,float和double只能用来做科学计算或者是工程计算,在商业计算中我们要用 java.math.BigDecimal来解决


System.out.println((new BigDecimal("2.0")).subtract(
new BigDecimal("1.9")).doubleValue());

3. 无限循环


public static final int END = Integer.MAX_VALUE;
public static final int START = END - 2;

public static void main(String[] args) {
int count = 0;
for (int i = START; i <= END; i++)
count++;
System.out.println(count);
}

A:这里无限循环的原因就是当i为Integer.MAX_VALUE时,此时for循环是先++,然后判断i是否<=END,当i为 Integer.MAX_VALUE再++时,i变成了负数。所以就一直循环下去。
变成负数的原因就是int溢出了。这里将<=END改成<END就可以解决问题。

4. 到底返回什么?


public static boolean decision() {
try {
return true;
} finally {
return false;
}
}

A:返回false。此时return true是不可达语句,在编译阶段将优化去掉。

3、下面来分享一段面试可能会遇到的陷阱题

看代码:


int a=5;
 System.out.println("value is"+((a<5)? 10.9:9 ));

输出结果为:

A.编译错误     B10.9     C.9    D 以上答案都不对。

运行执行结果为:


value is9.0

因为((a<5) ? 10.9 )有一个10.9java 根据运算符精度自动转型。因此后面的 9 也会变成9.0 。

所以选D 。

a


StringBuffer str1=new StringBuffer("123");
 StringBuffer str2=new StringBuffer("123");
 if(str1.equals(str2)){
  System.out.println("str1.equalstr2");
 }else{
  System.out.println("str1.notequalstr2");
 }

结果为: str1.notequalsstr2  这说明StringBuffer 没有重写 equals 方法。


Float fa=new Float(0.9f);
 Float fb=new Float(0.9f); //Float fb=new Float("0.9f");
 Double db=new Double(0.9f);
 if(fa==fb){ //false
  System.out.println("fa==fb");
 }else{
  System.out.println("fa!=fb");
 }
 if(fa.equals(fb)){ //true
  System.out.println("fa.equalfb");
 }else{
  System.out.println("fa!equalfb");
 }
 if(db.equals(fb)){ //false
  System.out.println("db.equalfb");
 }else{
  System.out.println("db!equalfb");
 }

结果为:


fa!=fb
fa.equalfb
db!equalfb Float 型与Double 型肯定不相等

如果还有其他欢迎补充。

Reference:

1. http://blog.csdn.net/ol_beta/article/details/5598867

2. http://zhidao.baidu.com/link?url=0UyDU42L7DXZitdydJMG3IIUDIf3xidFCRAObZAq6SHFCEaNnp2Oyuq1KVwBvmlR0UZGHSjD4f6A1yD0d65JL_

3. http://bbs.csdn.net/topics/300023952

4. http://z466459262.iteye.com/blog/739300

来源:https://my.oschina.net/hosee/blog/616705

标签:java,陷阱
0
投稿

猜你喜欢

  • C#实现Base64处理的加密解密,编码解码示例

    2023-07-15 12:11:31
  • mybatis foreach 循环 list(map)实例

    2023-11-23 23:39:05
  • Spring Boot+Shiro实现一个Http请求的Basic认证

    2022-06-01 22:22:31
  • Java C++实现相同MD5加密算法的方式

    2023-10-12 12:26:02
  • java锁synchronized面试常问总结

    2023-08-01 05:11:37
  • SpringBoot异步调用方法并接收返回值

    2023-08-16 22:33:49
  • Java流程控制语句之If选择结构

    2023-11-11 04:02:29
  • 为什么Java开发需要配置环境变量

    2023-08-13 13:11:03
  • 详解SpringCloud Ribbon 负载均衡通过服务器名无法连接的神坑

    2021-06-01 07:28:41
  • Java8 Comparator源码演示及解析

    2023-09-18 10:51:12
  • Java Mybatis框架Dao层的实现与映射文件以及核心配置文件详解分析

    2021-06-15 16:29:22
  • Android自定义View之组合控件实现类似电商app顶部栏

    2023-07-26 22:14:10
  • Java分页查询--分页显示(实例讲解)

    2023-02-05 11:07:15
  • Java中方法的使用、重载与递归的详细介绍

    2022-03-02 02:50:05
  • Spring Boot 整合 Apache Dubbo的示例代码

    2021-10-09 03:52:07
  • Java实现堆排序和图解

    2023-11-11 12:13:37
  • JAVA.io读写文件方式汇总

    2022-10-14 06:32:21
  • 浅析Spring Boot中的spring-boot-load模块

    2023-11-23 02:39:31
  • spring boot springMVC扩展配置实现解析

    2023-11-25 10:32:53
  • 基于Hadoop实现Knn算法

    2023-11-27 04:01:20
  • asp之家 软件编程 m.aspxhome.com