ArrayList、Vector、LinkedList、HashMap、HashTable、Link
ArrayList、Vector、LinkedList、HashMap、HashTable、Link
完美世界 发表于4年前
ArrayList、Vector、LinkedList、HashMap、HashTable、Link
  • 发表于 4年前
  • 阅读 46
  • 收藏 0
  • 点赞 0
  • 评论 0

新睿云服务器60天免费使用,快来体验!>>>   

摘要: ArrayList、Vector、LinkedList、HashMap、HashTable、LinkedHashMap和TreeMap

一、ArrayList、Vector、LinkedList
ArrayList 和Vector是采取数组体式格式存储数据,此数组元素数大于实际存储的数据以便增长和插入元素,二者都容许直接序号索引元素,然则插入数据要设计到数组元素移动等内存操纵,所以索引数据快,插入数据慢;Vector因为应用了synchronized办法(如add、、remove、set、equals、hashcode等操纵),是以是线程安然,机能上比ArrayList要差。 
LinkedList应用双向链表实现存储,按序号索引数据须要进行向前或向后遍历,然则插入数据时只须要记录本项的前后项即可,所以插入速度较快!LinkedList双向链表,是指可以从first依次遍历至last(从头到尾),也可以从last遍历至first(从尾到头),但首尾没有构成环,不合于双向轮回链表(重视区分)。 
ArrayList和LinkedList的大致差别: 
    1.ArrayList是实现了基于动态数组的数据布局,LinkedList基于链表的数据布局。 
    2.对于随机接见get和set,ArrayList感觉优于LinkedList,因为LinkedList要移动指针。 
    3.对于新增和删除操纵add和remove,LinedList斗劲占上风,因为ArrayList要移动数据。 
ArrayList和LinkedList在机能上各有优毛病,都有各自所实用的处所,总的说来可以描述如下: 
1.对ArrayList和LinkedList而言,在列表末尾增长一个元素所花的开销都是固定的。对ArrayList而言,主如果在内部数组中增长一项,指向所添加的元素,无意可能会导致对数组从头进行分派;而对LinkedList而言,这个开销是同一的,分派一个内部Entry对象。 
2.在ArrayList的中心插入或删除一个元素意味着这个列表中残剩的元素都邑被移动;而在LinkedList的中心插入或删除一个元素的开销是固定的。
3.LinkedList不支撑高效的随机元素接见。 
4.ArrayList的空间浪费首要表如今在list列表的结尾预留必然的容量空间,而LinkedList的空间花费则表如今它的每一个元素都须要消费相当的空间 
可以如许说:当操纵是在一列数据的后面添加数据而不是在前面或中心,并且须要随机地接见此中的元素时,应用ArrayList会供给斗劲好的机能;当你的操纵是在一列数据的前面或中心添加或删除数据,并且遵守次序接见此中的元素时,就应当应用LinkedList了。 

