引子
从过完年回苏州,就开始找工作,差不多1个半星期的时间,最后和一家公司谈好。
我个人情况比较特殊,30多岁,毕业前面5-6年做软件,后来就自己创业做线上粉丝运营,最近一年,把现在公司主流用的的技术栈,中间件多熟悉了一下,也通过几个项目练习了一遍。同时自己对大数据分析比较刚兴趣,趁着自己自由时间比较多,所以又把hadoop整个离线分析框架(hdfs,yarm,hive,hbase,flume),以及storm在线流式分析框架都学习了一遍。
学是一方面,在找工作的过程中,还是要对面试中经常遇到的问题有一个整体的了解,也包括自己的职业规划,这个关系到你想向那些公司投简历。
今年的第一个面试就需要先去做题目,发现自己技术基础掌握的不是很好,也可能是时间长了,很多java基础的东西区分的不是很仔细,所以自己在牛客网上刷题,遇到一些不是很明白的,再去发散性的学习提升,后面有机会再去把我的这些错题总结出来。
还有很多想跟大家分享的,不过感觉自己的文笔没有我参考的这个博主【五月的仓颉】好,所以用他的大纲,我总结了一个思维导图,分享给大家。.
参考 面试感悟----一名3年工作经验的程序员应该具备的技能
面试感悟
java
易学难精
语言是职业生涯的一个赛道
职业规划
前3年积累工作经验
- 比较纯粹的Coder的阶段
- 团队协作
- 如何使用项目管理工具
- 代码如何测试
- 如何在线上运行
5-10年 技术上独当一面
- 从一个Coder逐步走向系统分析师或是架构师,成为项目组中不可或缺的人物
- 研究各种技术实现细节
- 看了N多好书
- 写一些博客
- 在Github上分享技术
10年之后 担任关键职务
- 对行业有着深入认识
- 对技术有着深入认识
- 能从零开始对一个产品进行分析的程序员
- 担任的都是CTO、技术专家、首席架构师等最关键的职位
面试衡量的3方面
项目经验
-
虽然大部分情况都是做产品的一个功能或一个模块,但是你有没有把整个系统架构或产品搞清楚,并能介绍清楚
- 为什么做这个系统?
- 这个系统的价值是什么?
- 这个系统有哪些功能?
- 优缺点有哪些?
- 如果让你重新设计这个系统你会如何设计?
-
总结
- 明确你的项目到底是做什么的,有哪些功能
- 明确你的项目的整体架构,清楚地指出从哪里调用到哪里、使用什么方式调用
- 明确你的模块在整个项目中所处的位置及作用
- 明确你的模块用到了哪些技术
- 更好一些的可以再了解一下整个项目用到了哪些技术
-
绕不开的问题
- 谈一下你在项目中解决过的比较复杂的问题
- 问题不是你解决的而是别人解决的,但是你把这个问题弄懂、搞透了,依然是你的经验
基本技术
-
3-5年工作经验
-
1 基本语法
-
static、final、transient等关键字的作用
-
volatile关键字的底层实现原理
-
foreach循环的原理
-
对你技术的考量
- 深度优先、广度次之为标准
-
-
2 集合
-
List、Map、Set
- 各种实现类的底层实现原理,实现类的优缺点
-
ArrayList、LinkedList、Hashtable、HashMap、ConcurrentHashMap、HashSet的实现原理
-
掌握CopyOnWrite容器
-
Queue
-
ConcurrentHashMap的问题
- 1 它的锁分段技术
- 2 它的读是否要加锁,为什么
- 3 它的迭代器是强一致性的迭代器还是弱一致性的迭代器
-
-
3 设计模式
-
重点研究常用的十来种
- 1 你的项目中用到了哪些设计模式,如何使用
- 2 知道常用设计模式的优缺点
- 3 能画出常用设计模式的UML图
-
-
4 多线程
-
基本上不会再问你怎么实现多线程了
-
Thread和Runnable的区别和联系
-
多次start一个线程会怎么样
-
线程有哪些状态
-
问题
-
假如有Thread1、Thread2、Thread3、Thread4四条线程分别统计C、D、E、F四个盘的大小,所有线程都统计完毕交给Thread5线程去做汇总,应当如何实现?
- 分析:先多线程同步执行,需要有一个线程等待汇总
- 可以通过发令枪,循环栅栏,阻塞队列,CompletableFuture异步回调
-
-
线程池
- 用的线程池有几种?
- 这几种线程池之间有什么区别和联系?
- 线程池的实现原理是怎么样的?
- 实际一点的,会给你一些具体的场景,让你回答这种场景该使用什么样的线程池比较合适
-
多线程同步、锁
- synchronized和ReentrantLock的区别
- synchronized锁普通方法和锁静态方法
- 死锁的原理及排查方法等等
-
-
5 IO
-
File IO
-
Socket IO
-
阻塞/非阻塞的区别
-
同步/异步的区别
-
四种IO模型
- 阻塞IO
- 非阻塞IO
- 多路复用IO
- 异步IO
-
Socket IO如何和这四种模型相关联。
-
-
NIO的原理、NIO属于哪种IO模型、NIO的三大组成
- NIO并不是严格意义上的非阻塞IO而应该属于多路复用IO
- 知道NIO会阻塞在Selector的select方法上
-
Netty
- 当前最好的NIO框架
-
-
6 JDK源码
-
看你平时是不是爱钻研了
-
String的hashCode()方法是怎么实现的
-
1 List、Map、Set实现类的源代码
-
2 ReentrantLock、AbstractQueuedSynchronizer(AQS)的源代码
-
AQS详解
-
抽象的队列式的同步器
-
同步类实现都依赖于它
- 如常用的ReentrantLock/Semaphore/CountDownLatch
-
-
维护了2个属性
-
一个volatile int state(代表共享资源)
-
访问方式
-
getState()
-
setState()
-
compareAndSetState()
- CAS
-
-
-
一个FIFO线程等待队列(多线程争用资源被阻塞时会进入此队列)
-
-
对共享资源state,有两种资源共享方式
-
独占方式 Exclusive
-
如 ReentrantLock
-
tryAcquire 尝试获取资源
- 成功则返回true
- 失败则返回false
-
-
共享方式 Share
-
如 Semaphore/CountDownLatch
-
tryAcquireShared(int) 尝试获取资源
- 负数表示失败;
- 0表示成功,但没有剩余可用资源;
- 正数表示成功,且有剩余资源
-
-
AQS也支持自定义同步器同时实现独占和共享两种方式
- 如ReentrantReadWriteLock
-
-
-
3 AtomicInteger的实现原理
- 主要能说清楚CAS机制并且AtomicInteger是如何利用CAS机制实现的
-
4 线程池的实现原理
-
5 Object类中的方法以及每个方法的作用
-
-
7 框架
-
问你一下你们项目中使用的框架
-
给你一些场景问你用框架怎么做
-
举例
- 在Spring初始化bean的时候做一些事情该怎么做
- 想要在bean销毁的时候做一些事情该怎么做
- MyBatis中$和#的区别
-
-
问一些框架的实现原理
- Spring AOP的实现原理
- 难的:画一下Spring的Bean工厂实现的UML图
-
-
8 数据库
- union和union all的区别
- left join
- 几种索引及其区别
- 数据库性能的优化
-
9 数据结构和算法分析
-
会比不会好而且在工作中绝对能派上用场
-
数组、链表是基础
-
栈和队列深入一些但也不难,树挺重要的
-
比较重要的树AVL树、红黑树
-
要知道什么是二叉查找树、什么是平衡树,AVL树和红黑树的区别
-
你知道索引使用的是哪种数据结构实现吗?
-
算法分析
-
排序,查找
-
分治法
-
动态规划
-
Collections.sort方法使用的是哪种排序方法
- TimSort的排序,增强型的归并排序法
-
-
-
10 Java虚拟机
- Java虚拟机的内存布局
- GC算法及几种垃圾收集器
- 类加载机制,也就是双亲委派模型
- Java内存模型
- happens-before规则
- volatile关键字使用规则
- 走向大牛的路上,不可不会
-
11 Web方面的一些问题
-
谈谈分布式Session的几种实现方式
-
Session和Cookie的区别和联系以及Session的实现原理
-
web.xml里面的内容是重点
- Filter、Servlet、Listener 知根知底
-
get/post的区别
-
forward/重定向的区别
-
HTTPS的实现原理
-
SOA和RPC,面向服务体系
- 大型分布式架构必备
-
-
个人潜力
-
HR面试
- 1 简历中写的过去工作经历的离职原因
- 2 当前公司薪资待遇
- 3 期望能到怎样的一家公司
- 4 个人未来的发展方向
-
面试心态
-
1 不紧不慢,平心静气
-
2 条理清晰
-
不要把面试当作面试,当做一次技术交流
- 把面试的心态从我要找到一份工作转变为我要通过面试去发现不足、提升自己
-
如果自己热衷于研究技术的朋友,真的要有自信
-
为什么java易学难精
-
易学
- Java语言的设计者帮助Java程序员做了这么多事情
-
难精
- 假如在应用运行过程中遇到了语法层面和应用层面之外的错误,应当如何处理?
- 比如线上环境出现内存溢出怎么办?
- GC时间过长怎么办?
- IO长时间没反应怎么办?
- 方法抛出莫名其妙的异常怎么办?
- 这些问题需要大量的经历、大量的实践、大量对Java底层实现细节的研究
工作的心态
-
建议看看这本书【软技能-代码之外的生存之道】
-
把自己与公司的雇佣关系
-
变为自己也是一个企业与公司是一种合作关系
- 公司是自己的一个重要客户(贡献大部分收入)
- 自己作为企业,那企业发展需要考虑哪些方面
-
30岁之后工作不好找,或者30岁之后就要转行?
-
这个就像一个老中医一样,老中医一眼就看出这个人有什么问题,而新人需要查这个查那个,还不一定能准确定位
-
对于一个新的容器
-
老手一看就知道 这是不是新壶装老酒
- 还是在技术上加入了哪些新的特性,解决了原来哪方面的问题
-
新手
- 新手去学,要一段时间,再去用,有没多少实际经验,不知道怎么配置调优
-
XMind - Trial Version