此题集根据在阅读
Effective Java Second Edition中文版 时整理而成的,欢迎进行讨论与补充,共同学习与掌握。
1、 静态工厂方法相对公有构造器的优势有哪些?静态工厂方法的缺点又有哪些?通常在什么样的情况下使用它们比较合适?优先使用谁呢?为什么?请举例说明。
2、 Builder模式在什么样的情况下是一种不错的选择?为什么?Builder模式与传统的构造器相比,有什么优点?Builder模式与JavaBeans模式相比又有什么优点?
3、 请用最简洁高效的方式实现Singleton模式,并实现序列化,同时保证在反序列化后仍不会创建一个新的实例,而且能够有效地抵制反射(Reflection)的攻击。
4、 通过什么样的方式可以强化类的不可实例化?怎么样做比较明智?这样的实现方式有什么样的副作用?
5、 如何改进以下程序,使性能有明显的提升?
public static void main(String[] args) {
Long sum = 0L;
for (long i = 0; i < Integer.MAX_VALUE; i++) {
sum += i;
}
System.out.println(sum);
}
6、 以下程序存在什么问题?如何加以修正?在日常的开发过程中,内存泄露的情况有哪些?如何针对这些可能出现的情况进行分析并加以解决?
public class Stack {
private Object[] elements;
private int size = 0;
private static final int DEFAULT_INITIAL_CAPACITY = 16;
public Stack() {
elements = new Object[DEFAULT_INITIAL_CAPACITY];
}
public void push(Object e) {
ensureCapacity();
elements[size++] = e;
}
public Object pop() {
if (size == 0)
throw new EmptyStackException();
return elements[--size];
}
/**
* Ensure space for at least one more element, roughly
* doubling the capacity each time the array needs to grow.
*/
private void ensureCapacity() {
if (elements.length == size)
elements = Arrays.copyOf(elements, 2 * size + 1);
}
}
7、 Java语言规范保证了哪个线程将会执行终结方法finalize()呢?在什么时间执行?终结方法在性能上会带来多大的增强?终结方法有哪些合法的用途?有什么样的手段能够保证终结方法finalize()会被执行?
8、 考虑以下程序片断,它的输出结果是什么?为什么呢?
java.net.URL urlMain = new java.net.URL("http://www.iteye.com");
java.net.URL urlSub = new java.net.URL("http://Doremi123.iteye.com"); System.out.println(urlMain.equals(urlSub));
9、 你是否拒绝使用Cloneable接口?理由是什么?请举例说明。
10、 在Java里有四种可能的访问级别,私有的(private)、包级私有的(package-private)、受保护的(protected)、公有的(public)。那么请设计或举例出一个比这四种访问级别更小的访问级别,并说明它的作用。
11、 以下的代码片断是线程安全的吗?如果不是,请问如何改进后才可能是线程安全的,有哪些方式?这些方式各自的优缺点是什么?
public static final Map map = new HashMap();
12、 常量接口有哪些什么样的缺点?如何针对性地进行改进?
13、 考虑以下代码,为什么Java泛型系统会对基本类型进行限制,如何进行修正呢?
java.util.Stack <int> abc ;
14、 Producer-Extends,Consumer-Super(PECS)这个基本原则适用于哪里?所有的comparable和comparator是属于Producer吗?为何?
15、 自从Java 1.5发布以来,增加了枚举(enum)类型,请说说Java枚举类型背后的原理是什么?它有没有可以访问的构造器?能否创建枚举类型的实例,能否对它进行扩展?它是Singleton吗?
16、 考虑以下程序,打印的结果是什么?怎么样才能结果为26,为什么会发生这种情况?何以进行修正?
public class Bigram {
private final char first;
private final char second;
public Bigram(char first, char second) {
this.first = first;
this.second = second;
}
public boolean equals(Bigram b) {
return b.first == first && b.second == second;
}
public int hashCode() {
return 31 * first + second;
}
public static void main(String[] args) {
Set<Bigram> s = new HashSet<Bigram>();
for (int i = 0; i < 10; i++)
for (char ch = 'a'; ch <= 'z'; ch++)
s.add(new Bigram(ch, ch));
System.out.println(s.size());
}
}
17、 考虑以下程序,它打印的结果是什么呢?为什么?与自己预期的目标是否相符?
public class CollectionClassifier {
public static String classify(Set<?> s) {
return "Set";
}
public static String classify(List<?> lst) {
return "List";
}
public static String classify(Collection<?> c) {
return "Unknown Collection";
}
public static void main(String[] args) {
Collection<?>[] collections = {
new HashSet<String>(),
new ArrayList<BigInteger>(),
new HashMap<String, String>().values()
};
for (Collection<?> c : collections)
System.out.println(classify(c));
}
}
18、 在Java 1.5发行版本中增加了可变参数(varargs)方法,它可以接受0个到多个指定类型的参数,请问它的实现原理是什么?为什么说printf和反射机制在可变参数中得到了极大的益处?
19、 相对于传统的for循环,for-each有哪些方面的优点?在性能上哪个更好?但是for-each在哪些种的情况下并不适应?为何?应当怎么做?
20、 基本类型与装箱基本类型之间三个会让你陷入麻烦的区别,它们是什么呢?什么时候应该用装箱基本类型呢?它们有几个合理的用处呢?基本类型与装箱基本类型在使用时应当注意哪些方面的问题呢?
21、 考虑以下程序,它说明了什么问题?你应当注意什么样的原则?
List<Subscriber> subscribers = new Vector<Subscriber>();
Vector<Subscriber> subscribers = new Vector<Subscriber>();
22、 在利用Java的反射机制给你带来编程上的灵活性时,说说利用反射机制也付出了其它方面的代价,这些代价有哪些方面?
23、 说说什么时机下才有使用本地方法(Native Method)的可能,理由是什么?本地方法存在哪些严重的缺点?
24、 请举例说明将Exception作为控制程序流向给你带来的后果有哪些?为什么?你将如何应对这样的后果?
25、 一般而言,失败的方法调用应该使对象保持在被调用之前的状态。具有这种属性的方法被称为具有失败原子性(failure atomic),那么有几种方法能够实现这种效果呢?你是怎么看待这个特性的?
26、 考虑以下程序,你应该如何进行处理?
try {
...
} catch (SomeException e) {
}
27、 考虑以下程序,它存在什么问题?如何进行修正才保证是线程安全的?
private static volatile int nextSerialNumber = 0;
public static int generateSerialNumber() {
return nextSerialNumber++;
}
28、 线程安全性有哪些种级别?并考虑以下程序,它是线程安全的吗?不是的话,如何修正才能保证它是线程安全的?
private Object lock = new Object();
public void foo() {
synchronized(lock) {
...
}
}
29、 考虑以下双重检查模式的程序,它是线程安全的吗?不是的话,如何修正才能保证它是线程安全的?
private FieldType field;
FieldType getField() {
FieldType result = field;
if (result == null) { // First check (no locking)
synchronized(this) {
result = field;
if (result == null) // Second check (with locking)
field = result = computeFieldValue();
}
}
return result;
}
30、 HTTP会话状态为什么可以被缓存?RMI的异常为什么可以从服务器端传递到客户端呢?GUI组件为什么可以被发送、保存和恢复呢?是因为它们实现了Serializable接口吗?
31、 通过implements Serializable接口就实现类的序列化吗?实现序列化Serializable接口的代价有哪些?
32、 如果超类没有提供一个可访问的无参构造器,它的子类可以被序列化吗?
33、 当一个实例采用默认的序列化形式,并且给某些域标记为transient,那么当实例反序列化回来后,这些标志为transient域的值各是些什么呢?
34、 序列化代理模式(Serialization Proxy Pattern)有哪些局限性?它所增强的功能和安全性带来的后果是什么?
分享到:
相关推荐
EJ汉化版,狂暴战DPS计算器 EJ汉化版,狂暴战DPS计算器
**知识点:EJ1模块式温控器操作手册解析** **一、EJ1模块式温控器概述** EJ1模块式温控器是一种专为精确控制温度环境设计的设备,广泛应用于需要高精度温度调节的各种场景。该温控器采用先进的技术,能够实现对...
6. **性能优化**:EJB超时问题通常提示我们关注代码性能。通过分析和优化数据库查询、减少不必要的计算、优化算法等手段,可以缩短方法执行时间,降低超时发生的可能性。 7. **监控与报警**:使用日志监控和报警...
Jazelle技术则是针对Java字节码的直接执行而设计,减少了代码转换的开销,提高了执行效率。 #### 发展历程 自2001年首次发布以来,ARM926EJ-S经历了多次版本迭代,每一次更新都包含了性能改进和技术修正。从2001年...
exe4j是EJ Technologies开发的一款工具,能够将Java应用程序转换为Windows平台下的exe文件,同时提供JRE捆绑选项,确保目标机器上即使没有安装Java环境也能运行程序。exe4j还支持高级定制功能,如自定义图标、版本...
《ARM926EJ-S技术文档》是ARM公司针对其ARM926EJ-S处理器发布的详尽技术参考手册,版本号为DDI0198E,修订版为r0p5。该文档全面介绍了ARM926EJ-S处理器的各项特性、架构设计、指令集以及开发和调试指南,旨在帮助...
然而,传统的Java技术应用于嵌入式系统时,主要问题在于Java虚拟机的动态加载和垃圾收集器导致的实时性和任务执行时间的不可预测性。为解决这些问题,Sun公司与IBM、Microsoft等企业制定了实时Java规范(RTSJ),为...
将Java项目打包成可执行文件是一项常见的需求,尤其是在部署应用程序到非开发环境时。通过将Java项目转换为可执行文件(.exe),可以方便地在Windows操作系统上运行,无需用户安装Java运行环境(JRE)。本文将详细...
2. **集成Jazelle DBX技术**:这是ARM926EJ-S的核心优势之一,Jazelle DBX技术使得处理器可以直接执行Java字节码,大大提高了Java应用的执行效率,降低了代码大小,非常适合Java密集型应用。 3. **代码密度优化**:...
"ARM926EJ-S技术参考手册" ARM926EJ-S技术参考手册是ARM公司发布的一份技术文档,旨在为开发者提供ARM926EJ-S处理器的详细技术信息。该手册涵盖了ARM926EJ-S处理器的系统控制协处理器CP15编程模型、MMU、Cache、TCM...
在Java开发过程中,有时候我们需要将编写的Java应用程序封装成可以在Windows系统上直接运行的exe格式文件。这不仅能够提高应用程序的易用性,还可以减少用户安装JRE(Java运行环境)的需求,进一步简化用户的操作...
本文将详细探讨如何使用exe4j工具将Java应用程序转换为Windows平台上的exe可执行文件,以及在这一过程中可能遇到的关键步骤与技巧。 #### 一、了解exe4j **exe4j**是一款由Ej-technologies公司开发的工具,专门...
### Java跨平台软件如何打包成一个EXE文件详解 在Java开发中,为了方便不同操作系统下的用户使用,经常需要将Java程序打包成可执行文件。本文主要介绍如何使用exe4j工具将Java程序(通常为.jar文件)打包成Windows...
Exe4j是一款由EJ Technologies公司开发的实用工具,主要用于将Java应用程序转换为Windows平台下的可执行文件(.exe)。这个工具对于那些希望在没有Java运行环境的计算机上运行Java程序的开发者来说非常有用。Exe4j ...
Java程序在运行时需要JVM(Java虚拟机)的支持,但在一些情况下,用户可能希望将Java应用程序打包成可执行的本地二进制文件,以便在没有安装JVM的机器上直接运行。`exe4j`就是这样一款强大的工具,它允许Java开发者...
在本主题"JAVA-Clase6Ej3"中,我们关注的是JAVA Clase 6的一个实例,Ejemplo 3。这个例子深入探讨了数据库管理,特别是与达托斯基地(可能是数据存储或数据库练习的虚构场景)相关的概念。在这一部分,我们将讨论两...
在软件开发领域,特别是针对Java开发者而言,了解如何将Java程序转换为可执行文件是至关重要的技能之一。这不仅能提高应用程序的易用性和分发便捷性,还能有效保护源代码不被轻易查看或修改。 #### 二、基本概念:...
【EJ511 USB3.1 Gen1 视频捕获集成电路】 EJ511是一款专为USB3.1 Gen1视频捕捉设计的集成电路,由Etron Technology, Inc.开发。USB3.1 Gen1是USB 3.0规范的一部分,提供最高5Gbps的数据传输速率,比USB2.0的480Mbps...
BTT3050EJ是英飞凌(INFINEON)公司生产的一款汽车级智能功率开关芯片,专为24伏系统设计,具备单通道控制能力。该芯片封装形式为PG-TDSO-8,能够为电子控制单元(ECU)和其他汽车应用提供安全而高效的动力管理解决...