java集合解析(二)

pan>当然,这个方法不高效。如果你发现自己正在使用该方法,那么你可能在使用错误的数据结构来解决你的问题。
 
12-1. 如果你有一个整数索引n,那么List.listIterator(n)将返回一个迭代器,它指向索引为n的元素前面的位置。也就是说,此时调用next产生的元素与调用list.get(n)方法得到的元素是相同的,只是要获取迭代器的效率是比较低的。
 
12-2.如果链表只有很少几个元素,那么我们完全不必为get和set方法的开销而烦恼。但是,我们为什么而是用链表呢?唯一的理由是为了尽量减少在列表中插入和移出元素时所花的代价。如果需要创建的列表只有少数几个元素。完全可以使用ArrayList。
     
12-3. 尽量避免使用以整数索引来表示链表中的位置的所有方法。如果需要随机访问某个集合。那么请使用数组或者ArrayList,而不是链表。
 
13. Vector和ArrayList的选择(当需要创建一个动态数组时)。Vector类的所有方法都是同步的(Synchronized);相反,ArrayList的方法是不同步的。所以,如果只用单个线程来访问Vector对象—这是更加常见的现象—那么你的代码会在同步操作上浪费相当多的时间。同样,ArrayList类的方法不是同步的,因此在不需要同步时应选择使用ArrayList而不是Vector
 
 
14. 讲一个元素添加到树集中的速度比将它添加到散列表中的速度要慢,但是仍然比将它添加到数组或者链表中的恰当位置要快。如果树集包含n个元素,那么平均需要log2 n次比较,才能找到新元素的正确位置
 
15. 如果要将自己的对象插入到树集中,必须通过实现Comparable借口来定义一个排序的顺序。Object类种的compareTo方法没有提供任何默认的实现!
 
15-1. 使用Comparable结构来定义排序是有明显的局限性的。对于一个给定类,该接口只能实现一次。如果想在一个集合中需要按部件编号队一组项进行排序, 而在另一个集合中却要按描述信息对项进行排序,此外,如果必须对一个类的对象进行排序,而这个类的创建者又不愿意劳神地实现Comparable接口时:
      这些情况下可以让树集使用不同的比较方法,将一个Comparator对象传递给树集的构造器,Comparator接口声明一个compare方法,它带有2个参数:
         public interface Comparator<T>
    {
        int compare(T a, T b)
    }
     
 
16. 对于是否应该总是使用树集来代替散列集,取决于想要收集的数据。因为使用数集时,添加元素并不需要花费太长的时间,各个元素就能够自动进行排序。但如果不 需要对数据进行排序,那么就没有理由在排序上花费不必要的开销。更为重要的事,对某些数据来说,要进行排序是非常困难的。
 
17. 映射表(Map)可以得到视图的3个方法:
    Set<K> keySet()
    Collection<K> values()
    Set<Map.Entry<K,V>> entrySet()
 
17-1. 从上面得到的迭代器(Set),如果调用迭代器的remove方法,实际上就是从映射表中移除某个键值以及与它相关联的值。但是。不能将元素添加到这个视图。
 
18.一些专用的集和映射表类:
    a. WeakHashMap(弱散列映射表)。当对键的唯一引用来自散列表元素项时,该数据结构与垃圾回收器相互合作,移除该键/值对。
    b. LinkedHashSet(链接散列表)和LinkedHashMap(链接散列映射表)。它们能够记住插入元素的顺序。这样就可以避免散列表中各个元素项从表面上看上去是随机排列的。
链接散列映射表将使用访问顺序而不是插入顺序来迭代映射表的各个元素项。访问顺序对实现高速缓存的“最近很少使用”原则非常有用。比如,在一些情况下,我们可以让迭代器进入该表,将它所枚举的最开头的几个元素移除掉,因为这些元素是最近最少使用的元素项。
c.     EnumSet(枚 举集)。EnumSet类是一个包含枚举类型元素的集得非常高效的实现。因为枚举类型只有有限个实例,所以EnumSet在内部是使用位序列来实现的。如 果某个值存在于集中,则相对应的位将被打开。EnumSet没有公共的构造器,我们可以使用静态工厂方法来构造枚举集。
d.     EnumMap(枚举表)。EnumMap是键类型为枚举类型的映射表。它可以简单而高效的使用一个值数组来实现。需要在构造器中指定键的类型。
e.     IdentityHashMap(表 示散列映射表)。在此类中,键的散列码不是由hashCode方法计算得来的,而是由System.identityHashCode方法计算得出。这是 Object.hashCode方法根据对象的内存地址来计算散列码时所使用的方法,另外,IdentityHashMap是用==,而不是equals 来对各个对象进行比较。IdentityHashMap类对实现对象遍历算法(比如对象的序列化)非常有用,在进行对象遍历时,它可以跟踪哪些对象已经被 遍历了。
 
     
19. Arrays类有个asList方法,它返回包装了一个普通java数组的List包装器。使用这个方法可以将一个数组传递给一个期望得到列表或者集合参数的方法。例如:
    Card[] cardDeck = new Card[52];
    …
    List<Card> cardList = Arrays.asList(cardDeck);
    上面代码返回的对象不是一个ArrayList,而是一个视图对象,它可以使用其get和set方法来访问底层的数组。所有能改变数组大小的方法(比如迭代其相关的add和remove方法)都抛出一个UnsupportedOperationException异常。从jdk5.0开始,asList方法被声明为一个具有可变数量参数的方法。除了可以传递一个数组外,还可以将各个元素直接传递给该方法。
视图技术在集合框架中有许多非常有用的应用(比如19。其他参考书中P106。。《java核心技术》第7版中文版第2卷,或e文版第2卷chapter2 section3 )

文章出处:飞诺网(http://www.diybl.com/course/3_program/java/javajs/200797/69998_2.html)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值