java tips and items 20071020

<script type="text/javascript"> function java(){ var java = document.getElementById("java"); var dt = document.getElementById("datastructure"); var db = document.getElementById("database"); java.style.display="block"; dt.style.display="none"; db.style.display="none"; } function dt(){ var java = document.getElementById("java"); var dt = document.getElementById("datastructure"); var db = document.getElementById("database"); dt.style.display="block"; java.style.display="none"; db.style.display="none"; } function db(){ var java = document.getElementById("java"); var dt = document.getElementById("datastructure"); var db = document.getElementById("database"); db.style.display="block"; java.style.display="none"; dt.style.display="none"; } </script>

1Use nested classes for better organization

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.Arraysjava.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';
    int i = 0;
    System.out.println(true ? x : 0);
    System.out.println(false ? i : x);

结果:X
88
另外,从较窄的整型转换成较宽的整型时的符号扩展行为如果最初的数值类型是有符号的,那么就执行符号扩展;如果它是char,那么不管它将要被转换成什么类型,都执行零扩展。

10 复合运算符

E1 op= E2 不是等于 E1 = E1 op E2,而是:E1 = (T)((E1)op(E2)),其中TE1的类型,除非E1只被计算一次。 关于复合运算符的注意:要求两个操作数都是原始类型的,例如int,或包装了的原始类型,例如Integer,但是有一个例外:如果在+=操作符左侧的操作数是String类型的,那么它允许右侧的操作数是任意类型,在这种情况下,该操作符执行的是字符串连接操作。

11 容易遗忘的工具:Collections和Arrays


12 官方关于classpath的解释(三种classpath,对了解classpath足够详尽了)
none

你可能感兴趣的:(java)