本文已参与「新人创作礼」活动,一起开启掘金创作之路。
21K 面试实录
JAVA集合你了解的有哪些?
主要有 3 种:set(集)、list(列表包含 Queue)和 map(映射)。
比如List ,ArrayList ,LinkedList
再比如set中有:HashSet、TreeSet
对他们的理解,各自的优点,缺点?
可以说 List集合中的ArrayList与LinkedList之间的区别:
Arraylist是基于数组的,在查询效率比较高,插入删除效率比较低
Linkedlist是基于链表的,插入删除效率比较高,查询效率比较低
对于添加和删除的时候,linkedlist优于arraylist,因为arraylist在做数据的添加和删除的时候需要有数据的位置的移动
HashSet可以对list集合中的数据去重
ArrayList的扩容会导致什么问题?
可能导致内存溢出(OOM)
- 直接指定ArrayList大小时,导致add 没有进行扩容,于是内存刚好适合运行。
- 不指定ArrayList大小,导致add进行扩容,但是扩容时会需要额外的内存,于是报了OOM了。
hashmap为什么引入红黑树?
红黑树是为了解决二叉查找树的缺陷,二叉查找树在特殊情况下会变成一条线性结构(这就跟原来使用链表结构一样了,造成很深的问题),遍历查找会非常慢。
说一下hash工作流程
解决hash冲突还有什么方法?
- 链地址法
- 对于相同的哈希值,使用链表进行连接。
- 再哈希:
- 提供多个哈希函数,如果第一个哈希函数计算出来的key的哈希值冲突了,则使用第二个哈希函数计算key的哈希值。
- 建立公共溢出区
- 将哈希表分为基本表和溢出表两部分,凡是和基本表发生冲突的元素,一律填入溢出表。
- 开放寻址法:
- 经过hash计算找到在数组的位置
- 如果这个位置已存在元素,继续找一个空闲位置
红黑树和二叉树的区别?
线程安全的集合?
Collections 肯来可申
Vector 外科ter
ConcurrentHashMap
ConcurrentHashMap为什么是安全的
ConcurrentHashMap 在 JDK 1.7 时使用的是数组加链表的形式实现的,其中数组分为两类:Segment 和 HashEntry,而加锁是通过给 Segment 添加 ReentrantLock 锁来实现线程安全的。
而 JDK 1.8 中 ConcurrentHashMap 使用的是数组+链表/红黑树的方式实现的,它是通过 CAS 或 synchronized 来实现线程安全的,并且它的锁粒度更小,查询性能也更高。
CAS的工作机制?
线程用过吗?怎么使用的?
怎么维护线程安全
加锁的话你会把一个多线程改变成一个单线程串行化执行
能不能优化,既能保证多线程串行化,又能保证线程安全
线程池的使用场景?
线程池的具体使用,需要注意什么地方?
身份认证不会一下子返回所有的东西,需要调用多次......?
如果程序CPU飙升怎么解决?
Mysql的MVCC了解过嘛?能说说嘛?
事务默认的隔离级别?怎么做的可重复读?
在什么场景下,多次读到的数据是一样的?
可串行化怎么理解的?能解决什么问题?
程序在运行过程中处理的CPU是最类怎么报错
MySQL事务
原子性是怎么保证的?
回滚的话执行什么?
默认的隔离级别是什么?
可重复读的工作机制
怎么保证读到的结果都一样?
索引的数据结构?
为什么使用B+树?
B+树和红黑树的区别
红黑树的优势是什么
B+树的优势
怎样查看SQL语句的执行计划?
如果排查慢Sql,怎么抓取?
慢sql怎么优化
Select * 走索引吗
Sql优化的场景?
还有哪些?(不走索引的其他情况)
数据库使用all映射走索引嘛?
redis的setNX的实际操作,起了什么作用?什么流程?
redis的数据结构?
list是怎么用的?使用场景?
Set和zset是怎么使用的
redis的集群使用过吗?
主从数据之间同步的过程?
Mq这块哪个比较熟
RabbitMq的消息生命周期(浏览过程)?
Ack发给谁确认?
消息的幂等(重复消费)?
mq一秒钟的处理量多少?数据库一秒钟的处理量多少?redis一秒钟的处理量多少?
有没有接触过订单,商品,支付这方面业务?
说一下订单业务怎么做的
活动期间面对高并发,如何去设计秒杀场景?
下单关于优惠券的统计和优惠券的计算具体怎么实现
对接支付宝的流程?
支付宝支持几位小数支付?
调用支付宝body里面有什么?
对账接触过吗
对账是为了防止被篡改,用户支付成功后,本应用户、支付宝、银行三方显示交易状态为成功。但可能因为某些原因出错,银行单方面通知支付宝交易失败,不会修改用户的订单状态,导致出现问题。会在每天的凌晨对前一天的账目,防止出错