java tips and items 20071020,items20071020
java tips and items 20071020,items20071020
1Use nested classes for better organization
2Object initialization in Java3 关于java的hashCode方法
4 java equals
5 java1.5泛型指南
6 How to avoid traps and correctly override methods from java.lang.Object
7 collection framework
Iterable
Iterable
△
|
Collection Map Iterator RandomAccess
△ △ △
| | |
| | |
|-------|--------| | |
List Set Queue SortedMap ListIterator
△
|
|
SortedSet
Set就是Collection,它们有一样的接口(除TreeSet)。其他两种Collection的子类,都有扩展行为。
List主要有两种:ArrayList和LinkedList,前者是基于数组的List,后者是基于链表的List。它们的区别也主要在其不同的实现上(数组 or链表)。LinkedList有实现Stack的所有功能的方法,所以可以直接将LinkedList做为Stack来使用。但是这样会给Stack 引入额外的方法,因此一种比较好的方式是,使用组合/聚集复用的方式:将一个LinkedList对象作为Stack类的成员。而不是直接使用 LinkedList或继承LinkedList。(这个问题可引申为继承复用与组合/聚集复用的问题。)注意:java api中使用了继承于List的Stack:List---AbstractList.....--Stack,这样的设计是不成功的。
Queue接口,LinkedList实现了该接口。
Map可以生成键的Set,值的Collection,键值对的Set。因为键和键值对不可能重复,所以用了Set。
java.util.Arrays和java.util.Collections是两个对应于数组和Colleciton的工具类,包括了创建,排序,比较等功能。
Collection的toString()被override了,所以每个Collection可以直接print。但是要打印数组,要么自己遍历,要么使用Arrays.toString(...)。Collections里没有override方法toString()。
容器使用时,不建议使用过时的Vector,Hashtable,Stack。
8 垃圾收集
How can you force garbage collection of an object?
A. Garbage collection cannot be forced
B. Call System.gc().
C. Call System.gc(), passing in a reference to the object to be garbage collected.
D. Call Runtime.gc().
E. Set all references to the object to new values(null, for example).
解答:A
点评:在Java中垃圾收集是不能被强迫立即执行的。调用System.gc()或 Runtime.gc()静态方法不能保证垃圾收集器的立即执行,因为,也许存在着更高优先级的线程。所以选项B、D不正确。选项C的错误在于, System.gc()方法是不接受参数的。选项E中的方法可以使对象在下次垃圾收集器运行时被收集。
9 整数向下转型,数据类型的转型问题:
任何基本类型都可以转换为其他基本类型,除boolean,即boolean不能与其他类型互转。因此,在不同基本类型的转换中存在向上转(拓展原始类型)和向下转(窄化原始类型)两种方式。 注意三元操作符:条件操作符?:,确定条件操作符的结果的数据类型要用复杂的规则:
- 如果第二个和第三个操作数具有相同的类型,那么它就是条件表达式的类型。换句话说,你可以通过绕过混合类型的计算来避免大麻烦。
- 如果一个操作数的类型是T,T表示byte、short或char,而另一个操作数是一个int类型的常量表达式,它的值是可以用类型T表示的,那么条件表达式的类型就是T。
- 否则,将对操作数类型运用二进制数字提升,而条件表达式的类型就是第二个和第三个操作数被提升之后的类型。
-
- char x = 'X';
结果:X
88
另外,从较窄的整型转换成较宽的整型时的符号扩展行为:如果最初的数值类型是有符号的,那么就执行符号扩展;如果它是char,那么不管它将要被转换成什么类型,都执行零扩展。
10 复合运算符
E1 op= E2 不是等于 E1 = E1 op E2,而是:E1 = (T)((E1)op(E2)),其中T是E1的类型,除非E1只被计算一次。 关于复合运算符的注意:要求两个操作数都是原始类型的,例如int,或包装了的原始类型,例如Integer,但是有一个例外:如果在+=操作符左侧的操作数是String类型的,那么它允许右侧的操作数是任意类型,在这种情况下,该操作符执行的是字符串连接操作。
11 容易遗忘的工具:Collections和Arrays
12 官方关于classpath的解释(三种classpath,对了解classpath足够详尽了) 1 深入研究Servlet线程安全性问题(好文)
none
相关文章
- 暂无相关文章
用户点评