1 你的什么专业?在你的专业方向做了什么工作?,主要是在研究生做了哪些工作?做了哪些课题?
2 大数据的相关组件你了解吗?
hadoop 的原理 Flume的原理 ……一些大数据相关的组件的原理。
3 sleep()和wait的区别?
这两个方法来自不同的类分别是Thread和Object 。
最主要是sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法(锁代码块和方法锁)。
wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用(使用范围) 。
sleep必须捕获异常,而wait,notify和notifyAll不需要捕获异常 。
4 Currenthashmap的的原理和底层实现
ConcurrentHashMap 和 HashMap 思路是差不多的,但是因为它支持并发操作,所以要复杂一些。整个 ConcurrentHashMap 由一个个 Segment 组成, Segment 代表”部分“或”一段“的意思,所以很多地方都会将其描述为分段锁。注意,行文中,我很多地方用了“槽”来代表一个segment。ConcurrentHashMap 是一个Segment数组Segment 通过继承ReentrantLock 来进行加锁,所以每次需要加锁的操作锁住的是一个segment,这样只要保证每个 Segment 是线程安全的,也就实现了全局的线程安全。JDk1.7的时候
JDK1.8在JDK1.8中,放弃了Segment臃肿的设计,取而代之的是采用Node + CAS + Synchronized来保证并发安全进行实现,synchronized只锁定当前链表或红黑二叉树的首节点,这样只要hash不冲突,就不会产生并发,效率又提升N倍。
5 Redis的持久化操作和原理以及实现操作
redis提供两种方式进行持久化,一种是RDB持久化(原理是将Reids在内存中的数据库记录定时 dump到磁盘上的RDB持久化),另外一种是AOF(append only file)持久化(原理是将Reids的操作日志以追加的方式写入文件)
RDB持久化是指在指定的时间间隔内将内存中的数据集快照写入磁盘,实际操作过程是fork一个子进程,先将数据集写入临时文件,写入成功后,再替换之前的文件,用二进制压缩存储
AOF持久化以日志的形式记录服务器所处理的每一个写、删除操作,查询操作不会记录,以文本的方式记录,可以打开文件看到详细的操作记录。
|
AOF |
RDB |
优点 |
1AOF 可以更好的保护数据不丢失,一般 AOF 会每隔 1 秒,通过一个后台线程执行一次fsync操作,最多丢失 1 秒钟的数据 2AOF 日志文件以 append-only 模式写入,所以没有任何磁盘寻址的开销,写入性能非常高,而且文件不容易破损,即使文件尾部破损,也很容易修复。 3AOF 日志文件即使过大的时候,出现后台重写操作,也不会影响客户端的读写. 4AOF 日志文件的命令通过非常可读的方式进行记录,这个特性非常适合做灾难性的误删除的紧急恢复。 |
1RDB 会生成多个数据文件,每个数据文件都代表了某一个时刻中 redis 的数据,这种多个数据文件的方式,非常适合做冷备,可以将这种完整的数据文件发送到一些远程的安全存储上去 2RDB 对 redis 对外提供的读写服务,影响非常小,可以让 redis 保持高性能 3相对于 AOF 持久化机制来说,直接基于 RDB 数据文件来重启和恢复 redis 进程,更加快速。 |
缺点 |
1对于同一份数据来说,AOF 日志文件通常比 RDB 数据快照文件更大 2AOF 开启后,支持的写 QPS 会比 RDB 支持的写 QPS 低AOF 这种较为复杂的基于命令日志 / merge / 回放的方式,比基于 RDB 每次持久化一份完整的数据快照文件的方式 |
1如果想要在 redis 故障时,尽可能少的丢失数据,那么 RDB 没有 AOF 好 2RDB 每次在 fork 子进程来执行 RDB 快照数据文件生成的时候,如果数据文件特别大,可能会导致对客户端提供的服务暂停数毫秒,或者甚至数秒。 |
6 对并发和并行的理解?
并发(concurrency)
指宏观上看起来两个程序在同时运行,比如说在单核cpu上的多任务。但是从微观上看两个程序的指令是交织着运行的,你的指令之间穿插着我的指令,我的指令之间穿插着你的,在单个周期内只运行了一个指令。这种并发并不能提高计算机的性能,只能提高效率
并行(parallelism)
指严格物理意义上的同时运行,比如多核cpu,两个程序分别运行在两个核上,两者之间互不影响,单个周期内每个程序都运行了自己的指令,也就是运行了两条指令。这样说来并行的确提高了计算机的效率。所以现在的cpu都是往多核方面发展。
简单理解
并发:一个处理器可以同时处理多个任务。这是逻辑上的同时发生。
并行:多个处理器同时处理多个不同的任务。这是物理上的同时发生。
7 数据库的表的相关的连接操作?
内连接:两个表格的的交集
外连接:两个表格数据的并集
左连接:左边表格的全部数据的连接右边的相匹配的数据
右连接:右边表格的全部数据的连接左边的相匹配的数据
8 Union 和union All的相关的区别?
UNION 并集,表中的所有数据,并且去除重复数据(工作中主要用到的是这个);
UNION ALL,表中的数据都罗列出来;
9 java里面cylicbarrier和countdownlunch,区别?是如何使用的?实现代码?
10 利用java来实现的阻塞队列的代码
public class MyBlockQueue<T> {
//push锁
private final static Object pushLock = new Object();
//pop锁
private final static Object popLock = new Object();
//数据存储
private Stack<T> stack;
//队列最大长度
private int maxSize = 0;
//队列最小长度
private int minSize = 0;
public MyBlockQueue(int size) {
this.maxSize = size;
stack = new Stack<T>();
}
public synchronized void push(T t) {
if(stack.size() >= maxSize) {
pushLock();
}
stack.push(t);
popUnLock();
}
public synchronized T pop() {
if(stack.size() == minSize) {
popLock();
}
T t = stack.pop();
pushUnLock();
return t;
}
private void pushLock() {
synchronized (pushLock) {
try {
pushLock.wait();
} catch (Exception e) {
e.printStackTrace();
}
}
}
private void pushUnLock() {
synchronized (pushLock) {
pushLock.notify();
}
}
private void popLock() {
synchronized (popLock) {
try {
popLock.wait();
} catch (Exception e) {
e.printStackTrace();
}
}
}
private void popUnLock() {
synchronized (popLock) {
popLock.notify();
}
}
}
11实现二叉树的翻转的实现
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public TreeNode invertTree(TreeNode root) {
//递归终止的条件
if(root==null){
return null;
}
//递归的过程是
invertTree(root.left);
invertTree(root.right);
//翻转实现
TreeNode temp=root.right;
root.right=root.left;
root.left=temp;
return root;
}
}
12 并发的相关的问题的原理?
……
13 java 中的IO 和NIO 和AIO的原理和区别?
BIO (Blocking I/O): 同步阻塞I/O模式,数据的读取写入必须阻塞在一个线程内等待其完成。在活动连接数不是特别高(小於单机1000)的情况下,这种模型是比较不错的,可以让每一个连接专注于自己的 I/O 并且编程模型简单,也不用过多考虑系统的过载、限流等问题。线程池本身就是一个天然的漏斗,可以缓冲一些系统处理不了的连接或请求。但是,当面对十万甚至百万级连接的时候,传统的 BIO 模型是无能为力的。因此,我们需要一种更高效的 I/O 处理模型来应对更高的并发量。
NIO (New I/O): NIO是一种同步非阻塞的I/O模型,在Java 1.4 中引入了NIO框架,对应 java.nio 包,提供了 Channel , Selector,Buffer等抽象。NIO中的N可以理解为Non-blocking,不单纯是New。它支持面向缓冲的,基于通道的I/O操作方法。 NIO提供了与传统BIO模型中的 Socket 和 ServerSocket 相对应的 SocketChannel 和 ServerSocketChannel 两种不同的套接字通道实现,两种通道都支持阻塞和非阻塞两种模式。阻塞模式使用就像传统中的支持一样,比较简单,但是性能和可靠性都不好;非阻塞模式正好与之相反。对于低负载、低并发的应用程序,可以使用同步阻塞I/O来提升开发速率和更好的维护性;对于高负载、高并发的(网络)应用,应使用 NIO 的非阻塞模式来开发
AIO (Asynchronous I/O): AIO 也就是 NIO 2。在 Java 7 中引入了 NIO 的改进版 NIO 2,它是异步非阻塞的IO模型。异步IO 是基于事件和回调机制实现的,也就是应用操作之后会直接返回,不会堵塞在那里,当后台处理完成,操作系统会通知相应的线程进行后续的操作。AIO 是异步IO的缩写,虽然 NIO 在网络操作中,提供了非阻塞的方法,但是 NIO 的 IO 行为还是同步的。对于 NIO 来说,我们的业务线程是在 IO 操作准备好时,得到通知,接着就由这个线程自行进行 IO 操作,IO操作本身是同步的。查阅网上相关资料,我发现就目前来说 AIO 的应用还不是很广泛,Netty 之前也尝试使用过 AIO,不过又放弃了。
14 拦截器 过滤器的原理 有什么区别?怎么配置?
15 反问环节:
我问他对我的面试评价,他是叫我猜。然后笑笑说,这个东西我不做评价了。后面的结果会通知到你的。那个时候就知道你的评价了。
面试总结:
1java的基础中的那几个关键字和一些词语的区别和理解
类 多态 抽象类 接口 并发问题的关键字的理解和原理…………
2并发编程的中的原理和简单实现
3 手写代码一般都是leetcode的简单的一定要手写一次成功。不能在IDEA中的写,难度是简单的就行。