Java基础
1、HashMap的源码,实现原理,JDK8中对HashMap做了怎样的优化。
2、HaspMap扩容是怎样扩容的,为什么都是2的N次幂的大小。
hashmap的默认大小是16,为2的4次方,每次扩容时,都时原理的2倍,所以是2的N次幂。默认负载因子为0.75,当长度大于原来长度的0.75倍时,进行resize。注意hashmap是不支持多线程的。线程不安全,所以多线程情况下,会出现问题。
3、HashMap,HashTable,ConcurrentHashMap的区别。
4、极高并发下HashTable和ConcurrentHashMap哪个性能更好,为什么,如何实现的。
5、HashMap在高并发下如果没有处理线程安全会有怎样的安全隐患,具体表现是什么。
6、java中四种修饰符的限制范围。
7、Object类中的方法。
protected Object clone() 创建并返回此对象的一个副本。
boolean equals(Object obj) 指示某个其他对象是否与此对象“相等”。
protected void finalize() 当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法。
Class<? extendsObject> getClass() 返回一个对象的运行时类。
int hashCode() 返回该对象的哈希码值。
void notify() 唤醒在此对象监视器上等待的单个线程。
void notifyAll() 唤醒在此对象监视器上等待的所有线程。
String toString() 返回该对象的字符串表示。
void wait() 导致当前的线程等待,直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法。
void wait(long timeout) 导致当前的线程等待,直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法,或者超过指定的时间量。
void wait(long timeout, int nanos) 导致当前的线程等待,直到其他线程调用此对象的 notify()
8、接口和抽象类的区别,注意JDK8的接口可以有实现。
9、动态代理的两种方式,以及区别。
总结:1.JDK代理使用的是反射机制实现aop的动态代理,CGLIB代理使用字节码处理框架asm,通过修改字节码生成子类。所以jdk动态代理的方式创建代理对象效率较高,执行效率较低,cglib创建效率较低,执行效率高;2.JDK动态代理机制是委托机制,具体说动态实现接口类,在动态生成的实现类里面委托hanlder去调用原始实现类方法,CGLIB则使用的继承机制,具体说被代理类和代理类是继承关系,所以代理类是可以赋值给被代理类的,如果被代理类有接口,那么代理类也可以赋值给接口。
10、Java序列化的方式。
11、传值和传引用的区别,Java是怎么样的,有没有传值引用。
12、一个ArrayList在循环过程中删除,会不会出问题,为什么。
总结:for循环正向删除,会遗漏连续重复的元素。(删除元素“222”,当循环到下标为1的元素的的时候,发现此位置上的元素是“222”,此处元素应该删除,根据上图中的元素移动可知,在删除元素后面的所有元素都要向前移动一个位置,那么移动之后,原来下标为2的元素“222”,此时下标为1,这是在i = 1,时的循环操作,在下一次的循环中,i = 2,此时就遗漏了第二个元素“222”。)
总结:反向遍历删除,没有问题(单线程)。(反向删除的时候,循环遍历完了的元素下标才有可能移动(已经遍历的元素,下标变化了也没有影响),所以没有遍历的下标不会移动,自反向删除会遍历到所有的元素,正向会跳过一些元素。)
总结:多线程反向遍历删除,没有问题。
总结:Iterator调用ArrayList的删除方法报错,Iterator调用迭代器自己的删除方法,单线程不会报错,多线程会报错。
总结:forEach循环删除报错。
13、@transactional注解在什么情况下会失效,为什么。
@Transactional注解只能应用到public修饰符上,其它修饰符不起作用,但不报错。
默认情况下此注解会对unchecked异常进行回滚,对checked异常不回滚。
通俗的说,编译器能检测到的是checked,检测不到的就是unchecked。
派生于Error或者RuntimeException(比如空指针,1/0)的异常称为unchecked异常。
继承自Exception得异常统称为checked异常,如IOException、TimeoutException等。
数据结构和算法
1、B+树2、快速排序,堆排序,插入排序(其实八大排序算法都应该了解3、一致性Hash算法,一致性Hash算法的应用
JVM
1、JVM的内存结构。
2、JVM方法栈的工作过程,方法栈和本地方法栈有什么区别。
3、JVM的栈中引用如何和堆中的对象产生关联。
4、可以了解一下逃逸分析技术。
5、GC的常见算法,CMS以及G1的垃圾回收过程,CMS的各个阶段哪两个是Stop the world的,CMS会不会产生碎片,G1的优势。
6、标记清除和标记整理算法的理解以及优缺点。
7、eden survivor区的比例,为什么是这个比例,eden survivor的工作过程。
8、JVM如何判断一个对象是否该被GC,可以视为root的都有哪几种类型。
9、强软弱虚引用的区别以及GC对他们执行怎样的操作。
10、Java是否可以GC直接内存。
11、Java类加载的过程。
12、双亲委派模型的过程以及优势。
13、常用的JVM调优参数。
14、dump文件的分析。
15、Java有没有主动触发GC的方式(没有)。
多线程
1、Java实现多线程有哪几种方式。
2、Callable和Future的了解。
Callable 和 Future接口
Callable是类似于Runnable的接口,实现Callable接口的类和实现Runnable的类都是可被其它线程执行的任务。
Callable和Runnable有几点不同:
(1)Callable规定的方法是call(),而Runnable规定的方法是run().
(2)Callable的任务执行后可返回值,而Runnable的任务是不能返回值的。
(3)call()方法可抛出异常,而run()方法是不能抛出异常的。
(4)运行Callable任务可拿到一个Future对象,
Future 表示异步计算的结果。它提供了检查计算是否完成的方法,以等待计算的完成,并检索计算的结果。
通过Future对象可了解任务执行情况,可取消任务的执行,还可获取任务执行的结果。
3、线程池的参数有哪些,在线程池创建一个线程的过程。
4、volitile关键字的作用,原理。
5、synchronized关键字的用法,优缺点。
6、Lock接口有哪些实现类,使用场景是什么。
7、可重入锁的用处及实现原理,写时复制的过程,读写锁,分段锁(ConcurrentHashMap中的segment)。
8、悲观锁,乐观锁,优缺点,CAS有什么缺陷,该如何解决。
9、ABC三个线程如何保证顺序执行。
应用关键字join。在b中调用a.join(),在c中调用b.join();
10、线程的状态都有哪些。
11、sleep和wait的区别。
12、notify和notifyall的区别。
13、ThreadLocal的了解,实现原理。
数据库相关
1、常见的数据库优化手段
2、索引的优缺点,什么字段上建立索引
3、数据库连接池。
4、durid的常用配置。
计算机网络
1、TCP,UDP区别
2、三次握手,四次挥手,为什么要四次挥手。
3、长连接和短连接。
长连接可以省去较多的TCP建立和关闭的操作,减少浪费,节约时间.对于频繁请求资源的客户来说,较适用长连接.短连接对于服务器来说管理较为简单,存在的连接都是有用的连接,不需要额外的控制手段。但如果客户请求频繁,将在TCP的建立和关闭操作上浪费时间和带宽。
长连接短连接操作过程
短连接的操作步骤是:
建立连接——数据传输——关闭连接...建立连接——数据传输——关闭连接
长连接的操作步骤是:
建立连接——数据传输...(保持连接)...数据传输——关闭连接
4、连接池适合长连接还是短连接。
设计模式
1、观察者模式2、代理模式3、单例模式,有五种写法,可以参考文章单例模式的五种实现方式4、可以考Spring中使用了哪些设计模式
分布式相关
1、分布式事务的控制。
2、分布式锁如何设计。
3、分布式session如何设计
4、dubbo的组件有哪些,各有什么作用。
5、zookeeper的负载均衡算法有哪些。
6、dubbo是如何利用接口就可以通信的。
缓存相关
1、redis和memcached的区别。
2、redis支持哪些数据结构。
3、redis是单线程的么,所有的工作都是单线程么。
4、redis如何存储一个String的。
5、redis的部署方式,主从,集群。
6、redis的哨兵模式,一个key值如何在redis集群中找到存储在哪里。
7、redis持久化策略。
框架相关
1、SpringMVC的Controller是如何将参数和前端传来的数据一一对应的。
2、Mybatis如何找到指定的Mapper的,如何完成查询的
3、Quartz是如何完成定时任务的。
4、自定义注解的实现。
5、Spring使用了哪些设计模式。
6、Spring的IOC有什么优势
7、Spring如何维护它拥有的bean。