Java容器研究总结


                                      完整的容器类关系图:

    虚线框表示abstract类,你可以看到大量的类的名字都是以Abstract开头的。这些类可能初看起来有点令人困惑,但是它们只是部分实现了特定接口的工具。例如,如果你在创建自己的Set,那么并不用从Set接口开始并实现其中的全部方法,只需从AbstractSet继承,然后执行一些创建新类必需的工作。但是,事实上容器类库包含足够多的功能,任何时刻都可以满足你的需求,因此你通常可以忽略以Abstract开头的这些类。

  

  1.填充容器

  本小节概念容易混淆,理解不深。涉及了Generator,该类是作者BruceEckel自编的一个类。由此我们又可以联想到另外一个与之容易混淆的名词--Iterator。有如下信息可以帮助了解Generator和Iterator到底是什么:

  Generator:即生成器,这一种专门负责创建对象的类,也是工厂设计模式的一种应用,但其无需参数即可创建对象,是不是很嗮厉?佩服伟大的作者吧。其具体实现可参考《HINKING IN JAVA》。

  Iterator:本人理解,实现此接口你就可以实现迭代器的使用,但是得先构造其各个方法:hasNext()、next()、remove()、iterator()等。

这里提到了一个新的名次--享元。什么是享元?根据作者的理解,这是一种设计模式,“你可以在普通的解决方案需要过多的对象,或者产生普通对象太占用空间的时候使用”。

2.Collection

各个容器的底层是Collection,而其具有各个不同的操作,包括两个Collection的合并、输出最大最小元素、转换成元素数组等等,具体的使用还需依靠多编程来提高熟练。

3.可选操作

  未获支持的操作:可以使用Collections的静态方法unmodifiableList(list),这时保证了List的大小是不可修改的。

4.List的功能方法:

  除了最基本的几个,需要了解LinkedList可以当作栈和队列使用、并且其实每个list均可以返回一个iterator迭代器,然后循环访问list。

5.Set

  Set保证了链表元素里面不会出现重复的元素,有:Set,HashSet,TreeSet,LinkedSet。

  我们默认使用HashSet,保证速度,需定义HashCode()和equal()TreeSet可以实现排序,但是其元素要实现Comparable接口。LinkedSet具有高速度,需定义HashCode()和equal()。

6.队列

  可以使用LinkedList实现之,栈则反方向输出即可。有一种优先级队列(PriorityQueue),其元素只需编写相应的comoareTo方法,即可实现优先排序。双向队列(Dqueue),这是不存在的一个类,需要自己编写,方法全部使用LinkedList来暴露其方法。

7.Map

  Map是比较难而且重要的一个知识点,其维护了一个映射表,保存很多对键值。包括:HashMap(默认),TreeMap,LinkedMap,WeakHashMap,ConcurrentHashMap,IdentityHashMap。

这里有一个编写toString的实用方法:新建一个StringBuilder对象,将所有toString通过append方法集中在它身上,再一次返回该对象的toString。

LinkedHashMap有一个神奇的功能,将最近被使用的元素自动排至对尾,使用了LRU算法实现。

8.散列和散列码

  编写Map的时候,如果键需要用自己的类来填充,则该类需要覆写hashCode和equal方法。创建自己的Map的时候,需要同时定义Map.Entry的实现。好的hasncode方法应该产生分布均匀的散列码,所以书写hashCode()方法时,Joshua Bloch提到过:

a.为Int变量result赋予某个非零值常量,如17.

b.为对象内每个有意义的域f计算出一个Int散列码c,具体规则可自行定义。

c.合并计算得到的散列码:result=37*result+c

d.返回result

e.检查Hashcode()最后生成的结果,确保相同的对象有相同的散列码。

9.实用方法

Collections有很多的静态方法可供使用,包括Collection可设为可读,排序等。考虑简单的同步问题,有方法synchronizedList可实现自动同步。

注意:操作迭代器之后,确定没有再操作容器,否则会快速报错。

10.持有引用---Reference

  如果想继续持有某个对象的引用,以后可以访问,但是又想允许垃圾回收器释放,这时候可以使用一个ReferenceQueue队列来调用poll方法返回一个Reference对象。这里涉及了SoftReference、WeakReference、PhantomReference由强到弱排列,对应不同级别的“可获得性”。

11.旧容器

  虽然诸如Vector、Enumeration这类在编写时候就不该使用的旧容器,但是你仍然应该了解他们,因为有时候会遇到。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值