java面试简略版

链接:https://zhuanlan.zhihu.com/p/33029321

1.java HashMap的原理。

是怎么存放的,发生hash碰撞怎么做,为什么get请求的算法复杂度会接近O(1)

了不了解ConcurrentHashMap

原理是什么,如果答出了分段锁之类的,再问一下java7和java8有什么不一样,因为在8的时候做了很多改变,已经不是以前那种Segement了,改用了node数组,扩容是怎么扩的,扩容也是分段扩的,并不是整个桶一起扩的。

2. java的运行机制

例如java文件编译成class文件,由classloader载入->运行

问一下classloader的双亲委派模型,为什么要这样做(可以保证java的一些重要类如Object一定是rt.jar中的,保证系统的稳定性),有哪些问题(模型本身决定的,例如基础类要掉回用户代码),后来怎么解决了(线程上下文类加载器)

问一下java的内存模型,堆和栈这些

gc怎么确定哪些是垃圾(可达性分析),哪些是根?

问一下java的垃圾回收

比如了解哪些算法啊,最好可以说说每个算法的算法流程,例如CMS的第一步是初始标记-并发标记-重新标记-并发清理-并发重置 每个算法的优缺点啊,怎么简单的解决啊(简单回答就好了,例如增加堆的大小,增加后台线程,提前开始并发周期等),也可以问一下有没有了解G1收集器这些,G1的流程,相比CMS有哪些优势。

java 的对象分分配策略

在Eden中,大对象直接进入老年代,长期存活的对象进入老年代,动态年龄分配,空间分配担保

会哪些java工具例如jinfo, jstat, jstack, jcmd等

3. 谈谈设计模式

用过什么设计模式,谈谈什么时候该用这些模式,再问一下,其他的设计模式

4. java多线程问题

怎么创建一个线程,怎么启动一个线程,为什么要用多线程技术,有什么优点(异步运行提高响应速度)缺点(线程上下文的切换)?

怎么确定线程数,根据cpu密集型,还是io密集型决定

线程池问题,在java中怎么创建一个线程池(Executors,或者new ThreadPoolExecutor()),线程池可以解决什么问题(减少了线程创建销毁的时间),可以继续问一下一个线程被提交到线程池会做些什么判断(core线程池满?->等待队列满?->整个线程池满?->饱和策略)

线程同步问题,一般都会回答synchronized跟lock,他们之间的区别(lock可中断,可超时,可尝试获取锁),性能问题谁的性能更好?

问一下volatile的并语义,是不是线程安全,适合哪些场景

有没有看过lock的源码,lock的原理是什么?通过AQS(AbstractQueuedSynchronizer)来维护一个int,是否了解Lock.Condition。

在java虚拟机层面上做了哪些锁优化(锁的种类),偏向锁,轻量级锁,重量级锁

有没有听说过悲观锁和乐观锁,乐观锁CAS的原理是什么,有什么缺点(ABA问题),怎么解决,还有就是两个CAS在一起能否保证线程安全(不能)

5. 是否了解计算机网络

有没有听说过七层协议,ip跟tcp分别属于哪一层。

有没有用过ping命令?ping命令用的是什么协议(icmp),有没有经过tcp层?除了判断可达性还有哪些实用(Traceroute),原理是什么

有没有听过tcp三次握手,过程是什么,为什么要三次握手?那四次挥手呢?

6. 问一下有没有用过spring,springmvc

spring可以为我们解决什么问题(业务解耦),springMVC在一个请求过来是怎么找到相应的处理器(简单回答即可,例如所有请求都会被DispatcherServlet拦截->通过request找到handler->通过handler找到HandlerAdapter)

7. 问一些简单的mysql知识 INT(11)的11代表什么,varchar(11)中的11呢

8. 是否了解缓存

redis或mencached,redis有哪些数据结构(string,list,hash,zset,set),redis对比mencached有什么优缺点(有数据类型,原生支持集群),由于有数据类型所以会占用更多的空间

9. 是否了解mysql的读写分离,是否了解mysql的分库分表,会带来什么问题(不能join)

10. mysql事务隔离级别(读为提交,读已提交,可重复读,可串行化)

你可能感兴趣的:(java面试简略版)