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


猜你喜欢
- 前言现代化大型项目通常使用独立的数据库来存储数据,其中以采用关系型数据库居多。用于开发项目的高级语言(C#、Java等)是面向对象的,而关系
- 阅读目录:基础Socket编程多线程并发阻塞式同步IO基础在现今软件开发中,网络编程是非常重要的一部分,本文简要介绍下网络编程的概念和实践。
- 最近学习了 C#实现文件上传与下载,现在分享给大家。1、C#文件上传创建MyUpload.htm页面,用于测试<form name=&
- 目录启动startServiceAMS的创建start()setSystemProcess后续goingCallBackstartHomeO
- 给组件加上 * 定义一个类,这个类继承ActionListenerpubulic class ButListener implements
- idea去掉不想commit的文件我们项目在每次commit代码时,有时候会有一些不想提交又不能删除的代码,怎么做呢?此方法亲测最方便!!!
- 一、查看官网http://www.zhuozhengsoft.com/点击首页下载,进入页面:最新得5.2,我们就下载5.2版本进行测试。二
- 本文实例讲述了JDBC基础知识与技巧。分享给大家供大家参考。具体分析如下:1.什么是JDBC?通俗来讲JDBC技术就是通过java程序来发送
- 本文实例为大家分享了Unity3D实现攻击范围检测的具体代码,供大家参考,具体内容如下一、扇形攻击范围检测using UnityEngine
- fopen(打开文件)相关函数 open,fclose表头文件 #include<stdio.h>定义函数 FILE * fop
- list页面的字段要求可以根据用户的喜好进行排序,所以每个用户的字段都对应着不同的顺序(字段顺序存数据库),我们从数据库里取出来的值是对象,
- 在使用Java web开发的后端工程师们大多会使用Maven作为项目构建以及编译的工具,微服务和大中台当道的今天,更加关注maven的细节是
- 一、JMeter后端 * 介绍说到JMeter后端 * ,必须要从源头BackendListener开始说,最后延伸到我们需要的Backen
- C#定义多行字符串的方式在定义的前面加上@符号: string aa = @"asdfsdfsd &n
- springboot整合vue实现上传下载文件,供大家参考,具体内容如下环境springboot 1.5.x完整代码下载:springboo
- 问题起因主要是使用mybatis作为ORM之后,返回的对象为Map,然后对于数据库的datetime,datestamp类型返回为时间戳而不
- 记得在学习数据结构的时候一味的想用代码实现算法,重视的是写出来的代码有一个正确的输入,然后有一个正确的输出,那么就很满足了。从网上看了许多的
- 先从本地把图片上传到服务器,然后根据URL把头像处理成圆形头像。因为上传图片用到bmob的平台,所以要到bmob(http://www.bm
- 阿里终面在线编程题,写出来与大家分享一下 有一个单向链表
- java addMouseListener()方法使用用于接收组件上“感兴趣”的鼠标事件(按下、释放、单击、进入或离开)的 * 接口。(要跟