【学习笔记】Java面试准备讲座笔记
介绍
本文内容是基于cyc2018在牛客网上的讲座做的笔记整理。
cyc2018毕业于交大,硕士,最后拿到了字节的ssp。
GitHub:https://github.com/CyC2018/CS-Notes
学习规划
复习方法:结合面经看书,并通过面试及时查漏补缺
面试一线大厂需要重点准备:数据结构与算法、计算机网络、操作系统
面试小公司需要重点准备:语言和框架(去了就直接干活)
简历的亮点:1. 实习经历 2. 开源贡献 3. 学历 4. 个人项目(代码量) 5. 比赛 6. 博客 (重要性从高到低)
(个人计划,在百度实习完之后,去字节实习,此外,做一个开源项目,或者参与一些项目,博客随时写,记录学习以及工作心得)
(刷LeetCode,然后明年考一下PAT,CCF,以及软考,可能去国企)
相关知识准备
语言基础
《Java核心技术》前几章的内容,后面内容不推荐,基本都在堆API。
学习设计模式,因为源码中有大量的设计模式。学完之后,学习Java高级特性,《Java编程思想》、《Effective Java》。
学习操作系统,之后学习《深入理解Java虚拟机》,重点在内存,垃圾回收,类加载机制等,学习《Java并发编程实战》,学习地越深入越好。
学习源码,需要有数据结构相关的知识,最好看别人的博客学习,可以事半功倍。
(个人计划:提到的这几本书都打算学一下,重点学习《深入理解Java虚拟机》,以及阅读源码)
设计模式
面试中经常问到单例模式、工厂模式、代理模式等。回答时结合Java类、Spring中的实现来讲。
推荐《Head First设计模式》。
(个人计划:学一下这本书)
框架和中间件
框架主要是Spring,中间件是缓存和消息队列,缓存主要是Redis。
Spring学习《精通Spring 4.x》,《Spring揭秘》,然后动手实践,找个课程。
缓存学习《Redis实战》、《Redis设计和实现》,消息队列看《RabbitMQ实战指南》。
(个人计划:这部分书不打算看,找个课学一下,然后实战实践一下,然后阅读源码相关博客)
数据库
学习《MySQL必知必会》,然后找一些题目做。
学习《数据库系统概念》,理解关系型数据库管理系统、事务、范式等内容。
学习《MySQL技术内幕》、《高性能MySQL》,重点InnoDB存储引擎,索引,锁,事务,性能优化等内容。
(个人计划:MySQL根据面经学习,不花太多时间)
数据结构和算法
学习《算法 第四版》,刷LeetCode,top100。
(个人计划:直接刷LeetCode,不看书)
计算机网络
学习重点在TCP/IP、HTTP、Socket编程。
推荐书籍,《计算机网络 自顶向下》、《TCP/IP详解》、《图解HTTP》。Socket编程要求不高,主要了解下IO多路复用知识,看《Unix网络编程》。
(个人计划:阅读王道网络书,然后参考面经)
操作系统
学习重点在进程线程、死锁、内存管理。
推荐书籍《现代操作系统》、《深入理解计算机系统》,《鸟哥的Linux私房菜》稍微学点Linux。
(个人计划:阅读王道OS书,然后参考面经)
系统设计
系统设计主要涉及网络架构相关内容,推荐《大型网站架构》,《从Paxos到Zookeeper》,《大规模分布式存储系统》。
其次是《微服务设计》。
(个人计划:这部分还不太清楚咋学,后面有时间了再研究)
怎么做项目
误区:功能越多越好
着力点:1. 从业务角度分析项目的难点,2. 多用热门技术,比如缓存、集群、消息队列等,3. 从业务角度分析所选用的技术,4. 做高并发项目
将项目部署到云服务器上,并将访问地址附在简历上,将代码开源到GitHub,写好项目文档。
求职相关
时间节点:
春招实习:1-3月提前批,3-5月正式批,5-7月补招。
秋招:7-9月提前批,9-11月正式批,11-补招。
提前批好处:1. 简历优秀可以免笔试,2. 提前批有更多HC,3-. 但有些公司表现不好会影响后续。
招聘信息渠道:最好是官网以及公众号。其次是第三方平台。此外,牛客网上有日程表,比较好。
内推:免笔试或者免简历筛选,以及参加提前批(多一次机会)。找学长或者其他。
简历作用:筛选依据,以及面试大纲。
简历的本质:1. 技能匹配度(技术栈,以及相关项目经历),2. 能力证明(学历、工作经历、比赛、项目等等)。
简历形式:1. PDF简历,线下面试多带几份。2. HTML简历,通常就是GitHub Page那种。
简历内容:1. 期望薪资社招要写,校招不用。2. 兴趣爱好不要写。3. 比赛只写和技术有关的。4. 个人评价最好不写,或者不要太空泛,当做简历其他内容的总结。
简历格式:1. 中文和英文之间加空格,2. 专有名词大小写一定要对,比如Java,jQuery,3. 尽量简洁。
项目经历:1. 为什么做这个项目,2. 有哪些功能,3. 担任的角色,4. 遇到的问题,5. 怎么解决的,有什么优势,6. 用数据说明,不要太主观,7. 不要堆叠无意义的技术名词,如“基于Spring、SpringMVC实现XXX,包含XXX”。
笔试&面试题目:笔试题目有一些计算、证明等,不应当花时间,面试才是重点,怎么讲好对应的知识比较重要。
笔试准备:选择题+编程题,刷题,牛客网。
技术面-准备:深度:要多找一些资料看,比如TCP/UDP,结合具体使用场景说,广度:一些中间件的内容,不用很熟悉,但要懂基本原理,找一些入门资料看,并做好笔记,记下该怎么说。
按以下思路讲,1. 解决了什么问题,2. 基本原理,3. 使用场景,4. 和其他的有什么不同。
注意引导面试官往你想回答的问题上去问,提一下自己对哪方面熟悉,这样回答会比较结构化,不会因为被打断而变得很零散。
编程:注意纸上编程,或者编辑器编程的能力。注意输入输出,以及错误处理。
设计一下测试用例,正常用例,空值,异常输入,边界用例。
注意模块化,比如写个swap函数。可以先写伪代码,比如swap这种不重要的先不实现。
问面试官:1. 部门的业务以及技术栈,2. 技术难点怎么解决,3. 每天有多少时间花在写代码上,4. 公司吸引您的地方有哪些。
不过要提前了解一下,换一种问法,比如,我了解到你们在使用XXX,这个技术XX,请问你们是怎么处理XXX问题的?
了解面试表现:1. 问一下学习建议。
心态调整:1. 遇到不会的,要放慢语速,避免紧张,2. 面试官质疑的时候,可能是压力测试,注意不要表现出不自信,不过也有可能真的有问题,所以要想清楚再说。
模拟面试:1. 参加一些不太重要的面试,2. 互相模拟面试或者平台。
面试总结:1. 复盘,记录考点以及存在的不足。
HR面:1. 不要谈到想创业或者读研读博,2. 优缺点:缺点老实说,并给出改进打算,3. 最有成就感的事,提前准备,4. 有没有女朋友,感情方面是否稳定,5. 兴趣爱好,积极向上既可,6. 给出一个任务怎么做,7. 家庭情况,比如出差意愿等。8. 加班,不排斥加班。