java数据结构总结

ArrayList

  1. ArrayList是基于数组实现的一个集合
  2. 随机访问速度快,循环到某一个下标时停止。
  3. 插入速度较慢,循环到某一个下标时插入一个新数据,然后将后面数据的下标+1
  4. 更新速度快,循环到某一下标时更新当前数据
  5. 删除速度较慢,同插入原理,需要更新删除点后的其它数据下标。
  6. 初始化默认长度为10,可以指定size大小。长度递增为:旧容量*3/2+1
  7. 构造方法可以接收一个int型参数来做为初始容量
  8. 容量扩展是基于数组复制实现的

LinkedList

  1. LinkedList是一个链表。
  2. 其特点是插入速度快,插入时只需要将前一个对象连接到新数据上将新数据连接到后一个对象上既可。
  3. 查询速度较慢,因为每一个值都有一个自己的地址。
  4. 更新速度较慢,因为查询速度较慢。
  5. 随机访问速度慢,因为要寻找这个值所对象的地址。
  6. 删除速度较快,只需要将前一个节点连接到后一个节点上既可。

Vector

  1. Vector是一个线程安全的ArrayList(方法上强制使用Synchronized)

Stack

  1. 继承自Vector实现的先进后出的栈。
  2. 线程安全,基于Synchronized实现线程同步。

Queue

  1. 基于数组实现的一个先进先出的队列。
  2. 线程不安全。

HashMap

  1. 1.7是基于数组+链表的形式实现,1.8使用Node数组实现,当同一个hash值超过8个时会转成红黑树。
  2. 默认大小为16,默认加载因子是0.75
  3. 当key的Hash值有冲突时,以链表的形式追加到value的后面
  4. 阀值=容量*加载因子,扩容等于=原始容量*2
  5. 扩容时机为存储后扩容

HashTab

  1. 一种线程安全的HashMap。
  2. put、get、remove、putall、clear等大部分方法使用Synchronized进行强制同步

LinkedHashMap

  1. HashMap的子类,记录了put进入的顺序,在entry是记录了上一节点和下一节点的位置,是一种双向链表

HashSet

  1. 基于HashMap的key实现的一种不重复的数据结构。

LinkedHashSet

1.HashSet的子类,其实现是调用了HashSet构造LinkedHashMap方法,来实现有序set。

ConcurrentHashMap

  • 线程安全的HashMap
  • 扩容时机为存储前扩容

1.7版本

  1. segment:桶,用来装载每个小table的锁,继承自ReentrabntLock,对数据的put先调用segment的put方法
  2. 使用分段锁机制,将一个entry table分离在多个Segment中
  3. 先使用tryLock来获取锁,如果达到重试次数仍未获取锁,则使用segment继承的ReentrantLock类中的lock方法来获取锁,如果锁已被占用则等待。
  4. value使用了volatile保证内存可见,实现无锁读。
  5. 计算size,先采用无锁方法计算三次每个segment中元素个数,如果三次数据一致则表示正确,如果不一致刚给每个sgement加锁重新计算。
    1.8版本
  6. 使用Synchronized锁单个节点。put时使用cas原理来保证线程安全
  7. 当相同的hash值超过8个时自动转换成红黑树的结构存储。
  8. 使用 volatile类型的变量baseCount来记录元素的个数,然后使用CAS来修改baseCount的值,如果修改失败则使用counterCall来记录元素个数。
  9. 如果counterCall元素为空则初始化通过cas来设置cellsBusy字段,只有成功的线程才可以设置counterCall字段
  10. 当修改cellsBusy失败时则继承使用cas设置baseCount,如果设置失败则继承设置counterCall。

ArrayBlockingQueue

  1. 基于Array数组实现的一个线程安全的队列。
  2. 线程同步是基于ReentrantLock可重入锁实现线程安全。
  3. 基于Condition实现队列等待和唤醒。
  4. 如果队列已满offer方法会直接返回false,put方法会进行线程阻塞。
  5. 如果队列为空poll方法会直接返回null值,take方法会进行线程阻塞。

CopyOnWriteArrayList

  1. 基于数组复制实现的一个线程安全的ArrayList
  2. 每次add时会复制一个数据出来,将新元素放入到新数组尾部,然后将原来的引用指向新数组。
  3. 适用于读多于写的场景,并不会因为线程修改数据而影响到读。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值