admin管理员组文章数量:1568344
面试题总结
hashmap初始值时16
因为16也是一个经验值,太小不断扩容影响效率,太大空间浪费,16位2的幂等数,indexFor使用 位运算效率大于转换10进制取模运算。
hashmap中的因子为啥为0.75
太大hash碰撞太大影响效率,太小树的层级太低。空间浪费。一个经验值得折中。
hashmap为啥1.8后用尾插法,而不用头插法。
可以看到,在插入新节点的时候,头插法是先将新节点的next指向c1(L.next),然后再将L.next置为新节点。如果在多线程环境下,键值k对应的链表为k=a->b->null,
1.线程A先运行,put元素c,此时进行扩容,逐步复制元素,运行到next=e.next时,这里的next时a.next,也就是b。
2.接着此时线程B运行,put元素d,B也进行扩容,B中的链表变成b->a->null,此时b.next=a。
3.此时A再运行,第一次while,e=a,next=b,将a复制到链表中,a.next变成newTable[i]也就是null,第二次while,e=b,next=b.next=a(这里是关键,因为线程B已经把b.next指向a了!!!),所以将b拷贝过来后,第三次while, e=a,next=null,再次插入a,此时就形成了a->b->a的环! CPU直接爆满,程序崩溃。
此外,头插法在多线程环境下还会出现put的节点丢失的情况。这里就不展开了。
与之相比,尾插法从尾部插入,就不会有环的问题,因为每次都是插到尾部。
但是还是会有节点丢失的问题,因此可见,hashmap是线程不安全的,因为这一缺点,现在在多线程环境下,大多用CocurrentHashMap。https://segmentfault/a/1190000041492312
java工程师,是工程学。要知道你工程所用的材料的性质。
MapStruct入门指南
vo do dto
guava 本地缓存
springboot原理
mysql 读读,读写,写写
https://joonwhee.blog.csdn/article/details/99708892
https://joonwhee.blog.csdn/article/details/99708892
https://joonwhee.blog.csdn/article/details/99708892
重点!!!!!
面试只准备重点,其他细节,理解第一
面试抓重点,其他都可以放放
offer来了第二版本
on java ok
深入理解springcloud ok
springboot编程思想
java虚拟机 ok
深入理解java高并发编程 ok
mysql技术内幕innodb存储引擎 ok 源码解读
高性能mysql第四版 ok 高级实战
Netty权威指南(第2版)(博文视点出品) ok 源码,不用实战
Elasticsearch实战(异步图书出品) ok 实战
Redis 深度历险:核心原理与应用实践(博文视点出品) ok 实战
redis 设计与实现 ok 源码
深入理解Kafka:核心设计与实践原理(博文视点出品) ok 实战,不用源码
RocketMQ分布式消息中间件:核心原理与最佳实践(博文视点出品) ok 实战
RocketMQ技术内幕:RocketMQ架构设计与实现原理(第2版) 讲源码
RabbitMQ 没用过,适合小公司
Spring Cloud Alibaba 微服务架构实战派(上下册)(博文视点出品) pdf看看就好了
高并发系统实战派 看看pdf就好
jenkins CI/CD 找个pdf看看
docker 容器
kubernets 容器编排
Service Mesh 是微服务时代的 TCP/IP 协议。云服务 成熟产品落地很少 屏蔽了分布式系统的诸多复杂性
MobaXterm linux管理神器
devops平台搭建工具 阿里云效
项目管理(PM):jira。运营可以上去提问题,可以看到各个问题的完整的工作流,待解决未解决等;
代码管理:gitlab。jenkins或者K8S都可以集成gitlab,进行代码管理,上线,回滚等;
持续集成CI(Continuous Integration):gitlab ci。开发人员提交了新代码之后,立刻进行构建、(单元)测试。根据测试结果,我们可以确定新代码和原有代码能否正确地集成在一起。
持续交付CD(Continuous Delivery):gitlab cd。完成单元测试后,可以把代码部署到连接数据库的 Staging 环境中更多的测试。如果代码没有问题,可以继续手动部署到生产环境中。
镜像仓库:nexus。
容器:Docker。编排:K8S。
服务治理:springcloud。
脚本语言:Python。
日志管理:ELK。
系统监控:Prometheus。 是一个开源的服务监控系统和时间序列数据库。通过各个组件上面exporter上传http接口到Prometheus Grafana:图形化展示
负载均衡:Nginx F5
网关:gateway zuul
链路追踪:kywalking cat Zipkin
产品和UI图:Draw.io
公司内部文档:Confluence。语雀。基于md自己pandoc自研。
文本编译工具:UltraEdit,notepad3
linux服务器监控:Zabbix
跨linux机器的:NAS盘
专业技能方面
基础:JDK 常用类的原理、源码、使用场景。
设计模式:常用几种的原理、使用场景,单例、动态代理、模板、责任链等。
数据结构:数组、链表、栈、队列、树。
网络:TCP、HTTP、HTTPS、负载均衡算法。
框架:Spring IoC 原理、Spring AOP 原理和使用、Spring 常用的扩展点、MyBatis 的核心流程。
中间件:常用中间件的核心原理与最佳实践,并对其中的 1 到 2 个有深入的学习,Redis、Kafka(RocketMQ、RabbitMQ)、Dubbo、Zookeeper。
数据库(MySQL):索引原理、隔离级别、锁机制、分库分表、慢 SQL 定位及优化、线上问题解决。
Netty:NIO 原理、核心组件、I/O 多路复用(epoll)、零拷贝。
JVM:运行时数据区、垃圾回收算法、垃圾回收器(CMS、G1)、常用配置参数、线上问题定位及解决。
稳定性保障:隔离、限流、熔断、降级等。
Linux:基本命令的使用、快速定位和排查问题。
分布式理论:CAP、BASE、2PC、3PC、TCC。
项目方面
能独立完成一个复杂模块的需求分析、方案设计和最终落地实现。
能不断思考,寻找更优的设计和解决方案,积极优化慢 SQL、慢服务。
具备排查问题的能力,遇到线上问题能及时定位和修复上线,例如:数据库死锁、服务器宕机、服务器 Full GC 频繁等。
具备难题攻关的能力,能不断解决项目遇到的挑战,能给予初级工程师技术上的指导。
初步具备带领团队(1-3人左右)的能力,能合理分配需求,做好进度把控、风险评估、Code Review。
严格来说,要完全做到上面这些有点难,我自己也并不具备,但是,我们可以将其视为目标,不断去努力。
面试常见形式
大厂面试通常是“连环炮”的形式,举个栗子:
面试官:用过哪些 Map
我:LinkedHashMap、ConcurrentHashMap、HashMap、TreeMap
面试官:这四种 Map 的区别
我:ConcurrentHashMap 线程安全,LinkedHashMap 可以记录插入顺序和访问顺序,TreeMap 可以自定义排序,除了这几个场景,其他场景基本都可以使用 HashMap
面试官:ConcurrentHashMap 怎么保证线程安全
我:JDK 1.8 以前通过分段锁,JDK 1.8 以后通过 CAS + Synchronized
面试官:ConcurrentHashMap 在 JDK 1.8 前后的锁有什么区别
我:JDK 1.8 以前锁分段,JDK 1.8 以后锁单个节点,锁粒度降低,并发度变高
面试官:#%¥%……#%¥
我:喵喵喵~
这种模式的问法,其实就是想了解候选人对一个知识点的理解是仅仅停留在表面,还是真的去深入研究过。
面试内容
下面介绍下一些常见的面试内容,其中的面试题不一定是我真实遇到的,有可能是从别人的面试题中收集的,也有可能是我自己觉得重要的知识点,仅供参考。
1、项目
项目对于一个 3 - 5 年经验的开发来说是非常重要的,面试官也非常看重这一块。这个经验的开发基本是各大公司的编码主力,因此面试这个年限的候选人,通常项目是很重要的一块。面试官通常会让你先自己介绍下自己参与度最高(或者最牛逼)的项目,然后从中进行提问。常见的如以下:
介绍下你参与度最高的项目
画下项目的架构图
如果核心流程处理到一半,服务器崩溃了,会怎么处理
项目中遇到过哪些挑战或问题,怎么解决的
项目的稳定性和可用性怎么保障
数据安全这块怎么设计
项目的技术选型,为什么选这些
…
2、场景题
越到后面的面试官,越喜欢问场景题,场景题比较考验候选人平时的积累和解决问题能力。这个环节很容易挂掉一批人,特别是容易紧张的同学,很容易脑子会一片空白。场景题的核心一般是处理大数据量的问题、解决性能方面的问题。
场景题本质上是比较开放的,没有什么标准答案,只要自己的方案能够解决问题,能够“自圆其说”就行。
这个环节面试官可能会将线上真实的场景拿出来提问,我自己就遇到过。
3、专业技能
集合
经常用到哪些 Map
这几种 Map 的区别
CocurrentHashMap 怎么保证线程安全
CocurrentHashMap 在 JDK 1.8 前后的锁有什么区别
聊下 HashMap 的原理
HashMap 在 Put 时,新链表节点是放在头部还是尾部
HashMap 扩容时的流程
HashMap 在 JDK 1.8 有什么改变
CocurrentHashMap 在 JDK 1.8 有什么改变
TreeMap 的原理
Map、List、Set 分别说下你知道的线程安全类和线程不安全的类
真题解析:
问遍了身边的面试官朋友,我整理出这份 Java 集合高频面试题(2021年最新版)
面试阿里,HashMap 这一篇就够了
史上最详细的 JDK 1.8 HashMap 源码解析
多线程、锁
线程池使用的是哪种
线程池参数怎么配置
线程池各个参数的作用
线程池的参数配置要注意什么
线程池的工作流程
JDK 中的并发类知道哪些
AQS 的底层原理
介绍下悲观锁和乐观锁
使用过哪些锁
synchronized 和 Lock 的区别、使用场景
synchronized 原理
synchronized 作用于静态方法、普通方法、this、Lock.class 的区别
为什么引入偏向锁、轻量级锁,介绍下升级流程
死锁的必要条件,如何预防死锁
介绍下 CountDownLatch 和 CyclicBarrier
介绍下 CAS,存在什么问题
介绍下 ThreadLocal,存在什么问题
真题解析:
面试必问的线程池,你懂了吗?
面试必问的CAS,你懂了吗?
网络
HTTPS 是怎么加密的
普通 Hash 和一致性 Hash 原理
一致性 Hash 的缺点
TCP 三次握手过程,为什么需要三次握手
为什么 TIME_WAIT 状态需要经过 2MSL 才能返回到 CLOSE 状态
TCP 的拥塞控制
TCP 如何解决流控、乱序、丢包问题
为什么会出现粘包和拆包,如何解决
真题解析:待补充,可关注:原创汇总#面试题解析
Spring、Mybatis
Mybatis 中 # 和 $ 的区别
怎么防止 SQL 注入
使用 Mybatis 时,调用 DAO(Mapper)接口时是怎么调用到 SQL 的
介绍下 Spring IoC 的流程
BeanFactory 和 FactoryBean 的区别
Spring 的 AOP 是怎么实现的
Spring 的事务传播行为有哪些,讲下嵌套事务
什么情况下对象不能被代理
Spring 怎么解决循环依赖的问题
要在 Spring IoC 容器构建完毕之后执行一些逻辑,怎么实现
@Resource 和 @Autowire 的区别
@Autowire 怎么使用名称来注入
bean 的 init-method 属性指定的方法里用到了其他 bean 实例,会有问题吗
@PostConstruct 修饰的方法里用到了其他 bean 实例,会有问题吗
Spring 中,有两个 id 相同的 bean,会报错吗,如果会报错,在哪个阶段报错
Spring 中,bean 的 class 属性指定了一个不存在的 class,会报错吗,如果会报错,在哪个阶段
Spring 中的常见扩展点有哪些
真题解析:
面试必问的 Spring,你懂了吗?
面试题:mybatis 中的 DAO 接口和 XML 文件里的 SQL 是如何建立关系的?
面试题:mybatis 中的 DAO 接口和 XML 文件里的 SQL 是如何建立关系的?
MySQL
MySQL 索引的数据结构
为什么使用 B+ 树,与其他索引相比有什么优点
各种索引之间的区别
B+ 树在进行范围查找时怎么处理
MySQL 索引叶子节点存放的是什么
联合索引(复合索引)的底层实现
MySQL 如何锁住一行数据
SELECT 语句能加互斥锁吗
多个事务同时对一行数据进行 SELECT FOR UPDATE 会阻塞还是异常
MySQL 使用的版本和执行引擎
MySQL 不同执行引擎的区别
MySQL 的事务隔离级别
MySQL 的可重复读是怎么实现的
MySQL 是否会出现幻读
MySQL 的 gap 锁
MySQL 的主从同步原理
分库分表的实现方案
分布式唯一 ID 方案
如何优化慢查询
explain 中每个字段的意思
explain 中的 type 字段有哪些常见的值
explain 中你通常关注哪些字段,为什么
真题解析:
面试必问的 MySQL,你懂了吗?
MySQL 8.0 MVCC 核心原理解析(核心源码)
JVM
运行时数据区
服务器使用的什么垃圾收集器
CMS 垃圾收集的原理
G1 垃圾收集的特点,为什么低延迟
有哪些垃圾回收算法,优缺点
哪些对象可以作为 GC Roots
有哪些类加载器
双亲委派模式,哪些场景是打破双亲委派模式
线上服务器出现频繁 Full GC,怎么排查
定位问题常用哪些命令
介绍下 JVM 调优的过程
真题解析:待补充,可关注:原创汇总#面试题解析
Kafka
为什么使用 Kafka
介绍下 Kafka 的各个组件
如何保证写入 Kafka 的数据不丢失
如何保证从 Kafka 消费的数据不丢失
Kafka 为什么性能这么高
零拷贝技术使用哪个方法实现
Java 中也有类似的零拷贝技术,是哪个方法
Kafka 怎么保证消息的顺序消费
Kafka 怎么避免重复消费
什么是 HighWatermark 和 LEO
什么是 ISR,为什么需要引入 ISR
真题解析:待补充,可关注:原创汇总#面试题解析
Redis
项目中使用的 Redis 版本
Redis 在项目中的使用场景
Redis 怎么保证高可用
Redis 的选举流程
Redis 和 Memcache 的区别
Redis 的集群模式
Redis 集群要增加分片,槽的迁移怎么保证无损
Redis 分布式锁的实现
Redis 删除过期键的策略
Redis 的内存淘汰策略
Redis 的 Hash 对象底层结构
Redis 中 Hash 对象的扩容流程
Redis 的 Hash 对象的扩容流程在数据量大的时候会有什么问题吗
Redis 的持久化机制有哪几种
RDB 和 AOF 的实现原理、优缺点
AOF 重写的过程
哨兵模式的原理
使用缓存时,先操作数据库还是先操作缓存
为什么是让缓存失效,而不是更新缓存
缓存穿透、缓存击穿、缓存雪崩
更新缓存的几种设计模式
真题解析:
面试必问的分布式锁,你懂了吗?
面试必问的缓存使用:如何保证数据一致性、缓存设计模式
面试必问的 Redis:Memcached VS Redis
面试必问的 Redis:高可用解决方案哨兵、集群
面试必问的 Redis:主从复制
面试必问的 Redis:RDB、AOF、混合持久化
面试必问的 Redis:数据结构和基础概念
Zookeeper
Zookeeper 的使用场景
Zookeeper 怎么实现分布式锁
Zookeeper 怎么保证数据的一致性
ZAB 协议的原理
Zookeeper 遵循 CAP 中的哪些
Zookeeper 和 Eureka 的区别
Zookeeper 的 Leader 选举
Observer 的作用
Leader 发送了 commit 消息,但是所有的 follower 都没有收到这条消息,Leader 就挂了,后续会怎么处理
真题解析:待补充,可关注:原创汇总#面试题解析
分布式
CAP 理论
BASE 理论
分布式事务 2PC 和 TCC 的原理
TCC 在 cancel 阶段如果出现失败怎么处理
Paxos 算法、Raft 算法
真题解析:待补充,可关注:原创汇总#面试题解析
4、Hr 面
如果你一路过五关斩六将,最终来到了 Hr 面,那么恭喜你,你已经离 offer 非常非常近了。可以开始畅想自己升职加薪,当上总经理,出任 CEO,迎娶白富美,走上人生巅峰的场景了。
Hr 面主要是了解候选人的一些通用素质,经常会问的问题如下:
介绍下自己投入最多的项目(当时我就惊了,Hr 也开始问项目了 )
离职的原因
当前的薪资、绩效
当前在面试的其他公司的情况
平时有没有学习的习惯,怎么学习的,现在在学习什么
未来的规划
关于这些问题,没有什么标准答案,但是很重要的原则是,在整个过程中要保持积极向上的态度,不能有负面的情绪。
关于当前薪资的问题,由于诸多的原因,可能有些人会想着稍微多报一点,对于这种做法我持中立态度,但是要把握好度,毕竟大厂基本都有背景调查。大厂对于诚信问题一般是零容忍,而且可能会拉黑名单,进黑名单意味着你再也无缘这家公司了。
一些经验心得
先挑几个小公司找下面试感觉,太久没面,需要找找面试的感觉,我自己一开始就面的不太好,就很慌张?。
面试时紧张是正常的,但是不要过于紧张,如果面试官问完你大脑瞬间一片空白,你可以跟面试官说自己要思考下,然后回答的时候语速可以慢点,但是要条理清晰。
在面试的过程中回答面试官问题是一方面;另一方面,你要在回答的过程中让面试官感受到你身上一些优秀的特质,例如:有潜力、很灵活、热爱学习、学习能力强、解决问题能力强、基础扎实等等。这些特质都会影响面试官对你的评价。
平时项目中遇到难题要积极去解决,解决问题的过程能让人快速成长,并且解决的问题可能会成为你面试时的亮点,特别是对于那些项目没什么亮点的。
准备项目时,挑几个自己做过最牛逼的功能、或者解决过最有挑战的问题,并且要对这些内容理解的非常透彻,不能在给面试官介绍的时候 “支支吾吾”。
框架也好、中间件也好,必须要有几个特别深入研究过的,也就是说你除了“广度”之外,还必须在某些方面有足够的“深度”。面试时经常碰到的问题是:你对哪个框架或中间件理解的最深。然后面试官会在这个方向上一直问下去,如果你很多东西只是看了个大概,在这边就很有可能会被问倒。
自己讲出来的每个功能点、知识点,都要做好 “被挑战” 的心里准备,因此对于每个功能点、知识点都要多思考。
如果问的问题是线上实际的场景,有时候面试官会给出他们当前线上的解决方案,如果你能在这个时候给出一些自己的思考和观点,可能会给面试官留下不错的印象。
判断自己是否已经准备好的一个比较简单粗暴的方法:自己是否能将看到的面试题回答个 9 成左右,例如本文上面 “专业技能” 列举的这些题目。
如果你是真想跳槽,或者说你已经裸辞了,那么在收到电子 offer 前都不要停止面试,即使收到口头 offer 也不稳,特别是在这个寒冬。
在平时工作中多思考,无论是写代码还是方案设计,多思考更优的解决方案。特别是工作年限越久之后,思考对于我们的职业发展越重要。
面试前的准备非常重要,但更重要的是平时工作的积累,4 年经验问的问题很多是无法通过临时准备的,很多都是需要你不断去积累,才能有好的方案。
专注于自身的成长,不要轻易受到别人的影响,只要你不断的积累,总有一天你也能成为你眼中的那些大神。
学如逆水行舟,不进则退。不要停下学习的脚步,特别是趁着自己还年轻,趁着自己还是个单身狗的时候,逼自己一把,将来的你一定会感激现在拼命的自己。
程序员是一份很单纯的工作,不需要搞什么花里胡哨的,只要你付出努力了,你通常就能收获回报。
对于没有大厂背景,并且处于传统行业(就如 2 年前的我),想直接进入大厂比较难,除非你像我一样踩了狗屎运,但是这种几率不大,我觉得比较现实的途径是先找一个互联网独角兽沉淀一段时间。
大公司的部门非常多,各部门的招聘通常都是独立的,如果想进大公司可以多投,每个部门的需求紧张度不同,如果碰到急需招人的,可能就是一个非常好的机会。
大公司的面试通常会有存档,面试官可能会看到你之前的面试评价。如果你经常一轮游,肯定会给面试官不好的印象。因此请做好准备再去面试,不要轻易浪费机会。
2019 年互联网行业的行情不太好,也有可能接下去会一直这样,特别是对于没有大厂背景的同学来说,所以请记住一个很重要的原则:不要裸辞。
Last but not least,如果你觉得本文对你有帮助,欢迎关注我的微信公众号、右下角“在看”、分享到朋友圈,帮助更多的小伙伴。
推荐阅读
字节、美团、快手核心部门面试总结(真题解析)
两年Java开发工作经验面试总结
面试阿里,HashMap 这一篇就够了
面试必问的 MySQL,你懂了吗?
面试必问的线程池,你懂了吗?
专业技能方面
基础:JDK 常用类的原理、源码、使用场景。
设计模式:常用几种的原理、使用场景,单例、动态代理、模板、责任链等。
数据结构:数组、链表、栈、队列、树。
网络:TCP、HTTP、HTTPS、负载均衡算法。
框架:Spring IoC 原理、Spring AOP 原理和使用、Spring 常用的扩展点、MyBatis 的核心流程。
中间件:常用中间件的核心原理与最佳实践,并对其中的 1 到 2 个有深入的学习,Redis、Kafka(RocketMQ、RabbitMQ)、Dubbo、Zookeeper。
数据库(MySQL):索引原理、隔离级别、锁机制、分库分表、慢 SQL 定位及优化、线上问题解决。
Netty:NIO 原理、核心组件、I/O 多路复用(epoll)、零拷贝。
JVM:运行时数据区、垃圾回收算法、垃圾回收器(CMS、G1)、常用配置参数、线上问题定位及解决。
稳定性保障:隔离、限流、熔断、降级等。
Linux:基本命令的使用、快速定位和排查问题。
分布式理论:CAP、BASE、2PC、3PC、TCC。
项目方面
能独立完成一个复杂模块的需求分析、方案设计和最终落地实现。
能不断思考,寻找更优的设计和解决方案,积极优化慢 SQL、慢服务。
具备排查问题的能力,遇到线上问题能及时定位和修复上线,例如:数据库死锁、服务器宕机、服务器 Full GC 频繁等。
具备难题攻关的能力,能不断解决项目遇到的挑战,能给予初级工程师技术上的指导。
初步具备带领团队(1-3人左右)的能力,能合理分配需求,做好进度把控、风险评估、Code Review。
版权声明:本文标题:java神器 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://m.elefans.com/dianzi/1727613307a1122977.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论