集合框架概述

Java集合框架图

Java 集合框架主要包括两种类型的容器:

  • 一种是集合(Collection),存储一个元素集合,
  • 另一种是图(Map),存储键/值对映射。

上图展示了整个集合大家族的成员以及他们之间的关系。接下来就各个接口、基类做一些简单的介绍(主要介绍各个集合的特点、区别)。

1、 Collection接口

单列集合类的接口,用于存储一系列符合某种规则的元素,它有两个重要的子接口,分别是ListSet

2、List接口

List接口为Collection直接接口。List所代表的是有序的Collection,即它用某种特定的插入顺序来维护元素顺序。用户可以对列表中每个元素的插入位置进行精确地控制,同时可以根据元素的整数索引(在列表中的位置)访问元素,并搜索列表中的元素。实现List接口的集合主要有:ArrayList、LinkedList、Vector、Stack
特点:元素有序,可重复

2.1、ArrayList

ArrayList是一个动态数组,也是我们最常用的集合。它允许任何符合规则的元素插入甚至包括null。每一个ArrayList都有一个初始容量(10),该容量代表了数组的大小。随着容器中的元素不断增加,容器的大小也会随着增加。在每次向容器中增加元素的同时都会进行容量检查,当快溢出时,就会进行扩容操作。
ArrayList底层是使用一个数组来保存元素,所以查询速度快增删慢。同时ArrayList是非同步的。

2.2、LinkedList

LinkedList是采用双向循环链表的存储方式,链表中的每一个元素都是使用索引的方式记住前面一个元素和后面一个元素,从而可以将所有的元素彼此连接起来。当插入一个新元素时。只需要修改元素之间的这种引用关系即可,删除一个节点也是如此。所以,LinkedList集合对于元素的增删操作具有很高的效率

2.3、Vector

与ArrayList相似,但是Vector是同步的。所以Vector是线程安全的动态数组。它的操作与ArrayList几乎一样。

2.4、Stack

Stack继承自Vector,实现一个后进先出的堆栈。Stack提供5个额外的方法使得Vector得以被当作堆栈使用。

3、Set接口

Set接口和List接口一样,同样继承自collection接口,他与collection接口中的方法基本一致,并没有对collection接口进行功能上的扩展。主要实现的类:HashSetTreeSet
特点:元素无序,不可重复

3.1、HsahSet

HashSet是Set接口的一个实现类,它所存储的元素时不可重复,并且元素都是无序的。当向HashSet集合中添加一个对象时,首先会调用该对象的hashCode()方法来确定元素的存储位置,然后调用equals()方法来确保该位置没有重复的元素。不允许出现重复元素,不保证集合中元素的顺序,允许包含值为null的元素,但最多只能一个。

3.2、TreeSet

TreeSet是Set的另一个实现类,它内部采用二叉树来存储元素,这样的结构可以保证TreeSet集合中没用重复的元素,并且可以对元素进行排序。

四、Map接口

Map与List、Set接口不同,它是由一系列键值对组成的集合,提供了key到Value的映射。在Map中它保证了key与value之间的一一对应关系。也就是说一个key对应一个value,所以它不能存在相同的key值,但是value值可以相同。实现map的有:HashMapTreeMapHashTable

4.1、HashMap

HashMap 是一个散列表,它存储的内容是键值对(key-value)映射。
该类实现了Map接口,根据键的HashCode值存储数据,具有很快的访问速度,有且只允许一条记录的键为null,不支持线程同步。

4.2、TreeMap

继承了AbstractMap,并且使用一颗树,内部以red-black(红-黑)树数据结构实现。

4.3、 HashTable

也是以哈希表数据结构实现的,解决冲突时与HashMap也一样也是采用了散列链表的形式,不过性能比HashMap要低。已废弃!

五、异同点比较

5.1、Vector和ArrayList

  • vector是线程同步的,是线程安全的;
  • ArrayList是线程异步的,是线程不安全的;
  • 如果不考虑到线程的安全因素,一般用ArrayList效率比较高。

5.2、AarrayList和LinkedList

  • ArrayList 和 LinkedList都是List 接口的一种实现,都是线程不安全的;
  • ArrayList 底层使用数组实现的,LinkedList是用链表实现的;
  • ArrayList 遍历和查找元素比较快。LinkedList 添加、删除元素比较快;

5.3、HashSet和TreeSet

  • 二者都是线程不安全的;
  • HashSet是一个无序的集合,基于HashMap实现;
  • TreeSet是一个有序的集合,基于TreeMap实现;
  • HashSet集合中允许有null元素,TreeSet集合中不允许有null元素;

5.4、HashMap与TreeMap以及HashTable

  • HashTable是同步的,所以线程安全的;
  • HashMap和TreeMap是异步的,所以线程不安全;
  • 只有HashMap可以让你将空值作为一个表的条目的key或value 。

你可能感兴趣的:(集合框架概述)