面经(Java开发)
下面把我的秋招过程总结的面试提问频率最高的一些内容分享给大家。很多的公司面试都大同小异,集中在这些部分。不同的是实力要求更高的公司问的更细更深,对算法的考察也更多。
Java基础
super与this异同
-
作为引用,this表示当前对象,可在形参与对象属性重名时以示区分,super表示父类对象的引用
-
构造函数super(),this()表示调用构造方法。this()调用本类其他构造方法,super()调用父类构造方法.其都要放在构造方法内第一行,所以两者不可能同时出现。
-
如未说明,会默认在子类构造方法第一行加super(),但是如果父类没有无参构造方法,则必须显式声明。
-
本质上讲,this是对本对象的引用,super是一个java关键字
异常:
异常分为Error和Exception
-
Error为编译和系统错误 不允许被捕获
-
Exception又分为Runtime_Exception(运行时异常)和Non_RuntimeException(非运行时异常/可检测异常)
常见的运行时异常:
-
indexsOutofBoundsException
-
SQLException
-
MemException
-
ArithmeticExecption
-
NumberFormatException
-
IOException
设计模式:
-
单例模式
将该类的构造方法声明为private,使得无法从外部类来实例化对象。然后在类内部的方法中返回实例化的单一对象 -
工厂模式
备忘录模式:游戏当中进度存取 -
中介者模式
内存泄漏: 对象不再使用,无法被正常回收而驻留在堆内存中。内存泄漏最终可能会导致内存溢出
-
单例造成的内存泄漏
-
线程造成的内存泄漏
-
资源未关闭造成的内存泄漏
抽象类与接口的区别:
-
抽象类可以有默认的方法实现,接口的方法不能实现
-
继承抽象类使用extends,实现接口使用implements
-
抽象类可以声明为public,protected,default。接口只能声明为public
-
抽象类可以有构造器,接口不能有构造器
Java集合
HashMap与HashTable区别:
1:父类不同 HashMap父类为AbstractMap,HashTable父类为Dictionary 但它们都实现了map cloneable serializable三个接口
2:HashTable不允许Null key 与 null value
3:hashtable是线程安全的 hashmap不是线程安全的,在多线程情况下有可能产生死锁
解决hash冲突的四种方法:
-
开放定址发
-
链地址法 hashmap采用的方法
-
再hash法
-
公共溢出区
ArrayList与LinkedList的异同
JVM
堆内存与栈内存区别
Java的垃圾回收
-
判断对象是否存活,两种方法,可达性分析和引用计数
-
GC垃圾收集算法,4种,标记清除,复制,标记整理,分代收集
-
GC垃圾收集器,7种,对应垃圾回收算法来回答
-
内存分配策略,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方法体
多线程的实现方式:
-
继承Thread类 实例化之后调用start方法
-
实现Runnable接口 实例化一个Thread传入该类实例
-
实现Callable接口,通过FutureTask包装器来创建线程
-
使用ExecutorService、Callable、Future实现有返回结果的线程
ExecutorService、Callable、Future三个接口实际上都是属于Executor框架。返回结果的线程是在JDK1.5中引入的新特征,有了这种特征就不需要再为了得到返回值而大费周折了。而且自己实现了也可能漏洞百出。
可返回值的任务必须实现Callable接口。类似的,无返回值的任务必须实现Runnable接口。
执行Callable任务后,可以获取一个Future的对象,在该对象上调用get就可以获取到Callable任务返回的Object了。
注意:get方法是阻塞的,即:线程无返回结果,get方法会一直等待。
再结合线程池接口ExecutorService就可以实现传说中有返回结果的多线程了。
进程与线程的区别:
-
进程是资源分配的最小单位,线程是CPU调度的最小单位
-
进程有独立的地址空间,线程之间共享其进程的同一空间。所以进程调度开销更大。
-
线程之间由于共享资源,交流方便但会互相干涉。而进程之间交流以通信的方式进行。
大数据框架
-
hadoop离线数据处理框架
-
spark,storm实时数据处理框架
hadoop的运行模式分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数据分片模型
Memcached
分布式内存对象缓存系统,通过缓存数据库查询结果,减少数据库访问,提高动态web速度,提高可扩展性
redis与Memcached比较
1 redis不仅支持基础的key-value类型数据,还提供List,set,zset,hash等数据结构
2 redis提供数据备份,即主从模式的数据备份
3 redis支持数据持久化,可以将数据保存进磁盘。
redis数据结构应用场景
1 List 消息队列
2 Hash 实际上value是一个HashMap,可以存放比如一个用户的各种信息
3 Set 可以实现关注功能
数据库
char与varchar的区别
事务的四大特性:
- 原子性
- 一致性
- 隔离性
- 永久性
事务并发时的3种问题:
- 脏读
- 不可重复读
- 幻读
隔离的四种级别:
- 串行化:最高级别
- 可重复读:避免脏读和不可重复读
- 读已提交:避免脏读
- 读未提交:最低级别,无法保证
常用查询优化:
-
避免在where子句上进行null值判断
-
慎用in与not in 能用between就不要用in
-
避免在where字句对 = 左边进行表达式或函数操作
-
组合索引情况下,必须使用到索引的第一个字段才能使索引生效,并且尽可能使字段顺序与索引顺序一致
-
要注意索引并不是越多越好,索引可以提高查询效率但是会降低更改表的效率,并且也会占用存储空间,所以要视情况而定
可以使用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
-
消息队列
-
信号量
-
共享内存
结语
我的能力不算突出,大家从我笔面试的经历也可以看出来,真正的顶级大厂我是一个offer都没有拿到的。但是好在我投的面的都比较多,各种公司的笔面试也都经历见识过,通过此文分享出来,希望可以给大家带来一定的帮助,也希望准备迈向春招秋招大坑的学弟学妹们可以乘风破浪,勇往直前,开心地离开校园,昂首进入公司!