有赞面经(详细)
有赞一面:
自我介绍
1、java的集合类了解吗?说一下hashmap的原理和实现。我:balabala.....
2、hashmap线程不安全,请问为什么线程不安全?答,并发时会成环。什么时候成环?比如我有两个数据要装入hashmap。
3、hashmap1.7从链表头插入数据,1.8从链表尾部插入数据,有什么区别为什么?使用红黑树为什么能提高查询的性能?什么时候hashmap开始使用红黑树,阈值是多少?
4、hashmap的线程安全怎么实现?答concurrenthashmap,让我介绍原理,如何上锁。插入数据时候一定上锁吗?怎么样获取concurrenthashmap的size。
5、hashset和hashmap的区别,写代码使用hashmap实现一个简单的hashset。(没写出来)
6、项目中有没有使用过并发编程?用过哪些锁?答用过synchronized和lock。他们的区别是什么?答Synchronized底层用mutex实现。在软件层面依赖Jvm,Lock底层基于AQS实现,在硬件层面依赖特殊的CPU指令(CAS)。简单介绍下CAS。Balabalabala。问CAS使用中存在什么问题?答ABA问题,怎么解决?说了版本号方式,atomicstampedreference和pause。还答了自旋时间过长消耗CPU资源。
7、AQS的框架中,自定义同步器使用哪些方法,分别表示什么含义?答isheldexclusively,该线程是否独占资源。tryacquire尝试获取资源tryrelease尝试释放资源这两种是独占方式,tryacquireshared,tryreleaseshared同前两种,不过是共享方式。
8、一个线程怎么判断自己是否可以获得共享资源的锁?答一个线程在获取共享资源前会判断markword里存放的是不是自己的threadid如果是则该线程处于偏向锁,可重入。若不是,则使用CAS进行切换,锁升级为轻量级锁,偏向锁释放,清空mark word,两个线程开始竞争,成功的将自己的markword存入对应的threadid,失败的开始自旋。
9、共享资源state何时增加何时减少?对于synchronized和lock有什么区别?答获得锁加一,释放减一。synchronized的state只能为1或者0,lock锁的state可以一直增加,但是增加多少就要减少多少直到为0锁释放。(可重入锁)
10、state用什么修饰符修饰?答int和 volatile。
11、volatile有什么作用?答1、禁止指令重排序,并介绍了原理,说了内存屏障的机制。2、保证多线程并发执行时某个线程对数据的修改对其他线程的可见性。说了原理。主存,本地栈,不从缓存取值。3、这个关键字不保证操作的原子性。是一种轻量级的synchronized实现。
12、数据库中,mysql用到哪些引擎?区别。答balabala
13、索引有哪些?聚簇索引和非聚簇索引的区别?
14、为什么使用索引查数据更快?什么时候使用索引查数据比全表扫描还更慢?使用什么关键字会触发全表扫描?
15、建立联合索引a,b,c,请问查询条件为a,c是否使用索引?a,b是否使用索引?b,a,c是否使用索引?
16、算法题,一个list中快速找出倒数第三个数。
17、http协议与tcp/ip协议有什么区别?http三次握手画图说明。timewait的时间为什么是2msl?
18、tcp五层模型?
19、http协议位于osi模型的哪一层?
20、集群和单机的区别?
21、redis简要介绍下。有哪些常用的数据结构?
22、redis为什么查询数据这么快?答1、用c编写的,2、单进程单线程的keyvalue数据库,不用加锁,不存在上下文切换的开销,很少消耗cpu资源。且没有主键和范式的约束。但是启用多个redis实例时要使用分布式锁。3、I/O多路复用,一个线程去遍历多个I/O流(sock),有数据的I/O流,标记并调用代码块进行处理。多路指的就是网络连接。额外介绍了select,poll,epoll的区别。
二面:
1、怼项目。负责哪块工作?具体细节怎么实现的?我觉得这么实现效率不高,怎么优化?…表里的数据都是什么数据结构?
2、介绍下mapreduce的原理。
3、udf函数有什么作用?
4、给100个数据,使用mapreduce,让我写代码啥的?这个算法题题我都没听懂
5、判断一个无序数组中是否有两个数等于目标数。暴力破解,算法时间复杂度o(n2)
6、手撕快速排序,问思路,让写,写完问是否有辅助空间?辅助存储空间复杂度?
7、数据库中,exist和in的区别?