非常非常不错的一篇面经文章,文中很多的面试题目都值得我们在面试前刷一遍,强烈推荐阅读3遍以上。如果觉得不错,可以收藏分享一下。(面经没有具体答案,需要大家一起来探讨学习一下。)
美团面试常问
- java虚拟机内存模型
- 内存溢出一般发生在哪个区?永久代会不会导致内存溢出?
- 动态加载类的框架了解哪些?
- 动态代理一般有哪几种实现方式?动态代理的应用场景有哪些?
- 栈会不会溢出?栈溢出一般抛什么异常?jvm在哪里设置栈的大小?设置的参数是什么?
- 用过哪些命令查看jvm的状态、堆栈信息?
- jvm的垃圾回收机制?
- java类加载机制?如何实现自定义类加载器?findClass与loadClass的区别?
- String、StringBuffer、StringBuilder的区别?对应的使用场景?
- 如何实现不可变的类?
- 浅复制和深复制?怎样实现深复制?
- HashMap、HashTable、ConcurrentHashMap的区别?
- CAS是一种什么样的同步机制?
- NIO的原理,包括哪几个组件?
- 简单介绍一下java的反射机制?反射在哪些地方有应用场景?
- spring加载bean的流程?
- java线程池?线程池构造函数的几个参数含义?keepAliveTime解释一下?
- 一个接口,要去调用另外5个接口,每一个接口都会返回数据给这个调用接口,调用接口要对数据进行合并并返回给上层。这样一种场景可能用到并发包下的哪些类?你会怎么去实现这样的业务场景?
- CountDownLatch和CyclicBarrier的区别?
- 线程加锁有哪些方式?synchronized和lock的区别?
- volatile关键字的作用?为什么使用AtomicLong而不使用Long?AtomicLong的底层是怎么实现的?
- mysql的存储引擎有哪几种?
- sql优化有哪些着手点?组合索引的最左前缀原则的含义?
- springmvc处理请求的流程?
- spring的事务怎么使用?事务回滚?自定义异常?
- 脏读?幻读?
- tcp四次挥手的过程?TIME_WAIT为什么至少设置两倍的MSL时间?
- get和post请求的区别?
- cookie和session的请求?
- 了解哪些开源的中间件?缓存?消息?分布式框架?
- 用到过哪些设计模式?单例模式的实现?
- 数据库的事务实现原理、操作过程、如何做到事物之间的独立性等问题
- 数据库的脏读,幻读,不可重复读出现的原因原理,解决办法
- 数据库的隔离级别、MVCC
- 乐观锁、悲观锁、互斥锁、读写锁的原理实现与区别
- 线程的生命周期
- 一致性hash算法原理与应用
- CAP原则
- CAS操作
- 分布式raft算法
腾讯篇
Java基础
- JAVA中的几种基本数据类型是什么,各自占用多少字节。
- String类能被继承吗,为什么。
- String,Stringbuffer,StringBuilder的区别。
- ArrayList和LinkedList有什么区别。
- 讲讲类的实例化顺序,比如父类静态数据,构造函数,字段,子类静态数据,构造函数,字段,当new的时候,他们的执行顺序。
- 用过哪些Map类,都有什么区别,HashMap是线程安全的吗,并发下使用的Map是什么,他们内部原理分别是什么,比如存储方式,hashcode,扩容,默认容量等。
- JAVA8的ConcurrentHashMap为什么放弃了分段锁,有什么问题吗,如果你来设计,你如何设计。
- 有没有有顺序的Map实现类,如果有,他们是怎么保证有序的。
- 抽象类和接口的区别,类可以继承多个类么,接口可以继承多个接口么,类可以实现多个接口么。
- 继承和聚合的区别在哪。
- IO模型有哪些,讲讲你理解的nio ,他和bio,aio的区别是啥,谈谈reactor模型。
- 反射的原理,反射创建类实例的三种方式是什么。
- 反射中,Class.forName和ClassLoader区别 。
- 描述动态代理的几种实现方式,分别说出相应的优缺点。
- 动态代理与cglib实现的区别。
- 为什么CGlib方式可以对接口实现代理。
- final的用途。
- 写出三种单例模式实现 。
- 如何在父类中为子类自动完成所有的hashcode和equals实现?这么做有何优劣。
- 请结合OO设计理念,谈谈访问修饰符public、private、protected、default在应用设计中的作用。
- 深拷贝和浅拷贝区别。
- 数组和链表数据结构描述,各自的时间复杂度。
- error和exception的区别,CheckedException,RuntimeException的区别。
- 请列出5个运行时异常。
- 在自己的代码中,如果创建一个java.lang.String类,这个类是否可以被类加载器加载?为什么。
- 说一说你对java.lang.Object对象中hashCode和equals方法的理解。在什么场景下需要重新实现这两个方法。
- 在jdk1.5中,引入了泛型,泛型的存在是用来解决什么问题。
- 这样的a.hashcode() 有什么用,与a.equals(b)有什么关系。
- 有没有可能2个不相等的对象有相同的hashcode。
- Java中的HashSet内部是如何工作的。
- 什么是序列化,怎么序列化,为什么序列化,反序列化会遇到什么问题,如何解决。
- java8的新特性。
JVM
- 什么情况下会发生栈内存溢出。
- JVM的内存结构,Eden和Survivor比例。
- JVM内存为什么要分成新生代,老年代,持久代。新生代中为什么要分为Eden和Survivor。
- JVM中一次完整的GC流程是怎样的,对象如何晋升到老年代,说说你知道的几种主要的JVM参数。
- 你知道哪几种垃圾收集器,各自的优缺点,重点讲下cms和G1,包括原理,流程,优缺点。
- 垃圾回收算法的实现原理。
- 当出现了内存溢出,你怎么排错。
- JVM内存模型的相关知识了解多少,比如重排序,内存屏障,happen-before,主内存,工作内存等。
- 简单说说你了解的类加载器,可以打破双亲委派么,怎么打破。
- 讲讲JAVA的反射机制。
- 你们线上应用的JVM参数有哪些。
- g1和cms区别,吞吐量优先和响应优先的垃圾收集器选择。
- 怎么打出线程栈信息。
开源框架
- 简单讲讲tomcat结构,以及其类加载器流程,线程模型等。
- tomcat如何调优,涉及哪些参数 。
- 讲讲Spring加载流程。
- Spring AOP的实现原理。
- 讲讲Spring事务的传播属性。
- Spring如何管理事务的。
- Spring怎么配置事务(具体说出一些关键的xml 元素)。
- 说说你对Spring的理解,非单例注入的原理?它的生命周期?循环注入的原理,aop的实现原理,说说aop中的几个术语,它们是怎么相互工作的。
- Springmvc 中DispatcherServlet初始化过程。
- netty的线程模型,netty如何基于reactor模型上实现的。
- 为什么选择netty。
- 什么是TCP粘包,拆包。解决方式是什么。
- netty的fashwheeltimer的用法,实现原理,是否出现过调用不够准时,怎么解决。
- netty的心跳处理在弱网下怎么办。
- netty的通讯协议是什么样的。
- springmvc用到的注解,作用是什么,原理。
- springboot启动机制。
操作系统
- Linux系统下你关注过哪些内核参数,说说你知道的。
- Linux下IO模型有几种,各自的含义是什么。
- epoll和poll有什么区别。
- 平时用到哪些Linux命令。
- 用一行命令查看文件的最后五行。
- 用一行命令输出正在运行的java进程。
- 介绍下你理解的操作系统中线程切换过程。
- 进程和线程的区别。
- top 命令之后有哪些内容,有什么作用。
- 线上CPU爆高,请问你如何找到问题所在。
头条篇
- 5个人去一个海岛寻宝,最后一共找到了100枚金币。他们约定了一个分配方案。
- 给你一个有序整数数组,数组中的数可以是正数、负数、零,请实现一个函数,这个函数返回一个整数:返回这个数组所有数的平方值中有多少种不同的取值。
- 一个环有10个节点,编号0-9。从0点出发,走N步又能回到0点,共有多少种走法?
- 一个乱序数组,求第K大的数。排序方式使用字典序。
- 一棵二叉树,求最大通路长度。(即最大左右子树高度之和)
- 进程和线程的区别,使用线程真的能节省时间?
- go协程的调度方式,使用协程真的能节省时间?
- 水平触发边沿触发的区别?在边沿触发下,一个socket有500的数据,已读取200然后不再处理,是不是剩下的300就永远无法读取?
- 有函数如下,输入1,返回什么?
- 设计http协议,A端发送 AAAA,至少让B端知道AAAA已发送完成。
- 流量总入口为api_gateway,api_gateway挂了会导致全部挂挂,用什么机制增大可用性?
- mysql为什么要用b+树,不用平衡二叉树做索引结构?
- 创建数据库索引应该怎么考虑?
- 使用int 做primary key和使用string 有什么优劣?
- 数据库分表的方法?
- 表结构,订单纪录如下,写一个语句,求卖的最好的 top 10 product_id。
- 微服务,A服务请求B服务B1接口,B1接口又请求A服务A2接口。会不会有问题?
- 不使用高级工具,只使用Linux自带的工具,你会如何debug?
- 如何预估一个mysql语句的性能?
- go函数中,返回值未命名,发生了panic,但是在函数内recover了。函数返回什么值?
- socket中,在tcp协议层面,数据分为10个报文发放。1-7次很顺利,第8次丢失。这次通信一定失败吗?如果第8次数据会重发,那在接收端是不是:先读取到1-7次的数据,然后读取到8-10次的数据?还是9-10次的数据会先到达?
- free -h,buffers 和cached有什么不同
- 后台进程有什么特点,如果要你设计一个进程是后台进程,你会考虑什么
- 僵尸进程是什么,如果产生一个僵尸进程,如何查找僵尸进程
- 孤儿进程是什么
- 一个进程有20个线程,在某个线程中调用fork,新的进程会有20个线程吗?
- tcp/ip 流量控制和拥塞控制
- 301/302有什么区别?应用上有什么异同。
- 50X相关错误码的内涵是什么?
- close wait和time wait是什么?如何排查?有什么意义?
- http req和resp的中数据有哪些
- 什么是连接的半打开,半关闭状态
- 假如一个业务依赖单点redis,此redis故障将导致业务不可用,如何改进
- redis sharding有哪些做法
- 当大量数据要求用redis保存,单机单点难以满足需要,设计(换寻找)一个负载均衡的方案
- 当redis 采用hash做sharding,现在有8个节点,负载方案是 pos = hash(key) % 8,然后保存在pos节点上。这样做有什么好处坏处?当8个节点要扩充到10个节点,应该怎么办?有什么更方便扩充的方案吗?(一致性hash, presharding)
- 如何保证redis和数据库数据的一致性。比如用户名既保存在数据库,又保存在redis做缓存。有如下操作 update_db(username); update_redis(username)。但是执行update_db后故障,update_redis没有执行。有什么简单办法解决这个问题。
- 数据库表包含三列:广告编号ad_id,广告开始投放时间ad_start,广告投放结束时间ad_end。用一行SQL语句查询给定时间段内存在的广告。
- 讲讲MapReduce的原理。
- 举出几种进程通信、线程通信的方式。
- 对列表中每一个元素找出比它大的第一个元素:输入一个listin,返回一个listout。对于任意listin[x],将满足 y > x 且 listin[y] > listin[x] 的第一个 listin[y] 值作为 listout[x] 的值。时间复杂度限制为O(n)。
滴滴篇
- B+树、B-树的区别?
- 数据库隔离级别,幻读和不可重复读的区别?
- 有hell, well, hello, world等字符串组,现在问能否拼接成helloworld,代码实现。
- **算法实现
- 线程安全的单例模式
- 25匹马赛跑,有一个赛场,只有五个赛道,没有计时器,只能通过目测来记录快慢,求出第三3快的马要多少场比赛?
- kmp算法next数组的求解思路
- 数组中有三个数字出现超过3/4,求这三个数字?
- 1到n+2个数组中缺了两个数,如何用O(n)时间,O(1)空间找到这两个数字。
- 一条线段长为1,随机选两个点,将改线段分为三段,三段能成三角形的概率是多少?
- 有一个教授,他三个学生,脑袋背后分别各写了一个数字,其中一个数字是另外两个数字的和,经过几轮后,有一个学生猜出了自己的数字请问是什么原因?
- B+树做索引时,B+树通常高度为多少层?要参考哪些条件?
并发编程篇
- 线程与进程的区别?
- 什么是多线程中的上下文切换?
- 死锁与活锁的区别,死锁与饥饿的区别?
- 什么是Executors框架?
- 什么是阻塞队列?阻塞队列的实现原理是什么?如何使用阻塞队列来实现生产者-消费者模型?
- 什么是Callable和Future?
- 什么是FutureTask?
- 什么是竞争条件?你怎样发现和解决竞争?
- 为什么我们调用start()方法时会执行run()方法,为什么我们不能直接调用run()方法?
- Java中你怎样唤醒一个阻塞的线程?
- java中有几种方法可以实现一个线程?
- 如何停止一个正在运行的线程?
- notify()和notifyAll()有什么区别?
- 什么是Daemon线程?它有什么意义?
- 乐观锁和悲观锁的理解及如何实现,有哪些实现方式?
MySQL篇
- 主键 超键 候选键 外键
- 数据库事务的四个特性及含义
- 视图的作用,视图可以更改么?
- drop,delete与truncate的区别
- 索引的工作原理及其种类
- 连接的种类
- 数据库范式
- 数据库优化的思路
- 存储过程与触发器的区别
Redis篇
- 使用Redis有哪些好处?
- redis相比memcached有哪些优势?
- redis常见性能问题和解决方案
- MySQL里有2000w数据,redis中只存20w的数据,如何保证redis中的数据都是热点数据
- Memcache与Redis的区别都有哪些?
- Redis 常见的性能问题都有哪些?如何解决?
- redis 最适合的场景
- Redis的同步机制了解么?
- 是否使用过Redis集群,集群的原理是什么?
- redis集群如何保证一致性?
Nginx篇
- 请解释一下什么是Nginx?
- 请列举Nginx的一些特性?
- 请列举Nginx和Apache 之间的不同点?
- 请解释Nginx如何处理HTTP请求。
- 在Nginx中,如何使用未定义的服务器名称来阻止处理请求?
- 使用“反向代理服务器”的优点是什么?
- 请列举Nginx服务器的最佳用途。
- 请解释Nginx服务器上的Master和Worker进程分别是什么?
- 请解释你如何通过不同于80的端口开启Nginx?
- 请解释是否有可能将Nginx的错误替换为502错误、503?
- 在Nginx中,解释如何在URL中保留双斜线?
- 请解释ngx_http_upstream_module的作用是什么?
- 请解释什么是C10K问题,后来是怎么解决的?
- 请陈述stub_status和sub_filter指令的作用是什么?
- 解释Nginx是否支持将请求压缩到上游?
- 解释如何在Nginx中获得当前的时间?
- 用Nginx服务器解释-s的目的是什么?
- 解释如何在Nginx服务器上添加模块?
- nginx中多个work进程是如何监听同一个端口的?如何处理客户连接的惊群问题?
- nginx程序的热更新是如何做的?
算法篇
- 10亿个数字里里面找最小的10个。
- 有1亿个数字,其中有2个是重复的,快速找到它,时间和空间要最优。
- 2亿个随机生成的无序整数,找出中间大小的值。
- 给一个不知道长度的(可能很大)输入字符串,设计一种方案,将重复的字符排重。
- 遍历二叉树。
- 有3n+1个数字,其中3n个中是重复的,只有1个是不重复的,怎么找出来。
- 写一个字符串(如:www.javastack.cn)反转函数。
- 常用的排序算法,**,归并、冒泡。 **的最优时间复杂度,最差复杂度。冒泡排序的
- 优化方案。
- 二分查找的时间复杂度,优势。
- 一个已经构建好的TreeSet,怎么完成倒排序。
- 什么是B+树,B-树,列出实际的使用场景。
- 一个单向链表,删除倒数第N个数据。
- 200个有序的数组,每个数组里面100个元素,找出top20的元素。
- 单向链表,查找中间的那个元素。