投了70多家 笔面试60多次 中二学长的秋招面经
秋招的时候在牛客上看了很多别人的面经,很有帮助。现在把自己面试的一些经历写出来,希望能有所回馈。
秋招那段时间
我投过的简历:
笔面试流程:
三类公司
在我的笔面试过程中,可以依据参与类型和难度把公司大概分为几种。
第一种是来学校进行招聘的公司。
这一种是量大,成功率高也相对容易的机会。
首先是量大,几乎每天都有不止一家企业在学校开宣讲会。而对应企业耗费不少人力物力肯定是希望带走不少学生的。而且既然来了你们学校,那么学历肯定不会是你的劣势的。所以这一类是机会最大的。
我所在的是一个普通211大学,也并不以计算机见长。所以一流大厂的研发岗很少有来我们学校招聘的。所以面试的难度也不太大,这一类笔面试机会是夯实基础,积攒信心的良好去处。也是我拿offer最多的类型。
第二种是知名非互联网大厂的软件岗位。
比如一些大银行,中兴OV小米等著名企业。这类企业名声在外,招聘也很规范化有不低的要求。但毕竟核心并非互联网与软件,这类公司在计算机与软件技术的实力上还是比不上一流互联网大厂的。所以笔面试难度相对一流互联网公司较为容易,一些国企更看重成绩与学校奖项,而对技术要求相对淡化。如果实力没有那么强大去顶尖互联网公司的话,这类公司也是很好的选择,大平台也有利于将来发展。
第三种就是真正的一流互联网大厂了。
以BAT,字节跳动,网易等为代表,部分知名外企为辅助,以及一些在特定子领域技术实力较强的创业公司提供更多选择与机会。
这一类企业是有志在互联网与将来的人工智能领域有所斩获的同学的主战场。简单说也就是大佬们挥洒的地方。也是笔面试难度最大的地方,同时也是对将来发展最有利的去处。
面经(Java开发)
下面把我的秋招过程总结的面试提问频率最高的一些内容分享给大家。很多的公司面试都大同小异,集中在这些部分。不同的是实力要求更高的公司问的更细更深,对算法的考察也更多。
Java基础
super与this异同
1.作为引用,this表示当前对象,可在形参与对象属性重名时以示区分,super表示父类对象的引用
2.构造函数super(),this()表示调用构造方法。this()调用本类其他构造方法,super()调用父类构造方法.其都要放在构造方法内第一行,所以两者不可能同时出现。
3.如未说明,会默认在子类构造方法第一行加super(),但是如果父类没有无参构造方法,则必须显式声明。
4.本质上讲,this是对本对象的引用,super是一个java关键字
异常:
异常分为Error和Exception
Error为编译和系统错误 不允许被捕获
Exception又分为Runtime_Exception(运行时异常)和Non_RuntimeException(非运行时异常/可检测异常)
常见的运行时异常:
indexsOutofBoundsException
SQLException
MemException
ArithmeticExecption
NumberFormatException
IOException
设计模式:
单例模式:将该类的构造方法声明为private,使得无法从外部类来实例化对象。然后在类内部的方法中返回实例化的单一对象
工厂模式
备忘录模式:游戏当中进度存取
中介者模式
内存泄漏---对象不再使用,无法被正常回收而驻留在堆内存中。内存泄漏最终可能会导致内存溢出
1单例造成的内存泄漏
2线程造成的内存泄漏
3资源未关闭造成的内存泄漏
抽象类与接口的区别:
1抽象类可以有默认的方法实现,接口的方法不能实现
2继承抽象类使用extends,实现接口使用implements
3抽象类可以声明为public,protected,default。接口只能声明为public
4抽象类可以有构造器,接口不能有构造器
Java集合
HashMap与HashTable区别:
1:父类不同 HashMap父类为AbstractMap,HashTable父类为Dictionary 但它们都实现了map cloneable serializabl三个接口
2:HashTable不允许Null key 与 null value
3:hashtable是线程安全的 hashmap不是线程安全的,在多线程情况下有可能产生死锁
解决hash冲突的四种方法:
开放定址发
链地址法 hashmap采用的方法
再hash法
公共溢出区
ArrayList与LinkedList的异同
JVM
堆内存与栈内存区别
Java的垃圾回收
1 判断对象是否存活,两种方法,可达性分析和引用计数
2 GC垃圾收集算法,4种,标记清除,复制,标记整理,分代收集
3 GC垃圾收集器,7种,对应垃圾回收算法来回答
4 内存分配策略,5种
类加载与双亲委派机制
多线程
start()与run()的区别
run只是thread中的一个普通方法,还是在主线程中中执行。
start是真正启动线程,实现了多线程运行
线程5种状态
创建状态 生成线程对象之后,start之前
就绪状态 start之后,运行之前。或者从等待或睡眠中回来
运行状态 CPU开始运行该线程
阻塞状态 正在运行的时候被暂停,如等待某资源。可使用 sleep,suspend,wait等方法使其阻塞
死亡状态 run方法执行结束或者调用stop方法
wait()与sleep()的区别
sleep是Thread类中的方法,线程进入sleep状态,会暂停运行一段时间,把CPU让出,但不会释放锁资源以及监控的状态
wait是Obiect类中的方法,会使线程放弃当前对象的锁,只有针对该对象调用notify方法之后才能进入对象锁定池重新获取对象锁
如何安全地停止线程:
不能直接调用线程的stop方法,这样会导致无法进行必要的收尾操作及释放资源
调用线程的interrupt方法,为线程做上“需要终止”的标识
在线程内部每一次循环进行判断Thread.interrupted()来决定是否进行必要收尾后return,结束run方法体
多线程的实现方式:
1继承Thread类 实例化之后调用start方法
2实现Runnable接口 实例化一个Thread传入该类实例
3实现Callable接口,通过FutureTask包装器来创建线程
4使用ExecutorService、Callable、Future实现有返回结果的线程
ExecutorService、Callable、Future三个接口实际上都是属于Executor框架。返回结果的线程是在JDK1.5中引入的新特征,有了这种特征就不需要再为了得到返回值而大费周折了。而且自己实现了也可能漏洞百出。
可返回值的任务必须实现Callable接口。类似的,无返回值的任务必须实现Runnable接口。
执行Callable任务后,可以获取一个Future的对象,在该对象上调用get就可以获取到Callable任务返回的Object了。
注意:get方法是阻塞的,即:线程无返回结果,get方***一直等待。
再结合线程池接口ExecutorService就可以实现传说中有返回结果的多线程了。
进程与线程的区别:
1:进程是资源分配的最小单位,线程是CPU调度的最小单位
2:进程有独立的地址空间,线程之间共享其进程的同一空间。所以进程调度开销更大。
3:线程之间由于共享资源,交流方便但会互相干涉。而进程之间交流以通信的方式进行。
大数据框架
hadoop离线数据处理框架
spark,storm实时数据处理框架
hadoop的运行模式分3种
1.本地运行模式
2.伪分布式运行模式
3.分布式集群运行模式
hadoop中通信
namenode通过rpc通信
client与datanode通过socket通信
hadoop HDFC(hadoop distribute file system)
Spark有3种运行模式:独立集群运行模式、YARN运行模式、Mesos运行模式。
开发框架
Spring
ioc:依赖注入,也叫控制反转
aop:面向切面编程
Redis
redis五种数据结构
string hash list set zset
使用redis实现分布式
1读写分离模型
采取主从模式,master更新数据并将其同步到slave上,slave提供检索服务,master负责同步数据
2数据分片模型
Mem***d
分布式内存对象缓存系统,通过缓存数据库查询结果,减少数据库访问,提高动态web速度,提高可扩展性
redis与Mem***d比较
1 redis不仅支持基础的key-value类型数据,还提供List,set,zset,hash等数据结构
2 redis提供数据备份,即主从模式的数据备份
3 redis支持数据持久化,可以将数据保存进磁盘。
redis数据结构应用场景
1 List 消息队列
2 Hash 实际上value是一个HashMap,可以存放比如一个用户的各种信息
3 Set 可以实现关注功能
数据库
char与varchar的区别
事务的四大特性:
原子性
一致性
隔离性
永久性
事务并发时的3种问题:
脏读
不可重复读
幻读
隔离的四种级别:
串行化:最高级别
可重复读:避免脏读和不可重复读
读已提交:避免脏读
读未提交:最低级别,无法保证
常用查询优化:
1避免在where子句上进行null值判断
2慎用in与not in 能用between就不要用in
3避免在where字句对 = 左边进行表达式或函数操作
4组合索引情况下,必须使用到索引的第一个字段才能使索引生效,并且尽可能使字段顺序与索引顺序一致
5要注意索引并不是越多越好,索引可以提高查询效率但是会降低更改表的效率,并且也会占用存储空间,所以要视情况而定
可以使用explain 语句来解析sql方便制定优化方案
数据库索引,B+树,为什么用B+树
常用数据库引擎
ISAM
MyISAM ISAM在索引与事务上的扩展
HEAP 支持只驻留在内存中的临时表格
InnoDB 支持MySql++ API
计算机网络
tcp:
面向连接,是可靠的
保证按序到达
全双工协议 允许在两个方向上同时传输
活动窗口及拥塞控制:
发送窗口: 建立连接时发送者被告知接收者接收窗口大小,以此来决定发送窗口大小
拥塞控制: 慢开始,快重传
http:
http状态码:
200成功
3XX重定向
4XX请求错误 400请求格式错误 401未授权 403禁止 404未找到
5XX服务器内部错误
http get与post区别:
get明文传输,数据显示在url中,post数据不显示在url中
get安全性更差,发送敏感信息不应使用get ,post更安全,信息不会被保存到浏览器历史或服务器日志中
get有传输长度限制,post无传输长度限制
get只允许ASCII字符,post不仅允许ASCII,也允许二进制数据
Linux
模糊查询 find -name "*abc"
查看进程信息
top top中内容可动态更新,而且可进行其他操作
ps -aux ps只显示静态内容
可同时利用grep抓取我们想要获取的内容,某进程的cwd内容是该进程的文件所在位置
查看cpu cat /proc/cpuinfo 查看内存信息 cat /proc/meminfo
查看端口netstat
wc命令 查看文件有多少行
mount 挂载linux系统外文件
strace Linux调试分析诊断工具,跟踪进程的系统调用等相关信息
进程间通信5种方式
管道
FIFO
消息队列
信号量
共享内存
结语