丰巢面试review

面试职位:java中高级工程师

面试结果:一面被刷

面试问题:

一 缓存技术:

1.redis的持久化

2.redis的有点和原理

3.redis和memecahe对比

4.redis的主从同步机制

二数据库技术

1.mysql数据库的索引,B树和B+树的原理,索引的生效机制

2.连表查询为什么慢

3.mysql主从binlog同步的机制和原理

4.数据库的优化:

sql的优化:1)应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。

2)应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如:

select id from t where num is null

可以在num上设置默认值0,确保表中num列没有null值,然后这样查询:

select id from t where num=0

3)很多时候用 exists 代替 in 是一个好的选择

4)用Where子句替换HAVING 子句 因为HAVING 只会在检索出所有记录之后才对结果集进行过滤

索引优化:

数据库结构优化:

硬件优化:

三技术架构

1.ddd的原理和其他模型的对比

2.敏捷开发的实际应用

3.如何实现高可用,具体措施

4.服务监控的指标和方式方法

5.一致性哈希算法:哈希环,最近距离算法,详细百度去查

6.事务

事务的ACID特性(原子性,一致性,隔离性,持久性),事务的隔离级别:1.未授权读,2授权读3.可重复读4.串行化

分布式事务CAP定理:一个系统不能同时满足一致性/可用性

BASE理论:1基本可用2、弱状态 3.最终一致性

四 RPC技术

1.什么事RPC技术,原理是什么?

2.dubbo的原理,消息订阅机制

3.RPC和restfullapi的区别和对比

4.dubbo的负载均衡策略,降级机制

五基础

0.java中的synchronized和volatile关键字含义?

1.HashMap的实现原理,自动扩容机制?currentHashMap的实现原理?并发安全的问题?

实现原理:链表

如何自动扩容:

HashMap 内部的 Node 数组默认的大小是16,假设有100万个元素,那么最好的情况下每个 hash 桶里都有62500个元素,这时get(),put(),remove()等方法效率都会降低。为了解决这个问题,HashMap 提供了自动扩容机制,当元素个数达到数组大小loadFactor 后会扩大数组的大小,在默认情况下,数组大小为16,loadFactor 为0.75,也就是说当 HashMap 中的元素超过16\0.75=12时,会把数组大小扩展为2*16=32,并且重新计算每个元素在新数组中的位置

如何处理冲突:

通过链地址法解决冲突,它们使用单向链表来存储相同索引值的元素。在最坏的情况下,这种方式会将HashMap的get方法的性能从O(1)降低到O(n)。为了解决在频繁冲突时hashmap性能降低的问题,Java 8中使用平衡树来替代链表存储冲突的元素。这意味着我们可以将最坏情况下的性能从O(n)提高到O(logn)。

如何安全的使用HashMap:可以使用hashtable,但是因为是使用synchronized保证线程的安全,如果面临线程激烈竞争的话,多个线程同时访问同步方法,会进入阻塞或者轮询状态,导致效率低下。

currnetHashmap使用了锁分段技术,所以可以有效提高并发访问效率(jdk8引入了cas算法实现)。

为什么hashmap不是线程安全的:HashMap 在并发执行 put 操作时会引起死循环,导致 CPU 利用率接近100%。因为多线程会导致 HashMap 的 Node 链表形成环形数据结构,一旦形成环形数据结构,Node 的 next 节点永远不为空,就会在获取 Node 时产生死循环。

2.双亲委派模型是怎么回事?如果一个类被两个加载器加载,是不是同一个?

这个问题涉及到类的加载机制,首先要说到类的生命周期 加载,连接(验证,准备,解析),初始化,使用,卸载。加载,连接和初始化都是运行期间执行的,解析可能在初始化之后进行。

每一个类加载器都有一个独立的命名空间,即使两个类来源于同一个class文件,同一个虚拟机加载,只要加载他们的类加载器不同,那这两个类也必定不相等。

双亲委派模型(自定义类加载器-》应用程序加载器-〉扩展类加载器-》启动类加载器),工作过程:如果一个类加载器收到类加载的请求,首先不会自己去尝试加载这个类,而是把请求委派给父类加载器去完成,每个层次的类加载器都是如此,最终都应该传送到顶层的启动类加载器中,只有当父加载器反馈不能完成这个加载请求,就是说搜索范围之内没有找到所需的类的时候,子加载器才会尝试自己去加载。

3.jvm的内存模型

4.jvm的GC机制

GC算法:标记清除算法,复制算法,标记整理算法

5.java的几种锁,什么是重入锁?

重量锁,轻量锁,自旋锁,重入锁

这个目前还没办法迅速解答,坑

6.jvm的常用命令和图形化工具使用

六linux操作

1.more和less的区别

less 与 more 类似,但使用 less 可以随意浏览文件,而 more 仅能向前移动,却不能向后移动,而且 less 在查看之前不会加载整个文件。

2.git的merge和rebase的区别

merge操作会生成一个新的节点,之前的提交分开显示。而rebase操作不会生成新的节点,是将两个分支融合成一个线性的提交,

想要更好的提交树,使用rebase操作会更好一点。这样可以线性的看到每一次提交,并且没有增加提交节点。

3.maven的重复依赖问题

按照最短路径生效

七/其他

1.最近的工作成长在哪里?

2.你觉得你的长处在哪?

你可能感兴趣的:(丰巢面试review)