0
点赞
收藏
分享

微信扫一扫

2018最新Java面试题

一.基础知识篇

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服务端的主要步骤如下:

  1. 将ServerSocketChannel注册到Reactor线程中的Selector上,监听ACCEPT事件
    5.Selector轮询准备就绪的key
  2. 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

举报

相关推荐

0 条评论