二、HashMap、HashTable、LinkedHashMap和TreeMap
Java为数据布局中的映射定义了一个接口java.util.Map,它有四个实现类,分别是HashMap、HashTable、LinkedHashMap和TreeMap。 
Map 首要用于存储键(key)值(value)对,按照键获得值,是以键不容许键反复,但容许值反复。 Map 接口的哈希表和链接列表实现,具有可预知的迭代次序。此实现与 HashMap 的不合之处在于,后者保护着一个运行于所有条目标双重链接列表。此链接列表定义了迭代次序,该迭代次序凡是就是将键插入到映射中的次序(插入次序)。重视,若是在映射中从头插入 键,则插入次序不受影响。(若是在调用 m.put(k, v) 前 m.containsKey(k) 返回了 true,则调用时会将键 k 从头插入到映射 m 中。) 
HashMap是一个最常用的Map,它按照键的 HashCode 值存储数据,按照键可以直接获取它的值,具有很快的接见速度。HashMap最多只容许一笔记录的键为Null;允很多笔记录的值为 Null;HashMap不支撑线程的同步,即任一时刻可以有多个线程同时写HashMap;可能会导致数据的不一致。若是须要同步,可以用 Collections的synchronizedMap办法使HashMap具有同步的才能。 
Hashtable与HashMap类似,它持续自Dictionary类,不合的是:它不容许记录的键或者值为空;它支撑线程的同步,即任一时刻只有一个线程能写Hashtable,是以也导致了 Hashtable在写入时会斗劲慢。 
LinkedHashMap也是一个HashMap,然则内部保持了一个双向链表,可以对峙次序;LinkedHashMap 是比 HashMap 多了一个链表的布局。与 HashMap 比拟 LinkedHashMap 保护的是一个具有双重链表的HashMap,LinkedHashMap支撑两种排序,一种是插入排序,一种是应用排序,比来应用的会移至尾部例如 M1 M2 M3 M4,应用M3后为 M1 M2 M4 M3了,LinkedHashMap 输出时其元素是有次序的,而 HashMap 输出时是随机的,若是 Map 映射斗劲错杂而又请求高效力的话,最好应用 LinkedHashMap,然则多线程接见的话可能会造成不合步,所以要用 Collections.synchronizedMap 来包装一下,从而实现同步。 
TreeMap不仅可以对峙次序,并且可以用于排序(TreeMap可以或许把它保存的记录按照键排序,默认是按升序排序,也可以指定排序的斗劲器。)。TreeMap实现SortMap接口,可以或许把它保存的记录按照键排序,默认是按键值的升序排序,也可以指定排序的斗劲器,当用Iterator 遍历TreeMap时,获得的记录是排过序的。TreeMap的键和值都不克不及为空。 
一般景象下,我们用的最多的是HashMap,在Map 中插入、删除和定位元素,HashMap 是最好的选择。但若是您要按天然次序或自定义次序遍历键,那么TreeMap会更好。若是须要输出的次序和输入的雷同,那么用LinkedHashMap 可以实现,它还可以按读取次序来分列。LinkedHashMap保存了记录的插入次序,在用Iterator遍历LinkedHashMap时,先获得的记录必然是先插入的,在遍历的时辰会比HashMap慢,有HashMap的全部特点。 
Collator 类履行区分说话景象的 String 斗劲。应用此类可为天然说话文本构建搜刮和排序例程。 
Collator 是一个抽象基类,若是正好斗劲 String 一次,则 compare 办法可供给最佳机能。 但在对 String 列表排序时,凡是须要对每个 String 进行多次斗劲。 
在这种景象下,CollationKey 可供给更好的机能。CollationKey 类将一个 String 转换成一系列可与其他 CollationKey 进行按位斗劲的位。 
CollationKey 是由 Collator 对象为给定的 String 所创建的。 
不克不及直接创建 CollationKey。而是经由过程调用 Collator.getCollationKey 来生成。 
只能斗劲同一个 Collator 对象生成的 CollationKey。 
CollationKey 默示遵守特定 Collator 对象规矩的 String。 
斗劲两个 CollationKey 将返回它们所默示的 String 的相对次序。 
应用 CollationKey 来斗劲 String 凡是比应用 Collator.compare 更快。 
是以,当必须多次斗劲 String 时(例如,对一个 String 列表进行排序), 
应用 CollationKey 会更高效。 
遍历Map有两种办法: 
(1)map的keySet()办法获得键的凑集,再调用键凑集的iterator办法获得键的迭代器,以此迭代地取出Map中的键,用get办法获得键对应的值,便完成了Map的遍历。代码如下所示: 

//应用迭代器遍历Map的键,按照键取值
Iterator it = map.keySet().iterator();
    while (it.hasNext()){
    key = it.next();
    value = map.get(key);
    System.out.println("key: " + key + "; value: " + value );
}

 (2)应用Map的entrySet办法获得Map中记录的凑集,每条对象都是一个Map.Entry对象,应用其getKey办法获得记录的键,应用其getValue办法获得记录的值。代码如下所示: 

//或者应用迭代器遍历Map的记录Map.Entry
Map.Entry entry = null;
it = map.entrySet().iterator();
while (it.hasNext()){
//一个Map.Entry代表一笔记录
entry = (Map.Entry)it.next();
//经由过程entry可以获得记录的键和值
//System.out.println("key: " + entry.getKey() + "; value: " + entry.getValue());

 


  • 打赏
  • 点赞
  • 收藏
  • 分享
共有 人打赏支持
粉丝 11
博文 149
码字总数 134011
×
完美世界
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: