美文网首页Java基础相关
java集合框架详细对比

java集合框架详细对比

作者: Sincerity_ | 来源:发表于2020-04-29 17:43 被阅读0次

前言 : 这几天一直沉迷于HashMap ,LinkedHashMap , ConcurrentHashMap的源码之中越陷越深.. 这里说明一下 对于源码这个东西不能太过于详细去挖掘 不然就会出现我这几天这样的情况 ConcurrentHashMap的原理最让人难以理解. 推荐大概看一下源码后找个对应的视频来解惑. 太难了 .. 废话不多说了 总的来说看了源码之后收获还是有的

集合框架

Java集合里使用接口来定义功能,是一套完善的继承体系。Iterator是所有集合的总接口,其他所有接口都继承于它,该接口定义了集合的遍历操作,Collection接口继承于Iterator,是集合的次级接口(Map独立存在),定义了集合的一些通用操作。

集合框架体系图png
  • set 无序 不可重复 ,重复元素会盖掉 继承于Collection接口 (元素虽然无放入顺序,但是元素在set中位置是由该元素的HashCode决定的,其位置其实是固定,加入SetObject必须定义equals()方法;) 检索元素效率低下,删除和插入效率高,插入和删除不会引起元素位置改变

  • list 有序 可重复 插入和删除过程伴随着数据的移动 继承于Collection接口,另外list支持for循环,也就是通过下标来遍历,也可以使用迭代器Iterator, 和数组类似,List可以动态增长,查找元素效率高,插入和删除比较慢

  • Map:映射键值对,键唯一,值多个

  • 并发问题

    HashSet Vector ArrayList LinkedList HashMap
    线程安全 安全 不安全
    线程不安全 不安全 不安全 不安全
    是否重复 不重复 可以 可以 可以 (key)不重复
    是否有序 无序 有序 有序 有序 无序
ArrayList , LinkedList和Vector的区别
  • ArrayList

    • 优点ArrayList是实现了基于动态数组的数据结构,因地址连续,一旦数据存储好了,查询操作效率会比较高(在内存里是连着放的)。

    • 缺点: ArrayList要移动数据,所以插入和删除操作效率比较低

    • 适用场景:当需要对数据进行对应访问的情况下选用ArrayList 插入数据效率一般 不代表不用使用

  • LinkedList

    • 优点:LinkedList 基于链表的数据结构 地址是任意的, 对于新增和删除数据有较好的性能

    • 缺点: 查询较慢 因为LinkedList插叙需要移动指针 详情见LinkedList简述

    • 适用场景 :对数据对此进行添加和删除操作时采用linkedList性能较高

  • Vector

    • 优点:Vector是多线程安全的,Vector可以设置增长因子

    • 缺点:Vector是一种老的动态数组,是线程同步的使用悲观锁synchronied,效率很低,一般不赞成使用

    • 适用场景 :和ArrayList如果集合中的元素的数目大于目前集合数组的长度时,在集合中使用数据量比较大的数据,用Vector有一定的优势。一般不使用Vector

ArrayList和LinkedList的动态扩容
  • ArrayList

    • ArrayList的初始大小为0, 当添加第一个元素时候数组大小变成10 在后续扩容的时候会变成之前容量的1.5倍

    • 数组的扩容 只能新建一个指定容量的数组然后对数组进行元素的赋值

  • LinkedList

    • LinkedList 双向链表 没有初始化大小, 也没有扩容机制 添加元素只需要移动指针即可
HashSet和TreeSet的区别
  • HashSet

    • 优点 基于哈希表实现的,允许有一个Null 无序不可重复

    • 缺点 :HashSet中存放的数据必须实现HashCode() 放入对象是以hashCode为标识 不能存放hashCode相同元素

    • 适用场景 :HashSet基于hash算法实现 为了快速查找使用 HashSet

  • TreeSet

    • 优点 基于红黑树实现 TreeSet中存放的数据时自动排序好的

    • 缺点 不允许有null

    • 适用场景 排序功能使用TreeSet

set集合为何能保证元素不重复
  • 在往set中添加元素时,如果指定元素不存在,则添加成功。

  • 当向HashSet中添加元素时 首先会计算出元素的HashCode值,然后用这个元素的HashCode/hashset集合的大小(size)+1 得出元素的存储位置, 如果这个位置为空,直接添加到这个位置,不为空,用equals比较二个元素是否相等,相等就不添加 则否找一个空的位置添加

HashMap与TreeMap、HashTable的区别及适用场景( 重点)
  • HashMap

    • 优点: HashMap允许空键值 允许一个null键和多个null值 基于哈希表实现,

    • 缺点:

      • 非线程安全 ,

      • 使用HashMap要求的键类明确定义了hashCode()equals()可以重写hasCode()equals(),为了优化HashMap空间的使用,您可以调优初始容量和负载因子,

      • 散列表的冲突处理主分两种,一种是开放定址法,另一种是链表法。HashMap实现中采用的是链表法。

      • HashMap没有排序

    • 适用场景 适用于Map中插入、删除和定位元素。

  • TreeMap

    • 优点 :安全基于红黑树实现

    • 缺点 非线程

    • 适用场景 适用于按自然顺序或自定义顺序遍历键(key)

  • HashTable

    • 优点 HashTable是同步的

    • 缺点 HashTable不允许Null键。

    • 适用场景 HashTable是同步的

  • HashMapHashTable的主要区别

    • HashMap没有排序,允许一个null键和多个null 值,而Hashtable 不允许

    • HashMapHashtable 的contains 方法去掉了,改成containsvaluecontainsKey, 因为contains 方法容易让人引起误解;

    • Hashtable 继承自Dictionary 类,HashMap 是Jdk1.2 引进的Map 接口的实现;

    • Hashtable 的方法是Synchronized 的,而HashMap 不是,在多个线程访问Hashtable 时,不需要自己为它的方法实现同步,而HashMap 就必须为之提供额外的同步。HashtableHashMap 采用的hash/rehash 算法大致一样,所以性能不会有很大的差异。

    • HashMapHashtable的底层实现都是数组 + 链表(+红黑树 ---jdk8)结构实现的

相关文章

网友评论

    本文标题:java集合框架详细对比

    本文链接:https://www.haomeiwen.com/subject/baynwhtx.html