Java容器类类库

完整的容器分类法:
完整的容器分类法
Java容器类类库的作用是保存对象,并将其划分为两个不同的概念:
1)Collection(接口) 一个独立元素的序列,这些元素都服从一条或多条规则。
List必须按照插入的顺序保存元素,而Set不能有重复的元素,Queue按照排队规则来确定对象产生的顺序(通常与它们被插入的顺序相同)
主要方法:add,equals,hashCode,remove,clear ,size,iterator等
2)Map(接口) 又称为关联数组,是一组成对的“键值对”对象,使用键对象来查找值对象。
主要方法:get,equals,clear,hashCode,put,remove,size等
四种容器:List,Set,Map,Queue,均为接口,除Map外,都继承了Collection接口,所以都拥有Collection中的方法
一、List
1、List的实现:ArrayList,LinkedList
ArrayList:主要用于随机访问大量元素,但是在List的中间插入和移除元素时较慢,按照插入的顺序保存元素,其底层实现是数组
LinkedList:可以以较低的代价在List中间进行插入和删除操作,按照插入的顺序保存元素,其底层实现是链表
List的主要方法:除继承了Colloction内的方法还扩展了get,set等方法。
2、List的选择
在LinkedList的插入和移除代价相当低廉,并且不随列表尺寸发生变化,这是因为在LinkedList中插入元素时只需链接新的元素,而不必修改链表中剩余的元素,
但在ArrayList中插入元素时代价特别高,并且其代价随链表尺寸的增加而增加,这是因为在ArrayList插入元素时,必须创建空间并将它的所有引用向前移动。
二、Set
1、Set的实现:HashSet, TreeSet, LinkedHashSet
HashSet:为快速查找而定义的Set,存入Hash Set的元素必须定义hashCode(),即散列函数。
TreeSet:保持次序的Set,底层为红-黑数结构,使用它可以从Set中提取有序的序列,元素必须实现Comparable接口。
LinkedHashSet:拥有HashSet的查询速度,所以也使用了散列函数,内部使用了链表来维护元素的插入顺序,所以在使用迭代器遍历Set时,结果会按元素的插入的次序显
示。元素也必须定义hashCode()方法。
Set的主要方法:除了继承了Collection内的方法,没有额外功能。
2、Set的选择
HashSet的性能基本上总是比TreeSet好,特别是在添加和查询元素时。TreeSet存在的唯一原因是它可以维持元素的排序状态,所以只有当需要一个排好序的Set时,才应该
使用TreeSet.因为TreeSet内部结构支持排序,并且因为迭代是我们更有可能执行的操作,所以用TreeSet迭代通常比HashSet要快。对于插入操作,LinkedHashSet比
HashSet的代价更高,这是由维护链表所带来的额外开销造成的。
3、SortedSet:其中的元素可以保证处于排序状态,按对象的比较函数对元素进行排序而不是插入顺序,TreeSet是其实现。
三、Map
1、Map的实现:HashMap , TreeMap, LinkedHashMap, WeakHashMap,ConcurrentHashMap,IdentityHashMap
HashMap:提供了最快的查找技术,基于散列表的实现,取代了HashTable,插入和查询“键值对”的开销是固定的。可以通过构造器设置容量和负载因子,以调整容
器的性能。必须有hashCode()和equals()方法。
TreeMap:基于红-黑树的实现,查看“键”或“键值对”时,它们会被排序(次序由Comparable或Comparator决定)。按照比较结果的升序保存键,所得到的结果是
经过排序的。TreeMap是唯一的带有subMap()方法的Map,它可以返回一个子树。必须实现Comparable接口。
LinkedHashMap:类似于HashMap,但是迭代遍历是时取得“键值对”的顺序是其插入次序,或者是最近最少使用(LRU)的次序,只比HashMap慢一点,而在
而在迭代访问时反而更快,因为它使用链表维护内部次序。必须实现hashCode()和equals()。
WeakHashMap:弱键映射,允许释放映射所指向的对象,这是为解决某类特殊问题而设计的。如果映射之外没有引用指向某个“键”,则此键可以被垃圾收集器回收
ConcurrentHashMap:一种线程安全的Map,它不涉及同步加锁。
IdentityHashMap:使用==代替equals()对“键”进行比较的散列映射。专为解决特殊问题而设计的。
2、Map的选择
使用Map时,第一选择应该是HashMap,只有在要求Map始终保持有序时,才需要使用TreeMap。
LinkedHashMap在插入时比HashMap慢一点,因为它维护散列数据结构的同时还要维护链表(以保持插入顺序),正是由于这个链表,使其迭代速度更快。
3、SortedMap:TreeMap是其唯一实现,可以确保键处于排序状态。
四、Queue:
1、队列是先进先出(FIFO)的容器,只能从一端放入,从另一端取出。由于LinkedList添加了可以使其用作栈、队列或双端队列的方法,所以可以用LinkedList实现Queue
接口,
Queue接口中的方法:offer(),peek()和element()在不移除的情况下返回队头,poll()和remove()将移除并返回队头。
2、PriorityQueue:优先级队列声明下一个弹出元素是最需要的元素(具有最高的优先级)。
3、双向队列:可以在任何一端添加或移除。
五、Java 1.0/1.1的容器(尽量避免使用以下容器)
1、Vector:唯一可以自我扩展的序列,但缺点过多
2、Enumeration:迭代器的新名字–枚举,它比Iterator接口小。
3、HashTable:用HashMap代替。
4、Stack:继承了Vector。
六、散列和散列码
散列的价值在于速度,散列使得查询得以快速进行。存储一组元素最快的数据结构是数组,所以使用数组来存储键的信息。数组并不保存键本身,而是通过键对象生成一个数字,
将其作为数组的下标,这个数字就是散列码,由定义在Object中的、且可能由你的类覆盖的hashCode()方法生成。不同的键可以产生相同的下标,所以解决了数组容量被固定
的问题,但同时可能会由冲突。通常,冲突由外部链接处理:数组并不直接保存值,而是保存值的list,然后队list中的值使用equals()方法进行线性查询。默认的hashCode
产生的散列码是对象的地址,而在实际程序中不一定是将地址作为散列码,所以需要覆盖hashCode()方法,同时需要覆盖equals()方法来比较当前的键与表中的键是否相
同,因为equals()默认比较的是对象的地址,而键不一定总是由地址构成。**

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

那个小白猿

讨杯可乐

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值