现在的位置: 首页 > 综合 > 正文

Collection List Set Map 区别记忆

2013年09月16日 ⁄ 综合 ⁄ 共 1507字 ⁄ 字号 评论关闭


Collection List Set Map


区别记忆

转者注:关于
Java
中的集合,在这里主要从其元素是否有序,是否可重复来进行区别记忆,以便恰当地使用。以下是正文:

 

List
接口对
Collection
进行了简单的扩充,它的具体实现类常用的有
ArrayList

LinkedList
。你可以将任何东西放到一个
List
容器中,并在需要时从中取出。
ArrayList
从其命名中可以看出它是一种类似数组的形式进行存储,因此它的随机访问速度极快,而
LinkedList
的内部实现是链表,它适合于在链表中间需要频繁进行插入和删除操作。在具体应用时可以根据需要自由选择。前面说的
Iterator
只能对容器进行向前遍历,而
ListIterator
则继承了
Iterator
的思想,并提供了对
List
进行双向遍历的方法。

 

Set
接口也是
Collection
的一种扩展,而与
List
不同的是,在
Set
中的对象元素不能重复,也就是说你不能把同样的东西两次放入同一个
Set
容器中。它的常
用具体实现有
HashSet

TreeSet
类。
HashSet
能快速定位一个元素,但是你放到
HashSet
中的对象需要实现
hashCode()
方法,它使用了前面说过的哈希码的算法。而
TreeSet
则将放入其中的元素按序存放,这就要求你放入其中的对象是可排序的,这就用到了集合框架提供的另外两个实用类
Comparable

Comparator
。一个类是可排序的,它就应该实现
Comparable
接口。有时多个类具有相同的排序算法,那就不需要在每分别重复定义相同的排序算法,只要实现
Comparator
接口即可。集合框架中还有两个很实用的公用类:
Collections

Arrays

Collections
提供了对一个
Collection
容器进行诸如排序、复制、查找和填充等一些非常有用的方法,
Arrays
则是对一个数组进行类似的操作。

 

Map
是一种把键对象和值对象进行关联的容器,而一个值对象又可以是一个
Map
,依次类推,这样就可形成一个多级映射。对于键对象来说,像
Set
一样,一个
Map
容器中的键对象不允许重复,这是为了保持查找结果的一致性
;
如果有两个键对象一样,那你想得到那个键对象所对应的值对象时就有问题了,可能你得到的并不是你想的那个值对象,结果会造成混乱,所以键的唯一性很重要,也是符合集合的性质的。当然在使用过程中,某个键所对应的值对象可能会发生变化,这时会按照最后一次修改的值对象与键对应。对于值对象则没有唯一性的要求。你可以将任意多个键都映射到一个值对象上,这不会发生任何问题(不过对你的使用却可能会造成不便,你不知道你得到的到底是那一个键所对应的值对象)。
Map
有两种比较常用的实现:
HashMap

TreeMap

HashMap
也用到了哈希码的算法,以便快速查找一个键,
TreeMap
则是对键按序存放,因此它便有一些扩展的方法,比如
firstKey(),lastKey()
等,你还可以从
TreeMap
中指定一个范围以取得其子
Map
。键和值的关联很简单,用
pub (Object key,Object value)
方法即可将一个键与一个值对象相关联。用
get(Object
key)

可得到与此
key
对象所对应的值对象。

 

下图为不同容器里元素是否有序与是否重复对照

 

有序否

允许元素重复否

Collection



List



Set

AbstractSet



HashSet

TreeSet

是(用二叉树排序)

Map

AbstractMap


使用key-value
来映射和存储数据,Key
必须惟一,value
可以重复

HashMap

TreeMap

是(用二叉树排序)

 

 

抱歉!评论已关闭.