精华内容
下载资源
问答
  • Java中级面试题及答案(120道Java中级面试题大汇总)
    千次阅读
    2021-11-08 15:20:14

    Java中级面试题及答案【最新版及答案,干货!!!这是一个中级Java面试系列题中的第一部分。这一部分论述了可变参数,断言,垃圾回收,初始化器,令牌化,日期,日历等等Java核心问题。

    Java中级面试永远是程序员迈向成功的第一个门槛,想要面试成功,各种面试题的洗礼是必不可少的,下面就来看看小编精心整理的一些java高级工程师面试题及答案吧。

    如果不背 Java面试题的答案,肯定面试会挂!

    这套Java面试题大全,希望对大家有帮助哈~

    博主已将以下这些面试题整理成了一个Java面试手册,是PDF版的

    1、线程与进程的区别

    进程是系统进行资源分配和调度的一个独立单位,线程是CPU调度和分派的基本单位

    进程和线程的关系:

    1、 一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程。

    2、 资源分配给进程,同一进程的所有线程共享该进程的所有资源。

    3、 线程在执行过程中,需要协作同步。不同进程的线程间要利用消息通信的办法实现同步。

    4、 线程是指进程内的一个执行单元,也是进程内的可调度实体。

    线程与进程的区别:

    1、 调度:线程作为调度和分配的基本单位,进程作为拥有资源的基本单位。

    2、 并发性:不仅进程之间可以并发执行,同一个进程的多个线程之间也可以并发执行。

    3、 拥有资源:进程是拥有资源的一个独立单位,线程不拥有系统资源,但可以访问隶属于进程的资源。

    4、 系统开销:在创建或撤销进程的时候,由于系统都要为之分配和回收资源,导致系统的明显大于创建或撤销线程时的开销。但进程有独立的地址空间,进程崩溃后,在保护模式下不会对其他的进程产生影响,而线程只是一个进程中的不同的执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮,但是在进程切换时,耗费的资源较大,效率要差些。

    2、什么是策略模式

    定义了一系列的算法 或 逻辑 或 相同意义的操作,并将每一个算法、逻辑、操作封装起来,而且使它们还可以相互替换。(其实策略模式Java中用的非常非常广泛)

    我觉得主要是为了 简化 if...else 所带来的复杂和难以维护。

    3、什么是游标?

    游标是sql查询结果集的一个指针,与select语句相关联。

    游标关键字是cursor,主要包含两个部分:游标结果集和游标位置。

    1、 游标结果集:执行select语句后的查询结果

    2、 游标位置:一个指向游标结果集内某条记录的指针。

    游标主要有两个状态:打开和关闭。

    1、 只有当游标处于打开状态时,才能够操作结果集中的数据

    2、 当游标关闭后,查询结果集就不存在了

    4、单例模式了解吗?给我解释一下双重检验锁方式实现单例模式!”

    双重校验锁实现对象单例(线程安全)

    说明:

    双锁机制的出现是为了解决前面同步问题和性能问题,看下面的代码,简单分析下确实是解决了多线程并行进来不会出现重复new对象,而且也实现了懒加载

    public class Singleton { private volatile static Singleton uniqueInstance; private Singleton() { } public static Singleton getUniqueInstance() { //先判断对象是否已经实例过,没有实例化过才进入加锁代码 if (uniqueInstance == null) { //类对象加锁 synchronized (Singleton.class) { if (uniqueInstance == null) { uniqueInstance = new Singleton(); } } } return uniqueInstance; } }

    另外,需要注意 uniqueInstance 采用 volatile 关键字修饰也是很有必要。

    uniqueInstance 采用 volatile 关键字修饰也是很有必要的, uniqueInstance = new Singleton(); 这段代码其实是分为三步执行:

    1、 为 uniqueInstance 分配内存空间

    2、 初始化 uniqueInstance

    3、 将 uniqueInstance 指向分配的内存地址

    但是由于 JVM 具有指令重排的特性,执行顺序有可能变成 1->3->2。指令重排在单线程环境下不会出现问题,但是在多线程环境下会导致一个线程获得还没有初始化的实例。例如,线程 T1 执行了 1 和 3,此时 T2 调用 getUniqueInstance() 后发现 uniqueInstance 不为空,因此返回 uniqueInstance,但此时 uniqueInstance 还未被初始化。

    使用 volatile 可以禁止 JVM 的指令重排,保证在多线程环境下也能正常运行。

    5、怎么获取 Java 程序使用的内存?堆使用的百分比?

    可以通过 java.lang.Runtime 类中与内存相关方法来获取剩余的内存,总内存及最大堆内存。通过这些方法你也可以获取到堆使用的百分比及堆内存的剩余空间。Runtime.freeMemory() 方法返回剩余空间的字节数,Runtime.totalMemory()方法总内存的字节数,Runtime.maxMemory() 返回最大内存的字节数。

    6、在java中守护线程和本地线程区别?

    java中的线程分为两种:守护线程(Daemon)和用户线程(User)。

    任何线程都可以设置为守护线程和用户线程,通过方法Thread.setDaemon(bool on);true则把该线程设置为守护线程,反之则为用户线程。Thread.setDaemon()必须在Thread.start()之前调用,否则运行时会抛出异常。

    两者的区别

    唯一的区别是判断虚拟机(JVM)何时离开,Daemon是为其他线程提供服务,如果全部的User Thread已经撤离,Daemon 没有可服务的线程,JVM撤离。也可以理解为守护线程是JVM自动创建的线程(但不一定),用户线程是程序创建的线程;比如JVM的垃圾回收线程是一个守护线程,当所有线程已经撤离,不再产生垃圾,守护线程自然就没事可干了,当垃圾回收线程是Java虚拟机上仅剩的线程时,Java虚拟机会自动离开。

    扩展

    Thread Dump打印出来的线程信息,含有daemon字样的线程即为守护进程,可能会有:服务守护进程、编译守护进程、windows下的监听Ctrl+break的守护进程、Finalizer守护进程、引用处理守护进程、GC守护进程。

    7、线程之间是如何通信的?

    当线程间是可以共享资源时,线程间通信是协调它们的重要的手段。Object类中wait()\notify()\notifyAll()方法可以用于线程间通信关于资源的锁的状态。

    8、聚集索引与非聚集索引有什么区别?

    所有的索引都是为了更快地检索数据,索引存放在索引页中,数据存放在数据页中,索引以B(balance)树的形式存储

    聚集索引:聚集索引用于决定数据表中的物理存储顺序,一张表最多有一个聚集索引。聚集索引的字段值尽量不能修改,因为修改后,因为修改后数据表的物理顺序需要重写排序。通常主键就是聚集索引

    非聚集索引:非聚集索引的关键自是index,不会决定表的物理存储顺序,在一张表内最多可以有249个非聚集索引。

    9、说一下 ArrayList 的优缺点

    ArrayList的优点如下:

    1、 ArrayList 底层以数组实现,是一种随机访问模式。ArrayList 实现了 RandomAccess 接口,因此查找的时候非常快。

    2、 ArrayList 在顺序添加一个元素的时候非常方便。

    ArrayList 的缺点如下:

    1、 删除元素的时候,需要做一次元素复制操作。如果要复制的元素很多,那么就会比较耗费性能。

    2、 插入元素的时候,也需要做一次元素复制操作,缺点同上。

    3、 ArrayList 比较适合顺序添加、随机访问的场景。

    10、请解释StackOverflowError和OutOfMemeryError的区别?

    通过之前的分析可以发现,实际上每一块内存中都会存在有一部分的可变伸缩区,其基本流程为:如果空间内存不足,在可变范围之内扩大内存空间,当一段时间之后发现内存充足,会缩小内存空间。

    永久代(JDK 1.8后消失了)

    虽然java的版本是JDK1.8,但是java EE 的版本还是jdk1.7,永久代存在于堆内存之中

    元空间

    元空间在Jdk1.8之后才有的,器功能实际上和永久代没区别,唯一的区别在于永久代使用的是JVM的堆内存空间,元空间使用的是物理内存,所以元空间的大小受本地内存影响,一般默认在2M 左右。

    范例:设置一些参数,让元空间出错

    Java -XX:MetaspaceSize=1m

    11、请阐述Catalina的配置文件有哪些?

    Catalina包含的配置文件有:

    1、 ·policy

    2、 ·properties

    3、 ·properties

    4、 ·xml

    5、 ·xml

    6、 ·Tomcat-users.xml

    12、Java中有几种类型的流?

    字节流和字符流。字节流继承于InputStream、OutputStream,字符流继承于Reader、Writer。在http://java.io 包中还有许多其他的流,主要是为了提高性能和使用方便。关于Java的I/O需要注意的有两点:一是两种对称性(输入和输出的对称性,字节和字符的对称性);二是两种设计模式(适配器模式和装潢模式)。另外Java中的流不同于C#的是它只有一个维度一个方向。

    面试题 - 编程实现文件拷贝。(这个题目在笔试的时候经常出现,下面的代码给出了两种实现方案)
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.nio.ByteBuffer;
    import java.nio.channels.FileChannel;
    public final class MyUtil {
        private MyUtil() {
            throw new AssertionError();
        }
        public static void fileCopy(String source, String target) throws IOException {
            try (InputStream in = new FileInputStream(source)) {
                try (OutputStream out = new FileOutputStream(target)) {
                    byte[] buffer = new byte[4096];
                    int bytesToRead;
                    while ((bytesToRead = in .read(buffer)) != -1) {
                        out.write(buffer, 0, bytesToRead);
                    }
                }
            }
        }
        public static void fileCopyNIO(String source, String target) throws IOException {
            try (FileInputStream in = new FileInputStream(source)) {
                try (FileOutputStream out = new FileOutputStream(target)) {
                    FileChannel inChannel = in .getChannel();
                    FileChannel outChannel = out.getChannel();
                    ByteBuffer buffer = ByteBuffer.allocate(4096);
                    while (inChannel.read(buffer) != -1) {
                        buffer.flip();
                        outChannel.write(buffer);
                        buffer.clear();
                    }
                }
            }
        }
    }
    注意:上面用到Java 7的TWR,使用TWR后可以不用在finally中释放外部资源 ,从而让代码更加优雅。

    13、当一个线程进入一个对象的synchronized方法A之后,其它线程是否可进入此对象的synchronized方法B?

    不能。其它线程只能访问该对象的非同步方法,同步方法则不能进入。因为非静态方法上的synchronized修饰符要求执行方法时要获得对象的锁,如果已经进入A方法说明对象锁已经被取走,那么试图进入B方法的线程就只能在等锁池(注意不是等待池哦)中等待对象的锁。

    14、什么是不可变对象(immutable object)?Java 中怎么创建一个不可变对象?

    不可变对象指对象一旦被创建,状态就不能再改变。任何修改都会创建一个新的对象,如 String、Integer及其它包装类。详情参见答案,一步一步指导你在 Java 中创建一个不可变的类。

    15、怎么利用 JUnit 来测试一个方法的异常?

    http://javarevisited.blogspot.sg/2013/04/JUnit-tutorial-example-test-exception-thrown-by-java-method.html

    16、两个相同的对象会有不同的的 hash code 吗?

    不能,根据 hash code 的规定,这是不可能的。

    17、如果你提交任务时,线程池队列已满,这时会发生什么

    有俩种可能:

    1、 如果使用的是无界队列 LinkedBlockingQueue,也就是无界队列的话,没关系,继续添加任务到阻塞队列中等待执行,因为 LinkedBlockingQueue 可以近乎认为是一个无穷大的队列,可以无限存放任务

    2、 如果使用的是有界队列比如 ArrayBlockingQueue,任务首先会被添加到ArrayBlockingQueue 中,ArrayBlockingQueue 满了,会根据maximumPoolSize 的值增加线程数量,如果增加了线程数量还是处理不过来,ArrayBlockingQueue 继续满,那么则会使用拒绝策略RejectedExecutionHandler 处理满了的任务,默认是 AbortPolicy

    18、GC日志的real、user、sys是什么意思?

    real 实际花费的时间,指的是从开始到结束所花费的时间。比如进程在等待I/O完成,这个阻塞时间也会被计算在内。user 指的是进程在用户态(User Mode)所花费的时间,只统计本进程所使用的时间,是指多核。sys 指的是进程在核心态(Kernel Mode)花费的CPU时间量,指的是内核中的系统调用所花费的时间,只统计本进程所使用的时间。

    这个是用来看日志用的,如果你不看日志,那不了解也无妨。不过,这三个参数的意义,在你能看到的地方,基本上都是一致的,比如操作系统。

    19、解释 Java 堆空间及 GC?

    当通过 Java 命令启动 Java 进程的时候,会为它分配内存。内存的一部分用于创建堆空间,当程序中创建对象的时候,就从对空间中分配内存。GC 是 JVM 内部的一个进程,回收无效对象的内存用于将来的分配。

    20、类的实例化顺序

    比如父类静态数据,构造函数,字段,子类静态数据,构造函数,字段,他们的执行顺序

    先静态、先父后子。

    先静态:父静态 > 子静态

    优先级:父类 > 子类 静态代码块 > 非静态代码块 > 构造函数

    一个类的实例化过程:

    1、 父类中的static代码块,当前类的static

    2、 顺序执行父类的普通代码块

    3、 父类的构造函数

    4、 子类普通代码块

    5、 子类(当前类)的构造函数,按顺序执行。

    6、 子类方法的执行,

    21、Spring中自动装配的方式有哪些?

    1、 no:不进行自动装配,手动设置Bean的依赖关系。

    2、 byName:根据Bean的名字进行自动装配。

    3、 byType:根据Bean的类型进行自动装配。

    4、 constructor:类似于byType,不过是应用于构造器的参数,如果正好有一个Bean与构造器的参数类型相同则可以自动装配,否则会导致错误。

    5、 autodetect:如果有默认的构造器,则通过constructor的方式进行自动装配,否则使用byType的方式进行自动装配。

    22、栈帧里面包含哪些东西?

    局部变量表、操作数栈、动态连接、返回地址等

    23、你是如何调用 wait() 方法的?使用 if 块还是循环?为什么?

    处于等待状态的线程可能会收到错误警报和伪唤醒,如果不在循环中检查等待条件,程序就会在没有满足结束条件的情况下退出。

    wait() 方法应该在循环调用,因为当线程获取到 CPU 开始执行的时候,其他条件可能还没有满足,所以在处理前,循环检测条件是否满足会更好。下面是一段标准的使用 wait 和 notify 方法的代码:

    synchronized (monitor) { // 判断条件谓词是否得到满足 while(!locked) { // 等待唤醒 monitor.wait(); } // 处理其他的业务逻辑 }

    24、ArrayList与LinkedList有什么区别?

    1、 ArrayList与LinkedList都实现了List接口。

    2、 ArrayList是线性表,底层是使用数组实现的,它在尾端插入和访问数据时效率较高,

    3、 Linked是双向链表,他在中间插入或者头部插入时效率较高,在访问数据时效率较低

    25、Super与this表示什么?

    1、 Super表示当前类的父类对象

    2、 This表示当前类的对象

    26、简述Java的对象结构

    Java对象由三个部分组成:对象头、实例数据、对齐填充。

    对象头由两部分组成,第一部分存储对象自身的运行时数据:哈希码、GC分代年龄、锁标识状态、线程持有的锁、偏向线程ID(一般占32/64 bit)。第二部分是指针类型,指向对象的类元数据类型(即对象代表哪个类)。如果是数组对象,则对象头中还有一部分用来记录数组长度。

    实例数据用来存储对象真正的有效信息(包括父类继承下来的和自己定义的)

    对齐填充:JVM要求对象起始地址必须是8字节的整数倍(8字节对齐 )

    27、Java 虚拟机栈的作用?

    Java 虚拟机栈来描述 Java 方法的内存模型。每当有新线程创建时就会分配一个栈空间,线程结束后栈空间被回收,栈与线程拥有相同的生命周期。栈中元素用于支持虚拟机进行方法调用,每个方法在执行时都会创建一个栈帧存储方法的局部变量表、操作栈、动态链接和方法出口等信息。每个方法从调用到执行完成,就是栈帧从入栈到出栈的过程。

    有两类异常:① 线程请求的栈深度大于虚拟机允许的深度抛出 StackOverflowError。② 如果 JVM 栈容量可以动态扩展,栈扩展无法申请足够内存抛出 OutOfMemoryError(HotSpot 不可动态扩展,不存在此问题)。

    28、实际开发中应用场景哪里用到了模板方法

    其实很多框架中都有用到了模板方法模式

    例如:

    数据库访问的封装、Junit单元测试、servlet中关于doGet/doPost方法的调用等等

    29、import java和javax有什么区别

    tech.souyunku.com/EasonJim/p/…

    31、Spring中自动装配的方式有哪些?

    1、 no:不进行自动装配,手动设置Bean的依赖关系。

    2、 byName:根据Bean的名字进行自动装配。

    3、 byType:根据Bean的类型进行自动装配。

    4、 constructor:类似于byType,不过是应用于构造器的参数,如果正好有一个Bean与构造器的参数类型相同则可以自动装配,否则会导致错误。

    5、 autodetect:如果有默认的构造器,则通过constructor的方式进行自动装配,否则使用byType的方式进行自动装配。

    32、栈帧里面包含哪些东西?

    局部变量表、操作数栈、动态连接、返回地址等

    33、你是如何调用 wait() 方法的?使用 if 块还是循环?为什么?

    处于等待状态的线程可能会收到错误警报和伪唤醒,如果不在循环中检查等待条件,程序就会在没有满足结束条件的情况下退出。

    wait() 方法应该在循环调用,因为当线程获取到 CPU 开始执行的时候,其他条件可能还没有满足,所以在处理前,循环检测条件是否满足会更好。下面是一段标准的使用 wait 和 notify 方法的代码:

    synchronized (monitor) { // 判断条件谓词是否得到满足 while(!locked) { // 等待唤醒 monitor.wait(); } // 处理其他的业务逻辑 }

    34、ArrayList与LinkedList有什么区别?

    1、 ArrayList与LinkedList都实现了List接口。

    2、 ArrayList是线性表,底层是使用数组实现的,它在尾端插入和访问数据时效率较高,

    3、 Linked是双向链表,他在中间插入或者头部插入时效率较高,在访问数据时效率较低

    35、Super与this表示什么?

    1、 Super表示当前类的父类对象

    2、 This表示当前类的对象

    36、简述Java的对象结构

    Java对象由三个部分组成:对象头、实例数据、对齐填充。

    对象头由两部分组成,第一部分存储对象自身的运行时数据:哈希码、GC分代年龄、锁标识状态、线程持有的锁、偏向线程ID(一般占32/64 bit)。第二部分是指针类型,指向对象的类元数据类型(即对象代表哪个类)。如果是数组对象,则对象头中还有一部分用来记录数组长度。

    实例数据用来存储对象真正的有效信息(包括父类继承下来的和自己定义的)

    对齐填充:JVM要求对象起始地址必须是8字节的整数倍(8字节对齐 )

    37、Java 虚拟机栈的作用?

    Java 虚拟机栈来描述 Java 方法的内存模型。每当有新线程创建时就会分配一个栈空间,线程结束后栈空间被回收,栈与线程拥有相同的生命周期。栈中元素用于支持虚拟机进行方法调用,每个方法在执行时都会创建一个栈帧存储方法的局部变量表、操作栈、动态链接和方法出口等信息。每个方法从调用到执行完成,就是栈帧从入栈到出栈的过程。

    有两类异常:① 线程请求的栈深度大于虚拟机允许的深度抛出 StackOverflowError。② 如果 JVM 栈容量可以动态扩展,栈扩展无法申请足够内存抛出 OutOfMemoryError(HotSpot 不可动态扩展,不存在此问题)。

    38、实际开发中应用场景哪里用到了模板方法

    其实很多框架中都有用到了模板方法模式

    例如:

    数据库访问的封装、Junit单元测试、servlet中关于doGet/doPost方法的调用等等

    39、import java和javax有什么区别

    tech.souyunku.com/EasonJim/p/…

    40、构造器(constructor)是否可被重写(override)?

    构造器不能被继承,因此不能被重写,但可以被重载。

    更多Java 面试题80道

    01、创建socket通讯的步骤?

    02、Java 中 sleep 方法和 wait 方法的区别?

    03、程序计数器(线程私有)

    04、什么是线程调度器(Thread Scheduler)和时间分片(Time Slicing)?

    05、迭代器 Iterator 是什么?

    06、线程的 sleep()方法和 yield()方法有什么区别?

    07、Java 中能创建 volatile 数组吗?

    08、java中equals方法的用法以及==的用法

    09、如何创建一个json对象?

    10、如何判断对象是否是垃圾?

    11、抽象工厂模式和原型模式之间的区别?

    12、在 Java 程序中怎么保证多线程的运行安全?

    13、volatile 修饰符的有过什么实践?

    14、Java中各种数据默认值

    15、说说Java 垃圾回收机制

    16、有没有可能两个不相等的对象有有相同的 hashcode?

    17、synchronized 和 Lock 有什么区别?

    18、什么是Vector

    19、对象的访问定位有哪几种方式?

    20、equals 和 == 的区别?#

    21、什么是ThreadPoolExecutor?

    22、invokedynamic 指令是干什么的?

    23、synchronized、volatile、CAS 比较

    24、Iterator 怎么使用?有什么特点?

    25、被引用的对象就一定能存活吗?

    26、列出一些你常见的运行时异常?

    27、Servlet生命周期内调用的方法过程?

    28、阐述静态变量和实例变量的区别。

    29、类加载器双亲委派模型机制?

    30、抽象的(abstract)方法是否可同时是静态的(static),是否可同时是本地方法(native),是否可同时被synchronized修饰?

    31、如何判断一个对象是否存活

    32、Int与integer的区别

    33、Servlet的生命周期?

    34、怎么唤醒一个阻塞的线程

    35、虚拟DOM的优劣如何?

    36、双亲委派模型是什么?

    37、静态嵌套类(Static Nested Class)和内部类(Inner Class)的不同?

    38、如果对象的引用被置为null,垃圾收集器是否会立即释放对象占用的内存?

    39、JVM 出现 fullGC 很频繁,怎么去线上排查问题

    40、JVM 内存区域

    41、Parallel Old 收集器(多线程标记整理算法)

    42、对象分配内存是否线程安全?

    43、当一个线程进入某个对象的一个synchronized的实例方法后,其它线程是否可进入此对象的其它方法?

    44、Serial 与 Parallel GC 之间的不同之处?

    45、为什么线程通信的方法 wait(), notify()和 notifyAll()被定义在 Object 类里?

    46、redux异步中间件之间的优劣?

    47、类加载为什么要使用双亲委派模式,有没有什么场景是打破了这个模式?

    48、Hibernate中Session的load和get方法的区别是什么?

    49、说一下堆内存中对象的分配的基本策略

    50、Java 中如何将字符串转换为整数?

    51、讲讲什么情况下会出现内存溢出,内存泄漏?

    52、乐观锁和悲观锁的理解及如何实现,有哪些实现方式?

    53、线程与进程的区别?

    54、Session的save()、update()、merge()、lock()、saveOrUpdate()和persist()方法分别是做什么的?有什么区别?

    55、用代码演示三种代理

    56、stackoverflow错误,permgen space错误

    57、分代收集算法

    58、同步方法和同步块,哪个是更好的选择?

    69、Java 中的编译期常量是什么?使用它又什么风险?

    70、Java死锁以及如何避免?

    71、日期和时间:

    72、XML文档定义有几种形式?它们之间有何本质区别?解析XML文档有哪几种方式?

    73、依赖注入和工程模式之间有什么不同?

    74、Java 堆的结构是什么样子的?什么是堆中的永久代(Perm Gen space)

    75、如何修改tomcat的端口号?

    76、Java有没有goto?

    77、Java 内存分配与回收策率以及 Minor GC 和 Major GC

    78、简述Hibernate常见优化策略。

    79、Statement与preparedStatement区别

    80、什么是DAO模式?

    如果不背 Java面试题的答案,肯定面试会挂!

    这套Java面试题大全,希望对大家有帮助哈~

    博主已将以下这些面试题整理成了一个Java面试手册,是PDF版的

    更多相关内容
  • 2021年面试题集合,某培训平台的整理得出,资源集合题目差不多800多,很全面,面试可以靠它了
  • Java面试题大全(备战2021)

    千次下载 2020-12-01 22:25:02
    这本面试手册包含了Java基础、Java集合、JVM、Spring、Spring Boot、Spring Cloud、Mysql、Redis、RabbitMQ、Dubbo、Netty、分布式及架构设计等方面的技术点。内容难度参差,满足初中高级Java工程师的面试需求。
  • java面试题及答案大汇总,史上最全!(2020最新版) 最新Java面试题,常见面试题及答案汇总 Java面试题及答案整理(2020最新版) 最常见的Java面试题及答案汇总
  • 初级Java开发工程师面试题,不需要积分(免费下载),说明:上传文件中是资源的链接,大家直接访问。同时提供了PDF版本下载方式!
  • 2022 Java最新面试题合集

    千次阅读 2022-03-03 19:55:16
    2022最新Java面试题合集,包括 Java 集合、JVM、多线程、并发编程、设计模式、SpringBoot、SpringCloud、Java、MyBatis、ZooKeeper、Dubbo、Elasticsearch、Memcached、MongoDB、Redis、MySQL、RabbitMQ、Kafka、...

    2022最新Java面试题合集,包括 Java 集合、JVM、多线程、并发编程、设计模式、SpringBoot、SpringCloud、Java、MyBatis、ZooKeeper、Dubbo、Elasticsearch、Memcached、MongoDB、Redis、MySQL、RabbitMQ、Kafka、Linux、Netty、Tomcat、大数据、阿里巴巴等大厂面试题等等技术栈!文末获取所有面试题资源

    image

    Java集合容器

    1. 什么是集合
    2. 集合的特点
    3. 集合和数组的区别
    4. 使用集合框架的好处
    5. 常用的集合类有哪些?
    6. List,Set,Map三者的区别?
    7. 集合框架底层数据结构
    8. 哪些集合类是线程安全的?
    9. Java集合的快速失败机制 “fail-fast”?
    10. 怎么确保一个集合不能被修改?

    image

    Java多线程

    1. 多线程有什么用?
    2. 线程和进程的区别是什么?
    3. Java 实现线程有哪几种方式?
    4. 启动线程方法 start()和 run()有什么区别?
    5. 怎么终止一个线程?如何优雅地终止线程?
    6. 一个线程的生命周期有哪几种状态?它们之间如何流转的?
    7. 线程中的 wait()和 sleep()方法有什么区别?
    8. 多线程同步有哪几种方法?
    9. 什么是死锁?如何避免死锁?
    10. 多线程之间如何进行通信?

    image

    Java并发编程

    1. 为什么要使用并发编程
    2. 多线程应用场景
    3. 并发编程有什么缺点
    4. 并发编程三个必要因素是什么?
    5. Java 程序中怎么保证多线程的运行安全?
    6. 并行和并发有什么区别?
    7. 什么是多线程
    8. 多线程的好处
    9. 多线程的劣势
    10. 线程和进程区别

    image

    JVM虚拟机

    1. 我们开发人员编写的Java代码是怎么让电脑认识的
    2. 为什么说java是跨平台语言
    3. Jdk和Jre和JVM的区别
    4. 说一下 JVM由那些部分组成,运行流程是什么?
    5. 说一下 JVM 运行时数据区
    6. 详细的介绍下程序计数器?(重点理解)
    7. 详细介绍下Java虚拟机栈?(重点理解)
    8. 你能给我详细的介绍Java堆吗?(重点理解)
    9. 能不能解释一下本地方法栈?
    10. 能不能解释一下方法区(重点理解)

    image

    Tomcat

    1. Tomcat的缺省端口是多少,怎么修改?
    2. Tomcat 有哪几种Connector 运行模式(优化)?
    3. Tomcat 有几种部署方式?
    4. Tomcat容器是如何创建servlet类实例?用到了什么原理?
    5. Tomcat 如何优化?
    6. Tomcat 内存调优
    7. Tomcat 垃圾回收策略调优
    8. Tomcat 共享session处理
    9. Tomcat 添加JMS远程监控
    10. 专业点的分析工具有

    image

    MySQL

    1. MySQL 中有哪几种锁?
    2. MySQL 中有哪些不同的表格?
    3. 简述在MySQL 数据库中 MyISAM 和InnoDB 的区别
    4. MySQL 中InnoDB 支持的四种事务隔离级别名称
    5. CHAR 和VARCHAR 的区别?
    6. 主键和候选键有什么区别?
    7. myisamchk 是用来做什么的?
    8. 如果一个表有一列定义为TIMESTAMP,将发生什么?
    9. 你怎么看到为表格定义的所有索引?
    10. 列对比运算符是什么?

    image

    Memcached

    1. Memcached是什么,有什么作用?
    2. Memcached服务分布式集群如何实现?
    3. Memcached服务特点及工作原理是什么?
    4. 简述Memcached内存管理机制原理?
    5. Memcached是怎么工作的?
    6. Memcached最大的优势是什么?
    7. Memcached和MySQL的querycache相比,有什么优缺点?
    8. memcached和服务器的local cache(比如PHP的APC、mmap文件等)相比,有什么优缺点?
    9. memcached的cache机制是怎样的?
    10. memcached如何实现冗余机制?

    image

    Redis

    1. 什么是Redis?
    2. Redis有哪些优缺点?
    3. 使用redis有哪些好处?
    4. 为什么要用 Redis / 为什么要用缓存
    5. 为什么要用 Redis 而不用 map/guava 做缓存?
    6. Redis为什么这么快
    7. Redis有哪些数据类型
    8. Redis的应用场景
    9. Redis持久化
    10. Redis 的持久化机制是什么?各自的优缺点?

    image

    elasticsearch

    1. elasticsearch 了解多少,说说你们公司 es 的集群架构,索引数据大小,分片有多少,以及一些调优手段
    2. elasticsearch 的倒排索引是什么
    3. elasticsearch 索引数据多了怎么办,如何调优,部署
    4. elasticsearch 是如何实现 master 选举
    5. 详细描述一下 Elasticsearch 索引文档的过程
    6. 详细描述一下 Elasticsearch 搜索的过程?
    7. Elasticsearch 在部署时,对 Linux 的设置有哪些优化方法
    8. ucence 内部结构是什么?
    9. Elasticsearch 是如何实现 Master 选举的?
    10. Elasticsearch 中的节点(比如共 20 个),其中的10 个选了一个 master,另外 10 个选了另一个 master,怎么办?

    image

    ZooKeeper

    1. ZooKeeper 是什么?
    2. ZooKeeper 提供了什么?
    3. Zookeeper 文件系统
    4. ZAB 协议?
    5. 四种类型的数据节点 Znode
    6. Zookeeper Watcher 机制 – 数据变更通知
    7. 客户端注册 Watcher 实现
    8. 服务端处理 Watcher 实现
    9. 客户端回调 Watcher
    10. ACL 权限控制机制

    image

    Dubbo

    1. 为什么要用 Dubbo?
    2. Dubbo 是什么?
    3. Dubbo 的使用场景有哪些?
    4. Dubbo 核心功能有哪些?
    5. Dubbo 核心组件有哪些?
    6. Dubbo 服务器注册与发现的流程?
    7. Dubbo 的整体架构设计有哪些分层?
    8. Dubbo Monitor 实现原理?
    9. Dubbo 类似的分布式框架还有哪些?
    10. Dubbo 和 Spring Cloud 有什么关系?

    image

    RocketMq

    1. RocketMq 是什么
    2. RocketMq 有什么功能
    3. RoctetMq 架构
    4. RocketMq 消息模型(专业术语)
    5. 核心问题
    6. 顺序消息
    7. 消息过滤
    8. 消息去重
    9. 分布式事务消息
    10. 消息的可用性
    11. 刷盘实现
    12. 负载均衡

    image

    Kafka

    1. Kafka 架构
    2. Kafka 基础概念
    3. Kafka Rebalance (重平衡)
    4. 日志索引
    5. 高性能, 高吞吐
    6. 分区的原因
    7. 顺序写
    8. 批发送
    9. 数据压缩
    10. Page Cache & MMap
    11. Page Cache
    12. MMap (Memory Mapped Files, 内存映射文件)

    image

    RabbitMQ

    1. 什么是MQ
    2. MQ的优点
    3. 解耦、异步、削峰是什么?
    4. 消息队列有什么缺点
    5. 你们公司生产环境用的是什么消息中间件?
    6. Kafka、ActiveMQ、RabbitMQ、RocketMQ 有什么优缺点?
    7. MQ 有哪些常见问题?如何解决这些问题?
    8. 什么是 RabbitMQ?
    9. Rabbitmq 的使用场景
    10. RabbitMQ基本概念

    image

    Netty

    1. Netty
    2. I/O 模式
    3. I/O 多路复用
    4. select
    5. poll
    6. epoll
    7. Java 的 I/o
    8. Netty 线程模型和 Reactor 模式
    9. Echo服务
    10. 源码剖析

    image


    点击下方公众号,扫码关注公众号 Java架构师进阶编程,回复面试题白嫖所有资源

    展开全文
  • 2021最新、最全的Java面试题及答案,300页
  • 2018java面试题

    2018-01-30 10:22:27
    压缩包里包含了面试过程中经常问到的知识点,还包含了同事面试时遇到的面试题,并且有详细的答案,各大框架的搭建步骤等等,面试必备~
  • 2019最全的java面试题

    2019-04-20 16:53:06
    2019年最全面试题。145页,63542字。 涵盖java所有要点,外加框架和算法要点
  • 2018最新最全java高级工程师面试题,2018最新最全java高级工程师面试题2018最新最全java高级工程师面试题,2018最新最全java高级工程师面试题 十几个文档
  • 最新Java面试题,常见面试题及答案汇总

    万次阅读 多人点赞 2019-07-12 08:56:55
    Java最新面试题面试题答案汇总

    Java最新常见面试题 + 答案汇总

    原文地址:https://blog.csdn.net/sufu1065/article/details/88051083

    1、面试题模块汇总

    面试题包括以下十九个模块: Java 基础、容器、多线程、反射、对象拷贝、Java Web 模块、异常、网络、设计模式、Spring/Spring MVC、Spring Boot/Spring Cloud、Hibernate、Mybatis、RabbitMQ、Kafka、Zookeeper、MySql、Redis、JVM 。如下图所示:

    可能对于初学者不需要后面的框架和 JVM 模块的知识,读者朋友们可根据自己的情况,选择对应的模块进行阅读。

    适宜阅读人群

    • 需要面试的初/中/高级 java 程序员
    • 想要查漏补缺的人
    • 想要不断完善和扩充自己 java 技术栈的人
    • java 面试官

    具体面试题

    下面一起来看 208 道面试题,具体的内容。

    一、Java 基础

    1.JDK 和 JRE 有什么区别?

    2.== 和 equals 的区别是什么?

    3.两个对象的 hashCode()相同,则 equals()也一定为 true,对吗?

    4.final 在 java 中有什么作用?

    5.java 中的 Math.round(-1.5) 等于多少?

    6.String 属于基础的数据类型吗?

    7.java 中操作字符串都有哪些类?它们之间有什么区别?

    8.String str="i"与 String str=new String(“i”)一样吗?

    9.如何将字符串反转?

    10.String 类的常用方法都有那些?

    11.抽象类必须要有抽象方法吗?

    12.普通类和抽象类有哪些区别?

    13.抽象类能使用 final 修饰吗?

    14.接口和抽象类有什么区别?

    15.java 中 IO 流分为几种?

    16.BIO、NIO、AIO 有什么区别?

    17.Files的常用方法都有哪些?

    二、容器

    18.java 容器都有哪些?

    19.Collection 和 Collections 有什么区别?

    20.List、Set、Map 之间的区别是什么?

    21.HashMap 和 Hashtable 有什么区别?

    22.如何决定使用 HashMap 还是 TreeMap?

    23.说一下 HashMap 的实现原理?

    24.说一下 HashSet 的实现原理?

    25.ArrayList 和 LinkedList 的区别是什么?

    26.如何实现数组和 List 之间的转换?

    27.ArrayList 和 Vector 的区别是什么?

    28.Array 和 ArrayList 有何区别?

    29.在 Queue 中 poll()和 remove()有什么区别?

    30.哪些集合类是线程安全的?

    31.迭代器 Iterator 是什么?

    32.Iterator 怎么使用?有什么特点?

    33.Iterator 和 ListIterator 有什么区别?

    34.怎么确保一个集合不能被修改?

    三、多线程

    35.并行和并发有什么区别?

    36.线程和进程的区别?

    37.守护线程是什么?

    38.创建线程有哪几种方式?

    39.说一下 runnable 和 callable 有什么区别?

    40.线程有哪些状态?

    41.sleep() 和 wait() 有什么区别?

    42.notify()和 notifyAll()有什么区别?

    43.线程的 run()和 start()有什么区别?

    44.创建线程池有哪几种方式?

    45.线程池都有哪些状态?

    46.线程池中 submit()和 execute()方法有什么区别?

    47.在 java 程序中怎么保证多线程的运行安全?

    48.多线程锁的升级原理是什么?

    49.什么是死锁?

    50.怎么防止死锁?

    51.ThreadLocal 是什么?有哪些使用场景?

    52.说一下 synchronized 底层实现原理?

    53.synchronized 和 volatile 的区别是什么?

    54.synchronized 和 Lock 有什么区别?

    55.synchronized 和 ReentrantLock 区别是什么?

    56.说一下 atomic 的原理?

    四、反射

    57.什么是反射?

    58.什么是 java 序列化?什么情况下需要序列化?

    59.动态代理是什么?有哪些应用?

    60.怎么实现动态代理?

    五、对象拷贝

    61.为什么要使用克隆?

    62.如何实现对象克隆?

    63.深拷贝和浅拷贝区别是什么?

    六、Java Web

    64.jsp 和 servlet 有什么区别?

    65.jsp 有哪些内置对象?作用分别是什么?

    66.说一下 jsp 的 4 种作用域?

    67.session 和 cookie 有什么区别?

    68.说一下 session 的工作原理?

    69.如果客户端禁止 cookie 能实现 session 还能用吗?

    70.spring mvc 和 struts 的区别是什么?

    71.如何避免 sql 注入?

    72.什么是 XSS 攻击,如何避免?

    73.什么是 CSRF 攻击,如何避免?

    七、异常

    74.throw 和 throws 的区别?

    75.final、finally、finalize 有什么区别?

    76.try-catch-finally 中哪个部分可以省略?

    77.try-catch-finally 中,如果 catch 中 return 了,finally 还会执行吗?

    78.常见的异常类有哪些?

    八、网络

    79.http 响应码 301 和 302 代表的是什么?有什么区别?

    80.forward 和 redirect 的区别?

    81.简述 tcp 和 udp的区别?

    82.tcp 为什么要三次握手,两次不行吗?为什么?

    83.说一下 tcp 粘包是怎么产生的?

    84.OSI 的七层模型都有哪些?

    85.get 和 post 请求有哪些区别?

    86.如何实现跨域?

    87.说一下 JSONP 实现原理?

    九、设计模式

    88.说一下你熟悉的设计模式?

    89.简单工厂和抽象工厂有什么区别?

    十、Spring/Spring MVC

    90.为什么要使用 spring?

    91.解释一下什么是 aop?

    92.解释一下什么是 ioc?

    93.spring 有哪些主要模块?

    94.spring 常用的注入方式有哪些?

    95.spring 中的 bean 是线程安全的吗?

    96.spring 支持几种 bean 的作用域?

    97.spring 自动装配 bean 有哪些方式?

    98.spring 事务实现方式有哪些?

    99.说一下 spring 的事务隔离?

    100.说一下 spring mvc 运行流程?

    101.spring mvc 有哪些组件?

    102.@RequestMapping 的作用是什么?

    103.@Autowired 的作用是什么?

    十一、Spring Boot/Spring Cloud

    104.什么是 spring boot?

    105.为什么要用 spring boot?

    106.spring boot 核心配置文件是什么?

    107.spring boot 配置文件有哪几种类型?它们有什么区别?

    108.spring boot 有哪些方式可以实现热部署?

    109.jpa 和 hibernate 有什么区别?

    110.什么是 spring cloud?

    111.spring cloud 断路器的作用是什么?

    112.spring cloud 的核心组件有哪些?

    十二、Hibernate

    113.为什么要使用 hibernate?

    114.什么是 ORM 框架?

    115.hibernate 中如何在控制台查看打印的 sql 语句?

    116.hibernate 有几种查询方式?

    117.hibernate 实体类可以被定义为 final 吗?

    118.在 hibernate 中使用 Integer 和 int 做映射有什么区别?

    119.hibernate 是如何工作的?

    120.get()和 load()的区别?

    121.说一下 hibernate 的缓存机制?

    122.hibernate 对象有哪些状态?

    123.在 hibernate 中 getCurrentSession 和 openSession 的区别是什么?

    124.hibernate 实体类必须要有无参构造函数吗?为什么?

    十三、Mybatis

    125.mybatis 中 #{}和 ${}的区别是什么?

    126.mybatis 有几种分页方式?

    127.RowBounds 是一次性查询全部结果吗?为什么?

    128.mybatis 逻辑分页和物理分页的区别是什么?

    129.mybatis 是否支持延迟加载?延迟加载的原理是什么?

    130.说一下 mybatis 的一级缓存和二级缓存?

    131.mybatis 和 hibernate 的区别有哪些?

    132.mybatis 有哪些执行器(Executor)?

    133.mybatis 分页插件的实现原理是什么?

    134.mybatis 如何编写一个自定义插件?

    十四、RabbitMQ

    135.rabbitmq 的使用场景有哪些?

    136.rabbitmq 有哪些重要的角色?

    137.rabbitmq 有哪些重要的组件?

    138.rabbitmq 中 vhost 的作用是什么?

    139.rabbitmq 的消息是怎么发送的?

    140.rabbitmq 怎么保证消息的稳定性?

    141.rabbitmq 怎么避免消息丢失?

    142.要保证消息持久化成功的条件有哪些?

    143.rabbitmq 持久化有什么缺点?

    144.rabbitmq 有几种广播类型?

    145.rabbitmq 怎么实现延迟消息队列?

    146.rabbitmq 集群有什么用?

    147.rabbitmq 节点的类型有哪些?

    148.rabbitmq 集群搭建需要注意哪些问题?

    149.rabbitmq 每个节点是其他节点的完整拷贝吗?为什么?

    150.rabbitmq 集群中唯一一个磁盘节点崩溃了会发生什么情况?

    151.rabbitmq 对集群节点停止顺序有要求吗?

    十五、Kafka

    152.kafka 可以脱离 zookeeper 单独使用吗?为什么?

    153.kafka 有几种数据保留的策略?

    154.kafka 同时设置了 7 天和 10G 清除数据,到第五天的时候消息达到了 10G,这个时候 kafka 将如何处理?

    155.什么情况会导致 kafka 运行变慢?

    156.使用 kafka 集群需要注意什么?

    十六、Zookeeper

    157.zookeeper 是什么?

    158.zookeeper 都有哪些功能?

    159.zookeeper 有几种部署模式?

    160.zookeeper 怎么保证主从节点的状态同步?

    161.集群中为什么要有主节点?

    162.集群中有 3 台服务器,其中一个节点宕机,这个时候 zookeeper 还可以使用吗?

    163.说一下 zookeeper 的通知机制?

    十七、MySql

    164.数据库的三范式是什么?

    165.一张自增表里面总共有 7 条数据,删除了最后 2 条数据,重启 mysql 数据库,又插入了一条数据,此时 id 是几?

    166.如何获取当前数据库版本?

    167.说一下 ACID 是什么?

    168.char 和 varchar 的区别是什么?

    169.float 和 double 的区别是什么?

    170.mysql 的内连接、左连接、右连接有什么区别?

    171.mysql 索引是怎么实现的?

    172.怎么验证 mysql 的索引是否满足需求?

    173.说一下数据库的事务隔离?

    174.说一下 mysql 常用的引擎?

    175.说一下 mysql 的行锁和表锁?

    176.说一下乐观锁和悲观锁?

    177.mysql 问题排查都有哪些手段?

    178.如何做 mysql 的性能优化?

    十八、Redis

    179.redis 是什么?都有哪些使用场景?

    180.redis 有哪些功能?

    181.redis 和 memecache 有什么区别?

    182.redis 为什么是单线程的?

    183.什么是缓存穿透?怎么解决?

    184.redis 支持的数据类型有哪些?

    185.redis 支持的 java 客户端都有哪些?

    186.jedis 和 redisson 有哪些区别?

    187.怎么保证缓存和数据库数据的一致性?

    188.redis 持久化有几种方式?

    189.redis 怎么实现分布式锁?

    190.redis 分布式锁有什么缺陷?

    191.redis 如何做内存优化?

    192.redis 淘汰策略有哪些?

    193.redis 常见的性能问题有哪些?该如何解决?

    十九、JVM

    194.说一下 jvm 的主要组成部分?及其作用?

    195.说一下 jvm 运行时数据区?

    196.说一下堆栈的区别?

    197.队列和栈是什么?有什么区别?

    198.什么是双亲委派模型?

    199.说一下类加载的执行过程?

    200.怎么判断对象是否可以被回收?

    201.java 中都有哪些引用类型?

    202.说一下 jvm 有哪些垃圾回收算法?

    203.说一下 jvm 有哪些垃圾回收器?

    204.详细介绍一下 CMS 垃圾回收器?

    205.新生代垃圾回收器和老生代垃圾回收器都有哪些?有什么区别?

    206.简述分代垃圾回收器是怎么工作的?

    207.说一下 jvm 调优的工具?

    208.常用的 jvm 调优的参数都有哪些?

    2、面试题答案汇总

    (一)基础模块

    (二)容器

    (三)多线程

    (四)反射

    (五)对象拷贝

    (六)JavaWeb

    (七)异常

    (八)网络

    (九)设计模式

    (十)Spring/SpringMVC

    (十一)Spring Boot / Spring Cloud

    (十二)Hibernate

    (十三)Mybatis

    (十四)RabbitMQ

    (十五)Kafka

    (十六)Zookeeper

    (十七)MySql

    (十八)Redis

    (十九)JVM

    展开全文
  • 尚硅谷Java学科面试题正式出炉,且将持续更新!视频针对企业高频面试技术题目,涵盖内容:JavaSE、SSM、框架高级、电商项目。每个视频由浅入深的讲解,帮助大家更好地应对面试,并全方位掌握Java的核心技术点。
  • 史上最全Java初中级面试题,发现网上很多Java初级面试题都没有答案,所以花了很长时间搜集整理出来了这套Java面试题大全,希望对大家有帮助哈~ 本人发现网上虽然有不少Java相关的面试题,但第一未必全,第二未必有...

    史上最全Java初中级面试题,发现网上很多Java初级面试题都没有答案,所以花了很长时间搜集整理出来了这套Java面试题大全,希望对大家有帮助哈~

    本人发现网上虽然有不少Java相关的面试题,但第一未必全,第二未必有答案,第三虽然有答案,但未必能在面试中说,所以在本文里,会不断收集各种面试题,并站在面试官的立场上,给出我自己的答案。

    如果不背 Java面试题的答案,肯定面试会挂!

    这套Java面试题大全,希望对大家有帮助哈~

    博主已将以下这些面试题整理成了一个Java面试手册,是PDF版的

    1、为什么使用Executor框架?

    1、 每次执行任务创建线程 new Thread()比较消耗性能,创建一个线程是比较耗时、耗资源的。

    2、 调用 new Thread()创建的线程缺乏管理,被称为野线程,而且可以无限制的创建,线程之间的相互竞争会导致过多占用系统资源而导致系统瘫痪,还有线程之间的频繁交替也会消耗很多系统资源。

    3、 接使用new Thread() 启动的线程不利于扩展,比如定时执行、定期执行、定时定期执行、线程中断等都不便实现。

    2、你能保证 GC 执行吗?

    不能,虽然你可以调用 System.gc() 或者 Runtime.gc(),但是没有办法保证 GC的执行。

    3、UML中有哪些常用的图?

    UML定义了多种图形化的符号来描述软件系统部分或全部的静态结构和动态结构,包括:用例图(use case diagram)、类图(class diagram)、时序图(sequence diagram)、协作图(collaboration diagram)、状态图(statechart diagram)、活动图(activity diagram)、构件图(component diagram)、部署图(deployment diagram)等。在这些图形化符号中,有三种图最为重要,分别是:用例图(用来捕获需求,描述系统的功能,通过该图可以迅速的了解系统的功能模块及其关系)、类图(描述类以及类与类之间的关系,通过该图可以快速了解系统)、时序图(描述执行特定任务时对象之间的交互关系以及执行顺序,通过该图可以了解对象能接收的消息也就是说对象能够向外界提供的服务)。

    用例图:

    类图:

    时序图:

    4、volatile关键字的原理是什么?干什么用的?

    使用了volatile关键字的变量,每当变量的值有变动的时候,都会将更改立即同步到主内存中;而如果某个线程想要使用这个变量,就先要从主存中刷新到工作内存,这样就确保了变量的可见性。

    一般使用一个volatile修饰的bool变量,来控制线程的运行状态。

    volatile boolean stop = false; void stop(){ this.stop = true; } void start(){ new Thread(()->{ while (!stop){ //sth } }).start(); }

    5、synchronized 和 Lock 有什么区别?

    1、 首先synchronized是Java内置关键字,在JVM层面,Lock是个Java类;

    2、 synchronized 可以给类、方法、代码块加锁;而 lock 只能给代码块加锁。

    3、 synchronized 不需要手动获取锁和释放锁,使用简单,发生异常会自动释放锁,不会造成死锁;而 lock 需要自己加锁和释放锁,如果使用不当没有 unLock()去释放锁就会造成死锁。

    4、 通过 Lock 可以知道有没有成功获取锁,而 synchronized 却无法办到。

    6、抽象类必须要有抽象方法吗

    不是必须。抽象类可以没有抽象方法。

    7、强引用、软引用、弱引用、虚引用是什么,有什么区别?

    1、 强引用,就是普通的对象引用关系,如 String s = new String("ConstXiong")

    2、 软引用,用于维护一些可有可无的对象。只有在内存不足时,系统则会回收软引用对象,如果回收了软引用对象之后仍然没有足够的内存,才会抛出内存溢出异常。SoftReference 实现

    3、 弱引用,相比软引用来说,要更加无用一些,它拥有更短的生命周期,当 JVM 进行垃圾回收时,无论内存是否充足,都会回收被弱引用关联的对象。WeakReference 实现

    4、 虚引用是一种形同虚设的引用,在现实场景中用的不是很多,它主要用来跟踪对象被垃圾回收的活动。PhantomReference 实现

    8、Servlet的生命周期?

    1、 加载:判断servlet实例是否存在,如果不存在,就加载serlvet

    2、 实例化:

    3、 初始化

    4、服务

    5、销毁

    9、Hibernate的对象有几种状态

    1、 瞬时态(transient)

    2、 持久态(persistent)

    3、 游离态(detached)

    10、说一下HashMap的实现原理?

    1、 HashMap概述: HashMap是基于哈希表的Map接口的非同步实现。此实现提供所有可选的映射操作,并允许使用null值和null键。此类不保证映射的顺序,特别是它不保证该顺序恒久不变。

    2、 HashMap的数据结构: 在Java编程语言中,最基本的结构就是两种,一个是数组,另外一个是模拟指针(引用),所有的数据结构都可以用这两个基本结构来构造的,HashMap也不例外。HashMap实际上是一个“链表散列”的数据结构,即数组和链表的结合体。

    HashMap 基于 Hash 算法实现的

    1、 当我们往HashMap中put元素时,利用key的hashCode重新hash计算出当前对象的元素在数组中的下标

    2、 存储时,如果出现hash值相同的key,此时有两种情况。

    (1)如果key相同,则覆盖原始值;

    (2)如果key不同(出现冲突),则将当前的key-value放入链表中

    3、 获取时,直接找到hash值对应的下标,在进一步判断key是否相同,从而找到对应值。

    4、 理解了以上过程就不难明白HashMap是如何解决hash冲突的问题,核心就是使用了数组的存储方式,然后将冲突的key的对象放入链表中,一旦发现冲突就在链表中做进一步的对比。

    需要注意Jdk 1.8中对HashMap的实现做了优化,当链表中的节点数据超过八个之后,该链表会转为红黑树来提高查询效率,从原来的O(n)到O(logn)

    1、java中有几种方法可以实现一个线程?

    继承 Thread 类

    实现 Runnable 接口

    实现 Callable 接口,需要实现的是 call() 方法

    2、Java 中的 HashSet,内部是如何工作的?

    HashSet 的内部采用 HashMap来实现。由于 Map 需要 key 和 value,所以所有 key 的都有一个默认 value。类似于 HashMap,HashSet 不允许重复的 key,只允许有一个null key,意思就是 HashSet 中只允许存储一个 null 对象。

    3、redux的工作流程?

    首先,我们看下几个核心概念:

    1、 Store:保存数据的地方,你可以把它看成一个容器,整个应用只能有一个Store。

    2、 State:Store对象包含所有数据,如果想得到某个时点的数据,就要对Store生成快照,这种时点的数据集合,就叫做State。

    3、 Action:State的变化,会导致View的变化。但是,用户接触不到State,只能接触到View。所以,State的变化必须是View导致的。Action就是View发出的通知,表示State应该要发生变化了。

    4、 Action Creator:View要发送多少种消息,就会有多少种Action。如果都手写,会很麻烦,所以我们定义一个函数来生成Action,这个函数就叫Action Creator。

    5、 Reducer:Store收到Action以后,必须给出一个新的State,这样View才会发生变化。这种State的计算过程就叫做Reducer。Reducer是一个函数,它接受Action和当前State作为参数,返回一个新的State。

    6、 dispatch:是View发出Action的唯一方法。

    然后我们过下整个工作流程:

    1、 首先,用户(通过View)发出Action,发出方式就用到了dispatch方法。

    2、 然后,Store自动调用Reducer,并且传入两个参数:当前State和收到的Action,Reducer会返回新的State

    3、 State一旦有变化,Store就会调用监听函数,来更新View。

    到这儿为止,一次用户交互流程结束。可以看到,在整个流程中数据都是单向流动的,这种方式保证了流程的清晰。

    redux原理详解

    4、String类的常用方法有那些?

    1、 charAt:返回指定索引处的字符

    2、 indexOf():返回指定字符的索引

    3、 replace():字符串替换

    4、 trim():去除字符串两端空白

    5、 split():分割字符串,返回一个分割后的字符串数组

    6、 getBytes():返回字符串的byte类型数组

    7、 length():返回字符串长度

    8、 toLowerCase():将字符串转成小写字母

    9、 toUpperCase():将字符串转成大写字符

    10、 substring():截取字符串

    11、 format():格式化字符串

    12、 equals():字符串比较

    5、请你谈谈对OOM的认识

    OOM是非常严重的问题,除了程序计数器,其他内存区域都有溢出的风险。和我们平常工作最密切的,就是堆溢出。另外,元空间在方法区内容非常多的情况下也会溢出。还有就是栈溢出,这个通常影响比较小。堆外也有溢出的可能,这个就比较难排查一些。

    6、ParNew 垃圾收集器(Serial+多线程)

    ParNew 垃圾收集器其实是 Serial 收集器的多线程版本,也使用复制算法,除了使用多线程进行垃圾收集之外,其余的行为和 Serial 收集器完全一样, ParNew 垃圾收集器在垃圾收集过程中同样也要暂停所有其他的工作线程。

    ParNew 收集器默认开启和 CPU 数目相同的线程数,可以通过-XX:ParallelGCThreads 参数来限制垃圾收集器的线程数。【Parallel:平行的】

    ParNew 虽然是除了多线程外和Serial 收集器几乎完全一样,但是ParNew垃圾收集器是很多 java虚拟机运行在 Server 模式下新生代的默认垃圾收集器。

    7、Java 中如何格式化一个日期?如格式化为 ddMMyyyy 的形式?

    http://javarevisited.blogspot.com/2011/09/convert-date-to-string-simpledateformat.html

    Java 中,可以使用 SimpleDateFormat 类或者 joda-time 库来格式日期。DateFormat 类允许你使用多种流行的格式来格式化日期。参见中的示例代码,代码中演示了将日期格式化成不同的格式,如 dd-MM-yyyy 或 ddMMyyyy。

    8、什么是Java虚拟机

    任何一种可以运行Java字节码的软件均可看成是Java的虚拟机(JVM)

    9、Java 中的同步集合与并发集合有什么区别?

    同步集合与并发集合都为多线程和并发提供了合适的线程安全的集合,不过并发集合的可扩展性更高。在 Java1.5 之前程序员们只有同步集合来用且在多线程并发的时候会导致争用,阻碍了系统的扩展性。Java5 介绍了并发集合像ConcurrentHashMap,不仅提供线程安全还用锁分离和内部分区等现代技术提高了可扩展性。

    10、适配器模式和代理模式之前有什么不同?

    这个问题与前面的类似,适配器模式和代理模式的区别在于他们的意图不同。由于适配器模式和代理模式都是封装真正执行动作的类,因此结构是一致的,但是适配器模式用于接口之间的转换,而代理模式则是增加一个额外的中间层,以便支持分配、控制或智能访问。

    1、说说G1垃圾收集器的工作原理

    优点:指定最大停顿时间、分Region的内存布局、按收益动态确定回收集

    1、 G1开创的基于Region的堆内存布局是它能够实现这个目标的关键。虽然G1也仍是遵循分代收集理论设计的,但其堆内存的布局与其他收集器有非常明显的差异:G1不再坚持固定大小以及固定数量的分代区域划分,而是把连续的Java堆划分为多个大小相等的独立区域(Region),每一个Region都可以根据需要,扮演新生代的Eden空间、Survivor空间,或者老年代空间。收集器能够对扮演不同角色的Region采用不同的策略去处理,这样无论是新创建的对象还是已经存活了一段时间、熬过多次收集的旧对象都能获取很好的收集效果。

    2、 虽然G1仍然保留新生代和老年代的概念,但新生代和老年代不再是固定的了,它们都是一系列区域(不需要连续)的动态集合。G1收集器之所以能建立可预测的停顿时间模型,是因为它将Region作为单次回收的最小单元,即每次收集到的内存空间都是Region大小的整数倍,这样可以有计划地避免在整个Java堆中进行全区域的垃圾收集。更具体的处理思路是让G1收集器去跟踪各个Region里面的垃圾堆积的“价值”大小,价值即回收所获得的空间大小以及回收所需时间的经验值,然后在后台维护一个优先级列表,每次根据用户设定允许的收集停顿时间(使用参数-XX:MaxGCPauseMillis指定,默认值是200毫秒),优先处理回收价值收益最大的那些Region,这也就是“Garbage First”名字的由来。这种使用Region划分内存空间,以及具有优先级的区域回收方式,保证了G1收集器在有限的时间内获取尽可能高的收集效率。

    3、 G1收集器的运作过程大致可划分为以下四个步骤:·初始标记 (Initial Marking):仅仅只是标记一下GC Roots能直接关联到的对象,并且修改TAMS指针的值,让下一阶段用户线程并发运行时,能正确地在可用的Region中分配新对象。这个阶段需要停顿线程,但耗时很短,而且是借用进行Minor GC的时候同步完成的,所以G1收集器在这个阶段实际并没有额外的停顿。·并发标记 (Concurrent Marking):从GC Root开始对堆中对象进行可达性分析,递归扫描整个堆里的对象图,找出要回收的对象,这阶段耗时较长,但可与用户程序并发执行。当对象图扫描完成以后,还要重新处理SATB记录下的在并发时有引用变动的对象。·最终标记 (Final Marking):对用户线程做另一个短暂的暂停,用于处理并发阶段结束后仍遗留下来的最后那少量的SATB记录。·筛选回收 (Live Data Counting and Evacuation):负责更新Region的统计数据,对各个Region的回收价值和成本进行排序,根据用户所期望的停顿时间来制定回收计划,可以自由选择任意多个Region构成回收集,然后把决定回收的那一部分Region的存活对象复制到空的Region中,再清理掉整个旧Region的全部空间。这里的操作涉及存活对象的移动,是必须暂停用户线程,由多条收集器线程并行完成的。从上述阶段的描述可以看出,G1收集器除了并发标记外,其余阶段也是要完全暂停用户线程的 。

    2、JRE、JDK、JVM 及 JIT 之间有什么不同?

    JRE 代表 Java 运行时(Java run-time),是运行 Java 引用所必须的。JDK 代表 Java 开发工具(Java development kit),是 Java 程序的开发工具,如 Java编译器,它也包含 JRE。JVM 代表 Java 虚拟机(Java virtual machine),它的责任是运行 Java 应用。JIT 代表即时编译(Just In Time compilation),当代码执行的次数超过一定的阈值时,会将 Java 字节码转换为本地代码,如,主要的热点代码会被准换为本地代码,这样有利大幅度提高 Java 应用的性能。

    3、当父类引用指向子类对象的时候,子类重写了父类方法和属性,那么当访问属性的时候,访问是谁的属性?调用方法时,调用的是谁的方法?

    子类重写了父类方法和属性,访问的是父类的属性,调用的是子类的方法

    4、堆溢出的原因?

    堆用于存储对象实例,只要不断创建对象并保证 GC Roots 到对象有可达路径避免垃圾回收,随着对象数量的增加,总容量触及最大堆容量后就会 OOM,例如在 while 死循环中一直 new 创建实例。

    堆 OOM 是实际应用中最常见的 OOM,处理方法是通过内存映像分析工具对 Dump 出的堆转储快照分析,确认内存中导致 OOM 的对象是否必要,分清到底是内存泄漏还是内存溢出。

    如果是内存泄漏,通过工具查看泄漏对象到 GC Roots 的引用链,找到泄露对象是通过怎样的引用路径、与哪些 GC Roots 关联才导致无法回收,一般可以准确定位到产生内存泄漏代码的具***置。

    如果不是内存泄漏,即内存中对象都必须存活,应当检查 JVM 堆参数,与机器内存相比是否还有向上调整的空间。再从代码检查是否存在某些对象生命周期过长、持有状态时间过长、存储结构设计不合理等情况,尽量减少程序运行期的内存消耗。

    5、说一下 runnable 和 callable 有什么区别

    相同点:

    1、 都是接口

    2、 都可以编写多线程程序

    3、 都采用Thread.start()启动线程

    主要区别:

    Runnable 接口 run 方法无返回值;Callable 接口 call 方法有返回值,是个泛型,和Future、FutureTask配合可以用来获取异步执行的结果

    Runnable 接口 run 方法只能抛出运行时异常,且无法捕获处理;Callable 接口 call 方法允许抛出异常,可以获取异常信息 注:Callalbe接口支持返回执行结果,需要调用FutureTask.get()得到,此方法会阻塞主进程的继续往下执行,如果不调用不会阻塞。

    6、JVM 类加载机制

    JVM 类加载机制分为五个部分:加载,验证,准备,解析,初始化。

    加载

    加载是类加载过程中的一个阶段, 这个阶段会在内存中生成一个代表这个类的 java.lang.Class 对象, 作为方法区这个类的各种数据的入口。注意这里不一定非得要从一个 Class 文件获取,这里既可以从 ZIP 包中读取(比如从 jar 包和 war 包中读取),也可以在运行时计算生成(动态代理),也可以由其它文件生成(比如将 JSP 文件转换成对应的 Class 类)。

    验证

    这一阶段的主要目的是为了确保 Class 文件的字节流中包含的信息是否符合当前虚拟机的要求,并且不会危害虚拟机自身的安全。

    准备

    准备阶段是正式为类变量分配内存并设置类变量的初始值阶段,即在方法区中分配这些变量所使用的内存空间。注意这里所说的初始值概念,比如一个类变量定义为:

    实际上变量 v 在准备阶段过后的初始值为 0 而不是 8080, 将 v 赋值为 8080 的 put static 指令是程序被编译后, 存放于类构造器方法之中。

    但是注意如果声明为:

    public static final int v = 8080;

    在编译阶段会为 v 生成 ConstantValue 属性,在准备阶段虚拟机会根据 ConstantValue 属性将 v赋值为 8080。

    解析

    解析阶段是指虚拟机将常量池中的符号引用替换为直接引用的过程。符号引用就是 class 文件中的

    public static int v = 8080;

    实际上变量 v 在准备阶段过后的初始值为 0 而不是 8080, 将 v 赋值为 8080 的 put static 指令是程序被编译后, 存放于类构造器方法之中。但是注意如果声明为:

    在编译阶段会为 v 生成 ConstantValue 属性,在准备阶段虚拟机会根据 ConstantValue 属性将 v赋值为 8080。

    解析

    解析阶段是指虚拟机将常量池中的符号引用替换为直接引用的过程。符号引用就是 class 文件中的

    public static final int v = 8080;

    在编译阶段会为 v 生成 ConstantValue 属性,在准备阶段虚拟机会根据 ConstantValue 属性将 v赋值为 8080。

    解析

    解析阶段是指虚拟机将常量池中的符号引用替换为直接引用的过程。符号引用就是 class 文件中的:

    1、 CONSTANT_Class_info

    2、 CONSTANT_Field_info

    3、 CONSTANT_Method_info

    等类型的常量。

    符号引用

    符号引用与虚拟机实现的布局无关, 引用的目标并不一定要已经加载到内存中。各种虚拟机实现的内存布局可以各不相同,但是它们能接受的符号引用必须是一致的,因为符号引用的字面量形式明确定义在 Java 虚拟机规范的 Class 文件格式中。

    直接引用

    直接引用可以是指向目标的指针,相对偏移量或是一个能间接定位到目标的句柄。如果有了直接引用,那引用的目标必定已经在内存中存在。

    初始化

    初始化阶段是类加载最后一个阶段,前面的类加载阶段之后,除了在加载阶段可以自定义类加载器以外,其它操作都由 JVM 主导。到了初始阶段,才开始真正执行类中定义的 Java 程序代码。

    类构造器

    初始化阶段是执行类构造器方法的过程。方法是由编译器自动收集类中的类变量的赋值操作和静态语句块中的语句合并而成的。虚拟机会保证子方法执行之前,父类的方法已经执行完毕, 如果一个类中没有对静态变量赋值也没有静态语句块,那么编译器可以不为这个类生成()方法。

    注意以下几种情况不会执行类初始化:

    1、 通过子类引用父类的静态字段,只会触发父类的初始化,而不会触发子类的初始化。

    2、 定义对象数组,不会触发该类的初始化。

    3、 常量在编译期间会存入调用类的常量池中,本质上并没有直接引用定义常量的类,不会触发定义常量所在的类。

    4、 通过类名获取 Class 对象,不会触发类的初始化。

    5、 通过 Class.forName 加载指定类时,如果指定参数 initialize 为 false 时,也不会触发类初始化,其实这个参数是告诉虚拟机,是否要对类进行初始化。

    6、 通过 ClassLoader 默认的 loadClass 方法,也不会触发初始化动作。

    7、怎么打破双亲委派模型?

    打破双亲委派机制则不仅要继承ClassLoader类,还要重写loadClass和findClass方法。

    8、垃圾收集算法

    GC最基础的算法有三种:标记 -清除算法、复制算法、标记-压缩算法,我们常用的垃圾回收器一般都采用分代收集算法。

    标记 -清除算法

    “标记-清除”(Mark-Sweep)算法,如它的名字一样,算法分为“标记”和“清除”两个阶段:首先标记出所有需要回收的对象,在标记完成后统一回收掉所有被标记的对象。

    复制算法

    “复制”(Copying)的收集算法,它将可用内存按容量划分为大小相等的两块,每次只使用其中的一块。当这一块的内存用完了,就将还存活着的对象复制到另外一块上面,然后再把已使用过的内存空间一次清理掉。

    标记-压缩算法

    标记过程仍然与“标记-清除”算法一样,但后续步骤不是直接对可回收对象进行清理,而是让所有存活的对象都向一端移动,然后直接清理掉端边界以外的内存

    分代收集算法

    “分代收集”(Generational Collection)算法,把Java堆分为新生代和老年代,这样就可以根据各个年代的特点采用最适当的收集算法

    9、你有哪些手段来排查 OOM 的问题?

    1、 增加两个参数 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp/heapdump.hprof,当 OOM 发生时自动 dump 堆内存信息到指定目录

    2、 同时 jstat 查看监控 JVM 的内存和 GC 情况,先观察问题大概出在什么区域

    3、 使用 MAT 工具载入到 dump 文件,分析大对象的占用情况,比如 HashMap 做缓存未清理,时间长了就会内存溢出,可以把改为弱引用

    10、假设把实例化的数组的变量当成方法参数,当方法执行的时候改变了数组内的元素,那么在方法外,数组元素有发生改变吗?

    改变了,因为传递是对象的引用,操作的是引用所指向的对象

    1、怎么获取 Java 程序使用的内存?堆使用的百分比?

    可以通过 java.lang.Runtime 类中与内存相关方法来获取剩余的内存,总内存及最大堆内存。通过这些方法你也可以获取到堆使用的百分比及堆内存的剩余空间。Runtime.freeMemory() 方法返回剩余空间的字节数,Runtime.totalMemory() 方法总内存的字节数,Runtime.maxMemory() 返回最大内存的字节数。

    2、强引用、软引用、弱引用、虚引用是什么?

    普通的对象引用关系就是强引用

    软引用用于维护一些可有可无的对象。只有在内存不足时,系统则会回收软引用对象,如果回收了软引用对象之后仍然没有足够的内存,才会抛出内存溢出异常。

    弱引用对象相比较软引用,要更加无用一些,它拥有更短的生命周期。当JVM进行垃圾回收时,无论内存是否充足,都会回收被弱引用关联的对象。

    虚引用是一种形同虚设的引用,在现实场景中用的不是很多,它主要用来跟踪对象被垃圾回收的活动。

    3、G1 收集器

    Garbage first 垃圾收集器是目前垃圾收集器理论发展的最前沿成果,相比与 CMS 收集器, G1 收集器两个最突出的改进是:

    1、 基于标记-整理算法,不产生内存碎片。

    2、 可以非常精确控制停顿时间,在不牺牲吞吐量前提下,实现低停顿垃圾回收。G1 收集器避免全区域垃圾收集,它把堆内存划分为大小固定的几个独立区域,并且跟踪这些区域的垃圾收集进度,同时在后台维护一个优先级列表,每次根据所允许的收集时间, 优先回收垃圾最多的区域。区域划分和优先级区域回收机制,确保 G1 收集器可以在有限时间获得最高的垃圾收集效率

    4、运行时常量池溢出的原因?

    String 的 intern 方法是一个本地方法,作用是如果字符串常量池中已包含一个等于此 String 对象的字符串,则返回池中这个字符串的 String 对象的引用,否则将此 String 对象包含的字符串添加到常量池并返回此 String 对象的引用。

    在 JDK6 及之前常量池分配在永久代,因此可以通过 -XX:PermSize 和 -XX:MaxPermSize 限制永久代大小,间接限制常量池。在 while 死循环中调用 intern 方法导致运行时常量池溢出。在 JDK7 后不会出现该问题,因为存放在永久代的字符串常量池已经被移至堆中。

    5、Java最顶级的父类是哪个?

    Object

    6、JVM 监控与分析工具你用过哪些?介绍一下。

    1、 jps,显示系统所有虚拟机进程信息的命令行工具

    2、 jstat,监视分析虚拟机运行状态的命令行工具

    3、 jinfo,查看和调整虚拟机参数的命令行工具

    4、 jmap,生成虚拟机堆内存转储快照的命令行工具

    5、 jhat,显示和分析虚拟机的转储快照文件的命令行工具

    6、 jstack,生成虚拟机的线程快照的命令行工具

    7、 jcmd,虚拟机诊断工具,JDK 7 提供

    8、 jhsdb,基于服务性代理实现的进程外可视化调试工具,JDK 9 提供

    9、 JConsole,基于JMX的可视化监视和管理工具

    10、 jvisualvm,图形化虚拟机使用情况的分析工具

    11、 Java Mission Control,监控和管理 Java 应用程序的工具

    1、 MAT,Memory Analyzer Tool,虚拟机内存分析工具

    2、 vjtools,唯品会的包含核心类库与问题分析工具

    3、 arthas,阿里开源的 Java 诊断工具

    4、 greys,JVM进程执行过程中的异常诊断工具

    5、 GCHisto,GC 分析工具

    6、 GCViewer,GC 日志文件分析工具

    7、 GCeasy,在线版 GC 日志文件分析工具

    8、 JProfiler,检查、监控、追踪 Java 性能的工具

    9、 BTrace,基于动态字节码修改技术(Hotswap)实现的Java程序追踪与分析工具

    下面可以重点体验下:

    JDK 自带的命令行工具方便快捷,不是特别复杂的问题可以快速定位;

    阿里的 arthas 命令行也不错;

    可视化工具 MAT、JProfiler 比较强大。

    7、JVM新生代中为什么要分为Eden和Survivor?

    如果没有Survivor,Eden区每进行一次Minor GC,存活的对象就会被送到老年代。老年代很快被填满,触发Major GC.老年代的内存空间远大于新生代,进行一次Full GC消耗的时间比Minor GC长得多,所以需要分为Eden和Survivor。Survivor的存在意义,就是减少被送到老年代的对象,进而减少Full GC的发生,Survivor的预筛选保证,只有经历16次Minor GC还能在新生代中存活的对象,才会被送到老年代。设置两个Survivor区最大的好处就是解决了碎片化,刚刚新建的对象在Eden中,经历一次Minor GC,Eden中的存活对象就会被移动到第一块survivor space S0,Eden被清空;等Eden区再满了,就再触发一次Minor GC,Eden和S0中的存活对象又会被复制送入第二块survivor space S1(这个过程非常重要,因为这种复制算法保证了S1中来自S0和Eden两部分的存活对象占用连续的内存空间,避免了碎片化的发生)

    8、Parallel Old 收集器(多线程标记整理算法)

    Parallel Old 收集器是Parallel Scavenge的年老代版本,使用多线程的标记-整理算法,在 JDK1.6才开始提供。

    在 JDK1.6 之前,新生代使用 ParallelScavenge 收集器只能搭配年老代的 Serial Old 收集器,只能保证新生代的吞吐量优先,无法保证整体的吞吐量, Parallel Old 正是为了在年老代同样提供吞吐量优先的垃圾收集器, 如果系统对吞吐量要求比较高,可以优先考虑新生代Parallel Scavenge和年老代 Parallel Old 收集器的搭配策略。

    9、Java线程具有五中基本状态

    1、 新建状态(New):当线程对象对创建后,即进入了新建状态,如:Thread t = new MyThread();

    2、 就绪状态(Runnable):当调用线程对象的start()方法(t.start();),线程即进入就绪状态。处于就绪状态的线程,只是说明此线程已经做好了准备,随时等待CPU调度执行,并不是说执行了t.start()此线程立即就会执行;

    3、 运行状态(Running):当CPU开始调度处于就绪状态的线程时,此时线程才得以真正执行,即进入到运行状态。注:就 绪状态是进入到运行状态的唯一入口,也就是说,线程要想进入运行状态执行,首先必须处于就绪状态中;

    4、 阻塞状态(Blocked):处于运行状态中的线程由于某种原因,暂时放弃对CPU的使用权,停止执行,此时进入阻塞状态,直到其进入到就绪状态,才 有机会再次被CPU调用以进入到运行状态。

    根据阻塞产生的原因不同,阻塞状态又可以分为三种:

    1、 等待阻塞:运行状态中的线程执行wait()方法,使本线程进入到等待阻塞状态;

    2、 同步阻塞:线程在获取synchronized同步锁失败(因为锁被其它线程所占用),它会进入同步阻塞状态;

    3、 其他阻塞:通过调用线程的sleep()或join()或发出了I/O请求时,线程会进入到阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入就绪状态。

    5、 死亡状态(Dead):线程执行完了或者因异常退出了run()方法,该线程结束生命周期。

    10、双亲委派模型是什么?

    类加载器具有等级制度但非继承关系,以组合的方式复用父加载器的功能。双亲委派模型要求除了顶层的启动类加载器外,其余类加载器都应该有自己的父加载器。

    一个类加载器收到了类加载请求,它不会自己去尝试加载,而将该请求委派给父加载器,每层的类加载器都是如此,因此所有加载请求最终都应该传送到启动类加载器,只有当父加载器反馈无法完成请求时,子加载器才会尝试。

    类跟随它的加载器一起具备了有优先级的层次关系,确保某个类在各个类加载器环境中都是同一个,保证程序的稳定性。

    更多Java 面试题70道

    01、java中有几种方法可以实现一个线程?

    02、Java 中的 HashSet,内部是如何工作的?

    03、redux的工作流程?

    04、String类的常用方法有那些?

    05、请你谈谈对OOM的认识

    06、ParNew 垃圾收集器(Serial+多线程)

    07、Java 中如何格式化一个日期?如格式化为 ddMMyyyy 的形式?

    08、什么是Java虚拟机

    09、Java 中的同步集合与并发集合有什么区别?

    10、适配器模式和代理模式之前有什么不同?

    11、说说G1垃圾收集器的工作原理

    12、JRE、JDK、JVM 及 JIT 之间有什么不同?

    13、当父类引用指向子类对象的时候,子类重写了父类方法和属性,那么当访问属性的时候,访问是谁的属性?调用方法时,调用的是谁的方法?

    14、堆溢出的原因?

    15、说一下 runnable 和 callable 有什么区别

    16、JVM 类加载机制

    17、怎么打破双亲委派模型?

    18、垃圾收集算法

    19、你有哪些手段来排查 OOM 的问题?

    20、假设把实例化的数组的变量当成方法参数,当方法执行的时候改变了数组内的元素,那么在方法外,数组元素有发生改变吗?

    21、怎么获取 Java 程序使用的内存?堆使用的百分比?

    22、强引用、软引用、弱引用、虚引用是什么?

    23、G1 收集器

    24、运行时常量池溢出的原因?

    25、Java最顶级的父类是哪个?

    26、JVM 监控与分析工具你用过哪些?介绍一下。

    27、JVM新生代中为什么要分为Eden和Survivor?

    28、Parallel Old 收集器(多线程标记整理算法)

    09、Java线程具有五中基本状态

    30、双亲委派模型是什么?

    31、什么是方法内联?

    32、你对线程优先级的理解是什么?

    33、Java是否需要开发人员回收内存垃圾吗?

    34、说说Java 垃圾回收机制

    35、volatile 变量和 atomic 变量有什么不同?

    36、JVM 内存区域

    37、JVM 有哪些运行时内存区域?

    38、Spring中Bean的作用域有哪些?

    39、String str=”aaa”,与String str=new String(“aaa”)一样吗?

    40、什么是建造者模式

    41、为什么HashMap中String、Integer这样的包装类适合作为K?

    42、常见的计算机网络协议有那些?

    43、一个线程运行时发生异常会怎样?

    44、遍历一个 List 有哪些不同的方式?每种方法的实现原理是什么?Java 中 List 遍历的最佳实践是什么?

    45、StringBuffer,Stringbuilder有什么区别?

    46、什么是线程池?

    47、JDBC操作的步骤

    48、说一下 JVM 调优的工具?

    49、JVM 提供的常用工具

    50、SynchronizedMap和ConcurrentHashMap有什么区别?

    51、有哪些类加载器?

    52、mixin、hoc、render props、react-hooks的优劣如何?

    53、什么是Executors?

    54、如何判断对象是否是垃圾?

    55、volatile 类型变量提供什么保证?

    56、在 Java 程序中怎么保证多线程的运行安全?

    57、线上常用的 JVM 参数有哪些?

    58、volatile 关键字的作用

    59、解释何时在Tomcat使用SSL ?

    60、使用js获取一个表单元素

    61、Sql优化有那些方法?

    62、用 Java 写一个线程安全的单例模式(Singleton)?

    63、在 Java 中,对象什么时候可以被垃圾回收?

    64、线程的 run()和 start()有什么区别?

    65、重排序实际执行的指令步骤

    66、Java中异常分为哪两种?

    67、什么是并发容器的实现?

    68、创建线程的四种方式

    69、Java 中,直接缓冲区与非直接缓冲器有什么区别?

    70、poll() 方法和 remove() 方法的区别?

    如果不背 Java面试题的答案,肯定面试会挂!

    这套Java面试题大全,希望对大家有帮助哈~

    博主已将以下这些面试题整理成了一个Java面试手册,是PDF版的

    展开全文
  • java面试题-2018最新面试题java面试题-2018最新面试题java面试题-2018最新面试题java面试题-2018最新面试题
  • java 面试题基础题,sql 面试题 带答案
  • JAVA面试题大全(含答案)JAVA面试题大全(含答案)JAVA面试题大全(含答案)
  • Java面试题及答案整理(2022最新版)

    千次阅读 2021-12-17 17:25:45
    Java面试题及答案(2022版),适用于应届生、用工作经验的程序员,每道都是认真筛选出的高频面试题,助力大家能找到满意的工作! 下载链接:全部面试题及答案PDF 1.什么是B/S架构?什么是C/S架构 B/S(Browser/Server),...
  • 另外我把所有Java相关的面试题和答案都整理出来了,需要的私信,即可免费获取哦! 6. EnumSet是什么? 7. 创建String对象的不同方式有哪些? 8. 为何Map接口不继承Collection接口? 9. HashMap和Hashtable的区别 10...
  • Java面试笔试大汇总(最全+详细答案) Java面试笔试大汇总(最全+详细答案)
  • 2020最新Java常见面试题及答案

    万次阅读 多人点赞 2019-10-26 15:53:35
    Java最新常见面试题 + 答案汇总 1、面试题模块汇总 面试题包括以下十九个模块:Java 基础、容器、多线程、反射、对象拷贝、Java Web 模块、异常、网络、设计模式、Spring/Spring MVC、Spring Boot/Spring Cloud、...
  • 下面给大家带来的是一个2020年最新的腾讯java面试题,一起来看看腾讯java面试都会问些什么问题吧!希望下面的内容可以帮助到大家呢!腾讯,一面,面试时长大约花费了五十分钟左右,下面是具体的面试题。一、面试题...
  • Java面试题全集,含(上)(中)(下)合集。原文地址:http://blog.csdn.net/jackfrued/article/details/44931137
  • 最全华为java面试题(含答案详细讲解),面试套路,流程,技术点的宽度,广度都有基本的方向,但愿对各位有所帮助
  • Java面试题Java面试题Java面试题Java面试题Java面试题Java面试题Java面试题Java面试题
  • 文章目录Java集合/泛型面试题1、ArrayList和linkedList的区别2、 HashMap和HashTable的区别3、Collection包结构,与Collections的区别4、泛型常用特点(待补充)5、说说List、Set、Map、三者的区别?6、Array与...
  • Java 最常见的 200+ 面试题:面试必备

    万次阅读 多人点赞 2019-07-10 17:41:50
    这份面试清单是从我 2015 年做了 TeamLeader 之后开始收集的,一方面是给公司招聘用,另一方面是想用它来挖掘在 Java 技术栈中,还有那些知识点是我不知道的,我想找到这些技术盲点,然后修复它,以此来提高自己的...
  • 拼多多一面 首先自我介绍 参加过哪些项目 并发编程三要素? 实现可见性的方法有哪些?...一面面试题答案: 拼多多二面 自我介绍 什么是工厂模式? 如何实现单链表的增删操作? 让我说意思JVM的分为哪几块
  • JAVA经典面试题附答案(持续更新版)

    万次阅读 多人点赞 2019-01-18 01:31:16
    JAVA基础 JAVA中的几种基本类型,各占用多少字节? 下图单位是bit,非字节 1B=8bit String能被继承吗?为什么? 不可以,因为String类有final修饰符,而final修饰的类是不能被继承的,实现细节不允许改变。平常我们...
  • 100道最新Java面试题,常见面试题及答案汇总

    万次阅读 多人点赞 2021-01-28 15:32:15
    小编特意整理了100道Java面试题,送给大家,希望大家都能顺利通过面试,拿下高薪。赶紧码住吧~~ Q1:Java内部类和子类之间有什么区别? 答案:内部类是指在一个外部类的内部再定义一个类,内部类对外部类有访问权限...
  • JAVA】2022年JAVA高级面试题汇总

    千次阅读 2022-01-12 01:17:56
    java面试题汇总(上)_Oliverfly1的博客-CSDN博客_java面试题 史上最全的中高级 JAVA 工程师面试题汇总有哪些? - 知乎 DevBooks: 2021面试题,Java面试题、JVM面试题、多线程面试题、并发编程、设计模式面试题、...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 401,839
精华内容 160,735
关键字:

java最新面试题

java 订阅
友情链接: 相位匹配角.rar