这篇笔记对几个常用的集合实现,从效率,线程安全和应用场景进行综合比较。

>>ArrayList、LinkedList与Vector的对比

(1)相同和不同
都实现了List接口,使用类似。
Vector和ArrayList的底层实现都是数组,这一点与LinkedList的双向链表不同。
Vector和ArrayList在更多元素添加进来时会请求更大的空间。Vector每次请求其大小的双倍空间,而ArrayList每次对size增长50%。
(2)线程安全
ArrayList、LinkedList都没有进行同步,可以使用 Collections的同步方法进行包装。

(3)性能比较
在ArrayList和Vector中,从一个指定的位置(通过索引)查找数据或是在集合的末尾增加、移除一个元素所花费的时间是一样的,这个时间我们用O(1)表示。但是,如果在集合的其他位置增加或移除元素那么花费的时间会呈线形增长:O(n-i),其中n代表集合中元素的个数,i代表元素增加或移除元素的索引位置,即时间复杂度O(N)。为什么会这样呢?因为数组在内存上是连续的,进行上述操作的时候集合中第i和第i个元素之后的所有元素都要执行位移的操作。
如果你只是查找特定位置的元素或只在集合的末端增加、移除元素,那么使用Vector或ArrayList都可以。如果是其他操作,你最好选择其他的集合操作类。比如,LinkList集合类在增加或移除集合中任何位置的元素所花费的时间都是一样的O(1),但它在索引一个元素的是有比较慢,O(i),其中i是索引的位置。

>>HashMap与HashTable比较

(1)是否允许空值
HashMap允许 null 值(key和value都可以),Hashtable不允许 null 值(key 和 value 都不可以),
这一点在之前学习源码时也注意到了,看一下HashTable的源码:

 public synchronized V put(K key, V value) {
        // Make sure the value is not null
        if (value == null) {
            throw new NullPointerException();
        }
		......
    }

(2)哈希值的使用不同
Hashtable直接使用对象的hashCode,代码是这样的:

int hash = key.hashCode();
int index = (hash & 0x7FFFFFFF) % tab.length; 

而HashMap重新计算hash值,这一点在之前的分析中也看到了:

int hash = hash(k);
int i = indexFor(hash, table.length); 

另外还有一些如内部链表数组使用方式不同等差异。

(3)线程安全
HashMap和HashTable在线程安全性上就如同ArrayList和Vector类似,
HashTable的操作都使用synchronized做了同步。需要注意这是一种性能较低的线程安全。

>>HashSet和HashMap的区别

HashSet 实现了 Set 接口,它不允许集合中有重复的值,在将对象存储在 HashSet 之前,要先确保对象重写 equals()和 hashCode()方法,这样才能比较对象的值是否相等,以确保set中没有储存相等的对象。
HashMap 实现了 Map 接口,Map 接口对键值对进行映射。Map 中不允许重复的键。Map 接口有两个基本的实现,HashMap 和 TreeMap。TreeMap 保存了对象的排列次序,而 HashMap 则不能。HashMap 允许键和值为 null。

(1)不同之处
HashMap实现了Map接口 HashSet实现了Set接口
HashMap储存键值对 HashSet仅仅存储对象
使用put()方法将元素放入map中 使用add()方法将元素放入set中
HashMap中使用键对象来计算hashcode值 HashSet使用成员对象来计算hashcode值,对于两个对象来说hashcode可能相同,所以equals()方法用来判断对象的相等性,如果两个对象不同的话,那么返回false
HashMap比较快,因为是使用唯一的键来获取对象 HashSet较HashMap来说比较慢

(2)线程安全
HashMap 是非 synchronized 的。

