大佬总结的面试题纲: https://github.com/farmerjohngit/myblog/issues/21
Hashmap 源码级掌握,扩容,红黑树,最小树化容量,hash 冲突解决,有些面试官会提出发自灵魂的审问,比如为什么是红黑树,别的树不可以吗;为什么 8 的时候树化,4 不可以吗,等等 concureentHashMap,段锁,如何分段,和 hashmap 在 hash 上的区别,性能,等等 HashTable,同步锁,这块可能会问你 synchronized 关键字 1.6 之后提升了什么,怎么提升的这些 ArrayList 优势,扩容,什么时候用 LinkedList 优势,什么时候用,和 arraylist 的区别 等等 基本类型和包装类型的区别,涉及自动装箱和拆箱,怎么做的,原理 String,StringBuffer,StringBuilder 哪个是安全的 字符串编码的区别,被问到过,我觉得比较容易被忽视的一个点 什么是泛型,怎么用泛型 static 能不能修饰 threadLocal,为什么,这道题我当时一听到其实挺懵逼的 Comparable 和 Comparator 接口是干什么的,其区别 多态的原理是什么,感觉这个很容易被问到 接口和抽象类,面试官问我是怎么理解的,我说接口对应功能,抽象类对应属性,然后面试官给我说了他的看法,说抽象类更偏向于一种模板~ 然后又交流了一下各自的想法 如何通过反射和设置对象私有字段的值 快速失败(fail-fast)和安全失败(fail-safe)的区别是什么 synchronized 的实现原理以及锁优化? volatile 的实现原理? Java 的信号灯? synchronized 在静态方法和普通方法的区别? 怎么实现所有线程在等待某个事件的发生才会去执行? CAS ? CAS 有什么缺陷,如何解决? synchronized 和 lock 有什么区别? Hashtable 是怎么加锁的 ? List,Map,Set 接口在取元素师,各有什么特点 如何线程安全的实现一个计数器 生产者消费者模式,要求手写过代码,还是要知道的 单例模式,饿汉式,懒汉式,线程安全的做法,两次判断 instance 是否为空,每次判断的作用是什么。 线程池,这个还是很重要的,在生产中用的挺多,四个线程池类型,其参数,参数的理解很重要,corepoolSize 怎么设置,maxpoolsize 怎么设置,keep-alive 各种的,阻塞队列在生产中的设置,一般设置为 0,防止用户阻塞 cyclicbarrier 和 countdownlatch 的区别,个人理解 赛马和点火箭 线程回调,这块 被问过让我设计一个 RPC,怎么实现,其实用到了回调这块的东西 sleep 和 yeild 方法有什么区别 volatile 关键字,可见性。 乐观锁和悲观锁的使用场景 悲观锁的常见实现方式:lock synchronized retreentlock 乐观锁:CAS MVCC 读写锁的实现方式,16 位 int 的前八位和后八位分别作为读锁和写锁的标志位 死锁的条件,怎么解除死锁,怎么观测死锁。 希望大家能够好好看一下反射的原理,怎么确定类,怎么调方法 RPC 框架,同步异步,响应时间,这些都被问到过,还让设计过 同步,异步,阻塞,非阻塞 最好再找一些应用场景加以理解
## JAVA 基础 1. HashMap 的源码,实现原理; JDK8 做了什么优化 2. HashMap 扩容机制,为什么都是 2 的 N 次幂 3. ArrayList 和 Vector 的区别,扩容机制等 4. CopyOnWriteArrayList 原理 5. HashSet 和 TreeSet 原理 6. ArrayBlockingQueue 和 LinkedBlockingQueue 区别 7. 集合迭代器的原理 8. 传值和传引用的区别 9. 动态代理 10. JDK8 ConcurrentHashMap 的原理 ## 多线程 1. 创建多线程的方式,以及线程的状态转换 2. 线程的中断机制 3. ThreadPoolExecutor 初始化参数; Executors 静态方法 4. synchronized 的使用方式及原理 5. 偏向锁、轻量级锁、自旋锁等优化 6. ReentrantLock 的特点及 AQS 原理 7. Semaphore、CountDownLatch、CyclicBarrier 等使用 8. ThreadLocal 的原理、与 Thread 类的关系、以及内存泄漏问题 9. volatile 的原理及内存屏障相关 10. Lock 接口有哪些实现类,使用场景是什么 11. 悲观锁,乐观锁,优缺点,CAS 有什么缺陷,该如何解决 12. ABC 三个线程如何保证顺序执行 13. 生产者消费者模式的实现方式 14. 如何实现控制线程在某段时间内完成,不完成就撤销 ## JVM 1. JVM 的内存区域 2. 字符串常量池相关 3. 对象的内存布局,涉及到锁的部分 4. 类加载的过程,以及双亲委派机制、自定义类加载器 5. GC 常见算法,CMS 以及 G1 的垃圾回收过程,CMS 的各个阶段哪两个是 Stop the world 的,CMS 会不会产生碎片,G1 的优势 6. 标记清除、复制和标记整理算法的理解以及优缺点 7. eden survivor 区的比例,为什么是这个比例,eden survivor 的工作过程 8. JVM 如何判断一个对象是否该被 GC,可以视为 root 的都有哪几种类型 9. 强软弱虚引用的区别以及 GC 对他们执行怎样的操作 10. Java 是否可以 GC 直接内存 11. 常用的 JVM 调优参数 12. GC 优化的步骤 13. 当出现了内存泄漏或内存溢出,怎么排错 14. CMS 和 G1 收集过程 ## 数据库相关 1. 常见的数据库优化手段 2. 索引的优缺点,以及索引选择 3. B+树索引的原理 4. 数据库连接池 5. MySQL 的锁机制 6. MVCC 和 ReadView 7. InnoDB 的一些特性 8. 数据库三范式 ## 计算机网络、操作系统 1. TCP,UDP 区别 2. 三次握手,四次挥手,为什么要四次挥手 3. 长连接和短连接,连接池适合长连接还是短连接 4. OSI 七层模型 5. 用户态和内核态 ## 数据结构和算法 1. 红黑树、AVL 树 2. B 树、B+树 3. 排序算法 4. 一致性 Hash 算法,一致性 Hash 算法的应用 5. TopK 问题 6. 判断链表是否有环 ## 缓存相关 1. redis 支持的数据类型及使用场景 2. redis 单线程为什么还那么快 3. redis 如何存储一个 String 的 4. redis 的过期策略 5. redis 的部署方式,主从,集群 6. redis 的哨兵模式,一个 key 值如何在 redis 集群中找到存储在哪 7. redis 持久化策略 8. 缓存穿透、缓存击穿、缓存雪崩问题及解决方法 9. 缓存和数据库一致性问题 ## 框架相关 1. Spring 的常用注解及作用 2. Spring Bean 的生命周期 3. Spring 怎么解决单例 Bean 的循环依赖问题 4. Spring 对于 IOC 的扩展点有哪些 5. Spring AOP 的原理,及代理对象调用过程(责任链+递归调用) 6. Spring 的事务机制,及执行流程 7. Spring 使用了哪些设计模式 8. Mybatis 基于接口完成查询的过程及原理 9. Mybatis 的一级缓存和二级缓存 10. Quartz 是如何完成定时任务的;集群同步机制 ## 分布式相关 1. 分布式事务的控制 2. 分布式锁如何设计 3. 分布式 session 如何设计 4. dubbo 的组件有哪些,及其作用 5. dubbo SPI 机制;远程接口调用过程 6. dubbo 支持的协议及序列化方式 7. dubbo 的负载均衡和容错策略 8. zookeeper 的 ZAB 协议工作原理 9. zookeeper 的 Watcher 机制 10. zookeeper 的 Watcher 机制 11. zookeeper 的数据存储 12. zookeeper 的负载均衡算法 13. rocketmq 的模块功能 14. rocketmq 的高可用及高性能 15. elasticsearch 的系统架构及读写过程 16. elasticsearch 在数据量很大的情况下(数十亿级别)如何提高查询效率啊 17. eureka 的相关原理,和 zookeeper 的比较
1 java 线程池的实现原理,threadpoolexecutor关键参数解释
public ThreadPoolExecutor(int corePoolSize 核心线程数,int maximumPoolSize最大线程数,long keepAliveTime空闲时间,TimeUnit unit时间单位,BlockingQueue<Runnable> workQueue任务等待队列,ThreadFactory threadFactory,RejectedExecutionHandler handler拒绝策略) 等待队列为有界时:corePoolSize先执行 满后 交给队列 满后 创建新线程执行直到maximumPoolSize也满 执行拒绝 为无界时:corePoolSize先执行 满后 交给队列 直到系统资源耗尽 最大线程数无意义 拒绝策略: AbortPolicy 抛异常 CallerRunsPolicy 线程池未关闭情况下 调用者运行该被抛弃任务 DiscardOldestPolicy 丢弃最老任务 尝试再次提交 DiscardPolicy 丢弃无法处理的任务 2 hashmap的原理,容量为什么是2的幂次
2的幂次-1 低位都是1 保证与操作均匀分布 3 为什么要同时重写hashcode和equals
一是规定 二是保证equals和hashcode一致性 equals相同则hashcode一定相同 4 ConcurrentHashMap如何实现线程安全?
1.7 Segment 分段锁 1.8 node+链表+红黑树 类似加强版hashmap 更细粒度的锁 取长度:1.7 连续取三次 如果三次结果不一样再加锁 1.8通过对baseCount和counterCell进行 CAS 计算,最终通过 baseCount 和 遍历 CounterCell 数组得出 size 5 介绍Java多线程的5大状态,以及状态图流转过程
新建(NEW) 可运行(RUNNABLE) 运行(RUNNING) 阻塞(BLOCKED) 死亡(DEAD) 介绍下Synchronized、Volatile、CAS、AQS,以及各自的使用场景 B+树和红黑树时间复杂度 logmn m是阶数 log2n 如果频繁老年代回收怎么分析解决 检查大对象 调整新生代老年代比例 调整堆大小 JVM内存模型,新生代和老年的回收机制 新生代 复制算法 浪费10%空间 老年代标记整理 新:老=1:2 mysql limit分页如何保证可靠性
首先获取到offset的id然后直接使用Mysql limit size来获取数据 Select * From tableName Where ID>=( Select ID From tableName limit 90000,1 )limit 100;
java nio,bio,aio,操作系统底层nio实现原理 bio:同步阻塞 一个客户端请求一个线程 不支持太多并发请求 伪异步模式 服务端运用线程池 nio:同步非阻塞 1.7后异步非阻塞 buffer缓冲器 socketChannel通道 选择器多路复用 buffer:三个重要变量position/limit/capaciy put/get;调用filp方法后lim=pos pos=0;warp()包裹duplicate()复制;remainin()可读长度 Spring IOC,autowired如何实现 Spring事务传播机制 线程死锁排查 jps查看pid + jstack 或在window打开 JConsole MySQL引擎及区别,项目用的哪个,为什么 RPC为什么用http做通信? RPC两端如何进行负载均衡? mycat分库分表、读写分离的实现 分布式数据如何保证数据一致性 高并发请求处理,流量削峰措施有哪些
Redis持久化RDB和AOF 的区别 rdb:保存快照 指定时间内操作多少次KEY更新或指定时间更新 dump.rdb aof:将写命令都保存在某一文件 重启时加载此文件 MQ底层实现原理 详细介绍下分布式 一致性Hash算法 nginx负载均衡的算法 Nginx 的 upstream目前支持 哪4 种方式的分配 分布式集群部署后,从应用端哪些需要怎么调整 Dubbo默认使用什么注册中心,还有别的选择吗? mongoDB、redis和memcached的应用场景,各自优势 谈谈你性能优化的实践案例,优化思路? 两千万用户并发抢购,你怎么来设计?
1、什么是微服务?
2、微服务之间是如何独立通讯的
3、springCloud和dubbo 有哪些区别?
4、springboot和springcloud,请你谈谈对他们的理解?
5、什么是微服务熔断?什么是服务降级?
6、微服务的优缺点分别是什么?说下你在项目开发中碰到的坑
7、你所知道的微服务技术栈有哪些?请列举一二
8、eureka和zookeeper都可以提供服务的注册和发现的功能,请说说两个的区别?