第11章:对象的集合.

如果一个程序只包含固定数量的且其生命都是已知的对象,那么这是一个非常简单的程序

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.
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值