凉风有幸,秋月无边,刚刚开题现在不想学习。
写写面经,回馈一下牛客。
差不多去年开始刷牛客,今年拿到了阿里,字节,腾讯,美团,拼多多,虾皮的offer,华为还在泡池子,快手疯狂简历挂,网易也不知道为啥挂,其他的就没咋投或者没做笔试
个人背景是东北某985科班本硕,做的Java开发,有两个自己写的小项目
大概步骤是 面经 ---> 总结 ---> 求点赞,求关注,求offer投票,求加群。
- 线程安全本质是什么,Java如何保证线程安全,callable,runnable有什么区别,线程不正常终止会发生什么,线程占用的空间具体是哪,是寄存器还是内存还是什么
- Java的线程和Linux的线程有什么区别,为什么需要Java的线程
- volatile具体实现原理,内存重排序都会发生在哪,为什么要内存重排序
- 使用过哪些Java并发包
- 简述BIO,NIO的具体使用及原理
- concurrentHashMap1.8和之前版本有什么区别,HashMap的具体实现,红黑树和平衡二叉树的区别,为什么不用B+树
- Java的GC整体过程,垃圾收集算法,流程,垃圾收集器,强引用,弱引用,虚引用等概念等,如果我要设置一个内存缓冲区,让垃圾收集器不对其进行操作怎么办
- JVM内存分区,。假设Java 的GC时间过长,简述应该如何做来排查解决这个问题,jamp的dump命令比较重,有什么代替的方法。
- 代码实现每五分钟一次Minor GC,如果要FullGC呢
- ThreadLocal的具体是怎样的,为什么会有内存泄漏问题,怎样避免
- Java的异常种类有哪些,平时自己是怎么处理异常的
- Spring的IOC和AOP及MVC机制,Sping中的单例bean是否可以依赖多例bean
- Springboot起步依赖有什么好处,为什么使用MyBatis不适用数据库连接池
- tomcat如果有两个项目,两个项目里面如果有相同的class,那么tomcat是如何对其进行区别
- 简述MySQL的ACID性质及实现,ACID有哪些一致性种类,乐观锁怎么实现的,简述MySQL的隔离机制及实现,简述MySQL索引结构及实现
- 如果MySQL要插入十万条数据,有什么较好的方法
- Redis支持集群的几种方式,redis的跳表要实现快速查找第k小的元素怎么做
- Netty 拆包粘包的实质,Netty线程池中的线程建立连接之后,这条连接是不是始终属于这个请求,对于Netty来说是不是只占用服务端的一个套接字,了解zero copy嘛
- 简述TCP三次握手四次挥手的状态转移,ip层的mtu是什么,如何探测机器之间的mtu
- 进程和线程的区别,进程的通信方式,线程空间中的内容,进程中打开文件其他线程可以直接读写那个文件嘛。用户态和内核态对于读写文件的操作有什么区别
- 内存为什么分页,虚拟内存有什么用,内存中的脏页是由硬件完成还是软件完成
- 怎样用单线程实现2kQPS对于服务器压测,1s均匀发2k条消息,可以异步返回
- Nginx和Redis能同时处理很多条请求,万级别,是不是都是通过Linux中的IO模型的的类似信号的机制.想这样的C10K问题,也就是单机10000条并发连接应该如何去处理
- 设计高并发秒杀系统,里面的阻塞队列是如何实现的
- 在王者荣耀里面,当渲染地图时,考虑网络波动的情况应该怎样渲染地图才能显得不卡,这回导致什么问题
- 如何实现cookie和session机制
- token在分布式服务器上的应用,用什么框架来验证token;除了redis还可以怎么做异步框架
问题基本就是这些,除了常规的知识点问题之外,就是一些网络通信,系统设计之类的综合性一点的问题。当然问题都是根据各人简历来问的,所以也许各人的不一样,但是有一些通用性的东西可以和大家分享一下。
Java的面试大概就分成Java本身,Spring等各种框架,RPC,消息队列中间件,数据库,计算机网络,操作系统这几方面来考
首先Java的一些基础知识,比如hashMap实现,ArrayList实现,ThreadLocal实现等就去看源码就好了
然后就是Java的一些并发相关的知识看《Java并发编程艺术》基本就够了,这本书称得上是面试神书,基本考并发的内容答案都能在这本书上找到,当然书本本身并不是很好理解
《深入理解Java虚拟机》同样也是面试神书,基本JVM虚拟机的内容答案都在这本书上
至于Java的IO相关的知识其实主要就是NIO和BIO两种,不过现在很多也是在使用Netty框架了,推荐大家可以去看看闪电侠的文章,这里把网址推给大家:https://juejin.im/book/6844733738119593991
Spring的话IOC和AOP其实是老生常谈的东西,阅读源码当然是了解Spring的极佳途径,但是当大家没有精力阅读源码的时候,自己实现一个简易版的IOC和AOP也是一个极佳的做法,这里把我当初学习的网址也分享给大家:http://www.tianxiaobo.com/2018/01/18/%E8%87%AA%E5%B7%B1%E5%8A%A8%E6%89%8B%E5%AE%9E%E7%8E%B0%E7%9A%84-Spring-IOC-%E5%92%8C-AOP-%E4%B8%8A%E7%AF%87/
MySQL的学习的话推荐大家去看看尚硅谷的MySQL高级课程,基本可以对于MySQL有个大概的了解,小白的话可以先看看《MySQL必知必会》,同时加上牛客网的MySQL练习题应该可以快速入门(我打广告啦,小管家给我福利哦~)
Redis就直接看《Redis设计与实现》好了,这本书真的是通俗易懂,读起来几乎没什么障碍,小白的话应该也可以直接上手
至于RPC,消息队列等,推荐大家就去使用一下,然后针对某个方面的源码去看就好了,要把源码整个看掉还是比较难得。比如RPC,现在一般的方法都是
服务器发表服务到zookeeper上 --> 客户端去zookeeper上申请服务 --> 申请成功后客户端调用方法 -->实质是通过代理模式传递packet --> 通过Neety传递packet到服务端 --> 服务端处理请求之后通过Netty写回 大概就是整个过程,大家可以自己实现一下
消息队列可以看看尚硅谷的kafka入门:https://www.bilibili.com/video/BV1a4411B7V9?from=search&seid=15264133011023976835
至于计网和操作系统大家应该都会(你懂的),我就不多说了
刷题这部分的话也没什么太多的诀窍,就把剑指offer和LeetCode top100liked和top interviewed 还有leetcode前三百刷熟吧,面试时候还是会有很多原题的
基本上分享的内容就是那些了,接下来就是本人的一些碎碎念。对于Java开发校招的基本知识就是以上说的那些,但是感觉就校招本身而言还是有可以进步的地方。
无论是Spring,Netty等框架的源码,各种中间件的源码,还是一些实际的工程亮点都可以作为突出的地方。
但是对于在校生而言实际工程也许会比较难我比较推荐大家看看RPC源码,然后深入看Netty源码看看网络通信是怎么做的,这两方面感觉会和实际关联非常紧密。
或者看看Spring的源码,实际Java工程几乎都是必须要用到的,也是一个加分项
另外拿了几个offer,请各位同学帮忙投投票,如果有知道内情的,通通气就更好了,谢谢大家~
如果大家有什么问题也可以直接留言,有时间我会尽量解答
最近被人嘲讽牛客网上没啥粉丝啥的,如果看了有帮助希望各位来个点赞关注,谢谢各位大佬
全部评论
(22) 回帖