Java中常见的陷阱题及答案

 更新时间:2017年01月15日 09:57:19   作者:Hosee  
在电脑里找到一份当时学习JAVA时的笔记,看到一些现在已经遗忘的细节。稍微整理了几个,发出来与大家分享。这篇文章主要介绍了Java中常见的陷阱题及答案,需要的朋友可以参考借鉴,下面来一起看看吧。

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

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。

相关文章

  • 使用javafx更新UI的方法

    使用javafx更新UI的方法

    这篇文章主要介绍了使用javafx更新UI的方法,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • springmvc九大组件之HandlerAdapter详解

    springmvc九大组件之HandlerAdapter详解

    这篇文章主要介绍了springmvc九大组件之HandlerAdapter详解,RequestMappingHandlerAdapter支持的handler的类型是HandlerMethod,而HandlerMethod是通过解析@RequestMapping注解获得的,需要的朋友可以参考下
    2023-11-11
  • 教你怎么用Java完成人民币大写转化

    教你怎么用Java完成人民币大写转化

    这篇文章主要介绍了教你怎么用Java完成人民币大写转化,文中有非常详细的代码示例,对正在学习java的小伙伴们有很好的帮助,需要的朋友可以参考下
    2021-04-04
  • 基于Springboot疫苗接种行程管理系统的设计与实现

    基于Springboot疫苗接种行程管理系统的设计与实现

    本文主要介绍了基于Springboot实现的疫苗接种行程管理系统的示例代码,系统主要实现个人疫苗接种管理、行程管理、病史管理、风险地区管理、核酸检测报告结果上报、疫情新闻管理等功能,需要的可以参考一下
    2022-03-03
  • 关于mybatisPlus yml配置方式

    关于mybatisPlus yml配置方式

    这篇文章主要介绍了mybatisPlus yml配置方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-06-06
  • 使用SpringBoot简单了解Druid的监控系统的配置方法

    使用SpringBoot简单了解Druid的监控系统的配置方法

    这篇文章主要介绍了使用SpringBoot简单了解Druid的监控系统的配置,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-06-06
  • SpringMvc导出Excel实例代码

    SpringMvc导出Excel实例代码

    本篇文章主要介绍了SpringMvc导出Excel实例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-01-01
  • java中的Struts2拦截器详解

    java中的Struts2拦截器详解

    本篇文章主要介绍了java中的Struts2拦截器浅解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-03-03
  • 全面了解java异常

    全面了解java异常

    本文非常详细的介绍了java异常,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们可以学习一下这篇文章
    2021-08-08
  • Vue结合Springboot实现用户列表单页面(前后端分离)

    Vue结合Springboot实现用户列表单页面(前后端分离)

    本文主要介绍了Vue结合Springboot实现用户列表单页面,可以实现简单的查询,删除,修改,和添加用户信息功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-07-07

最新评论