记录一下最近面试遇到的问题,持续更新ing
电话面试:
1 nio不是很熟
http://ifeve.com/java-nio-all/
2 kafka中间件的好处有什么 -> 可靠性 -> 它是如何保障它的可靠性
http://www.importnew.com/24973.html
3 redis集群用过嘛
4 hello world 做了什么?
编译,即把我们写好的java文件,通过javac命令编译成字节码,也就是我们常说的.class文件。
运行,则是把编译声称的.class文件交给Java虚拟机(JVM)执行。
5 常用gc算法 ->
1)引用计数法 -> 存在循环引用的缺陷 -> 针对其缺陷 -> 根搜索算法、
2)标记清除算法 -> 效率低 空间碎片 -> 复制算法 -> 较多的复制效率很低 -> 标记整理算法
3)分代回收法 这种算法并没有什么新的思路,只是根据对象的存活周期的不同,将内存划分为几块。一般是把java堆分成新生代和老年代,这样就可以根绝各个年代的特点采取最适当的收集算法。在新生代中,每次垃圾回收时都发现大批对象的死去,只有少量存活,那就选用复制算法,只需要付出少量存活对象的复制成本就可以完成收集。而老年代中因为对象存活率高,没有额外空间对它进行分配担保,就必须使用”标记-清理”或者“标记-整理”算法来进行回收。
6 一个请求中间都做了什么
7 SpringBoot用了哪些设计模式 xml和注解的bean统一管理是什么设计模式
8 你平时都用了哪些设计模式,为什么要用它
9 10亿个数据的业务要如何处理
10 mysql的版本是什么?
11 常用的数据结构是什么?-> ArrayList HashMap
-> hashMap底层是什么?
-> 数组链表红黑树
-> 为什么要用红黑树
-> 性能好相对于链表每个节点减少一半的可能
12 常用的orm模型框架是什么 -> mybatis -> 原理?
13 你平时用过哪些异步框架?
14 内存溢出如何排查?
15 一个发生概率为1%的问题要如何调查?
16 你平时如何做性能优化的?
17 平时遇到过慢sql嘛? 如何优化的?
18 用jdk几? -> 8 -> 有哪些新特性?
19 redis为什么比数据库快?
20 redis如何持久化?
21 一个增强for循环运行期间删掉一个元素会怎样?
22 threadLocal
当使用ThreadLocal维护变量时,ThreadLocal为每个使用该变量的线程提供独立的变量副本,每个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本,是线程隔离的。线程隔离的秘密在于ThreadLocalMap类(ThreadLocal的静态内部类)
线程局部变量是局限于线程内部的变量,属于线程自身所有,不在多个线程间共享。Java 提供 ThreadLocal
类来支持线程局部变量,是一种实现线程安全的方式。但是在管理环境下(如 web
服务器)使用线程局部变量的时候要特别小心,在这种情况下,工作线程的生命周期比任何应用变量的生命周期都要长。任何线程局部变量一旦在工作完成后没有释放,Java
应用就存在内存泄露的风险。
ThreadLocal的方法:void set(T value)、T get()以及T initialValue()。
ThreadLocal是如何为每个线程创建变量的副本的:
首先,在每个线程Thread内部有一个ThreadLocal.ThreadLocalMap类型的成员变量threadLocals,这个threadLocals就是用来存储实际的变量副本的,键值为当前ThreadLocal变量,value为变量副本(即T类型的变量)。初始时,在Thread里面,threadLocals为空,当通过ThreadLocal变量调用get()方法或者set()方法,就会对Thread类中的threadLocals进行初始化,并且以当前ThreadLocal变量为键值,以ThreadLocal要保存的副本变量为value,存到threadLocals。然后在当前线程里面,如果要使用副本变量,就可以通过get方法在threadLocals里面查找。
总结:
a、实际的通过ThreadLocal创建的副本是存储在每个线程自己的threadLocals中的
b、为何threadLocals的类型ThreadLocalMap的键值为ThreadLocal对象,因为每个线程中可有多个threadLocal变量,就像上面代码中的longLocal和stringLocal;
c、在进行get之前,必须先set,否则会报空指针异常;如果想在get之前不需要调用set就能正常访问的话,必须重写initialValue()方法
23 线程池
24 给你四个线程 一个主线程 如果并行的处理任务
25 hashcode 方法 和 equals方法
26 问:对象的比较,怎么判断两个对象相等?
答:equals方法
问:Integer里Integer a = new Integer(123), Integer b = 123, a==b?
答:不相等
问:Integer里Integer a = new Integer(123), Integer b = new Integer(123), a==b?
答:不相等
问:Integer里Integer a = new Integer(123), int b = 123, a==b?
答:相等
27 问:常用的List实现有哪些?
答:ArrayList 和 LinkedList, CopyOnWriteArrayList
问:ArrayList 和 LinkedList的区别
答:ArrayList是array实现的,读更快;LinkedList是链表实现的,写更快
问:ArrayList怎么扩容的,扩容到多大?
答:申请空间,copy一份出去,1.5倍
问:ConcurrentHashMap原理
答:线程同步基于Segment加锁,效率比对整个HashMap加锁效率高
问:ConcurrentHashMap怎么实现线程安全
答:分段锁
问:ConcurrentHashMap默认多少个分段锁
答:2的n次方
问:与hashtable区别
答:HashTable用synchronized保证线程安全,竞争激烈情况下效率低下
问: ConcurrentHashMap是如何解决并发冲突的
答: 使用Segment在每个桶上加锁
问:volatile的作用
答:可见性,防止CPU指令重排
问:原子类atomicinteger
答:cas
问:CAS原理
答:campare and swap 乐观锁
28 数据库不同的存储引擎
https://www.cnblogs.com/shijiaqi1066/p/3857808.html
https://www.cnblogs.com/sunsky303/p/8274586.html
29 redis的数据结构 及存储策略 -> String,Hash,Set,List,SortedSet,pub/sub,Transaction
->
30 设计一个线程池需要关心什么?
31 redis String是如何存储的?如何扩容?
32 常见线程池
①newSingleThreadExecutor
单个线程的线程池,即线程池中每次只有一个线程工作,单线程串行执行任务
②newFixedThreadExecutor(n)
固定数量的线程池,没提交一个任务就是一个线程,直到达到线程池的最大数量,然后后面进入等待队列直到前面的任务完成才继续执行
③newCacheThreadExecutor(推荐使用)
可缓存线程池,当线程池大小超过了处理任务所需的线程,那么就会回收部分空闲(一般是60秒无执行)的线程,当有任务来时,又智能的添加新线程来执行。
④newScheduleThreadExecutor
大小无限制的线程池,支持定时和周期性的执行线程
33 你最得意的项目是什么?你在项目中担当着什么样的角色?
最得意的应该属于绘制海报balabalabala ,现在在团队应该属于基层的中级开发人员
34 数据库不同的存储引擎
35 redis 支持的数据结构有哪些
redis 支持五种数据类型
string 字符串
hash 哈希
list 列表
set 集合
sorted set 有序集合
-> String是如何存储的?
https://www.cnblogs.com/idiotgroup/p/5450157.html
36 类加载的过程
类加载的过程主要分为三个部分:
加载
链接
初始化
而链接又可以细分为三个小部分:
验证
准备
解析
https://blog.csdn.net/ln152315/article/details/79223441
37 数据库事务隔离级别
https://blog.csdn.net/ln152315/article/details/79156655
38 线程池设计思路
https://www.cnblogs.com/chinaifae/p/10193774.html
代码面试:
/** 评测题目 1
* 请用java实现以下shell脚本的功能
* cat /home/admin/logs/webx.log | grep "Login" | uniq -c | sort -nr | head -n 10
* 假设webx.log 内容以下:
Login2
Login1
Login1
Login3
uniq -c 的结果:
1 Login2
2 Login1
1 Login3
**/
import java.nio.charset.Charset;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.Comparator;
import java.util.Optional;
import java.util.function.Function;
import java.util.stream.Collectors;
public class Demo {
public static void main(String[] args) throws Exception {
Optional.of("/home/admin/logs/webx.log")
.map(Paths::get)
.map(e -> {
try {
return Files.lines(e, Charset.defaultCharset())
.filter(s -> s.contains("Login"))
.collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
} catch (Exception err) {
return null;
}
})
.ifPresent(map -> map.keySet()
.parallelStream()
.sorted(Comparator.comparing(map::get).reversed())
.limit(10)
.forEach(e -> System.out.println(map.get(e) + " " + e)));
}
}
/**
* 问1 如果内存不足怎么办?问2 如何提升它的性能?
*/
参照:https://www.cnblogs.com/goody9807/p/6425399.html