此题集根据在阅读
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)有哪些局限性?它所增强的功能和安全性带来的后果是什么?