码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • Java中级面试题及答案(120道Java中级面试题大汇总)


    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() otify() otifyAll()方法可以用于线程间通信关于资源的锁的状态。

    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();
                    }
                }
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37

    注意:上面用到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版的

    先自我介绍一下,小编13年上师交大毕业,曾经在小公司待过,去过华为OPPO等大厂,18年进入阿里,直到现在。深知大多数初中级java工程师,想要升技能,往往是需要自己摸索成长或是报班学习,但对于培训机构动则近万元的学费,着实压力不小。自己不成体系的自学效率很低又漫长,而且容易碰到天花板技术停止不前。因此我收集了一份《java开发全套学习资料》送给大家,初衷也很简单,就是希望帮助到想自学又不知道该从何学起的朋友,同时减轻大家的负担。添加下方名片,即可获取全套学习资料哦

  • 相关阅读:
    电源硬件设计----电源组件基本知识
    JS生成随机字符串的多种方法
    Gof23设计模式之状态模式
    Linux 下使用 Docker 安装 MySQL
    【漏洞分析】KaoyaSwap 安全事件分析
    Unity中Shader的深度写入ZWrite
    穿透 wsl 和 ssh, 新版本 neovim 跨设备任意复制,copy anywhere!
    P4491 [HAOI2018] 染色
    使用MySQL和SQL Server生成最近七周和最近七个月的日期数据
    LeetCode高频题34. 在排序数组中查找元素的第一个和最后一个位置
  • 原文地址:https://blog.csdn.net/Ajekseg/article/details/126105880
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号