如果一个程序只包含固定数量的且其生命都是已知的对象,那么这是一个非常简单的程序
1。无论使用哪种类型的数组,数组标识符其实只是一个引用,指向在堆中创建的一个真实对象,这个数组对象用以
保存指向其它对象的引用。可以作为数组初始化语法隐式创建,或者用new 表达式显式的创建。只能用"[ ]"访问
数组对象唯一的方式。
2。可以任意返回一个数组,不用担心回收,只要你需要,它就一直存在。
3。Arrays类,并不是封装数组。而是提供了一套重载static方法。有四种基本方法:equals()比较
两个数组是否相等,fill()用于以某个值填充整个数组,sort()用于对对象和基本类型对于数组排序,binarySearch()
用于载以排序的数组中查找元素。asList()接受任意数组为参数,并将其转换为List容器。
4。StringBuffer 比String更好。System.arraycopy()用于复制任意数组。
5。对象数组元素的排序。1)实现java.lang.Comarable接口(只有一个方法comareTo(Object o))。
2)在sort中提供一个Comparator 对象(实现Comparator接口),Comparator有comare()和equals()
两个方法。但不一定要实现equals()方法,因为Object 带有equals方法。
6。容器类一般分为List ,Set ,Map。java 2中对所以容器都经过了重新设计,其划分为Collection 和Map。
Collection,包含List:保持元素特定顺序,Set:不能有重复元素。
7。常用的,ArrayList ,LinkedList 是一种List ,迭代器是ListIterator 。
HashSet,TreeSet 是一种Set。要想保持Set元素顺序,使用LinkedHashSet。
HashMap,TreeMap是一种Map,要想保持Set元素顺序,使用LinkedHashMap。
8。java容器的缺点:对象加入容器的时候就丢失了类型信息。需要要"向下转型"。解决方法可以制作类型
明确的容器。
9。要打印类的对象,只需要覆盖类的toString()方法。
10。java迭代器具有限制:
1)使用方法iterator()要求容器返回一个Iterator。第一次调用Iterator的next()方法时,它返回序列的第一个元素
2)使用next()获得序列的下一个元素。
3)使用hasNext()检查序列是否还有元素。
4)使用remove()将迭代器新近返回的元素删除。
针对特定容器,也有相应的增强。
11。String后的+,会自动调用toString(),要防止无意中的递归。
public String toString(){
return "infiniterecursion address"+this+"/n";
}
应该使用super.toString()取得this。
12。Collection的功能: add,addAll,contains,containsAll,isEmpty,iterator,remove,
removeAll,retainAll,size,toArray(),toArray(Object[] a)。其中不包括访问选择元素的set方法,
如果要检索Collecion中的元素,必须使用迭代器。
List 有附增方法,但Set于Collection完全一直的接口。
13。Map功能方法:于容器Collection有类似。
方法put( K , V )添加一个"值"。containKey(),containValue() 测试Map中是否包含某个"键","值"。
14。JAVA类库包含几种类型的Map,包含:
HashMap 基于散列,取代HashTable.可以通过构造器设置容量和负载因子,调整性能。
TreeMap 基于红黑树,查看"键"和"键值对"时,它们会被排序。特点是结果是经过排序的。
LinkedHashMap 类似HashMap,用链表维护内部次序
WeakHashMap 弱键映射,允许释放映射所指的对象。如果映射之外没有引用指向某个"键",则此键可
被垃圾回收。
IndentityHashMap. 使用==代替equals对键进行比较的散列映射。专门解决特殊问题。
15。默认的Object.equals()只是比较对象的地址,如果要使用自己的类作为HashMap的键,必须重载
hashCode(), equals().
16。高效的hashCode()
1)给int 变量result赋予某个非零常数,如17。
2)为对象内每个有意义的字段f (即每个可以做equals操作的字段)计算一个散列码
boolean c = (f ? 0 : 1)
byte,char,short,int c = (int) f
long c = (int)(f^(f>>>32))
float c = Float.floatToIntBits(f)
double long l = Double.doubleToLongBits(f);
c = (int)(l^(l>>>32))
Object c = f.hashCode()
数组 对每个元素应用上述规则。
3)合并计算得到的散列码:
result = 37 * result + c ;
4)返回result
5)检测hashCode最后生成的结果,确保相同的对象有相同的散列码。
参看: Apache的"Jakara Commons"项目,jakarta.apache.org/commons/lang
17。java.lang.ref类库,为垃圾回收提供更大的灵活性。
如果想继续持有对某个对象的引用,希望以后还能访问到该对象,但是也希望能够允许垃圾回收器在内存
消耗殆尽的时候释放该对象。因该用Refercence 对象,有三个继承之抽象类Refercence的类;
SoftReference,WeakRefercence,PhantomReference。
用SoftReference和WeakReference,可以选择将他们放在ReferenceQueue(用作回收前清理工作的工具)。
而PhantomReference只能依赖于ReferenceQueue.
18。Collections类有很多有用的方法。max,min,indexOfSubList , lastIndexOfSubList , replaceAll ,
reverse , rotate , copy , swap , fill ..
Collection.unmodifiableColleciton(c),Colleciton.unmodifiableSet设定Colleciton,Map不可修改。
19。java1.0/1.1的容器,老代码。
Vector , Enumeration ,Stack , BitSet.