`
ZangXT
  • 浏览: 116559 次
  • 性别: 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

相关推荐

    解题报告——noip 2016提高组

    解题报告——noip 2016提高组,初赛详细解析。

    魔鬼的乐园

    《程序员面试逻辑题解析》共分为3个部分。第一部分从有趣且锻炼头脑的谜题入手,继而给出解题思路和详细答案,更有“热身问题”给大家提供...《程序员面试逻辑题解析》不仅适合程序员阅读,更是谜题爱好者的饕餮盛宴

    数独解法,可运行,含源码

    一份java版的数独解法,另附一份半成品的谜题生成源码,运行批处理文件,输入谜题可解析

    leetcode被墙-chestnuts:面试谜题

    我确实对基本字符串解析的多种实现感到有些恼火(这在一些在线编码挑战中包含的框架代码中做得非常糟糕),因此为了清楚起见,将我自己的这些版本放入一个单独的包含目录中。 在一次采访中,我会把它放在代码之上。 ...

    squarelogic:日常天才的自动求解器

    该程序解决来自谜题。 用法 ruby ocr.rb 应用程序将抓取屏幕截图、裁剪它、处理图像并将解决方案输出到终端。 延迟 5 秒后,它会重复。 解决注意事项 不解决“直”或“&lt;、&gt;”线索、隐藏笼子或双板谜题。 直线...

    ((美)Dennis E. Shasha) 中文PDF 扫描版.rar

    《程序员面试逻辑题解析》共分为3 个部分。第一部分从有趣且锻炼头脑的谜题入手,继而给出解题思路和详细答案,更有“热身问题”给大家提供充分的思考空间。第二部分综合了不同类型的谜题,如数独、调度问题及概率题...

    Java学习资料&项目源码&教程

    1. 《Java解惑 [JAVA PUZZLERS]》:这是一本Java语言解惑与实战书籍,通过140个谜题帮助读者加深对Java的理解。 2. 《Java虚拟机规范 (Java_SE_7)》:这本书深入解析了Java虚拟机规范,是Java程序员进阶阅读的好选择...

    算法设计 - 排序、动态规划、数学问题 - 实用编程资源合集

    此外,还探讨了三壶谜题、交替放置的碟子等经典数学问题的算法思路。 适用人群为计算机科学学生、编程爱好者以及专业开发者,特别是那些希望提升算法知识、锻炼编程技能和解决复杂问题能力的人士。无论是为了学术...

    moth:Monarch Of The Hill-基于计算机的智力竞赛的基础结构

    Dirtbags君主的山服务器 山上的君主(MOTH)是一个拼图...则可以回答更多难题) 没有内部的排名或分数概念:它仅存储事件日志,记分板可根据需要对其进行解析必须先将所有谜题编译为静态内容,然后才能投放服务器几

    LucidTrain1:2021年cien项目LucidTrain 1号

    清醒火车1 2021年cien项目之谜,谜题2021.03.05-Unity项目启动2021.03.06-对话框窗口文本输出系统的实现,基于存储检索的系统的实现2021.03.07-自动聊天窗口关闭2021.03.11-库存实施2021.03.14-改善了移动屏幕的失真...

    stratabot:玩拼图游戏 Strata

    分层机器人目的Stratabot 解决来自益智游戏的难题,包括有限的自动化来解析 Strata 的图形并通过单击鼠标提交解决方案。建造ant fetch; ant compile 跑步要解决您输入的难题,请运行Solver.main 。 要与 Strata 交互...

    plumbr:https的克隆

    自述文件这是一个计算秘密的 Java 谜题。 正如您可能猜到的,您的目标是发现秘密。 使用当前版本的应用程序需要很长时间(老实说我们不知道,但在典型的桌面上我们谈论的是几年)。 如果您准备好迎接挑战,那么您的...

    贪吃蛇java安卓源码-snake-yaml:Snakeyaml支持安卓

    简单的艺术是复杂的谜题。 安卓jitpack版 此版本是来自原始存储库的端口。 所做的更改: 应用了 Android Maven 部署配置文件更改 有些删除了一些引发 javadoc 生成器错误的 javadoc 生成器行(遵循原始 javadoc) 有...

Global site tag (gtag.js) - Google Analytics