`
zjx2388
  • 浏览: 1333931 次
  • 性别: Icon_minigender_2
  • 来自: 北京
社区版块
存档分类
最新评论

java puzzlers---java 陷阱题

阅读更多

从BBS上看的一个帖子,摘录几条下来:

看了一段北风网的视频,总结几个经典的java陷阱给大家。

建议先思考一下结果,然后运行代码试验。也许你会恍然大悟。

1、找奇数:


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

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

A:没有考虑到负数问题,如果传参是负数,那么永远不能得到结果!应该是:return i % 2 != 0;

2、浮点数想减

System.out.println(2.0-1.9); 
System.out.println(2.0-1.9);

上面会打印0.1么?

A:不会,自己试验就知道结果了。正确做法:用decimal。

3、交换


int x = 2010;   
int y = 2012;   
x^=y^=x^=y;  
System.out.println("x= " + x + "; y= " + y); 
int x = 2010;
int y = 2012;
x^=y^=x^=y;
System.out.println("x= " + x + "; y= " + y);

x、y的值呼唤了么?

A:没有,java运算顺序是从左到右的,应该这么写:y=(x^= (y^= x))^ y;

4、字符和字符串

+ expand source
System.out.println("H" + "a");  
System.out.println('H' + 'a'); 
System.out.println("H" + "a");
System.out.println('H' + 'a');

上面两个语句输出结果相同么?

A:不想同,字符会被转换成在数字。所以第一句输出:Ha,第二句输出两个字符的assii码相加的数字。

5、无限循环


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

上面程序运行的结果是什么?

A:无限循环。将i<=END改成i<END?为什么呢?你知道的,呵呵!

6、计数器问题


int minutes = 0;   
for (int ms = 0; ms < 60*60*1000; ms++)   
    if (ms % 60*1000 == 0)   
        minutes++;   
System.out.println(minutes); 
int minutes = 0;
for (int ms = 0; ms < 60*60*1000; ms++)
 if (ms % 60*1000 == 0)
     minutes++;
System.out.println(minutes);

结果跟你想的一样么?

A:呵呵,括号问题,不多说!

7、到底返回什么?


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

true?false?

A:一般情况下,不管怎么说try/catch代码块中,finally总是最后被执行的 。

8、错误里聚集遍历


public static void main(String[] args) {  
        Vector v = new Vector();  
        v.add("one");  
        v.add("two");  
        v.add("three");   
        v.add("four");  
        Enumeration enume = v.elements();  
        while (enume.hasMoreElements()){  
            String s = (String) enume.nextElement();  
            if (s.equals("two"))  
                v.remove("two");  
            else{  
                System.out.println(s);  
            }  
        }  
        System.out.println("What's really there...");  
        enume = v.elements();  
        while (enume.hasMoreElements()){  
            String s = (String) enume.nextElement();  
            System.out.println(s);              
        }  
    } 
public static void main(String[] args) {
        Vector v = new Vector();
        v.add("one");
        v.add("two");
        v.add("three");
        v.add("four");
        Enumeration enume = v.elements();
        while (enume.hasMoreElements()){
            String s = (String) enume.nextElement();
            if (s.equals("two"))
                v.remove("two");
            else{
                System.out.println(s);
            }
        }
        System.out.println("What's really there...");
        enume = v.elements();
        while (enume.hasMoreElements()){
            String s = (String) enume.nextElement();
            System.out.println(s);           
        }
 }

运行代码看看结果跟你想的一样么?

A:一般不建议在遍历聚集的时候对聚集进行操作。为什么结果是这样呢?看JDK源码能得到答案。Enumeration没有实现Fail Fast操作,如果换成ArrayList,上面的代码可能会出错。《java与模式》迭代子(iterator)介绍了。

 

 

有兴趣的,可以看看 <java puzzlers>这本书,上面的应该都出去这书,很经典的

分享到:
评论

相关推荐

    java-puzzlers-sampler_java_Joshua_

    《Java Puzzlers Sampler》是由Java领域的权威专家Joshua Bloch和Neal Gafter共同编著的一本书,书中收录了一系列令人困惑、出乎意料的Java编程问题,旨在帮助开发者更好地理解和避免这些潜在的陷阱。书中的...

    JAVA PUZZLERS(JAVA 解惑)中英文

    《JAVA PUZZLERS》是一本深受欢迎的Java编程书籍,旨在揭示编程语言中的微妙陷阱和易犯错误,帮助开发者提升编程技能和理解。这本书以其独特的“谜题”形式,通过一系列精心设计的问题,引导读者探索Java语言的深奥...

    java Puzzlers 中文版带完整目录

    本書包含了Java程式語言和核心函式庫中的各種謎題,任何具備使用Java經驗的讀者都可以看得懂,但是書裡有不少謎題的難度頗高,即便是對經驗豐富的Java程式設計師而言,都是一項挑戰,所以如果你解不出來,別覺得難過...

    Java puzzlers(java 解惑)附源码

    这本书专门探讨了Java编程语言中容易让人迷惑的陷阱和常见误解,通过一系列精心设计的“puzzlers”(谜题)来揭示这些陷阱,并提供了深入的解析,帮助读者提高代码质量,避免潜在的错误。书中涵盖的知识点广泛,涉及...

    java-puzzlers源代码

    这本书通过一系列精心设计的编程谜题(即"puzzlers"),帮助读者深入理解Java语言的内在机制和陷阱。源代码是书中各个谜题的实现,对于学习和理解Java的微妙之处非常有帮助。 首先,我们来看"java-puzzlers"这个...

    java解惑(java-puzzlers)源码.rar

    本书深入研究Java编程语言及其核心类为的细微之处,特写95个有关Java或其他类库的陷阱和缺陷的谜题,其中大多数谜题都采用短程序的形式给出。在每个谜题之后都有详细的解惑方案,这些方案在给出那些实际行为与表面上...

    java puzzlers code

    Java Puzzlers 是一套经典的Java编程难题集,由Joshua Bloch和Neal Gafter合著,旨在帮助开发者深化对Java语言特性的理解和避免常见的陷阱。这些“puzzlers”通过一系列精心设计的代码示例,展示了在特定条件下可能...

    <好书>java解惑(java puzzlers),过来挑战吧

    《Java解惑》是一本专为Java程序员设计的书籍,旨在揭示编程中常见的陷阱、误导性和易错的代码片段,帮助读者提升编程技能,避免在实际工作中遇到问题时感到困惑。这本书通过一系列精心设计的“Java谜题”,引导读者...

    JavaSIG-Puzzlers.pdf

    ### Java Puzzlers知识点解析 #### 一、Java Puzzlers概述 《JavaSIG-Puzzlers.pdf》是一本由Joshua Bloch与Neal Gafter共同编写的书籍,该书主要探讨了Java编程语言中的一些非常规问题。这些问题是开发者在日常...

    Java+Puzzlers(中英文并且带源码)

    "Puzzlers"在这里指的是书中精心设计的一系列编程谜题,通过这些谜题,开发者可以了解到Java语言中的陷阱和微妙之处。 1. **类型转换与强制转换**:Java中存在自动类型转换和显式强制类型转换,但过度依赖这些转换...

    java谜题中文版

    在探讨`java_puzzlers`中的第一个谜题时,我们遇到了一个看似简单却充满陷阱的场景。方法`isOdd`的目标是判断一个整数是否为奇数。原始实现如下: ```java public static boolean isOdd(int i) { return i % 2 == ...

    java爱好者必备JAVA解惑(pdf格式)

    《JAVA解惑》是一本专为Java爱好者设计的书籍,旨在帮助读者解决在学习和使用Java过程中遇到的各种问题。这本书以PDF格式提供,方便电子阅读和保存。在深入探讨Java编程语言的过程中,它覆盖了从基础概念到高级特性...

    Javapuzzler+JAVA解惑 中英双语 完整源代码

    《Javapuzzler+JAVA解惑 中英双语 完整源代码》是一份集学习与实践于一体的Java编程资源,包含《Java Puzzlers》和《JAVA解惑》两部分,以及对应的完整源代码。这份资料对于深入理解Java语言的特性和陷阱,提升编程...

    Addison.Wesley.Java.Puzzlers.Jun.2005

    这本书的标题《Java Puzzlers: Traps, Pitfalls, and Corner Cases》揭示了其内容核心——解决Java编程语言中的陷阱、缺陷和边缘案例。在描述中提到,本书旨在帮助读者对Java编程中看似棘手的问题进行讲解,从而使...

    kotlin-puzzlers,科特林拼图集.zip

    "Kotlin Puzzlers"项目,正如其名,是一次探索Kotlin语言特性和陷阱的有趣之旅,旨在帮助开发者深入理解Kotlin的内在机制,避免潜在的问题。 开源项目"Kotlin Puzzlers"是学习和提升Kotlin编程技巧的一个宝贵资源。...

    那些丑陋的Java API

    结合标签"源码"和"工具",我们可以深入理解Java API的设计原理,以及如何避免相关的陷阱。 1. **Java API设计原则**: - Java API的设计应当遵循一致性、简洁性和易用性的原则。然而,一些API可能因为历史原因或...

    JavaPuzzlers

    《JavaPuzzlers》这本书由Josh Bloch和Bob Lee共同编写,是一本深入探讨Java编程语言中各种陷阱、怪癖及未被广泛认知特性的书籍。书中通过一系列精心设计的编程谜题,揭示了Java中那些容易导致错误或令人困惑的行为...

    java自学必读书目

    《Java Puzzlers》** - **作者:** Joshua Bloch & Neal Gafter - **主要内容:** 本书通过一系列有趣的编程难题来揭示Java语言中的微妙之处。 - **涵盖知识点:** - Java语言的怪异行为 - 常见陷阱 - 语言特性...

    Java学习推荐书(包含各类java入门)

    2. 《Java Puzzlers》:通过谜题介绍一些你可能没有注意到的边角料,这本书可以作为趣味读物,也可以帮助读者深入理解 Java 的特性。 3. 《深入 Java 虚拟机》:这本书提供了 Java 虚拟机的详细介绍,帮助读者深入...

Global site tag (gtag.js) - Google Analytics