此题集根据在阅读
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的绝好资料,
EJ 380-1989 EJ 380-1989 EJ 380-1989
EJB超时调用,EJB超时调用,EJB超时调用,EJB超时调用
软件介绍/下载地址/猜你喜欢/网友评论/JProfiler10破解版是一款非常好用且功能强大的Java开发分析工具,可以有效地查看java运行内存使用情况,并拥有JDBC、JPA和NOSQL数据库分析、内存泄漏分析等实用功能,它可以...
JAVA-Clase6Ej3 Ejemplo 3 del Apunte de JAVA Clase 6 达托斯基地 MariaDB和MySQL CRUD(创建,读取,更新,删除) 存储过程
TLD5045EJ 英飞凌芯片 INFINEON 中文版规格书手册
TLF4949EJ 英飞凌芯片 INFINEON 中文版规格书手册
BTT3018EJ 英飞凌芯片 INFINEON 中文版规格书手册
BTT3050EJ 英飞凌芯片 INFINEON 中文版规格书手册
BTS3080EJ 英飞凌芯片 INFINEON 中文版规格书手册
TLS115B0EJ 英飞凌芯片 INFINEON 中文版规格书手册
BTF3125EJ 英飞凌芯片 INFINEON 中文版规格书手册
TLE4254EJ A 英飞凌芯片 INFINEON 中文版规格书手册
TLF80511EJ V50 英飞凌芯片 INFINEON 中文版规格书手册
TLF80511EJ V33 英飞凌芯片 INFINEON 中文版规格书手册
TLE4254EJ S 英飞凌芯片 INFINEON 中文版规格书手册
TLS125D0EJ 英飞凌芯片 INFINEON 中文版规格书手册
TLT125D0EJ 英飞凌芯片 INFINEON 中文版规格书手册
TLS115D0EJ 英飞凌芯片 INFINEON 中文版规格书手册