题目接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类的内容)
分享到:
相关推荐
解题报告——noip 2016提高组,初赛详细解析。
《程序员面试逻辑题解析》共分为3个部分。第一部分从有趣且锻炼头脑的谜题入手,继而给出解题思路和详细答案,更有“热身问题”给大家提供...《程序员面试逻辑题解析》不仅适合程序员阅读,更是谜题爱好者的饕餮盛宴
一份java版的数独解法,另附一份半成品的谜题生成源码,运行批处理文件,输入谜题可解析
我确实对基本字符串解析的多种实现感到有些恼火(这在一些在线编码挑战中包含的框架代码中做得非常糟糕),因此为了清楚起见,将我自己的这些版本放入一个单独的包含目录中。 在一次采访中,我会把它放在代码之上。 ...
该程序解决来自谜题。 用法 ruby ocr.rb 应用程序将抓取屏幕截图、裁剪它、处理图像并将解决方案输出到终端。 延迟 5 秒后,它会重复。 解决注意事项 不解决“直”或“<、>”线索、隐藏笼子或双板谜题。 直线...
《程序员面试逻辑题解析》共分为3 个部分。第一部分从有趣且锻炼头脑的谜题入手,继而给出解题思路和详细答案,更有“热身问题”给大家提供充分的思考空间。第二部分综合了不同类型的谜题,如数独、调度问题及概率题...
1. 《Java解惑 [JAVA PUZZLERS]》:这是一本Java语言解惑与实战书籍,通过140个谜题帮助读者加深对Java的理解。 2. 《Java虚拟机规范 (Java_SE_7)》:这本书深入解析了Java虚拟机规范,是Java程序员进阶阅读的好选择...
此外,还探讨了三壶谜题、交替放置的碟子等经典数学问题的算法思路。 适用人群为计算机科学学生、编程爱好者以及专业开发者,特别是那些希望提升算法知识、锻炼编程技能和解决复杂问题能力的人士。无论是为了学术...
Dirtbags君主的山服务器 山上的君主(MOTH)是一个拼图...则可以回答更多难题) 没有内部的排名或分数概念:它仅存储事件日志,记分板可根据需要对其进行解析必须先将所有谜题编译为静态内容,然后才能投放服务器几
清醒火车1 2021年cien项目之谜,谜题2021.03.05-Unity项目启动2021.03.06-对话框窗口文本输出系统的实现,基于存储检索的系统的实现2021.03.07-自动聊天窗口关闭2021.03.11-库存实施2021.03.14-改善了移动屏幕的失真...
分层机器人目的Stratabot 解决来自益智游戏的难题,包括有限的自动化来解析 Strata 的图形并通过单击鼠标提交解决方案。建造ant fetch; ant compile 跑步要解决您输入的难题,请运行Solver.main 。 要与 Strata 交互...
自述文件这是一个计算秘密的 Java 谜题。 正如您可能猜到的,您的目标是发现秘密。 使用当前版本的应用程序需要很长时间(老实说我们不知道,但在典型的桌面上我们谈论的是几年)。 如果您准备好迎接挑战,那么您的...
简单的艺术是复杂的谜题。 安卓jitpack版 此版本是来自原始存储库的端口。 所做的更改: 应用了 Android Maven 部署配置文件更改 有些删除了一些引发 javadoc 生成器错误的 javadoc 生成器行(遵循原始 javadoc) 有...