面试职位: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.你觉得你的长处在哪?