前言
大学毕业后工作7年了,曾面试了阿里集团(菜鸟网络,蚂蚁金服),网易,滴滴,点我达,最终收到点我达,网易offer,蚂蚁金服二面挂掉,菜鸟网络一个月了还在流程中…最终有幸去了网易。但是要特别感谢点我达的领导及HR,真的非常非常好,很感谢他们一直的关照和指导。
小编在这里给大家整理了包括但不限于:JAVA基础和进阶类、Spring、Spring boot、Spring MVC、MyBatis、MySQL、JVM等面试题。
面试整体事项
- 简历要准备好,联系方式一定要正确清晰醒目,项目经历按照时间倒序阐述,注意描述自己在项目中承担的职责,简历的模板尽量选择简洁的,毕竟程序员大部分还是喜欢简单明了的。
- 推荐Boss直聘,我觉得很好用(不是广告)。
- 一般的整体面试流程都是电面->现场面->HR面->等着。
- 不要觉得HR说让你回去等消息就是GG了,他们也要跟你之前的面试官讨论,再向领导汇报,如果说不急可能还要和其他候选人比较,所以HR让你回去等消息绝对不是说明你完蛋了。
- 面试前准备好自我介绍,1分钟左右就可以,可以写在纸上,电面可以照着念,等你到了现场面了基本也都快背下来你的自我介绍了。
- 准备好扎实的基础,这是一切的根源,没实力怎么都没用的。
- 面试中你可以把你的面试官往你会的知识上引导(我遇到过你会什么他不问什么的)。
- 遇到了设计类题目不要着急,面试官不是为了让你几分钟设计一个高并发高可用设计模式完美的架构,只是想看看你的思路,看看你应变的能力,然后给你些提示看看你能否迅速的调整。
- offer都会有的,不要着急,把面试当成一个交流的过程。
——【文末即可免费获取】
需要准备的知识
以下为在近期面试中比较有印象的问题,也就不分公司了,因为没什么意义,大致分类记录一下,目前只想起这么多,不过一定要知道这些问题只是冰山一角,就算都会了也不能怎么样,最最重要的,还是坚实的基础,清醒的头脑。
Java基础
- HashMap的源码,实现原理,JDK8中对HashMap做了怎样的优化。
- HaspMap扩容是怎样扩容的,为什么都是2的N次幂的大小。
- HashMap,HashTable,ConcurrentHashMap的区别。
- 极高并发下HashTable和ConcurrentHashMap哪个性能更好,为什么,如何实现的。
- HashMap在高并发下如果没有处理线程安全会有怎样的安全隐患,具体表现是什么。
- java中四种修饰符的限制范围。
- Object类中的方法。
- 接口和抽象类的区别,注意JDK8的接口可以有实现。
- 动态代理的两种方式,以及区别。
- Java序列化的方式。
- 传值和传引用的区别,Java是怎么样的,有没有传值引用。
- 一个ArrayList在循环过程中删除,会不会出问题,为什么。
- @transactional注解在什么情况下会失效,为什么。
Spring
- 什么是spring?
- 使用Spring框架的好处是什么?
- Spring由哪些模块组成?
- BeanFactory–BeanFactory实现举例。
- XMLBeanFactory
- 解释AOP模块
- 解释JDBC抽象和DAO模块。
- 解释对象/关系映射集成模块。
- 使用Spring有哪些方式?
Spring boot
- 什么是Spring Boot?
- Spring Boot有哪些优点?
- 什么是JavaConfig?
- 如何重新加载Spring Boot上的更改,而无需重新启动服务器?
- Spring Boot中的监视器是什么?
- 如何在Spring Boot中禁用Actuator端点安全性?
- 如何在自定义端口上运行Spring Boot应用程序?
- 什么是YAML?
- 如何实现Spring Boot应用程序的安全性?
- 如何集成Spring Boot和ActiveMQ?
- 如何使用Spring Boot实现分页和排序?
- SpringBoot自动配置原理?
- SpringBoot热部署方式?
Spring MVC
- 什么是Spring的MVC框架?
- DispatcherServlet
- WebApplicationContext
- 什么是Spring MVC框架的控制器?
- @Controller注解
- @RequestMapping注解
MyBatis
- 什么是Mybatis?
- Mybaits的优点
- MyBatis框架的缺点
- MyBatis框架适用场合
- MyBatis与Hibernate有哪些不同?
- #{}和${}的区别是什么?
MySQL
- MySQL中有哪几种锁?
- MySQL中有哪些不同的表格?
- 简述在MySQL数据库中MyISAM和InnoDB的区别
- MySQL中InnoDB支持的四种事务隔离级别名称,以及逐级之间的区别?
- CHAR和VARCHAR的区别?
- 主键和候选键有什么区别?
- myisamchk是用来做什么的?
- 如果一个表有一列定义为TIMESTAMP,将发生什么?
- 你怎么看到为表格定义的所有索引?
- LIKE声明中的%和_是什么意思?
- 列对比运算符是什么?
数据结构和算法
- B+树
- 快速排序,堆排序,插入排序(其实八大排序算法都应该了解)
- 栈(stack)
答:
栈( stack)是限制插入和删除只能在一个位置上进行的表,该位置是表的末端,叫做栈顶(top)。它是后进先出(LIFO)的。对栈的基本操作只有 push(进栈)和 pop(出栈)两种,前者相当于插入,后者相当于删除最后的元素。
答:
队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。
答:
链表是一种数据结构,和数组同级。比如, Java中我们使用的ArrayList,其实现原理是数组。而LinkedList的实现原理就是链表了。链表在进行循环遍历时效率不高,但是插入和删除时优势明显。
答:
散列表(Hash table,也叫哈希表)是一种查找算法,与链表、树等算法不同的是,散列表算法在查找时不需要进行一系列和关键字(关键字是数据元素中某个数据项的值,用以标识一个数据元素)的比较操作。
散列表算法希望能尽量做到不经过任何比较,通过一次存取就能得到所查找的数据元素,因而必须要在数据元素的存储位置和它的关键字(可用key表示)之间建立一个确定的对应关系,使每个关键字和散列表中一个唯一的存储位置相对应。因此在查找时,只要根据这个对应关系找到给定关键字在散列表中的位置即可。这种对应关系被称为散列函数(可用h(key)表示)。
用的构造散列函数的方法有:
1) 直接定址法: 取关键字或关键字的某个线性函数值为散列地址。
即: h(key) = key或h(key) = a * key + b, 其中a和b为常数。
(2) 数字分析法
(3) 平方取值法:取关键字平方后的中间几位为散列地址。
(4) 折叠法:将关键字分割成位数相同的几部分,然后取这几部分的叠加和作为散列地址。
(5) 除留余数法:取关键字被某个不大于散列表表长m的数p除后所得的余数为散列地址,
即: h(key) = key MOD p p ≤ m
(6) 随机数法:选择一个随机函数,取关键字的随机函数值为它的散列地址,
即: h(key) = random(key)
答:
首先如果普通二叉树每个节点满足:左子树所有节点值小于它的根节点值,且右子树所有节点值大于它的根节点值,则这样的二叉树就是排序二叉树。
插入操作
首先要从根节点开始往下找到自己要插入的位置(即新节点的父节点);具体流程是:新节点与当前节点比较,如果相同则表示已经存在且不能再重复插入;如果小于当前节点,则到左子树中 寻找,如果左子树为空则当前节点为要找的父节点,新节点插入到当前节点的左子树即可;如果大于当前节点,则到右子树中寻找,如果右子树为空则当前节点为要找的父节点,新节点插入到当前节点的右子树即可。
- 一致性Hash算法,一致性Hash算法的应用
- 插入排序算法
- 快速排序算法
- 希尔排序算法
- 归并排序算法
- 桶排序算法
- 基数排序算法
- 剪枝算法
- 回溯算法
- 最短路径算法
- 最小生成树算法
JVM
- JVM的内存结构。
- JVM方法栈的工作过程,方法栈和本地方法栈有什么区别。
- JVM的栈中引用如何和堆中的对象产生关联。
- 可以了解一下逃逸分析技术。
- GC的常见算法,CMS以及G1的垃圾回收过程,CMS的各个阶段哪两个是Stop the world的,CMS会不会产生碎片,G1的优势。
- 标记清除和标记整理算法的理解以及优缺点。
答:
会,自己实现堆载的数据结构时有可能会出现内存泄露,可参看effective java。
- 64位JVM中,int的长度是多数?
- Serial与Parallel GC之间的不同之处?
- 32位和64位的JVM,int类型变量的长度是多数?
答:
32位和64位的JVM中,int类型变量的长度是相同的,都是32位或者4个字节。
- Java中WeakReference与SoftReference的区别?
- JVM选项-XX:+UseCompressedOops有什么作用?为什么要使用?
- 怎样通过Java程序来判断JVM是32位还是64位?
- Java有没有主动触发GC的方式(没有)。
多线程
- Java实现多线程有哪几种方式。
- Callable和Future的了解。
- 线程池的参数有哪些,在线程池创建一个线程的过程。
- volitile关键字的作用,原理。
- synchronized关键字的用法,优缺点。
- Lock接口有哪些实现类,使用场景是什么。
- 可重入锁的用处及实现原理,写时复制的过程,读写锁,分段锁(ConcurrentHashMap中的segment)。
JAVA并发知识库
- Java中实现多线程有几种方法?
- 继承Thread类
答:
Thread 类本质上是实现了Runnable接口的一个实例,代表一个线程的实例。 启动线程的唯一方法就是通过Thread类的start()实例方法。 start()方法是一个native方法,它将启动一个新线程,并执行run()方法。
public class MyThread extends Thread {
public void run() {
System.out.println("MyThread.run()");
}
}
MyThread myThread1 = new MyThread();
myThread1.start();
答:
如果自己的类已经extends另一个类,就无法直接extends Thread,此时,可以实现一个Runnable接口。
public class MyThread extends OtherClass implements Runnable {
public void run() {
System.out.println("MyThread.run()");
}
}
//启动 MyThread,需要首先实例化一个 Thread,并传入自己的 MyThread 实例: MyThread myThread = new MyThread(); Thread thread = new Thread(myThread); thread.start(); //事实上,当传入一个 Runnable target 参数给 Thread 后, Thread 的 run()方法就会调用 target.run() public void run() { if (target != null) { target.run(); } }
- ExecutorService、Callable、Future有返回值线程
答:
有返回值的任务必须实现Callable接口,类似的,无返回值的任务必须Runnable接口。执行Callable任务后,可以获取一个 Future的对象,在该对象上调用get就可以获取到Callable任务返回的Object了,再结合线程池接口ExecutorService就可以实现传说中有返回结果的多线程了。
//创建一个线程池 ExecutorService pool = Executors.newFixedThreadPool(taskSize); // 创建多个有返回值的任务 List list = new ArrayList(); for (int i = 0; i < taskSize; i++) { Callable c = new MyCallable(i + " "); // 执行任务并获取 Future 对象 Future f = pool.submit(c); list.add(f); }// 关闭线程池 pool.shutdown(); // 获取所有并发任务的运行结果 for (Future f : list) { // 从 Future 对象上获取任务的返回值,并输出到控制台 System.out.println("res: " + f.get().toString()); }
- 基于线程池的方式
- 悲观锁
- 乐观锁
- 优缺点
- CAS有什么缺陷
- notify和notifyall的区别
- ThreadLocal的了解,实现原理
数据库相关
- 常见的数据库优化手段索引的优缺点
- 什么字段上建立索引数据库连接池
- durid的常用配置
计算机网络
- TCP,UDP区别
- 三次握手,四次挥手
- 为什么要四次挥手
- 长连接和短连接
- 连接池适合长连接还是短连接
设计模式
- 观察者模式代理模式单例模式,有五种写法,可以参考文章单例模式的五种实现方式可以考Spring中使用了哪些设计模式。
分布式相关
- 分布式事务的控制
- 分布式锁如何设计
- 分布式session如何设计
缓存相关
- redis和memcached的区别。redis支持哪些数据结构。redis是单线程的么,所有的工作都是单线程么。redis如何存储一个String的。redis的部署方式,主从,集群。redis的哨兵模式,一个key值如何在redis集群中找到存储在哪里。redis持久化策略。
框架相关
- SpringMVC的Controller是如何将参数和前端传来的数据一一对应的。Mybatis如何找到指定的Mapper的,如何完成查询的。Quartz是如何完成定时任务的。自定义注解的实现。Spring使用了哪些设计模式。Spring的IOC有什么优势。Spring如何维护它拥有的bean。一些较新的东西JDK8的新特性,流的概念及优势,为什么有这种优势。区块链了解如何设计双11交易总额面板,要做到高并发高可用
一些小建议
- 可以去leetcode上刷题换换思路
- 八大排序算法一定要手敲一遍(快排,堆排尤其重要)
- 了解一些新兴的技术。面试之后面试官都会问你有没有什么问题,千万不要没问题,也别傻乎乎的问一些敏感问题
- 了解你要面试的公司的产品及竞争产品
总结
——【文末扫码免费获取】
无论是哪家公司,都很重视高并发高可用的技术,重视基础。
面试是一个双向选择的过程,不要抱着畏惧的心态去面试,不利于自己的发挥。
同时看中的应该不止薪资,还要看你是不是真的喜欢这家公司,是不是能真的得到锻炼。
最后,希望大家都能找到适合自己的公司,开开心心的撸代码!