跨专业渣硕春招逆袭之旅(附面经)
链接:https://www.nowcoder.com/discuss/197139?type=2&order=0&pos=5&page=0
来源:牛客网
终于鼓足勇气写下这篇文章,离找到工作过了好久了,该文章一是回馈牛客,感谢牛客网在找工作过程中的陪伴,二是想说一说我惨痛的经历,给小伙伴们更多的信心,当大家找工作受到了打击时,想到当时有这么一个渣硕比现在的你们还要惨,最后他坚持下来了,也找到了一份心仪的工作。现在回想起研三找工作时的艰辛与迷茫仍历历在目。今天复盘一下,希望给小伙伴们规避一些坑,愿小伙伴们都找到一个心仪的工作。
首先解释一下题目中的相关关键词,跨专业是指我本科不是计算机相关专业,而是一个特别冷门的专业,与计算机毫无关系,只学过一门与计算机相关的课程《C语言程序设计》,在大三的时候决定跨专业考研,最终考上了本校的计算机专业。但是专业基础知识薄弱已经奠定了我找工作时会面临种种挫折的必然性。
基础薄弱,结果崩溃
接着回顾一下我从研二暑假开始准备秋招的经历吧,这个时候给自己的定位是C++研发工程师,因为我研一研二给导师做的项目是C++方面的,对于C++的掌握,自己也只会基本语法方面的内容,在研二暑假前自己看过一点《C++ primer》算是有一点点语言基础,但是还掌握得不牢固,后来暑假期间自己跟着网课学习数据结构与算法的项目实战,用C++开发了一个可复用的模板类,这个项目弄完后已经到了8月份。而提前批的战役已经开始打响,通过牛客网的找工作信息,我开始大量投简历,并通过excel进行部分整理。
投了这么多,提前批就收到了部分笔试机会,后来幸运的通过了贝壳的笔试,进入了面试环节。对于贝壳的面试是我找工作的第一场面试,紧张到说话都在颤抖。在一面的基础知识和基本算法关出乎意料的回答上来了(仍然记得一面最后一个算法题出的是笔试的最后一个题,当时笔试的时候没有做出来,笔试完之后也没有好好总结和复盘,最后在面试遇到了,内心慌的一批。后来静下心来,整理思路,将自己的思路和面试官讨论,在讨论的过程中面试关也给了一些关键的提示,最后我手撕出来了,万幸~这里重点想表达的是每次笔试或者面试后一定要总结和复盘这一次的知识点,这些知识点可能在下一场笔试和面试中就会遇到)。进入二面后就没有那么幸运了,面试官一开始先让我手写了一个二叉树镜像翻转,写完后就问了进程和线程方面的知识,我支支吾吾的说了一点,然后问了网络方面的知识,我一脸懵逼了。当时的我只会一点C++语言的语法基础和数据结构与算法的知识,而对于操作系统、计算机网络、数据库、开发框架等方面的知识完全是空白。二面的时候面试官跟我说,你现在这一点语言基础还是不够的,其他方面还有好多,你不能完全不会,还得多充实一下自己。面试结束后,虽然挂了,但自己还是挺满意的,一是自己能过了一面,而是自己知道自己的空白之处在哪儿了。
提前批次的时间过了,紧接着就是秋招。秋招笔试也不知道笔试了多少,去宣讲会也不知道去了多少,每天忙忙碌碌,但一直没有好消息。在牛客网上看到大佬们分享拿到了XXX公司的offer等等,而自己一直都是0offer,每天压力越来越大。
破釜沉舟,备战春招
终于在10月份的时候,我和一个同学聊了一晚上后,我放弃了秋招,也放弃了原来的C++方向,而转向Java研发工程师。一是现在招聘Java的相比C++的岗位多,找工作相对于好找,二是他也是Java方面,他将他的学习路线和学习资料分享给我,然后我不懂的知识点方面问他,这样学习起来比自己一个人学C++更快。后来我就放弃秋招,全身心的投入到春招的准备中,(当然,这个时间节点还要考虑自己的毕业论文,还要做自己论文实验,熬夜是很正常的)。转java后对于java的语法我感觉学起来难度不是很大,感觉是自己有一定的C++基础,学起来比较快。然后就是学习他告诉我的一些面经了,我学习的时候按类别来学习。比如数据库方面的知识,我先学习基本的mysql的基本操作后,接着就学习他发给我的面经(后面会分享学习资料链接)。然后最重要的是刷算法题,包含《剑指offer》和《LeetCode》,记得当时剑指offer做了三遍,leetcode做了350多道题,一直保持到了春招前。在春招正式面试前的大概一周,我和同学约定了两天一次模拟面试,他给我出题,来考察我是否已经掌握面试的知识,我记得特别清楚,前几次的模拟面试我回答得模棱两可,对知道的问题回答的不全,对不知道的问题也不会去思考。而他分享了关于当时他提前批和秋招找工作时候的回答问题的角度和经验,慢慢地在后面我开始回答得比较好。因此,面试的时候是和面试官聊天,但提前模拟非常重要。最后在春招的时候,终于拿下来3个offer,最后选择自己最心仪的offer。感谢当时一直帮助我的同学,我们最后在一个公司。
感恩回馈,干货分享
下面是找工作时我的学习资料和学习笔记,主要是java的,C++的放弃过后就没有整理了。希望对小伙伴们提供帮助。
C++侯杰老师学习资料:
链接:https://pan.baidu.com/s/1ux_Q31Wry-V08fUYnmkPJw ,提取码:iqds
java
- 面向对象和面向过程的区别
- 字符型常量和字符串常量的区别
- 重载和重写的区别【重要】
- Java 面向对象编程三大特性: 封装 继承 多态。怎么理解多态?【重要】
- String StringBuffer 和 StringBuilder 的区别是什么 String 为什么是不可变的【重要】
- 接口和抽象类的区别是什么【重要】
- 成员变量与局部变量的区别有那些
- 创建一个对象用什么运算符?对象实体与对象引用有何不同?
- 静态方法和实例方法有何不同
- == 与 equals(重要)
- hashCode 与 equals (重要):你重写过 hashcode 和 equals 么,为什么重写equals时必须重写hashCode方法?
- 简述线程,程序,进程的基本概念.以及他们之间关系是什么?
- 线程有哪些基本状态?
- 关于 final 关键字的一些总结
- Java 中的异常处理
- sleep和wait的区别【重点】
- notify()和notifyAll()的区别【重点】
- java类加载及new对象的过程
Java集合框架常见面试题总结
- List,Set,Map三者的区别及总结
- Arraylist 与 LinkedList 区别
- ArrayList 与 Vector 区别
- HashMap 和 Hashtable 的区别
- HashMap 和 HashSet 区别
- HashMap 的工作原理及代码实现(红黑树要掌握)
- ConcurrentHashMap 的工作原理及代码实现
- HashMap 和 ConcurrentHashMap 的区别
- HashSet如何检查重复
- comparable 和 comparator的区别
- 如何对Object的list排序
- 如何实现数组与List的相互转换
- 如何求ArrayList集合的交集 并集 差集 去重复并集
- Arraylist 与 LinkedList 异同
- ArrayList 与 Vector 区别
- HashMap的底层实现
- ConcurrentHashMap的底层实现
- HashMap 的长度为什么是2的幂次方
- HashMap 多线程操作导致死循环问题
- HashSet 和 HashMap 区别
- ConcurrentHashMap 和 Hashtable 的区别
- ConcurrentHashMap线程安全的具体实现方式/底层具体实现
Java虚拟机(jvm)
内存区域问题
- 介绍下Java内存区域(运行时数据区)
- 对象的访问定位的两种方式
垃圾回收
- 如何判断对象是否死亡(两种方法)
- 简单的介绍一下强引用、软引用、弱引用、虚引用(虚引用与软引用和弱引用的区别、使用软引用能带来的好处)
- 垃圾收集有哪些算法,各自的特点
- HotSpot为什么要分为新生代和老年代
- 常见的垃圾回收器有那些
- 介绍一下CMS,G1收集器
- Minor GC和Full GC 有什么不同呢
多线程
- votatile的可见性:
- synchronized关键字和volatile关键字比较
- Java中CyclicBarrier 和CountDownLatch有什么不同?
线程池
- java有哪些常见线程池
- ThreadPoolExecutor方法参数作用
- 什么时候将请求加入队列
- execute和submit的区别
- 线程池都有哪几种工作队列
高并发
- 线程与进程
- 守护线程setDaemon()
- java thread状态
- 请说出与线程同步以及线程调度相关的方法
- wait()和sleep()的区别
- ThreadLocal是什么
- Volatile和Synchronized
- CAS
- Java中Unsafe类
- 线程池
- ThreadPoolExecutor构造方法参数说明
- Executor拒绝策略
- CachedThreadPool 、 FixedThreadPool、SingleThreadPool
- 死锁产生的四个必要条件和解决死锁
- 进程间的通信方式
- 为什么wait()和notify()属于Object类
计算机网络
- 五层协议的体系结构
-
TCP 三次握手和四次挥手(面试常客)
- 三次握手过程
- 为什么要三次握手
- 为什么要传回 SYN
- 传了 SYN,为啥还要传 ACK
- 四次挥手
- 为什么要四次挥手
- TCP、UDP 协议的区别
-
TCP 协议如何保证可靠传输
- 停止等待协议
- 自动重传请求 ARQ 协议
- 连续ARQ协议
- 滑动窗口
- 流量控制
- 拥塞控制
- 在浏览器中输入url地址 ->> 显示主页的过程(面试常客)
-
状态码
- 200
- 301
- 302
- 403
- 404
- 500
- 501
- 各种协议与HTTP协议之间的关系
- HTTP长连接、短连接
- get和post
- http和https
设计模式
- 定义
- 为什么要用单例模式呢(优点)?
- 为什么不使用全局变量确保一个类只有一个实例呢?
-
单例的模式的实现
- 饿汉方式(线程安全)
- 懒汉式(非线程安全和synchronized关键字线程安全版本 )
- 懒汉式(双重检查加锁版本)
- 懒汉式(登记式/静态内部类方式)
- 饿汉式(枚举方式)
- 定义:将一个类的接口转换成客户希望的另外一个接口
- 主要作用
- 解决的问题
-
优缺点
- 更好的复用性
- 透明、简单
- 更好的扩展性
- 解耦行
- 缺点:过多的使用适配器,会让系统非常零乱,不易整体进行把握
-
JDK使用实例
- Java I/O 库大量使用了适配器模式,例如 ByteArrayInputStream 是一个适配器类,它继承了 InputStream 的接口,并且封装了一个 byte 数组。换言之,它将一个 byte 数组的接口适配成 InputStream 流处理器的接口。
- 定义:给目标对象提供一个***对象,并由***对象控制对目标对象的引用
- 主要作用:通过引入***对象的方式来间接访问目标对象
- 解决的问题
-
优缺点
-
优点:
- 协调调用者和被调用者,降低了系统的耦合度
- ***对象作为客户端和目标对象之间的中介,起到了保护目标对象的作用
-
缺点:
- 由于在客户端和真实主题之间增加了***对象,因此会造成请求的处理速度变慢
- 实现***模式需要额外的工作(有些***模式的实现非常复杂),从而增加了系统实现的复杂度。
-
优点:
-
使用实例:
- 延迟加载
MySQL
- delete, truncate , drop 的区别?
- 数据库四大语言分类
- varchar和char的区别
- 什么是事务?事务的四大特征及隔离级别
- 数据库的存储引擎
- 索引的目的,好处,缺点,使用情况,不是能使用的情况
- sql优化
- 索引法则
- 使用索引的注意事项
- sql慢查询日志
- mysql资源消耗情况
- 全局查询日志
- 怎么避免高并发引起数据不一致问题?通过乐观锁和悲观锁
- 数据库的主备
redis
- redis为什么采用单线程架构
- Redis有哪些数据结构?
- 什么是pipeline
- (1)假如Redis里面有1亿个key,其中有10w个key是以某个固定的已知的前缀开头的,如果将它们全部找出来?(2)如果这个redis正在给线上的业务提供服务,那使用keys指令会有什么问题?
- redis有哪几种持久化方式,它们的优缺点有哪些?
- 说说Redis哈希槽的概念?
- redis常见性能问题和解决方案
- redis sentinel是什么?redis sentinel故障转移步骤?如何选择合适的slave节点?
- redis cluster和sentinel区别
- Redis的同步机制了解么?
- 缓存的优缺点
- 缓存雪崩、穿透、更新策略
算法:
- 剑指offer
- leetcode(可以关注我的公众号“算法半岛”,里面总结了leetcode的解题报告)
值得推荐到网站与书籍
- JavaGuide:https://github.com/Snailclimb/JavaGuide/
- 牛客网:https://www.nowcoder.com/
- leetcode中文版:https://leetcode-cn.com/problemset/all/
- leetcode英文版:https://leetcode.com/problemset/all/
- 剑指offer电子版:http://note.youdao.com/noteshare?id=da9dc9712af7bfbc2ba50846acc8d957&sub=372AD0E418574A34AFED5F4B5EB5516A
- 网络是怎么跑起来:http://note.youdao.com/noteshare?id=fc481d3777c781a2a3bfb05ee9e2b945&sub=0B792C463CA74E0883386752210CCB99
- 图解TCP/IP:http://note.youdao.com/noteshare?id=7d2186f2d7eeea36f19f25d42b808eee&sub=79A56C50CE7D496F96229497C53D8592
- Java虚拟机:http://note.youdao.com/noteshare?id=628f9db6135804a55f165ebdfea66401&sub=B53B9E3E29BB4EAE8115242EFE86F706
提前准备,顺利通关
最后,我想再啰嗦一下,一定要提前准备。不论是自我面试的准备,还是模拟面试的准备,还是自己项目的准备,还是HR面试时候的准备,一定要提前准备。面试的时候情况千变万化,一定要准备,才能应对自如。下面放一张面试的思维导图:
最后最后,希望小伙伴们都能找到心仪的工作。
#面经##春招##秋招##Java工程师#更多文章请添加公众号:算法半岛(扫描上图二维码即可关注)