Java集合源码学习(五)几种常用集合类的比较的更多相关文章

  1. Java集合源码学习(一)集合框架概览

    >>集合框架 Java集合框架包含了大部分Java开发中用到的数据结构,主要包括List列表.Set集合.Map映射.迭代器(Iterator.Enumeration).工具类(Array ...

  2. Java集合源码学习(二)ArrayList分析

    >>关于ArrayList ArrayList直接继承AbstractList,实现了List. RandomAccess.Cloneable.Serializable接口,为什么叫&qu ...

  3. Java集合源码学习(二)ArrayList

    1.关于ArrayList ArrayList直接继承AbstractList,实现了List. RandomAccess.Cloneable.Serializable接口,为什么叫"Arr ...

  4. Java集合源码学习(四)HashMap分析

    ArrayList.LinkedList和HashMap的源码是一起看的,横向对比吧,感觉对这三种数据结构的理解加深了很多. >>数组.链表和哈希表结构 数据结构中有数组和链表来实现对数据 ...

  5. Java集合源码学习(三)LinkedList分析

    前面学习了ArrayList的源码,数组是顺序存储结构,存储区间是连续的,占用内存严重,故空间复杂度很大.但数组的二分查找时间复杂度小,为O(1),数组的特点是寻址容易,插入和删除困难.今天学习另外的 ...

  6. Java集合源码学习(四)HashMap

    一.数组.链表和哈希表结构 数据结构中有数组和链表来实现对数据的存储,这两者有不同的应用场景,数组的特点是:寻址容易,插入和删除困难:链表的特点是:寻址困难,插入和删除容易:哈希表的实现结合了这两点, ...

  7. Java集合源码学习(三)LinkedList

    前面学习了ArrayList的源码,数组是顺序存储结构,存储区间是连续的,占用内存严重,故空间复杂度很大.但数组的二分查找时间复杂度小,为O(1),数组的特点是寻址容易,插入和删除困难.今天学习另外的 ...

  8. Java集合源码学习(一)Collection概览

    1.集合框架 Java集合框架包含了大部分Java开发中用到的数据结构,主要包括List列表.Set集合.Map映射.迭代器(Iterator.Enumeration).工具类(Arrays.Coll ...

  9. Java集合源码分析(三)LinkedList

    LinkedList简介 LinkedList是基于双向循环链表(从源码中可以很容易看出)实现的,除了可以当做链表来操作外,它还可以当做栈.队列和双端队列来使用. LinkedList同样是非线程安全 ...

随机推荐

  1. 第3次作业,c语言

    <C语言程序设计>实验报告 学 号    160809201  姓 名    王浩然专业.班    计科16-2班 学    期  2016-2017 第1学期  指导教师    黄俊莲 ...

  2. 网易CC研发工程师 笔试题2016-04-15

    题目: 1.判断一个数是否是3的幂.  2.判断一个数是否是3的幂,不用循环或递归.  3.正则表达式用来匹配电话号码.  例:(020) 12345678  020-12345678  还有一题正则 ...

  3. java的ArrayList使用方法

    在第N个数据后面添加一个数据 用法: 在第1个元素后面添加E list.add(1, "E");

  4. django xadmin自定义菜单

    1. 自定义菜单 adminx.py class GlobalSetting(object): site_title = u'xxx后台' def kuF_site_menu(self): retur ...

  5. django-cms安装

    ubuntu:12.04 (32bit) djangocms 0.5.1 =========================== 首先,跟着这个做: https://github.com/divio/ ...

  6. 转:sql之left join、right join、inner join的区别

    left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录 right join(右联接) 返回包括右表中的所有记录和左表中联结字段相等的记录inner join(等值连接) 只 ...

  7. Python操作excel,及图表展示

    学习:http://www.cnblogs.com/Lands-ljk/p/5444619.html

  8. Insert Delete GetRandom O(1) I & II

    Design a data structure that supports all following operations in O(1) time. insert(val): Inserts an ...

  9. FIDO 标准简介

    FIDO 联盟(Fast IDentity Online Alliance)简介 网站:http://fidoalliance.org FIDO Alliance,成立于2012年7月. FIDO的目 ...

  10. ACM/ICPC 之 Bellman Ford练习题(ZOJ1791(POJ1613))

    这道题稍复杂一些,需要掌握字符串输入的处理+限制了可以行走的时间. ZOJ1791(POJ1613)-Cave Raider //限制行走时间的最短路 //POJ1613-ZOJ1791 //Time ...