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

谜题解析

阅读更多

题目接http://zangxt.iteye.com/blog/435711

说明:这篇博文是我自己分析和整理的,题目来源和解析参考http://developers.sun.com/learning/javaoneonline/sessions/2009/pdf/TS-5186.pdf

,版权归原作者所有。

 

1.读文档,看Boolean.getBoolean()这个方法的功能就能解决。

    多读文档,很多接口可能并不是按我们想象的方式工作。

2.答案是6.

    多态带来的问题。

public boolean addAll(Collection<? extends E> c){
        addCount
+= c.size();
       
return super.addAll(c);
    }
     我们看父类中的代码:

 

    父类的addAll()方法调用了add(),由于多态,这里调用的是子类的add()方法,也就是

public boolean add(E e){
        addCount
++;
       
return super.add(e);
    }
   又对addCount进行了加1操作。

 

组合优于继承,在继承API中的类时先明确这些类是否适合继承。

3.结果是OOPS。

    多输出了一个O,这个倒是容易发现问题。这个也是和初始化顺序相关的,一般建议在构造方法中不要调用可能被覆盖的方法,但是像这种T next = nextElement();调用我们可能会不小心。执行这句话的时候,子类的构造方法及初始化语句尚未执行。nextElement();里面虽然执行了cursor++, 但是当流程执行到子类的初始化语句时cursor = 0把cursor++的效果弄没了。所以,我们可以将cursor = 0去掉来暂时性的解决问题。当然,原作者给出了更好的方案:

 改正后的代码:

 

      关于构造方法的调用顺序和初始化顺序,可以参考《Thinking In Java》或者自己写个简单的程序单步调试一下。

4.结果是-2.

问题出在:

return i<j?-1:(i==j?0:1);
两个Integer,用==判断容易出问题。

这句话可以修改为

return i<j?-1:(i>j?1:0);

     说明:对于包装类型,进行大于或者小于比较时,会进行拆箱操作,所以比较的就是封装的数的内容。但是使用==和!=进行比较时,比较的是引用的值。

    在《Java Puzzlers》一书中,作者也有类似的例子。比如,要求给出两个变量声明,使循环成为死循环。

while(i>=j && j>=i && i!=j){

}

     答案可以是:

Integer i = new Integer(1);
Integer j = new Integer(1);

 

5.这个是相对容易的,不过要对枚举的原理和java在类加载以及创建对象时的初始化顺序非常熟悉才行。可以结合下面两篇进行理解:

http://blog.csdn.net/ZangXT/archive/2008/10/29/3174741.aspx

http://blog.csdn.net/ZangXT/archive/2008/10/31/3196244.aspx

 

解决方案:

 

 

 

6.抛出异常,Exception in thread "main" java.lang.OutOfMemoryError: Java heap space

   

     其实这个细说起来还是很复杂的,需要理解ThreadLocal的原理和弱引用的相关知识。因为内部类对象存在一个指向外部类(包含内部类的类)ThreadFriendly对象的引用,而ThreadFriendly对象又存在到ThreadLocal对象的引用,导致Thread中ThreadLocal.ThreadLocalMap inheritableThreadLocals 中的key一直是强引用,无法释放,最终导致内存溢出。在开头给出的链接中,原作者的pdf里面有引用示意图,比较直观,有兴趣的可以下载看看。

     解决方法:

 

static class Value{
       
final int i;
        Value(
int i){
           
this.i = i;
        }
    }

 

     当然,也可以static ThreadLocal<Value> threadLocalPart = new ThreadLocal<Value>();

7.因为null的存在会导致Words类的加载,所以输出是:

the chemistry set

 

    关于常量折叠,可以参考:

http://blog.csdn.net/ZangXT/archive/2008/12/13/3511697.aspx

 

    这里需要注意的是,null并不是常量,将PrintWords.java编译之后,Words.FIRST,Words.THIRD都直接用"the"和"set"替换了,它们没有对Words类型的引用。但Words.SECOND 仍然保留对Words.SECOND的引用。

这可以通过分析javap -verbose反汇编class文件得到证实。

    重编译Words.java文件之后,PrintWords.java中进行输出时,读取Words.SECOND时要去加载Words类。导致输出结果是the chemistry set。(因为the 和 set已经编译为字符串常量,不会引用Words类的内容)

 

 

4
1
分享到:
评论
4 楼 hunter4java 2009-11-05  
4题:
public class Search {
    public static void main(String[] args) {
        String[] strings = { "0", "1", "2", "3", "4", "5" };
        List<Integer> integers = new ArrayList<Integer>();
        for (String s : strings) {
            integers.add(Integer.valueOf(s));
        }
        System.out.println(Collections.binarySearch(integers, 1, cmp));
    }

    static Comparator<Integer> cmp = new Comparator<Integer>() {
        public int compare(Integer i, Integer j) {
            return i < j ? -1 : (i == j ? 0 : 1);
        }
    };
}

我这里运行的结果是1啊,可以找得到的。

而且
Integer a =200;
Integer b = Integer.valueOf(200);
Integer c = Integer.valueOf("200");
这3个都是==的啊。
所以是可以搜寻到的,怎么这次不刨根问底了啊,就直接复制别人的过来了?
3 楼 ZangXT 2009-08-05  
qbq 写道
cmd

按照问题说的顺序:

javac Words.java
javac PrintWords.java

java PrintWords
the null set

修改Words.java

javac Words.java

java PrintWords
the chemistry set

Sorry,是我对原来题目的描述出现了偏差。谢谢提示。
2 楼 qbq 2009-08-05  
cmd

按照问题说的顺序:

javac Words.java
javac PrintWords.java

java PrintWords
the null set

修改Words.java

javac Words.java

java PrintWords
the chemistry set
1 楼 qbq 2009-08-04  
引用

7.因为null的存在会导致Words类的重新编译,所以输出是:

physics chemistry biology




这个输出应该是:
the chemistry set

相关推荐

    C语言的谜题

    ### C语言的谜题解析 #### 1. 程序不一定输出 "hello-std-out" **代码示例:** ```c #include #include int main() { while (1) { fprintf(stdout, "hello-std-out"); fprintf(stderr, "hello-std-err"); ...

    C语言谜题.

    ### C语言谜题解析 #### 1. 输出到标准输出与标准错误流 代码示例: ```c #include #include int main() { while (1) { fprintf(stdout, "hello-std-out\n"); fprintf(stderr, "hello-std-err\n"); sleep(1...

    C语言的谜题.txt

    ### C语言谜题解析 #### 谜题一:标准输出与错误输出的区别 **代码示例:** ```c #include #include int main() { while (1) { fprintf(stdout, "hello-std-out"); fprintf(stderr, "hello-std-err"); sleep...

    java解惑 中文版

    #### 二、奇数性谜题解析 **谜题背景** - **谜题1**:奇数性的判断。该谜题探讨了一个看似简单的判断整数是否为奇数的方法 `isOdd`,但其实存在明显缺陷。 - **问题所在**:`isOdd` 方法在处理负数时会出现问题。这...

    Futoshiki_solver_pythonFutoshiki_futoshiki_FutoshikiSolver_futos

    如果项目结构良好,每个子文件夹或文件可能对应不同的功能模块,如用户界面、谜题解析、解题算法等。 总的来说,这个Python项目提供了Futoshiki游戏的实现,允许玩家尝试解决谜题,并且有一个内置的自动解算器帮助...

    小学数学数学神探泰山石碑

    当我们把这个谜题解析出来,答案就是"风月无边",这是一个成语,用来形容风景优美,尤其是夜晚的景色,如同明月清风,无边无际。 这个教学案例展示了如何将传统文化与数学相结合,提高学生的观察力、思考能力和解决...

    笔试大全 主要是IT类的公司

    ### 问题解决策略:微软面试经典谜题解析 #### 谜题一:下水道盖子为何是圆形? 下水盖设计成圆形是为了防止盖子在移动时掉落井内。圆形盖子无论怎样放置都不会掉下去,因为其直径在任何方向都是相等的。这体现了...

    the C puzzle book

    C语言谜题解析 - **谜题示例**: - “FizzBuzz”问题: 输出1到100之间的数字,对于3的倍数输出“Fizz”,对于5的倍数输出“Buzz”,同时是3和5的倍数输出“FizzBuzz”。 - “汉诺塔”问题: 通过编程解决汉诺塔问题...

    S_sir_and_P_sir_problem.rar_sir

    《S_sir_and_P_sir_problem.rar_sir》——P先生与S先生谜题解析 在计算机科学领域,我们常常会遇到各种有趣的逻辑问题,其中“P先生与S先生谜题”是一个历史悠久的经典问题,源自数学逻辑和哲学的讨论。这个问题...

    java 软件工程师求职笔试大全

    #### 二、微软面试经典谜题解析 接下来,内容转向了微软的面试题,这类问题往往考察应聘者的逻辑思维能力、创造力以及解决问题的方法。下面是对部分谜题的解答: **1. 为什么下水道的盖子是圆的?** - 圆形盖子...

    MySudoku:我的数独解析器

    6. **测试**:为了确保MySudoku的正确性,开发者需要编写单元测试和集成测试,覆盖所有功能,包括谜题解析、解题过程以及用户界面交互。 7. **文档**:一个良好的项目不仅包含代码,还应该有清晰的文档,解释设计...

    impuzzable:一个谜题和一个解决它的人工智能

    在谜题解析阶段,Java的字符串处理和正则表达式功能将发挥关键作用。通过解析输入文本,我们可以提取关键信息并转化为程序内部的数据结构。这可能涉及到对字符串的分割、查找模式匹配以及转换操作。 接着,我们需要...

    六道运算放大器谜题答案

    ### 运算放大器谜题答案解析 #### 运算放大器基础知识回顾 在深入了解六道运算放大器谜题的答案之前,我们先简要回顾一下运算放大器的基础知识。运算放大器(Operational Amplifier,简称Op Amp)是一种集成电路,...

    文明盛世饮料谜题采用生成树解法

    《文明盛世饮料谜题的生成树解法解析》 在信息技术的广阔领域中,我们常常会遇到各种各样的问题,其中“饮料谜题”是一种典型的优化问题,它源自实际生活中的资源分配或路径规划问题。在这个问题中,我们需要在有限...

    算法谜题 英文版本

    #### 三、核心内容解析 ##### 1. 教程篇 - **通用算法设计策略**:这部分内容介绍了如何构思算法的基本思路,如递归、分治法、贪心算法等。这些策略是解决算法谜题的基础。 - **分析技巧**:包括时间复杂度分析、...

    文明盛世饮料谜题c++源码

    《文明盛世饮料谜题C++源码解析》 在编程世界中,解谜游戏是一种深受程序员喜爱的娱乐方式,它们通常结合了逻辑思维与算法设计,挑战着开发者的智力极限。"文明盛世饮料谜题"就是这样一款游戏,其C++源码提供了在...

    Scala谜题1

    书中还涵盖了对Scala编译器行为的解析,解释了编译器如何解析和优化代码,以及某些情况下编译器可能做出的非直观决策。这有助于读者在实际开发中避免因为误解编译器行为而导致的问题。 无论是对于初学者还是经验...

Global site tag (gtag.js) - Google Analytics