java集合 (util包体系结构)

1、集合是用来存放对象(的引用)的

  java集合中只能保存引用类型的数据,实际上存放的是对象的引用,而非对象本身。集合中元素相当于引用类型变量。

现在集合也能保存基本数据类型,但是没有实际意义。


2、集合要使用泛型

   集合是存放对象的,默认是Object对象。所以集合能存放不同类的对象。如果我们希望集合保存单一类型的对象,那么就要使用泛型。

比如创建一个键为String,值为object类型的HashMap,在此基础上创建list集合。

ArrayList<HashMap<String, Object>> listItem = new ArrayList<HashMap<String,Object>>();




3、集合的类型

从体系结构上讲,集合的类型可以分成3种:

     集(set):set集合中不区分元素的顺序,不允许出现重复的元素。

     列表(list):list集合区分元素的顺序,且允许出现重复的元素。

     映射(map):映射保存成对的键值信息映射中不能包含重复的键,每个键只能映射一个值。


因为list区分元素的顺序,所以使用者要对列表元素的插入位置进行精确的控制。列表元素的插入位置就是它的索引。

比如:

list.add(map1);

list.add(map2);

list.add(map3);

调用list.get(2);返回的是map3


4、list集合一般在项目中用来存储什么对象

  • 存储map对象。map对象以键值对的形式存储数据。

============================================

1. util包的框架

常用的集合类主要实现两个“super接口”而来:CollectionMap

1.1 Collection有两个子接口:ListSet

这里写图片描述

List特点是元素有序,且可重复。实现的常用集合类有ArrayListLinkedList,和Vector(线程安全)。

Set特点是元素无序,不可重复。实现的常用集合类有HashSetLinkedHashSetTreeSet(可排序)

1.2 Map是key、value键值对的集合

这里写图片描述

特点是key值无序不可重复,value值可重复(这样表述其实不太准确,因为实际上key和value是绑定在一起的)。常用的有HashMapHashTable(线程安全),TreeMap(可排序)。

1.3 其余重要接口和类

上面是util包中的集合框架,一般Java教材里面都会讲到。但我们深入研究一下,会发现还有其余几个重要的内容:

  • Iterator:迭代接口 
    集合类实现该接口后便具有了迭代功能。最简单的迭代实现是ArrayList,迭代过程其实就是数组的迭代。LinkedListLinkedHashSetLinkedHashMap迭代过程就是链表的迭代。这两者的迭代效率都很高,迭代时间与容器里的元素数目成正比。但HashSetHashMap迭代效率就略低了,因为采用了哈希表,所以元素是散列在数组中的,迭代时必须读完整个数组,迭代时间与容器的容量成正比。
  • Comparator:比较接口 
    实现该接口后,集合内元素便可比较通过compare()方法实现元素排序
  • AbstractXXX:骨架类 
    所谓骨架类,其实就是不同集合的核心代码实现,让继承这个抽象类的子类少干点活。例如AbstarctList代表“随机访问”集合(底层数组实现)的骨干代码实现。AbstractSequentialList代表“连续访问”(底层链表实现)集合的骨干代码实现。
  • Collections、Arrays 
    集合工具类和数组工具类。Java中的工具类好像都喜欢在对应的接口或类名称后,加S来表示其工具类。

接下来给一张比较完整的util包框架图:

这里写图片描述

2. 常用集合类原理

2.1 ArrayList

ArrayList的实现最简单,采用的顺序表,底层就是一个Object数组,初始容量为10,每当元素要超过容量时,重新创建一个更大的数组,并把原数据拷到新数组中来。

2.2 LinkedList

LinkedList采用双向链表。集合中的每一个元素都会有两个成员变量prevnext,分别指向它的前一元素和后一元素。

ArrayListLinkedList的区别这里就不详细讨论了,其实就是顺序表和链表两种数据结构的区别。之前写的博文中已经提到(包括ArrayListLinkedList的详细实现): 
数据结构基础(一)线性表

2.3 Vector

Vector底层实现和ArrayList类似,区别在于在许多方法上加了synchronized关键字,来实现了多线程安全。但代价是性能的降低。由于加锁的是整个集合,所以并发情况下进行迭代会锁住很长时间。

2.4 HashMap

HashMap采用的是哈希表结构,用链表法来解决hash冲突。这里不详细讨论,之前的文章写过: 
HashMap原理解析

2.5 HashTable

HashTable的底层实现和HashMap类似,区别也是在许多方法上加了synchronized关键字,来实现了多线程安全。

2.6 LinkedHashMap

HashMap的基础上加了双链表,该集合中的每个元素也都保留了前一个元素和后一个元素的“指针”。这样便可以按照插入顺序来读取集合元素。也可设置为按照访问顺序来读取集合元素。 
由于要维护额外的双链表,LinkedHashMap增删操作会比HashMap慢,但迭代时会比HashMap快。

2.7 TreeMap

采用了红黑树数据结构,从而实现了有序集合。这个比较复杂,以后单独开出一篇来讨论,此处略。

2.8 HashSet、LinkedHashSet、TreeSet

Set和Map有千丝万缕的联系呀。例如HashSet底层实现其实就是一个固定value的HashMap。LinkedHashSet就是一个value固定的LinkedHashMapTreeSet就是一个value固定的TreeMap


这段内容转载自:Java.util包简单总结


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值