面试官与水货程序员谢飞机的奇妙面试之旅(一)
面试官与水货程序员谢飞机的奇妙面试之旅本文纯属虚构仅供娱乐学习使用开场白今天要给大家分享一个有意思的面试故事。我们的主角谢飞机同志某三本院校计算机专业毕业自学Java两年自认为掌握了Java核心知识简历上写得那是相当漂亮精通Java、SpringBoot、Redis、MySQL...这不他收到了某大厂的面试邀请屁颠屁颠地就去了。第一轮面试基础扎不扎实面试官VS谢飞机面试官推了推眼镜谢飞机同学你好先简单自我介绍一下吧。谢飞机自信满满面试官好我叫谢飞机Java学习两年精通SpringBoot、Redis、MySQL参与过多个项目开发...面试官眉头一皱好的那我们开始问问题了。先来几个简单的基础题热热身。❓ 问题1HashMap的底层数据结构是什么面试官HashMap的底层数据结构是什么谢飞机这个我会HashMap底层是数组链表红黑树JDK1.8之后当链表长度超过8并且数组长度大于64时链表会转为红黑树用于提高查询效率。面试官点点头不错那你知道HashMap是线程安全的吗❓ 问题2HashMap是线程安全的吗谢飞机这个也简单不是HashMap不是线程安全的如果要线程安全可以用HashTable或者ConcurrentHashMap。面试官继续追问那ConcurrentHashMap是怎么保证线程安全的❓ 问题3ConcurrentHashMap如何保证线程安全谢飞机开始慌了这个...它...使用了...CAS...对CAS操作...还有...分段锁面试官笑而不语行那我们来问问ArrayList的问题。❓ 问题4ArrayList和LinkedList的区别谢飞机这个我会ArrayList底层是数组查询快增删慢LinkedList底层是双向链表增删快查询慢面试官微微点头不错那ArrayList扩容机制了解吗❓ 问题5ArrayList的扩容机制谢飞机糟了这个只知道一点就是...扩容是1.5倍...对吧面试官对那你知道具体是怎么扩容的吗谢飞机支支吾吾就是...调用grow方法...然后...Arrays.copyOf...复制...面试官笑了笑基础还行我们进入下一轮。第二轮面试进阶知识点面试官第二轮我们聊聊多线程和JUC相关的内容。❓ 问题1创建线程的方式有几种谢飞机这个简单三种继承Thread类、实现Runnable接口、实现Callable接口面试官那Runnable和Callable有什么区别❓ 问题2Runnable和Callable的区别谢飞机开始紧张了Runnable的run方法没有返回值Callable的call方法有返回值...而且Callable可以抛出异常...面试官点点头那你知道线程池吗❓ 问题3线程池的核心参数有哪些谢飞机背课文核心线程数、最大线程数、空闲线程存活时间、时间单位、阻塞队列、拒绝策略面试官那你说说拒绝策略有哪些❓ 问题4线程池的拒绝策略谢飞机卡住了有...AbortPolicy...还有...CallerRunsPolicy...还有一个...Discard...还有一个...DiscardOldest...对不对面试官笑对那你能解释一下这些策略的区别吗谢飞机开始胡说了AbortPolicy就是中止...CallerRunsPolicy就是让调用者运行...Discard就是丢弃...DiscardOldest就是丢弃最老的...面试官摆摆手行我们聊聊JVM。❓ 问题5JVM的内存结构了解吗谢飞机这个要完有堆...有栈...还有...方法区...本地方法栈...程序计数器...面试官那你知道堆内存分为哪几部分吗谢飞机开始编了新生代...老年代...还有...永久代不对现在好像改成元空间了...面试官勉强及格我们继续。第三轮面试框架与实战面试官第三轮我们聊聊实际项目中用到的技术。❓ 问题1SpringBoot的自动配置原理谢飞机慌了就是...SpringBootApplication...里面有个EnableAutoConfiguration...然后...Spring Boot 会读取META-INF/spring.factories...然后...自动配置...面试官追问那你知道如何排除自动配置吗❓ 问题2如何排除SpringBoot的自动配置谢飞机强行回答可以使用EnableAutoConfiguration(exclude {...})或者在application.yml中配置exclude属性面试官那聊聊Redis吧你们项目里Redis怎么用的❓ 问题3Redis的数据类型有哪些谢飞机这个我会String、Hash、List、Set、Zset还有HyperLogLog、Bitmap、Geospatial...面试官那Redis的持久化机制呢❓ 问题4Redis的持久化机制谢飞机开始编了有RDB和AOF两种RDB是定期快照...AOF是记录所有写操作...可以混合使用...面试官那你说说它们各自的优缺点谢飞机说不清楚了RDB...恢复快...但是可能丢数据...AOF...数据完整...但是文件大...慢...面试官笑了笑最后一个问题你们项目里用MySQL遇到过慢查询吗怎么优化的❓ 问题5MySQL慢查询优化谢飞机这个必须会首先用Explain分析执行计划...看有没有用索引...可以建索引...避免全表扫描...还有...优化SQL语句...加索引...分库分表...面试官满意的点点头不错最后问一下你们有用过消息队列吗❓ 问题6RabbitMQ的工作模式谢飞机只知道一种有简单模式...工作模式...发布订阅模式...路由模式...通配符模式...面试官行今天的面试就到这里。你有什么想问的吗谢飞机终于结束了那个...贵公司福利怎么样...有加班费吗...面试官微微一笑这些问题等通知再说吧。回去等通知吧有消息我们会联系你的。谢飞机内心崩溃又是一样的结局...面试结果谢飞机同志的第三次大厂面试就此结束据说后来他回去恶补了三个月终于在第四次面试时成功入职某中小厂实现了程序员的梦想。 答案解析第一轮答案1. HashMap的底层数据结构HashMap底层采用数组链表红黑树的数据结构JDK 1.8之前数组链表JDK 1.8及之后数组链表红黑树当链表长度超过8且数组长度大于64时链表会转换为红黑树查询时间复杂度从O(n)降为O(logn)。2. HashMap线程安全问题HashMap不是线程安全的在多线程环境下可能导致死循环JDK 1.7环形链表数据丢失并发修改异常线程安全替代方案Hashtable全局锁效率低Collections.synchronizedMap()ConcurrentHashMap推荐3. ConcurrentHashMap如何保证线程安全JDK 1.7Segment分段锁每个Segment继承ReentrantLockJDK 1.8放弃Segment使用CASsynchronized对每个桶单独加锁使用**CASCompare-And-Swap**保证原子性使用synchronized保证可见性4. ArrayList和LinkedList区别| 特性 | ArrayList | LinkedList | |------|-----------|------------| | 底层结构 | 动态数组 | 双向链表 | | 查询效率 | O(1) | O(n) | | 增删效率 | O(n) | O(1) | | 内存占用 | 连续内存 | 每个节点需要额外指针 | | 适用场景 | 查询多 | 增删多 |5. ArrayList扩容机制// 扩容核心方法 private void grow(int minCapacity) { int oldCapacity elementData.length; // 新容量 旧容量 旧容量/2 (即1.5倍) int newCapacity oldCapacity (oldCapacity 1); if (newCapacity - minCapacity 0) newCapacity minCapacity; // 使用Arrays.copyOf复制数据 elementData Arrays.copyOf(elementData, newCapacity); }扩容流程检查是否需要扩容扩容为原来的1.5倍使用Arrays.copyOf()复制到新数组如果还不够直接扩容到所需大小第二轮答案1. 创建线程的方式三种方式继承Thread类实现Runnable接口实现Callable接口配合FutureTask2. Runnable vs Callable| 特性 | Runnable | Callable | |------|-----------|----------| | 返回值 | void | V | | 异常 | 不可抛出 | 可抛出Exception | | 执行方法 | run() | call() | | 获取结果 | 无 | Future.get() |3. 线程池核心参数public ThreadPoolExecutor( int corePoolSize, // 核心线程数 int maximumPoolSize, // 最大线程数 long keepAliveTime, // 空闲线程存活时间 TimeUnit unit, // 时间单位 BlockingQueueRunnable workQueue, // 阻塞队列 ThreadFactory threadFactory, // 线程工厂 RejectedExecutionHandler handler // 拒绝策略 )4. 线程池拒绝策略AbortPolicy默认抛出RejectedExecutionExceptionCallerRunsPolicy由调用线程执行任务DiscardPolicy直接丢弃任务DiscardOldestPolicy丢弃队列最老的任务5. JVM内存结构线程私有程序计数器记录当前线程执行的字节码行号虚拟机栈方法执行的内存模型每个方法一个栈帧本地方法栈native方法使用的栈线程共享堆存放对象实例GC主要区域方法区存放类信息、常量、静态变量JDK 8后改为元空间堆内存分布新生代Eden区 Survivor区老年代JDK 8后元空间替代永久代第三轮答案1. SpringBoot自动配置原理核心注解SpringBootApplicationSpringBootApplication // 等价于 Configuration // 标注为配置类 EnableAutoConfiguration // 启用自动配置 ComponentScan // 组件扫描自动配置流程Spring Boot启动时加载META-INF/spring.factories读取EnableAutoConfiguration类的全限定名根据条件注解Conditional判断是否加载将符合条件的Bean注入容器排除自动配置SpringBootApplication(exclude {DataSourceAutoConfiguration.class}) // 或 EnableAutoConfiguration(exclude {DataSourceAutoConfiguration.class}) // 或配置文件中 spring.autoconfigure.excludeorg.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration2. Redis数据类型String字符串Hash哈希表List列表双向链表Set集合无序不重复ZSet有序集合HyperLogLog基数统计Bitmap位图Geospatial地理位置3. Redis持久化机制RDBRedis Database定期生成数据快照优点恢复快文件小缺点可能丢失最近数据AOFAppend Only File记录所有写操作命令优点数据完整缺点文件大恢复慢推荐策略RDBAOF混合使用4. MySQL慢查询优化步骤开启慢查询日志使用EXPLAIN分析执行计划优化策略合理使用索引避免全表扫描优化SQL语句分库分表读写分离索引优化原则区分度高的列放在前面遵循最左前缀原则避免索引失效尽量使用覆盖索引5. RabbitMQ工作模式简单模式单个生产者-消费者工作模式多个消费者竞争消息发布订阅模式Fanout Exchange路由模式Direct Exchange通配符模式Topic Exchange总结谢飞机同志的面试之旅告诉我们基础要扎实HashMap、ArrayList这些常问题必须掌握多线程要深入JUC包下的类要会用原理要懂框架要理解原理不能只会用要懂为什么项目经验要总结优化经验要能说出来希望大家在面试中不要像谢飞机要做真材实料的程序员未完待续...谢飞机的第四次面试又会发生什么呢
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2440123.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!