美文网首页
丰巢面试review

丰巢面试review

作者: JimmyJava | 来源:发表于2017-10-22 12:45 被阅读0次

    面试职位: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

          本文链接:https://www.haomeiwen.com/subject/onpguxtx.html