java面试应该准备哪些?

确定目标

心态非常重要!!!心态比学历还要重要!!!

可以逐步规划,不需要一步登天

打磨技术,积累项目经验,千万不要混日子

要善于总结,不要只关注增删改查

对于应届生,更要对面试知识有更深度的积累,而且可以把眼光放高一些(国家对应届生有政策)

公司情况

城市很重要,计算机行业与公司、城市关联性非常大,所以,如果条件允许,一定选发展好的城市工作。

公司很多,但竞争仍然很激烈,大家要认清定位,选好目标,这样更容易拿到offer,而且对自己整体的职业生涯都是非常有利的。

毕业性情况

面试准备

下面我会和大家讲如何是最优的,大家如果觉得要求高,可以根据自己的目标和情况适当调整,但建议大家对自己要求高一些,这样会更加有助于大家拿到好的offer,现在这个大环境,如果你不卷别人,别人就卷你。

简历

做简历的目的:拿到面试邀请

方法:与众不同,并且突出重点,详略搭配,引起面试官好奇

基础信息

案例一:

案例二:

案例三:

不要忽略最基础必要信息,显得不诚实,会引起相反效果,虽然面试可能多,但会大大降低面试官的印象

案例四:

问题:要不要有照片?要有

技术技能

注意写上的大前提是自己真的会,不然面试时会起到反作用,这也是很多同学要改简历,我反复强调一定要先学习,再改的原因。简历写了,面试不会,反而更不好,容易导致面试不过。

案例一:

案例二:

应届生

现在应届生非常卷,一定要在简历里面就体现深度,不然很容易让筛选简历的人认为技术能力一般,从而失去面试机会。

  • 精通掌握j2se的使用方法与底层原理,并对容器、java8等新特性有有深入的学习,并在项目中使用。

  • 对TCP、UDP、HTTP网络知识有深入了解,有效预防xsscsrf常见攻击,并能使用tcpdump wireshark常用工具与命令定位解决问题。

  • 深入学习jvm内存模型,对十种垃圾回收器、三色标记算法、类加载都有深入的学习与研究。

  • 深度学习并使用juc中的工具类,对于CASAQS原理与源码深入学习,并具备一定线程池优化的能力。

  • 多次详读过《高性能mysql》对其中的七中日志作用与使用方式有所掌握,深入学习索引的机制与原理,能熟练的对SQL进行优化,了解事务隔离级别、锁、MVCC等工作原理。

  • 对于Spring、mybaits、spring cloud、dubbo都能够熟练的应用开发,并阅读过部分源码。

  • 熟练掌握九种redis的数据结构与应用场景,并对其分布式锁、持久化、哨兵、集群等理论知识有深入的学习与研究。

  • 学习了解过常用的四种分布式中间件(activemq、rabbitmq、rocketmq、kafka)与一种内存式中间件(disruptor),并对其中的rocketmq与kafka有专门的学习与研究。

  • 熟练掌握各种数据结构,并能很好的使用递归分治、动态规划、贪心、回溯等算法解决项目中的问题。

  • 阅读过《大话设计模式》对23种设计模式都有一定的理解,并能运用到实际工作当中。

  • 学习过《鸟哥的linux私房菜》,能熟练的使用linux进行常规运营工作,并定位线上问题。

非应届生

