详解Java中常见的集合类中的联系与区别

                                       详解Java中常见的集合类中的联系与区别

一、迭代器简介

迭代器(Iterator)模式,又叫游标(Cursor)模式。定义:提供一种方法访问一个容器(container)对象中各个元素,而又不需暴露该对象的内部细节。

  Iterator只能单向移动是Java迭代器最简单的实现,为List设计的ListIterator(继承自Iterator)具有更多的功能,它可以从两个方向遍历List,也可以从List中插入和删除元素。

二、集合介绍

集合:一种容器,用于保存元素。Java集合框架主要包括两种类型的容器,一种是集合(Collection),存储一组元素,另一种是图(Map),存储键值对元素。

 Collection:集合类的根接口
├ —— List 接口: 元素有序,可重复,索引直接操作元素
│—————├ LinkedList 实现类,底层数据结构是链表,查询慢,增删快,线程不安全,效率高,可以存储重复元素 
│—————├ ArrayList   实现类,底层数据结构是数组,查询快,增删慢,线程不安全,效率高,可以存储重复元素  
│—————└ Vector        实现类,底层数据结构是数组,查询快,增删慢,线程安全,效率低,可以存储重复元素 
│———————└ Stack 是Vector类的实现类 底层数据结构是数组,线程安全,先进后出(FILO)
└ —— Set 接口: 元素无序,不可重复,并做内部排序 
├ —————└HashSet    实现类, 底层使用哈希表存储元素,无序且唯一,线程不安全,效率高,不可以存储重复元素 
│————————└ LinkedHashSet 实现类 底层链表维护元素的插入次序 (FIFO),由链表保证元素有序,哈希表保证元素唯一,线程不安全。
└ ————— TreeSet 实现类,底层实现为二叉树(红黑树),元素排好序(比较的返回值是否是0来决定元素是否唯一),线程不安全。

Map 接口 键值对的集合 
├ ———Hashtable 实现类,底层实现为数组+链表+红黑树, 同步, 线程安全,不允许为key或value为null
├ ———HashMap  实现类 ,底层实现为数组+链表+红黑树, 线程不安全,最多允许一key为Null,允许多条value为Null
│—————–├ LinkedHashMap  底层实现双向链表和哈希表,线程不安全,最多只允许一key为Null,允许多vlaue为Null
│—————–└ WeakHashMap 
├ ——–TreeMap  底层实现红黑树,对所有的key进行排序 ,线程不安全,有序
└ ———IdentifyHashMap

三、 List和Set集合详解

List实现类的适用场景

ArrayList

优点:基于动态数组的数据结构,因为地址连续,一旦数据存储好了,查询操作效率会比较高(在内存里是连着放的),可以直接通过索引进行操作。

缺点:因为地址连续,插入和删除操作时, ArrayList要移动数据,所以效率比较低。 

LinkedList

优点:基于双向链表的数据结构,地址是任意的,所以在开辟内存空间的时候不需要等一个连续的地址,对于新增和删除操作add和remove,LinedList比较占优势。LinkedList 适用于要头尾操作或插入指定位置的场景。

缺点:因为LinkedList要移动指针,所以查询操作性能比较低。

Vector       

优点:基于动态数组的数据结构,与ArrayList相似,但是很多方法有synchronized进行修饰,同步,线程安全。

缺点:效率低,不推荐使用。

Set实现类的适用场景

HashSet

底层数据结构采用哈希表(实际上是一个HashMap)实现,元素无序且唯一,线程不安全,效率高,可以存储null元素,但只能放入一个null,元素的唯一性是靠所存储元素类型是否重写hashCode()和equals()方法来保证的,如果没有重写这两个方法,则无法保证元素的唯一性。

LinkedHashSet

底层数据结构采用链表和哈希表共同实现(基于LinkedHashMap来实现),链表保证了元素的顺序与存储顺序一致,哈希表保证了元素的唯一性。线程不安全,效率高。可以存储null元素,但只能放入一个null。

TreeSet

底层数据结构采用二叉树来实现,元素唯一且已经排好序,不允许放入null值 ;非同步的,线程不安全的。唯一性同样需要重写hashCode和equals()方法,二叉树结构保证了元素的有序性。根据构造方法不同,分为自然排序(无参构造)和比较器排序(有参构造),自然排序要求元素必须实现Compareable接口,并重写里面的compareTo()方法,元素通过比较返回的int值来判断排序序列,返回0说明两个对象相同,不需要存储;比较器排需要在TreeSet初始化是时候传入一个实现Comparator接口的比较器对象,或者采用匿名内部类的方式new一个Comparator对象,重写里面的compare()方法。

适用场景分析

HashSet是基于Hash算法实现的,其性能通常都优于TreeSet。为快速查找而设计的Set,我们通常都应该使用HashSet,在我们需要排序的功能时,我们才使用TreeSet。

 四、Map详解

HashMap

HashMap是最常用的Map,它根据键的HashCode值存储数据,根据键可以直接获取它的值,具有很快的访问速度,遍历时,取得数据的顺序是完全随机的。因为键对象不可以重复,所以HashMap最多只允许一条记录的键为Null,允许多条记录的值为Null,是非同步的,线程不安全。

HashMap采用数组+链表实现,即使用链表处理冲突,同一hash值的链表都存储在一个链表里。但是当链表中的元素较多,即hash值相等的元素较多时,通过key值依次查找的效率较低。而JDK1.8中,HashMap采用数组+链表+红黑树实现,当链表长度超过阈值(8)时,将链表转换为红黑树,这样大大减少了查找时间。

可通过Collections.synchronizedMap达到同步效果。

Hashtable 

HashMap类似,是HashMap的线程安全版,它支持线程的同步。不允许记录的键或者值为null,效率较低。

LinkedHashMap

继承自 HashMap,在 HashMap 基础上,通过维护一条双向链表,解决了 HashMap 不能随时保持遍历顺序和插入顺序一致的问题,保存了记录的插入顺序,在用Iteraor遍历LinkedHashMap时,先得到的记录肯定是先插入的,在遍历的时候会比HashMap慢,有HashMap的全部特性。

最多只允许一条记录的键为Null,允许多条记录的值为Null,是非同步的,线程不安全。

TreeMap

TreeMap基于红黑树数据结构的实现,键值可以使用Comparable或Comparator接口来排序。TreeMap继承自AbstractMap,同时实现了接口NavigableMap,而接口NavigableMap则继承自SortedMap。SortedMap是Map的子接口,使用它可以确保图中的条目是排好序的。

不允许key值为空,非同步的,线程不安全。

ConcurrentHashMap

HashMap的线程安全版。同HashMap相比,ConcurrentHashMap不仅保证了访问的线程安全性(分段锁),而且在效率上与HashTable相比,也有较大的提高。

适用场景

在实际使用中,如果更新图时不需要保持图中元素的顺序,就使用HashMap,如果需要保持图中元素的插入顺序或者访问顺序,就使用LinkedHashMap,如果需要使图按照键值排序,就使用TreeMap。

最后常用的集合框架简化版,如下:

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值