码迷,mamicode.com
首页 > 编程语言 > 详细

java中的数组类与集合类详解及原理介绍

时间:2015-01-21 18:21:50      阅读:263      评论:0      收藏:0      [点我收藏+]

标签:

一、类结构概述

    当需要存储大量数据对象时,需要用到数组类或者集合类。java中的类结构如下(红色为接口,蓝色为类):

技术分享

Iterator接口:是对collection进行迭代的迭代器,它允许调用者利用定义良好的语义在迭代期间从迭代器所指向的collection移除元素。

Collection接口:Collection表示一组对象,最小存储数据颗粒是单一的

        List接口:是数组形式,允许数据重复;是有序的 collection(也称为序列),此接口的用户可以对列表中每个元素的插入位置进行精确地控制,用户可以根据元素的整数索引(在列表中的位置)访问元素,并搜索列表中的元素。

        Set接口:类似数学中的集合,是不允许数据重复的,并且最多包含一个null元素。

        Queue接口:在处理元素前用于保存元素的collection。除了基本的Collection 操作外,队列还提供其他的插入、提取和检查操作。

Map接口:采用key-value对应的数据结构。它提供三种collection 视图,允许以键集、值集或键-值映射关系集的形式查看某个映射的内容。映射顺序 定义为迭代器在映射的collection 视图上返回其元素的顺序。

二、类定义及实现原理

1、LinkedList

    LinkedList是List接口的链接列表实现,实现所有可选的列表操作,并且可以存放所有类型的元素(包括null)。LinkedList不是同步的,即如果至少一个线程从结构上修改(如添加或删除一个或多个元素的操作,修改元素值不是结构修改)不能保证其同步到所有线程。

   原理:LinkedList实质上是一个单向链表。

2、ArrayList

    ArrayList是List接口的大小可变数组的实现,实现了所有可选列表操作,并允许包括null在内的所有元素。ArrayList也不是同步的。

    原理:ArrayList本质就是一个数组。但是它是可以自动增加数组的大小,其add方法实质是一个数组如果这个数组满了就将创建一个比旧数组大的新数组,并将旧数组复制过去。

3、Vector

    Vector 类可以实现可增长的对象数组。与数组一样,它包含可以使用整数索引进行访问的组件。但是,Vector 的大小可以根据需要增大或缩小,以适应创建 Vector 后进行添加或移除项的操作。Vector类是线程安全的。

    原理:与ArrayList的实现基本相同,只是其方法都带有synchronized关键字。

4、HashSet

    HashSet类实现了Set 接口,由哈希表(实际上是一个 HashMap 实例)支持。它不允许集合对象中有重复的元素,不保证 set 的迭代顺序;特别是它不保证该顺序恒久不变,此类允许使用 null 元素。 HashSet不是同步的。

    原理:HashSet是基于HashMap实现的,其底层采用HashMap来保存所有元素,所有放入HashSet中的集合元素实际上由HashMap的key来保存,而HashMap的value则存储了一个PRESENT(静态Object对象)。为保证元素的不重复,采用一种算法判断要加入的对象内容是否相同,不同才会添加进去。

5、HashTable

    HashTable类实现了一个哈希表,该哈希表将键映射到相应的值,任何非null 对象都可以用作键或值。HashTable是同步的。为了成功地在哈希表中存储和获取对象,用作键的对象必须实现 hashCode 方法和 equals 方法。

    原理:HashTable是由数组+链表组成的数据结构。为了保证f(K) 的取值范围在0 <= f(K) < Array.Length,HashMap 的哈希算法核心为与 (&) 运算, f(K) = HashOf(K) & (Array.Length - 1), 运算时HashOf(K) 的高位同0 相与被丢弃, 低位同 1 相与被保留。而且要求哈希表的容量是一个偶数, 且为 2 的 N 次幂。当发生冲突时,采用“链地址法”解决冲突。

6、HashMap

    HashMap是基于哈希表的 Map 接口的实现,此实现提供所有可选的映射操作,并允许使用null 值和 null 键。此类不保证映射的顺序,特别是它不保证该顺序恒久不变。

    原理:HashMap的实现原理与HashTable的原理基本相同。

7、TreeMap

    TreeMap是基于红黑树(Red-Black tree)的NavigableMap 实现,TreeMap不是线程同步的。他最大的特点是能在O(n)的复杂度内完成数据的插入等操作,而数据也是排好序的。该映射根据其键的自然顺序进行排序,或者根据创建映射时提供的 Comparator 进行排序,具体取决于使用的构造方法。

    原理:利用红黑二叉平衡树存储元素,加快查找速度。

三、HashSet、HashTable、HashMap类比较

     哈希表之所以能够实现根据关键字 (典型的例子是一个字符串键值) 来获取记录, 是因为她在内部建立了记录存储位置 - 即内部数组中的索引号和关键字的一套对应关系 f, 因而在查找时, 只需根据这个映射关系 f 找到给定键值 K 对应的数 f(K), 就可直接从数组中取得目的数据 Hashtable[K] = Hashtable.InternalArray[f(K)], 而不必对数组进行遍历和比较. 这个对应关系 f 我们称为哈希函数.

HashSet:非同步的(非线程安全); 不允许有重复的值; 比HashMap慢; 保留了对象的排列次序

HashTable:同步的(线程安全) ; key和value不允许为null;单线程环境下慢;

HashMap:非同步的(非线程安全);  允许一个null的key和多个null的value ; 单线程环境下快; 不能保留对象的排列顺序

java中的数组类与集合类详解及原理介绍

标签:

原文地址:http://blog.csdn.net/u010515761/article/details/42970483

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!