非应届生在写技能的时候,更要注重实战情况,比如解决过的问题,或者实际工作中的应用。

  • 工作xxx年,有xxx架构经验,有xxx年管理经验(最大团队人数xxx人)。

  • 精通掌握j2se的使用方法与底层原理,并对容器、java8等新特性有有深入的学习,并在工作中合理使用。

  • 对TCP、UDP、HTTP网络知识有深入了解,有效预防csscsrf常见攻击,并使用过tcpdump wireshark常用工具与命令定位解决线上问题。

  • 深入学习jvm内存模型,对十种垃圾回收器、三色标记算法、类加载都有深入的学习与研究,熟练使用arthas、jmap、jstack、jvisualvm等命令与工具定位解决线上常见oom死锁等问题。

  • 深度学习并使用juc中的工具类,对于CAS、AQS等原理与源码深入学习,并具备一定线程池优化的能力。

  • 多次详读过《高性能mysql》对其中的七种日志作用与使用方式有所掌握,深入学习索引的机制与原理,能熟练的对SQL进行优化,避免慢查发生,了解事务隔离级别、锁、MVCC等工作原理。

  • 对于Spring、mybaits、spring cloud、dubbo都能够熟练的应用开发,快速搭建合理的技术架构给团队使用,并阅读过部分源码。

  • 深入学习分布式相关技术与框架,对于分布式链路监控框架Pinpoint、SkyWalking、Zipkin都有一定使用经验与研究。了解流行的监控系统Zabbix与Prometheus并在公司中推广使用,其中如何使用matrics埋点,如何使用ELK更好的收集和展示都有实际落地经验。

  • 对于微服务拆解与划分设计有比较丰富的实践经验,并深入研究过DDD,并在项目中落地使用。

  • 熟练掌握九种redis的数据结构与应用场景,并对其分布式锁、持久化、哨兵、集群等理论知识有深入的学习与研究。

  • 学习了解过常用的四种分布式中间件(activemq、rabbitmq、rocketmq、kafka)与一种内式中间件(disruptor),并对其中的rocketmq与kafka有专门的学习与研究。

  • 工作中遇到的定时(Elastic-job、xxl-job、quartz、工作流(activiti、flowable)、bin-log监听(binlog-connector、canal)等常见问题框架都有一定的研究,并在工作中实际使用。

  • 熟练掌握各种数据结构,并能很好的使用递归分治、动态规划、贪心、回溯等算法解决项目中的问题。

  • 阅读过《大话设计模式》对23种设计模式都有一定的理解,并能运用到实际工作当中。

  • 学习过《鸟哥的linux私房菜》,能熟练的使用linux进行常规运营工作,并定位线上问题。

项目经历

不同的经验的人、所在的公司不同,就算写同一个项目,也要体现不同的特点。这样的好处是一方面能让面试官感受到真实性,你真的参与其中,另一方面,更能体现出你工作时长与工作能力的匹配,更加容易找到工作。

比如核心人事系统为例:

刚毕业
小公司(公司体积小,人数少)

开发技术: SpringBoot + MyBatis plus + Nginx + RocketMq + MySql + xxl-job +ES+flowable

项目介绍:

公司为了管理公司员工,更好的支撑其他业务模块获取到人员相关信息,投入少量人力,开发了人事相关系统,对人组、岗灵活管理,并对入、转、调、离事件使用mq实时同步给相关模块。系统自上线以来,长期稳定运行,很少出现故障与问题。

我的职责:

  • 入职时正是系统初建期,在资深程序员的指导下,设计与开发了此系统,从零搭建并完成了上线,期间做了几次比较大的升级改造,如引入ES,引入 xxl-job,使得系统更加稳定,保障系统稳定运行。

  • 后期为此模块技术负责人员,并给同事做了此模块的设计与分享

问题与难点:

  • 组织存储的设计与升级改造。使用ES提升性能,并对倒排索引原理深入学习

  • 引入xxl-job平台,对公司整体定时任务进行升级,统一分布式管理

  • 升级项目架构,引入myBatis plus自动生成代码

大公司或者是专业做人事软件公司(公司体量大或者用户群体大)

开发技术: SpringBoot + MyBatis plus+ Redis + Nginx + RocketMq + MySql + Elastic-job +ES+flowable

项目介绍:

公司员工管理模块,也是其它系统的人员信息数据来源。主要是管理人、组、岗等人员信息,并对入、转、调、离等事件分发。此系统是公司其它系统的基石,特别是与权限系统相关联,不仅影响所有系统的人员基础信息获取,还会影响其它系统的授权与登录。

我的职责:

  • 快速熟悉核心人事模块,并保障长期稳定高性能运行

  • 快速处理遗留bug与线上问题,遇到问题给出高效解决方案

  • 后期为此模块技术负责人员,并给同事做了此模块的设计与分享(看情况填写)

问题与难点:

  • 下游消息消费处理异常,给出0成本解决方案

  • 定位并解决系统每间隔一段时间就无法响应问题

  • 改造组织实现方案,由递归方案,改成ES倒排索引直接查询,接口性能从秒级降为毫秒级(此处有技术负责人推动上游整体改造),彻底解决了之前获取顶级组织人员慢,甚至引起系统崩溃的问题

工作3年以内
小公司(公司体积小,人数少)

开发技术: SpringBoot + MyBatis plus+ Redis + Nginx + RocketMq + MySql + xxl-job+flowable

项目介绍:

公司为了便于人员管理,并对其他系统模块人员信息提供更好的保障,开发了人事系统,主要包括核心人事、考勤、薪酬绩效等,其中人事模块是最为核心的部分,而且会与权限系统相关联,决定整体公司所有系统的基础信息与数据权限。此系统主要是管理人、组、岗相关信息,并对下游准确的提供入、转、调、离相关事件。

我的职责:

  • 技术选型,并搭建系统框架,如:RocketMq、xxl-job 、MyBatis plus

  • 设计整体项目方案,实现核心逻辑,并指导实习生完成辅助工作

  • 优化公司整体技术方案,比如定时任务选择可视化的分布式xxl-job ,推动其它系统逐步切换

问题与难点:

  • 下游消息消费处理异常,快速给出0成本解决方案

  • 协助同事定位、解决另一模块长期过一段时间就反应缓慢的问题

  • 提出并设计了人事系统与权限自动关联模块,在人事录入人员并审批通过后,自动开启相关权限

大公司或者是专业做人事软件公司(公司体量大或者用户群体大)

开发技术: SpringBoot + MyBatis plus + Redis + Nginx + RocketMq + MySql + Elastic-job +flowable

项目介绍:

人事体系包括核心人事、考勤、薪酬绩效、培训、招聘五个部分,其中核心人事系统是一切系统的基石,对公司内的所有人事基本信息(人、组、岗)进行管理,并对人员的入、转、调、离等事件准确的同步给下游。通过与权限系统相关联,对公司整体系统的登录与授权,以及架构设计都有非常大的影响。

我的职责:

  • 负责整体模块的升级与维护,保证数据准确性与系统稳定性,SLA达到四个9以上

  • 及时响应线上反馈,响应时间工作日不超过10min,非工作不超过30min,第一时间沟通解决线线上问题(为此小米时刻带着小米手环)

  • 培养新人熟悉了解系统,并对系统沉淀完善的文档与技术手册,并在团队内分享

问题与难点:

  • 下游消息消费处理异常,快速给出0成本解决方案

  • 对系统进行分库分表,实现租户物理隔离,避免相互影响

  • 用bin-log监听方式实现了数据库与redis的同步,保证了数据一致性的同时,提升了代码的可维护性

工作3年以上

3年以上工作经验的同学,不建议仅仅写一个模块,要能从整体体系看问题,参与过多个项目,并对自己没有真正参与的部分有了解有见解有贡献,而且都了解其中的难点,并对整体的边界设计,以及对整体的技术能力抽象都能非常好的讲解出来。最好还有几个带人经验,那就更能突出综合能力。由于目前相关学员不多,先不涉及。

获得奖励/证书

应届生

学校中的好的成绩、奖学金、排名都可以写,四、六级证书、计算机等级证书都可以写。在学校担任的职务,以及组织过的活动也可以写。

非应届生

学校中的重点证书、公司中的好的绩效、公司中的项目奖、活动奖、优秀个人等都可以写。

自我评价

此部分非必段,根据个人情况而定,如果觉得自己真的有什么突出的点,可以写一下,如以下案例:

突击学习能力强:每次大学考试都是前一周开始准备,并能获得班级前十的好成绩。

爱好计算机:从小学就有编程的爱好,在高中就参与了竞赛。

组织、沟通能力强:参加过XXX志愿者,组织过XXX人参与的活动,并圆满成功。

面试官主导

常见面试知识点

应届生
非应届生

非应届生如果有时间最好也能向应届生一样,系统的准备,如果完全只是想通过面试,可以通过背诵八股文的方式针对面试准备知识点,但建议有时间还是要系统的学习,这样才能深入的理解,更有助于面试和工作。具体的八股文体系,在其他文章中有详细的梳理。

场景题

系统设计面试题

選擇一種語言 · 系统设计(System Design)

如果不会怎么办?

  • 想存储,如何存数据,用mysql?ES?redis?mongodb?具体如何去存,用什么结构去存

  • 这么做的缺点是什么?性能差?容量不足?有重复?

  • 在讲的过程中最好有画图,而且要学习自言自语

  • 不断完善自己的方案,使它尽可能满足面试官要求

  • 最后可以想想类似的能想到的大公司成熟的解决方案,就算是不知道具体实现逻辑,但能说出来名字,也是很好的加分项。此处就要求我们开阔眼界,学习东西不能局限于书本。

算法题

时间仓促

准备以下知识点,研究透彻,基本可以解决部分中型公司和绝大多数小型公司面试:

  • 链表与数组

  • 队列和栈

  • 链表的删除、插入、反向

  • Hash表的hash函数,冲突解决方法有哪些

  • 各种排序:冒泡、选择、插入、希尔、归并、快排、堆排、桶排、基数的原理、平均时间复杂度、最坏时间复杂度、空间复杂度、是否稳定

  • 快排的partition函数与归并的Merge函数

  • 对冒泡与快排的改进

  • 二分查找,与变种二分查找

  • 二叉树、B+树、AVL树、红黑树、哈夫曼树

  • 二叉树的前中后续遍历:递归与非递归写法,层序遍历算法

  • KMP算法

时间充足

在完成时间仓促的题与知识的基础上,对下面进行刷题,反复的刷,熟能生巧。

系统刷题,研究透彻,每天最少三道,按分类刷leetcode前200道中等和简单的:数组、字符串、队列、链表、哈希表、动态规划、二分、树、贪心、堆栈、递归、分治

面试者官主导

自我介绍

例如:

面试官您好,简历中对我的工作经历有比较详细的描述,我这里就不再赘述。主要总结个人三点优势,第一、学习能力强。虽然非计算机专业自学,但对所用技术都能快速上手,从不影响项目进度。第二、沟通能力强。能够快速拉齐上、下游以及多种角色的认知与目标,让项目顺利推进。第三、有很强的问题解决能力。多次快速定位并解决实际工作中遇到的线上问题与线上隐患,保证线上稳定。以上就是我的自我介绍。

解决过的难点

在做项目过程中,遇到问题和难点是非常正常的,公司也希望能招到解决问题与难点的人才。也可以通过解决问题与难点的能力来更好的判断面试者的真实水平。所以,这里一定要对项目中常遇到的问题与难点非常熟悉,并对整体解决流程与细节了解于胸,才能更好的应对面试,这里举几个最常见的线上问题,以及解决方案。

内存溢出

现象:不定期的系统出现响应慢,逐步服务假死的情况,重启后会恢复,但过一段时间又会出现。

引起的原因:

(1)、不断反复的加载数据到内存,但内存中的数据还有引用。这种合适大量跑批计算的时候,需要把数据库load到内存中,导致内存数据过大,不能回收,引起oom。

(2)、写代码异常,出现拖库情况,没有加好查询条件,把一些大的表直接全量加载到内存里。

定位思路:

(1)、导出内存切片文件。方法有很多:

  • arthas的heapdump命令

  • jmap命令

  • -XX:+HeapDumpOnOutOfMemoryError - -XX:HeapDumpPath=/tmp

和面试官可以说有这三种方法,但在实际工作中,一定是第三种。因为前两种是手动的,很难抓住真正内存溢出的时机。注意这里生成的文件需要转成hprof文件才能解析

jmap -dump:format=b,file=HeapDump.hprof /path/to/bin/java core_dump_file

(2)、分析hprof

分析hprof文件的工具有非常多,如:Jconsole,jProfile,VisualVM ,这里重点介绍一个mat插件,虽然古老,但非常好用,而且很多资深程序员非常认可。

插件下载和安装:https://eclipse.dev/mat/

此插件有window版本不建议使用,因为本地的内存和cpu都不如linux服务器。建议使用linux版本直接在服务器上定位解决问题。

下载mat工具后在命令行下执行 ./ParseHeapDump.sh ../today_heap_dump/jvm.hprof

这个程序需要gtk+,如果没有gtk环境,可以使用将ParseHeapDump.sh改成下面的命令 java -Xmx8g -Xms8g \ -jar plugins/org.eclipse.equinox.launcher_1.3.100.v20150511-1540.jar \ -consoleLog -consolelog -application org.eclipse.mat.api.parse “$@”

如果hprof的文件比较大,在分析过程中会需要比较大的内存,需要修改MemoryAnalyzer.ini 将jvm的内存设置调大 -startup plugins/org.eclipse.equinox.launcher_1.2.0.v20110502.jar –launcher.library plugins/org.eclipse.equinox.launcher.gtk.linux.x86_64_1.1.100.v20110505 -vmargs -Xms4g -Xmx4g 上面的设置将mat的内存配置为4G

等待一段时间后,会生成用于分析的索引文件,索引文件后面会用到

然后使用下面的命令生成报告 ./ParseHeapDump.sh ../today_heap_dump/jvm.hprof org.eclipse.mat.api:suspects 其它几个选项 org.eclipse.mat.api:suspects org.eclipse.mat.api:overview org.eclipse.mat.api:top_components

(3)、查看分析报告

线程阻塞(死锁)

阻塞定位

jstack问题定位分析

现象:

服务突然无响应,重启短时间恢复,但很快又进入假死状态。

引起的原因:

(1)、方法加锁,而加锁里的代码执行时间过长,访问量还比较大,很多线程阻塞在相关代码逻辑处,导致线程耗尽,服务假死。

(2)、有死锁逻辑,触发导致相互等待锁,逻辑无法执行。

定位思路:

用jstack解决死锁(传统手法)

(1)、使用jps、ps ef|grep java 查看当前Java进程的pid,严重的时候可以使用top命令查看当前系统cpu、内存使用率最高的进程pid

2、使用top -Hp 29938 查看进程里面占用资源最多的线程。

 

[root@localhost opt]# top -Hp 29938 top - 16:25:22 up 51 days, 20:52, 6 users, load average: 2.13, 2.53, 2.78 Threads: 101 total, 1 running, 100 sleeping, 0 stopped, 0 zombie %Cpu(s): 9.2 us, 1.0 sy, 0.0 ni, 89.6 id, 0.0 wa, 0.0 hi, 0.3 si, 0.0 st KiB Mem : 23083337+total, 12591091+free, 95194368 used, 9728104 buff/cache KiB Swap: 4194300 total, 4194300 free, 0 used. 13460681+avail Mem Unknown command - try 'h' for help PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 31201 root 20 0 18.6g 2.4g 13828 R 99.0 1.1 108:04.58 java 29945 root 20 0 18.6g 2.4g 13828 S 0.7 1.1 0:32.57 java 29950 root 20 0 18.6g 2.4g 13828 S 0.7 1.1 0:32.50 java 29954 root 20 0 18.6g 2.4g 13828 S 0.7 1.1 0:32.57 java 29955 root 20 0 18.6g 2.4g 13828 S 0.7 1.1 0:32.54 java 29958 root 20 0 18.6g 2.4g 13828 S 0.7 1.1 0:32.56 java 29960 root 20 0 18.6g 2.4g 13828 S 0.7 1.1 0:32.56 java

此时我们可以看到占用资源最多的线程是:31201。

3、然后使用printf "%x\n" 31201 把线程pid转换成16进制数,就得到了:79e1

[root@localhost opt]# printf "%x\n" 31201 79e1

4、使用jstack 29938 | grep -20 79e1命令查询该线程阻塞的地方。(其中的20表示20行)

用arthas定位死锁(非常容易)

连接异常

tcp连续三次握手、四次挥手

netstat -ano

Tcpdump /wiresshark

利用Tcpdump抓包结合Wireshark分析_wireshark分析tcpdump的抓包文件_糟老头子坏得很的博客-CSDN博客

tcpdump 和 wireshark 抓包工具 ,介绍、安装、命令使用。 详解三次握手、四次挥手

项目经验介绍

了解公司基础信息
  • 了解公司大小、人数、体量

  • 公司工作流程

  • 团队分工/职责,自己项目在公司整体中的作用

  • 项目专业词汇

以上信息在说项目的时候不用特意强调,但一定要知道,而且如果问起,一定要能回答上来

从整体入手

一定要从项目整体先介绍项目的作用与组成,有一定的高度后,再进入下一步的介绍,最好能结合一些系统图来辅助让面试官更好的理解。

三年以内可以只介绍自己负责部分,如:

五年以上建议一定要从系统整体体系来入手讲,更全面的介绍项目体系后,再逐步进入具体负责部分,如:

重点说明自己负责部分

说完了整体情况 ,要强调哪一部分是自己负责,自己做的,这里要重点讲出里面的难点,自己如何解决的,最好能给出前后对比的数据,如:

对XXX核心模块进行了重构,qps从xxx上升到xxx,与页面交互从xxxms下降到xxxms大大提升了用户的体验等。

辅助手段

如何笔试

笔试其实有很多变通手段,这里不写在文档里,课上和大家详细说

如何面试

很多公司都可以不同部门面试多次,并不影响,进去后内部转岗很容易

如果面试能走内推,要比自己投递好一些

正规公司面试流程

面试

如果面试一般开发岗,一般四轮面试,一轮小组长,二轮部门负责人,三轮总监面(小公司就是CTO了,一般总监就不怎么考技术了),四轮hr

如果是面试一般管理岗位,一般五轮面试,一轮同级别管理人员,二轮部门负责人,三轮交叉面(另一个部门负责人),四轮总监面(小公司就是CTO),五轮hr面

谈薪&薪资证明

此处一般都会先让你提供薪资证明,然后再在你的过去收入的基础上,有一定的涨幅,现在一般严卡30%,具体涨幅多少和面试情况严格挂钩。薪资证明里面可以包括工资、奖金、期权等一切收入。

申请offer&发offer

谈完薪资后,那就到了hr申请offer阶段,他会把你之前的面试表现、评价、薪资情况等整理后,提交offer审批申请。毕过了之后,才会发邮件发送正式的offer。offer里会强调,你提供的信息一切都真实可靠,不然offer无效,这点真的挺虎人的。

背调

如果不是高职级岗位,就算是大公司,也是没有背调流程的,一般也就是让你提供学历、学位照片,然后会去学信网上查一下,学历是否造假。

但是如果是比较高的岗位,那就涉及到背调的问题了,背调案例如下:

背调提供的材料:

1、学位证、毕业证照片(扫描件)、身份证

2、是否有自己公司,如果有需要填写说明,如果没有需要承诺没有

3、过往经历(一般是三家),最近经历需要提供上级、同事、hr电话,并允许承诺可以沟通联系。之前的经历只要提供同事电话,其它不强要求。

可以看到被调公司调查过往经历最主要的手段是你来提供相关人的电话号,或者你提供当时的入职offer时间,离职证明。其实小的被调公司是没有办法接触到真实的公司情况的。而且大公司都有明确规定,如果泄漏公司内的组织、人员情况,是红线,会被开除,之前就在一家公司遇到过类似情况被开除的。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值