再读thinking in java -- 第十七章 容器深入研究(一)

填充容器可通过Collections.nCopies()和Collection.fill(),都采用单对象。fill()只能替换已有元素,不能添加新元素,可用Generator解决(利用泛型)。addAll方法是所有Collection子类的一部分。

LinkedHashSet维护的是保持了插入顺序的列表。用Generator填充,即覆盖了next()

调用iterator()一般返回一个匿名类的Iterator对象

每个java.util容器都有自己的Abstract类。若产生的容器是只读的,那需要提供的方法将减少到最少。

想检查Collection中的元素,必须使用迭代器。

执行各种不同的操作和移除的方法在Collection接口中都是可选操作,即实现类并不需要为这些方法提供功能定义(可定义,也可不定义)。若一个操作是可选的,编译器会要求只能调用该接口的方法。将方法定义成可选的原因:防止在设计中出现接口爆炸的情况。

Arrays.asList()会生成一个List,基于一个固定大小的数据,仅支持那些不会改变数组大小的操作。应把Arrays.asList()的结果作为构造器的参数传递给任何Collection或使用addAll/Collection.addAll静态方法。这样可生成允许使用所有方法的普通容器。

基本List大多数只调用add方法添加对象,使用get方法一次取出一个元素,以及条用iterator方法获取该序列的Iterator对象。

不同的Set实现不仅具有不同的行为,而且它们对于可以在特定的Set中放置的元素类型也有不同的要求。

具体:

Set(interface)    

存入Set的每个元素都必须是唯一的,因为Set不保存重复元素。加入Set的元素必须定义equals方法以确保对象的唯一性。Set和Collection有完全一样的接口。Set接口不保证维护元素的次序。

HashSet

为快速查找而设计的Set。加入HashSet的元素必须兴义hashCode方法

TreeSet

保持次序的Set,底层为树结构。元素必须实现Comparable接口

LinkedHashSet

具有HashSet的查询速度,且内部使用链表维护元素的顺序(插入顺序),使用迭代器遍历时,远古三按插入顺序显示,元素必须定义hashCode方法


一般将HashSet作为默认选择,它对速度进行了优化。在覆盖equals方法使,最好总是同时覆盖hashCode方法。

对于SortedSet,TreeSet是其唯一实现。SortedSet是按对象比较函数对元素排序,而不是插入次序。要实现后者要求可用LinkedHashSet

除了并发应用,Queue仅用来实现LinkedList和PriorityQueue。

标准java类库中包含了Map的几种基本实现,包括HashMap,TreeMap,LinkedHashMap,WeakHashMap。ConcurrentHashMap,IdentityHashMap。

当在get方法中使用线性搜索时,执行速度回相当慢。HashMap中使用了散列码来取代对键的缓慢搜索。散列码是相对唯一的,用以代表对象的int值。它是通过对该对象某些信息进行转换而生成的。其中hashCode方法是根类Object中的方法。所以所有java对象都能产生散列码。

具体Map信息:

HashMap:

Map基于散列表的实现(它取代了HashTable)。插入和查询开销固定。可以通过构造器设置容量和负载因子调整性能。

LinkedHashMap

类似于HashMap,迭代遍历取得的顺序是插入顺序。只比HashMap慢一点,迭代访问更快

TreeSet

基于红黑树实现,实现Comparable或者Comparator接口。所得到的的结果是经过排序的。TreeMap是唯一带有subMap方法的Map,它返回一个子树

WeakHashMap

弱键(weak key)映射,允许释放映射所指向的对象。如果映射之外么有引用指向某个键,则此键可被GC回收

ConcurrentHashMap

线程安全的Map,它不涉及同步加锁

IdentityHashMap

使用==代替equals方法,对键进行比较的散列映射



评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值