蚂蚁金服财富事业群一面,我当面试题做了很多不会的 求指点
1,TreeSet/HashSet 区别
TreeSet 使用的是 treeMap,看是传入了比较器 comportor,如果没传入,看 key 是否实现了 comparable 接口
区别在 treeset 是拍好按照 key 排序的,hashset 使用的是 hashmap 没有排序
2,HashMap 如何解决冲突,扩容机制
hashmap,是根据 hash 函数取模定位到一个数组索引,如果该地方有值,那么久以链表( 1.8 红黑树)的显示存放数据,
扩容设计到扩容因子,好像默认的是 0.75*当前数组的大小,大于这个值就需要扩容了。原数组长度乘 2
3,ConcurrentHashMap 如何做到高并发的
jdk1.7 好像是根据分 segment 来实现的,部分 key 归到一个 segment,没看 1.7 的源码
jdk1.8
在初始化 table 的时候,第一个进入的线程使用 cas 把 sizeCtl 设置为-1,其他线程发现 sizeCtl 的值小于 0,就放弃时间片,知道 table 初始化完成
存放值 put,当数组对于值为空,(n-1)&定位到数组下标,如果当前数组对于的值为 0 的时候 cas 放入即可,
不为空,使用 synchronize 锁头结点,也就是理论上吧 map 的同步锁最多有,扩容因子乘以数组大小了
4,线程池平常怎么用
new 线程池呗,还能怎么用,自己写?结合到自己项目就是
executorService = new ThreadPoolExecutor(4, 6, 10, TimeUnit.SECONDS,
new ArrayBlockingQueue<Runnable>(maxCheckNumber) ,new ThreadFactory() {
AtomicInteger atomicInteger = new AtomicInteger(0);
@
Override public Thread newThread(Runnable r) {
Thread t = new Thread(r,"checker-thread-"+atomicInteger.incrementAndGet());
if (t.isDaemon())
t.setDaemon(false);
if (t.getPriority() != Thread.NORM_PRIORITY)
t.setPriority(Thread.NORM_PRIORITY);
return t;
}
},new ThreadPoolExecutor.DiscardPolicy());
背景,线上是 4 核心 8g 内存的机器,然后这个是定时查询第三方接口的线程池。
初始化 4 个核心线程,最大为 6,存活时间 10s,设置一个定长的队列,然后命名线程名称,由于是查询任务,任务多久扔掉。
5,多个线程等待到某一节点然后统一放行有几种实现方式?
项目中久使用到了基于 CountDownLatch 的闭锁,基于 aqs 实现,维护一个 state,new 的时候初始化好线程数量,
然后线程执行的时候执行到 await 的时候,就把这个线程塞到一个双向队列中就完了,countdown 的时候用 cas 吧 state 减掉 1,为 0 就让哥哥的双向队列中的线程开始执行
6,数据库索引结构
mysql 常用 b+
7,select * from t where a=? and b>? order by c limit 0,100 如何加索引
如果是我建的话 index ( a,b,c )
根据 ab 查询到的数据,已经把 c 进行了排序了。。。
8,什么是聚簇索引和非聚簇索引
聚簇索引,mysql 的 innodb 使用的主键是聚簇索引,数据放在叶节点,数据是按照索引顺序排列的,索引和数据在一起。
如果非主键索引查询,也就是辅助索引,根据索引里面的值满足的话,可以不用回表,如果不满足,需要取出主键,在来回表使用主键查询。
非聚簇索引 myisam 索引文件和数据分开
9,介绍下 Fescar/了解 CAP 吗?redis 里的 CAP 是怎样的?
fescar 什么鬼,原谅我没听过,面试官你帮忙普及普及呗,
redis 里的 CAP 是怎样的 你要为什么呀
10,如何理解幂等?项目中接口的幂等是如何做的?
就是多次调用方法或者接口,除第一次执行外正确返回外,其他调用不会影响结果,
支付中的回调,先判断订单状态,未处理,则该状态,其他就不就行处理
11,算法题:两个有序的 list,求交集
嗯我 两层 for 循环 o(m*n),就问你怕不怕。
怕?
listm,listn
两个集合各设置一个指针 依次移动,每次都移动最小集合那边的指针 ,的一个值和另外一个比较,相等保存