美文网首页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