集合初探

#集合(基于JDK1.8)
##Map

以键值对形式存储数据。

  • 1.1 HashMap
  • 底层结构:数组+单向链表+红黑树(jdk1.8之后)
  • 底层数组默认初始化容量:16
  • 底层数组最大容量:2的30次方
  • 单向链表转红黑树阈值:8
  • 红黑树转单向链表阈值:6
  • 默认加载因子:0.75(每次扩容增加两倍)
  • 底层数组扩容时相当耗费性能
  • 非线程安全,性能高,允许键值对为null(key=null时候,值存储在数组第一个位置arr[0]);modCount代表该对象被修改次数,迭代器初始化时候将modCount赋值给expectedModCount,迭代时候判断这两个值如果不等表示已被其他线程修改,并抛出异常。
  • HashMap在底层通过Node[]来保存键值对,保存键值对时通过key的hash值决定其在数组中的位置,equals方法决定其在链表中的存储位置;获取value值过程同上。
  • 1.2 TreeMap
  • 有序集合,通过红黑树实现。
  • 在进行网络通讯加签之前可以用到该类。
  • 1.3 HashTable
  • 底层实现与HashMap相同
  • 线程安全,因其方法用synchronized修饰,性能低,因此催生ConCurrentHashMap的出现。
  • 1.4 LinkedHashMap
  • 与HashMap实现原理相似,区别在于LinkedHashMap维护了一个双向循环链表,实现了有序。
  • 1.5 ConCurrentHashMap
  • 线程安全,保证性能
  • 对底层数组分段加锁和读写锁:读锁所有线程共享;写锁排他,只允许一个线程进行写操作

##List

  • 1.1 ArrayList
  • 底层结构:数组
  • 默认初始化容量:10
  • 特点:查询效率高,有序,可重复
    在这里插入图片描述
  • 扩容机制
    当调用集合的add()方法时候,先扩容,新数组长度是旧数组长度的1.5倍,然后将旧数组的内容复制到新数组,再将新数据放到新集合最后一个位置。
    在这里插入图片描述
    在这里插入图片描述
  • 1.2 LinkedList
  • 底层由双向链表进行维护。
  • 增删效率高
  • 每一个节点包含指向前、后节点的地址,以及存储当前数据的引用
    在这里插入图片描述
  • 1.3 Vector
  • 底层由数组实现的List
  • 其部分方法经synchronized修饰,可以保证线程安全,但是效率低
    在这里插入图片描述
    在这里插入图片描述
    ##Set

Set的三个主要实现类均非线程安全,需调用Collections工具类方法保证线程安全。

  • 1.1 HashSet
  • 底层由HashMap实现,无序,不可重复;根据Map特性,所谓不许重复其实是在调用add()方法后,相同键被新键值覆盖。
    在这里插入图片描述
  • 1.2 LinkedHashSet
  • LinkedHashSet是HashSet的一个子类,底层由LinkedHashMap实现。
    在这里插入图片描述
  • 1.3 TreeSet
  • 底层由TreeMap类实现,通过红黑树实现数据的有序。如果没有排序需求,使用其他两个实现类性能更好。
    在这里插入图片描述

ConCurrentHashMap和队列深入了解,下回分解……

在这里插入图片描述在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值