这里有新鲜出炉的 Java 设计模式, 程序狗速度看过来!
Java 程序设计语言
java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言, 是由 Sun Microsystems 公司于 1995 年 5 月推出的 Java 程序设计语言和 Java 平台 (即 JavaEE(j2ee), JavaME(j2me), JavaSE(j2se)) 的总称
在电脑里找到一份当时学习 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
来源: http://www.phperz.com/article/18/0211/358823.html