一.基础知识篇
1.1 Java基础知识篇
final, finally, finalize 的区别
java异常处理 Exception、error、运行时异常和一般异常有何异同
说说反射的用途及实现
类加载的过程:
父类与子类之间的调用顺序:
public class ClassA {
public ClassA(){
System.out.println("父类构造函数");
}
{
System.out.println("父类语句块");
}
static{
System.out.println("父类静态语句块");
}
public void AMethod(){
System.out.println("父类普通方法");
}
}
public class ClassB extends ClassA{
public ClassB(){
System.out.println("子类构造函数");
}
{
System.out.println("子类语句块");
}
static{
System.out.println("子类静态语句块");
}
@Override
public void AMethod(){
System.out.println("子类普通方法");
}
public static void main(String[] args) {
ClassB b = new ClassB();
b.AMethod();
}
}
执行结果:
父类静态语句块
子类静态语句块
父类语句块
父类构造函数
子类语句块
子类构造函数
子类普通方法
内部类和外部类的调用:
JAVA 中堆和栈的区别,说下java 的内存机制
Java的垃圾回收机制:
Hashcode的作用,与 equal 有什么区别
1.2 java-集合篇
Java集合类框架的基本接口有哪些
Arraylist与linkedlist的区别
String,StringBuffer,StringBuilder的区别:
AbstractStringBuilder(int capacity) {
value = new char[capacity];
}
1.3 JVM
JVM运行时内存区域划分
1.4 设计模式
动态代理:
代理模式:代理类和被代理类实现共同的接口(或继承),代理类中存有指向被代理类的索引,实际执行时通过调用代理类的方法、实际执行的是被代理类的方法。
JDK常用设计模式:
装饰器设计模式(IO流)
对一组对象的功能进行增强时,就可以使用该模式进行问题的解决
好处:弱耦合,被装饰类的变化与装饰类的变化无关
特点:装饰类和被装饰类都必须属于同一接口或者父类
interface Coder {
publicvoid code();
}
classStudent implements Coder {
@Override
publicvoid code() {
System.out.println("javase");
System.out.println("javaweb");
}
}
classItcastStudent implements Coder {
privateStudent s; //获取到被包装的类的引用
publicItcastStudent(Student s) { //通过构造函数创建对象的时候,传入被包装的对象
this.s= s;
}
@Override
publicvoid code() { //对其原有功能进行升级
s.code();
System.out.println("数据库");
System.out.println("ssh");
System.out.println("安卓");
System.out.println(".....");
}
1.5 网络/IO基础
java网络io编程:从传统的BIO(同步阻塞)到NIO(同步非阻塞)再到AIO(异步非阻塞)
BIO
NIO编程:
NIO基于Reactor,当socket有流可读或可写入socket时,操作系统会相应的通知引用程序进行处理,应用再将流读取到缓冲区或写入操作系统。 也就是说,这个时候,已经不是一个连接就要对应一个处理线程了,而是有效的请求,对应一个线程,当连接没有数据时,是没有工作线程来处理的。
BIO与NIO一个比较重要的不同,是我们使用BIO的时候往往会引入多线程,每个连接一个单独的线程;而NIO则是使用单线程或者只使用少量的多线程,每个连接共用一个线程
创建NIO服务端的主要步骤如下:
- 将ServerSocketChannel注册到Reactor线程中的Selector上,监听ACCEPT事件
5.Selector轮询准备就绪的key - Selector监听到新的客户端接入,处理新的接入请求,完成TCP三次握手,简历物理链路
7.设置客户端链路为非阻塞模式
8.将新接入的客户端连接注册到Reactor线程的Selector上,监听读操作,读取客户端发送的网络消息
9.异步读取客户端消息到缓冲区
10.对Buffer编解码,处理半包消息,将解码成功的消息封装成Task
11.将应答消息编码为Buffer,调用SocketChannel的write将消息异步发送给客户端
AIO编程:
与NIO不同,当进行读写操作时,只须直接调用API的read或write方法即可。这两种方法均为异步的,对于读操作而言,当有流可读取时,操作系统会将可读的流传入read方法的缓冲区,并通知应用程序;对于写操作而言,当操作系统将write方法传递的流写入完毕时,操作系统主动通知应用程序。 即可以理解为,read/write方法都是异步的,完成后会主动调用回调函数
Java对BIO、NIO、AIO的支持:
二.spring篇
servlet执行流程:
springMVC的执行流程:
Aop与IOC概念:
三.多线程篇
创建线程的三种方式优缺点
public class SuperTest extends Thread{
public void run(){
System.out.println(getName());
}
public static void main(String[] args) {
for(int i=0;i<10;i++) {
System.out.println(Thread.currentThread().getName()+" "+i);
new SuperTest().start();
new SuperTest().start();
}
}
}
public class Test implements Runnable {
private int i;
public void run() {
for(;i<100;i++) {
System.out.println(Thread.currentThread().getName()+" "+i);
}
}
public static void main(String[] args) {
for(int i=0;i<100;i++){
System.out.println(Thread.currentThread().getName()+" "+i);
if(i==20){
Test test=new Test();
new Thread(test,"新线程1").start();
new Thread(test,"新线程2").start();
}
}
}
}
Java 中 sleep 方法和 wait 方法的区别?
Java中线程池实现原理:
Java线程池的工厂类:Executors类
初始化四种类型的线程池:
1.newFixedThreadPool:
2.newCachedThreadPool:
3.newSingleThreadPool:
4.newScheduledThreadPool:
特点:初始化得线程可以在指定的时间内周期性的执行所提交的任务,在实际的业务场景中可以使用该线程池定期的同步数据;
总结:除了newScheduledThreadPool的内部实现特殊一点之外,其它线程池内部都是基于ThreadPoolExecutor类(Executor的子类)实现的。
ThreadPoolExecutor内部具体实现:
ThreadPoolExecutor类构造器语法形式:
ThreadPoolExecutor(corePoolSize,maxPoolSize,keepAliveTime,timeUnit,workQueue,threadFactory,handle);
方法参数:
线程池的五种状态:
向线程池提交任务(2种):
execute()的内部实现:
sumbit()内部实现
两者比较:
线程池的关闭(2种)
线程池容量的动态调整
ThreadPoolExecutor提供了动态调整线程池容量大小的方法:setCorePoolSize()和setMaximumPoolSize()
总结:
四.网络协议篇
三次握手和四次挥手、为什么挥手需要四次
三次挥手:
四次挥手
五. tomcat 调优篇
Tomcat服务器优化:
六.数据库篇
MySQL 索引使用的注意事项
说说分库与分表设计
场景:有时数据库可能既面临着高并发访问的压力,又需要面对海量数据的存储问题,这时需要对数据库既采用分表策略,又采用分库策略,以便同时扩展系统的并发处理能力,以及提升单表的查询性能,这就是所谓的分库分表。
分库分表的策略比前面的仅分库或者仅分表的策略要更为复杂,一种分库分表的路由策略如下:
七.linux篇
常用linux命令总结:
八.微服务篇
九.解决方案篇
海量数据的解决方案:
高并发情况下的解决方案:
参考:https://blog.csdn.net/zhaojw_420/article/details/70881333