牛客还愿,分享我的秋招过程。
首先,先感谢牛客网在我秋招过程中给予的巨大帮助。祝愿牛客网在以后的日子里面越办越好,祝愿给位牛友在2020的春招以及秋招中获得自己的满意的offer!
本人面试的java后端开发,所以本帖子会将自己的整理的java面试的相关知识和一些面试经历分享给大家。
闲话少说,直接上干货。
1、知识点部分
知识点主要分为:java基础知识、多线程、spring、数据库、计算机网络、JVM和手撕代码7大部分。
1.1 java基础知识
- String、StringBuilder、StringBuffer的区别
- Java核心数据结构(List、Map、Set)
2.1 List
- ArrayList、LinkedList、vector、CopyOnWriteArrayList的区别
- CopyOnWriteArrayList的原理
2.2Map
- Map的实现
- hashmap、Hashtable、LinkedHashMap、TreeMap、ConcurrentHashMap的区别及实现原理
- Hashmap的原理、底层、扩容机制
- Hashtable的原理、底层、扩容机制
- ConcurrentHashMap的原理、底层(重点)
2.3Set
- Set的实现
- HashSet、LinkedHashSet、TreeHashSet的区别及原理
- 封装、继承、多态(面向对象编程的三大特性)
- 重载和重写的区别
- final、finally、finalize
- Static关键字
- i++与++i
- equals()与"=="的区别?
- 重写equals()方法为什么要同时重写hashcode()方法
- this和super的区别
- 自动装箱与自动拆箱
- 异常
- Java中throw和throws的区别
1.2 多线程
- 进程与线程的区别
- 多线程的实现(Thread、Runnable、callabe+futuretask、线程池四种方法的区别、实现原理、适用场景)
- 线程的启动(start()和run()的区别)
- 线程传递参数(1.向run()方法进行传参;2.获取子线程的返回值)
- Runnable与callable的区别
- 线程状态(新建、执行、无限等待、限期等待、阻塞、终止6种状态变换过程)
- sleep()和wait()的区别
- Notify()和NotifyAll()
- Yield ()
- 线程的停止
- 线程之间的转换
- 线程不安全的原因
- Synchronized关键字
- Synchronized和ReentrantLock的对比、区别、适用场景
- 锁的种类:公平锁与非公平锁、乐观锁与悲观锁、独享锁与共享锁、可重入锁、分段锁、锁的状态(无锁、偏向锁、轻量级锁、重量级锁、自旋锁、适应自旋锁)相关的知识点和对比。
- CAS(Compare and Swap )原理
- AQS(AbstractQueuedSynchronized)原理
- 死锁含义、成立条件
- 如何有效避免死锁
- 银行家算法
- Volatile关键字
- 线程之间的通信
- Java线程池
- 为什么使用线程池
- 线程池的创建、核心参数
- 线程池的种类
- 线程池任务执行方法(submit() 、execute()两种的区别)
- 线程池关闭
- 线程池常用等待队列
1.3 spring
- Spring概述
- AOP
- AOP的实际例子
- AOP的***模式
- IOC
- DI(依赖注入)
- Bean的Scope作用域
- Bean的生命周期
- Spring的事务
- Spring事务隔离级别
- SpringMVC
- Spring的过程
1.4 数据库
- 范式(最好记住几个例子)
- 索引(索引的含义、优缺点)
- 索引的数据结构(底层)
- 索引为什么使用B+树不用B树
- 索引的分类
- 聚簇索引与非聚簇索引
- 建立索引的考虑因素
- 使用索引的注意事项
- 事务(ACID)
- 多事务并发会造成的问题(脏读、不可重复读、幻读)
- 事务隔离性
- 读锁与写锁
- 高并发控制数据库
- Mysql的工具分析
- MyBatis一级缓存
- MyBatis二级缓存
- Mybatis中的#和$的区别
- 高并发数据库设计(百万级数据库设计)
- 数据库优化
- 主从复制
- Mysql数据引擎的选用
- 数据库连接池
1.5 计算机网络
- OSI七层模型、五层模型、TCP/IP四层模型
- 三次握手(为什么不是两次、为什么不是四次)
- 四次挥手(为什么是四次挥手不是三次)
- 保活计时器
- 确认应答机制(ACK)
- 滑动窗口
- 超时重传机制(去重机制、快重传)
- 流量控制
- 拥塞控制(慢启动、拥塞窗口)
- TCP可靠性保证的机制
- TCP与UDP的区别
- Post与get区别
- http与https
- http常见返回码
- http请求的过程
- 怎么防止http请求的攻击
- 对称加密与非对称加密
- Cookie和session 的区别
1.7JVM
- JVM的组成(类加载器、运行数据区、解释器、本地接口各自的含义与作用)
- java程序在JVM中的执行过程
- 类加载的时机
- 类加载器的种类(Bootstrap 、Extension 、App 、自定义四个类加载器的工作责任)
- 类加载器的工作过程(双亲委派机制)
- 类加载的详细过程(加载-连接-初始化-使用-卸载 五个步骤的含义)
- JVM内存模型(程序计数器、堆、虚拟机栈、本地方法栈、方法区)
- GC(垃圾回收机制)
- 判断对象存活的方法(引用计数法和可达性分析的区别)
- 可达性分析中可以作为GC Roots的对象
- 垃圾回收算法(标记/清除算法、复制算法、标记/整理算法的区别以及适用环境)
- GC时间
- 什么情况下回出现内存溢出,内存泄漏?
- GC回收器
1.8 手撕代码
在面试过程中,肯定是逃不过手撕代码这个环节的。我在面试中遇到的手撕代码如下:
- 线程安全的单例模式(多种写法)
- 快排(三种,其中美团考了一个单链表的快排)
- 二叉树的前中后序遍历(递归和非递归)
- 多个线程的交替打印
- 两个栈实现队列
- 链表反转
- 二分查找
- 逆波兰表达式
- 斐波那契数列(青蛙跳台阶):递归和非递归两种方法
手撕代码只有不断的训练才能变得更加熟悉。本人在面试准备的过程中主要刷了《剑指offer100题》和leetcode热体100道。在刷题过程中,主要做的是初级难度和中级难度的题,对于高级难度的题有时候只是看了看具体解题思想,很多高级难度的题并没有真正的解。
下面给出一些经常访问的知识点网址:
JVM内存模型理解:https://www.jianshu.com/p/76959115d486
各大公司java面试题总结:https://www.cnblogs.com/itcx1213/p/10963809.html
2019java面试题:https://www.cnblogs.com/marsitman/p/9539369.html
leetcode100题:https://leetcode-cn.com/problemset/hot-100/
在此向上述博客的作者和网站表示衷心的感谢!
上面的知识点只是一些最基础的知识点,在有时间的条件下还可以去了解:Redis、docker、SpringCloud、Dubbo、SpringBoot、分布式原理、设计模式等高级知识
上面只是简单的罗列了一些重要的知识点,并没有给出答案。没有给出答案是因为我认为寻找答案也是学习的过程,能够加深对知识点的理解和记忆。同时还能在寻找答案的过程中扩大自己的知识面,让自己不仅仅局限于上面罗列的知识点。
2、求职
1、前期准备工作
我个人认为前期的准备工作是:
1.1 记忆知识点、耍算法题。
1.2 确定自己的目标公司,并针对目标公司常考的知识点进行总结。
1.3 准备自己的简历,个人认为简历中比较重要的是你的项目经历和你掌握的开发技能。其他的可以不写或者少写。写在简历上的项目自己心里面一定要有把握,没有把握的项目最好不要写。一般面试时,面试官都会让你选择一个你最熟悉或者他感兴趣的项目让你讲一讲。
1.4 多投简历,多参加面试,把一些不重要或者不是很想去的公司放在前面进行面试,找找面试的感觉。当你觉得准备的差不多了,再向自己心仪的公司投递简历,这样获得offer的可能性更大。
1.5注意招聘的截止时间,这一点可以每天上牛客网上来看看,牛客的求职板块列出了各大公司的招聘开始时间和结束时间
2、面试
在面试过程中我有几点意见:
1、尽量参加现场面试,远程面试虽然方便,但是我个人觉得现场面试可能会发挥的更好,同时还能给面试官传达一些除了面试内容之外的个人气质。
2、面试时的手撕代码是肯定逃不了的,所以在面试前一天,多手写代码。
3、面试时如果遇到不会的问题,可以委婉的拒绝回答这个问题,比如“这方面我正准备进行学习,目前还不是很了解”;如果遇到自己会但不是很清楚的问题时,可以简单的回答对应的问题后,引导面试官去询问你了解的知识点,转移面试官的知识点。
4、一定要多说,把问题回答完成后,可以把该问题相关的知识点、或者有关联的知识点都阐述给面试官听。
以上就是我在2019年秋招过程中准备的知识点和面试经历。若有表述错误或者不合适的地方希望各位牛友进行指正,我会进行修改。
最后祝愿牛客越来越好,祝愿各位牛友都拿到自己喜欢的offer!