队列Queue和栈Stack

什么是队列queue?

先进先出表,是一种受限制的线性表.其限制是仅允许在表的队尾进行插入数据和表的队头进行删除数据.

队列的使用场景: 线程池ThreadPoolExecutor
  1. ThreadPoolExecutor源码中核心变量(前面3个是重点)
  • corePoolSize线程池维护的最小线程数量,哪怕是空闲的
  • BlockQueue<Runnable> workQueue阻塞队列
  • maximumPoolSize线程池维护的最大线程数量
  • ReentrantLock mainLock互斥锁
  • HashSet<Worker> workers线程集合,一个Worker对应一个线程
  • Condition termination终止条件
  • largestPoolSize线程池中线程数量曾经达到过的最大值
  • completedTaskCount已完成任务数量
  • ThreadFactory threadFactoryThreadFactory对象,用于创建线程
  • RejectedExecutionHandler handler拒绝策略的处理句柄
  • keepAliveTime线程池维护线程所允许的空闲时间
  • allowCoreThreadTimeOut
  1. ThreadPoolExecutor执行流程图如下:
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3qxyVm9h-1684035004552)(evernotecid://3A22127D-0425-400F-9B33-054BC6B3328D/appyinxiangcom/40619816/ENResource/p5)]

扩展知识:

  • 队列假溢出、循环队列、双端队列(概念: 插入和删除操作在表的两端进行. 例如: LinkedList ArrayQueue RedisQueue)、优先级队列(概念: 队列中每个元素都有一个优先级. 例如:MessageQueue)
stack

后进先出表,是一种受限制的线性表.其限制是仅允许在表的栈顶进行插入和删除数据.

方法:

  • push(E item) 新增
  • pop() 删除
  • peek() 查询栈顶元素
  • empty() 栈的非空判断
  • search(Object o) 查询元素在栈中的索引

栈的面试题
Java中的栈Stack是通过Vector来实现的,这种设计被认为是不良的设计,说说你的看法?

因为Vector中可以在指定位置index添加和删除元素,而栈stack的特性是只能在栈顶添加和删除元素,所以Stack继承自Vector有些不符.

栈的经典应用-逆波兰表达式法

JVM虚拟机

Java编译器和操作系统平台之间的虚拟处理器

StackOverFlowError

出现的情况,递归调用造成的死循环

OutOfMemoryError

创建的对象占用内存超过了我们设备的内存大小时报这个错

拓展知识:
JVM栈的每一个栈帧(slot)大小都是4bytes(4字节),一个对象的引用刚好占一个栈帧4字节
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值