Java面试题100道整理及答案

1 阅读26分钟

一、Java基础

  1. Java 17中的sealed类和record类的作用和区别?  答案:sealed:限制继承关系,通过permits指定允许的子类。示例代码:public sealed class Shape permits Circle, Square { ... } ;record:不可变数据类,自动生成equals()hashCode()toString()。示例代码:public record User(String name, int age) { }
  2. StringStringBufferStringBuilder的区别?  答案: | 类 | 可变性 | 线程安全 | 性能 | | --- | --- | --- | --- | | String | 不可变 | 安全 | 低 | | StringBuffer | 可变 | 安全 | 中(同步) | | StringBuilder | 可变 | 不安全 | 高 |
  3. equals()==的区别?如何重写equals()  答案:==:比较对象内存地址(基本类型比较值)。equals() :默认同==,可重写为逻辑相等(如字符串内容)。重写需满足:自反性、对称性、传递性、一致性。始终重写hashCode()以保证哈希一致性。
  4. 什么是B/S架构?什么是C/S架构 答案:B/S(Browser/Server),浏览器/服务器程序;C/S(Client/Server),客户端/服务端,桌面应用程序。
  5. 你所知道网络协议有那些?  答案:HTTP:超文本传输协议;FTP:文件传输协议;SMPT:简单邮件协议;TELNET:远程终端协议;POP3:邮件读取协议。
  6. Java都有那些开发平台?  答案:JAVA SE:主要用在客户端开发;JAVA EE:主要用在web应用程序开发;JAVA ME:主要用在嵌入式应用程序开发。
  7. 什么是JVM?java虚拟机包括什么?  答案:JVM:java虚拟机,运用硬件或软件手段实现的虚拟的计算机,Java虚拟机包括:寄存器,堆栈,处理器。
  8. Java是否需要开发人员回收内存垃圾吗?  答案:大多情况下是不需要的。Java提供了一个系统级的线程来跟踪内存分配,不再使用的内存区将会自动回收。
  9. 什么是JDK?什么是JRE?  答案:JDK:java development kit,java开发工具包,是开发人员所需要安装的环境;JRE:java runtime environment,java运行环境,java程序运行所需要安装的环境。
  10. 什么是数据结构?  答案:计算机保存,组织数据的方式。
  11. Java的数据结构有那些?  答案:线性表(ArrayList)、链表(LinkedList)、栈(Stack)、队列(Queue)、图(Map)、树(Tree)。
  12. 什么是OOP?  答案:面向对象编程。
  13. 什么是面向对象?  答案:世间万物都可以看成一个对象。每个物体包括动态的行为和静态的属性,这些就构成了一个对象。
  14. 类与对象的关系?  答案:类是对象的抽象,对象是类的具体,类是对象的模板,对象是类的实例。
  15. Java中有几种数据类型 答案:整形:byte,short,int,long;浮点型:float,double;字符型:char;布尔型:boolean。
  16. 什么是隐式转换,什么是显式转换 答案:显示转换就是类型强转,把一个大类型的数据强制赋值给小类型的数据;隐式转换就是大范围的变量能够接受小范围的数据;隐式转换和显式转换其实就是自动类型转换和强制类型转换。
  17. Char类型能不能转成int类型?能不能转化成string类型,能不能转成double类型 答案:Char在java中也是比较特殊的类型,它的int值从1开始,一共有2的16次方个数据;Char<int<long<float<double;Char类型可以隐式转成int,double类型,但是不能隐式转换成string;如果char类型转成byte,short类型的时候,需要强转。
  18. 什么是拆装箱?  答案:拆箱:把包装类型转成基本数据类型;装箱:把基本数据类型转成包装类型。
  19. Java中的包装类都是那些?  答案:byteByteshortShortintIntegerlongLongfloatFloatdoubleDoublecharCharacterbooleanBoolean
  20. 一个java类中包含那些内容?  答案:属性、方法、内部类、构造方法、代码块。
  21. 例如: if(a+1.0=4.0),这样做好吗?  答案:不好,因为计算机在浮点型数据运算的时候,会有误差,尽量在布尔表达式中不使用浮点型数据(if,while,switch中判断条件不使用浮点型)。
  22. 那针对浮点型数据运算出现的误差的问题,你怎么解决?  答案:使用Bigdecimal类进行浮点型数据的运算。
  23. ++i与i++的区别 答案:++i:先赋值,后计算;i++:先计算,后赋值。
  24. 程序的结构有那些?  答案:顺序结构、选择结构、循环结构。
  25. 数组实例化有几种方式?  答案:静态实例化:创建数组的时候已经指定数组中的元素,如int[] a = new int[]{1,3,3};动态实例化:实例化数组的时候,只指定了数组程度,数组中所有元素都是数组类型的默认值。
  26. Java中各种数据默认值 答案:Byteshortintlong默认是都是0;Boolean默认值是falseChar类型的默认值是''Floatdouble类型的默认是0.0;对象类型的默认值是null
  27. Java常用包有那些?  答案:Java.langJava.ioJava.sqlJava.utilJava.awtJava.netJava.math
  28. Java最顶级的父类是哪个?  答案:Object
  29. Object类常用方法有那些?  答案:EqualsHashcodetoStringwaitnotifyclonegetClass
  30. java中有没有指针?  答案:有指针,但是隐藏了,开发人员无法直接操作指针,由jvm来操作指针。
  31. java中是值传递引用传递?  答案:理论上说,java都是引用传递,对于基本数据类型,传递是值的副本,而不是值本身。对于对象类型,传递是对象的引用,当在一个方法操作操作参数的时候,其实操作的是引用所指向的对象。
  32. 假设把实例化的数组的变量当成方法参数,当方法执行的时候改变了数组内的元素,那么在方法外,数组元素有发生改变吗?  答案:改变了,因为传递是对象的引用,操作的是引用所指向的对象。
  33. 实例化数组后,能不能改变数组长度呢?  答案:不能,数组一旦实例化,它的长度就是固定的。
  34. 假设数组内有5个元素,如果对数组进行反序,该如何做?  答案:创建一个新数组,从后到前循环遍历每个元素,将取出的元素依次顺序放入新数组中。
  35. 形参与实参 答案:形参是方法定义时的参数,实参是方法调用时传递的参数。
  36. Java中的泛型是什么?它有什么作用?  答案:Java中的泛型是一种参数化类型,它允许使用一个占位符来代表各种类型。它的作用是在编译时检测类型的一致性,避免了类型转换错误,并提高了代码的重用性。
  37. Java中的类和对象有什么区别?  答案:类是描述对象的模板,对象是类的实例。类定义了对象的属性和行为,而对象则具体地拥有这些属性和行为。
  38. Java中的封装是什么?它有什么作用?  答案:封装是把过程和数据包围起来,对数据的访问只能通过已定义的界面。封装可以隐藏内部细节,提供对外部的安全接口,并实现代码的重用和维护。
  39. Java是否支持多继承?如果不支持,它是如何实现类似功能的?  答案:Java不支持多继承,一个类只能继承一个父类。但是Java支持接口的多实现,实现了多继承的效果。
  40. Java中的构造方法有什么作用?  答案:构造方法是用于在创建对象时初始化对象的状态。它的名称与类名相同,没有返回类型。
  41. 接口的意义是什么?  答案:接口的意义可以用三个词来概括:规范、扩展、回调。接口定义了一组方法的规范,实现接口的类必须遵守这些规范。接口可以作为类型使用,实现多态性。接口还可以用于实现回调机制。
  42. Java中的异常处理机制是怎样的?  答案:Java中的异常处理机制通过try-catch-finally语句块实现。try块中放置可能抛出异常的代码,catch块用于捕获并处理异常,finally块则无论是否发生异常都会执行。
  43. Java中的集合框架是什么?它包含哪些主要的接口和类?  答案:Java集合框架是一个为表示和操作集合而设计的统一架构,它包含了ListSetQueueMap等主要接口,以及ArrayListLinkedListHashSetHashMap等实现类。
  44. Java中的线程状态有哪些?  答案:Java中的线程状态主要有五种:新建(NEW)、就绪(RUNNABLE)、阻塞(BLOCKED)、等待(WAITING)、超时等待(TIMED_WAITING)和终止(TERMINATED)。
  45. 什么是Java中的线程同步?如何实现?  答案:线程同步是多个线程之间访问共享资源时的一种协调机制,它保证了在并发环境下,对共享资源的访问是有序和一致的。Java中可以通过synchronized关键字或Lock接口实现线程同步。
  46. Java中的垃圾回收机制是怎样的?  答案:Java中的垃圾回收机制自动管理内存,当对象不再被引用时,垃圾回收器会自动回收其占用的内存。Java程序员无需手动释放内存。
  47. 什么是Java中的反射机制?它有哪些应用场景?  答案:反射机制是指在运行时能够获取类的信息并动态地调用类的方法或属性。Java中的反射机制通过Class类实现。反射机制为Java程序提供了强大的动态性。通过反射,程序可以在运行时加载类、创建对象、调用方法等。这使得Java程序能够更加灵活地应对各种复杂场景,如框架设计、插件机制等。
  48. 什么是Java中的内部类?它有哪些种类?  答案:Java中的内部类是指定义在一个类内部的类。它主要有四种类型:静态内部类、成员内部类、局部内部类和匿名内部类。
  49. Java中的枚举类型是什么?它有哪些特点?  答案:Java中的枚举类型是一种特殊的类,用于表示固定数量的常量值。枚举类型具有类型安全、易于理解和使用的特点。
  50. Java中的泛型擦除是什么?它有哪些影响?  答案:泛型擦除是指在编译期间,Java编译器将泛型信息擦除,生成没有泛型信息的字节码文件。泛型擦除是Java泛型实现的一种方式。

二、并发编程

  1. synchronizedReentrantLock的底层实现差异?  答案:synchronized:JVM层面通过monitorentermonitorexit指令实现,依赖对象头中的Mark Word。ReentrantLock:基于AQS(AbstractQueuedSynchronizer),通过CAS和CLH队列实现锁竞争,支持公平锁和非公平锁。
  2. ThreadLocal的原理和内存泄漏问题如何避免?  答案:原理 :每个线程持有独立的ThreadLocalMap,Key为弱引用的ThreadLocal对象。内存泄漏 :Key被回收后,Value仍被强引用,需调用remove()手动清理。
  3. 如何实现高并发下的无锁编程?  答案:使用Atomic类(如AtomicInteger)的CAS操作;基于Unsafe类直接操作内存;JDK 8+的LongAdder替代AtomicLong,减少CAS竞争。
  4. Java中实现多线程有几种方法 答案:继承Thread类;实现Runnable接口;ExecutorSenviceCallableFuture有返回值线程;基于线程池的方式。
  5. 如何停止一个正在运行的线程 答案:可以使用interrupt()方法中断线程,但需要在线程内部处理中断信号;也可以通过设置标志位来控制线程的运行。
  6. notify()notifyAll()有什么区别?  答案:notify()随机唤醒一个在该对象上等待的线程;notifyAll()唤醒所有在该对象上等待的线程。
  7. sleep()wait()有什么区别?  答案:sleep()Thread类的方法,会让当前线程暂停执行指定的时间,不会释放对象的锁;wait()Object类的方法,会让当前线程进入等待状态,同时释放对象的锁,直到其他线程调用notify()notifyAll()方法唤醒它。
  8. volatile是什么?可以保证有序性吗?  答案:volatile是一个关键字,用于修饰变量,保证变量的可见性,即当一个变量被声明为volatile时,它会保证对该变量的写操作会立即刷新到主内存中,而读操作会从主内存中读取最新的值。volatile不能保证变量操作的原子性和有序性。
  9. Thread类中的start()run()方法有什么区别?  答案:start()方法用于启动一个新线程,它会调用run()方法;run()方法是线程的执行体,包含了线程要执行的代码。如果直接调用run()方法,并不会启动新线程,而是在当前线程中执行run()方法中的代码。
  10. 为什么waitnotifynotifyAll这些方法不在thread类里面?  答案:waitnotifynotifyAllObject类的方法,因为这些方法是用于线程间的通信和同步,而对象是线程间共享的资源,所以这些方法定义在Object类中,以便所有对象都可以使用。
  11. 为什么waitnotify方法要在同步块中调用?  答案:waitnotify方法用于线程间的同步和通信,必须在同步块中调用,因为在调用这些方法时,线程必须持有对象的锁。如果不在同步块中调用,会抛出IllegalMonitorStateException异常。
  12. Java中interrupted()isInterrupted()方法的区别?  答案:interrupted()是一个静态方法,它会检查当前线程的中断状态,并清除中断标志;isInterrupted()是一个实例方法,它会检查调用该方法的线程的中断状态,但不会清除中断标志。
  13. Java中synchronizedReentrantLock有什么不同?  答案:synchronized是Java的关键字,是JVM层面的实现,使用简单,自动释放锁;ReentrantLock是一个类,是基于AQS实现的,功能更强大,如支持公平锁、可中断锁、条件变量等,但需要手动释放锁。
  14. 有三个线程T1,T2,T3,如何保证顺序执行?  答案:可以使用join()方法、CountDownLatchCyclicBarrier等方式来保证线程的顺序执行。例如,使用join()方法:
public class ThreadOrder { 
    public static void main(String[] args) throws InterruptedException { 
        Thread t1 = new Thread(() -> { 
            System.out.println("T1"); 
        }); 
        Thread t2 = new Thread(() -> { 
            try { 
                t1.join(); 
            } catch (InterruptedException e) { 
                e.printStackTrace(); 
            } 
            System.out.println("T2"); 
        }); 
        Thread t3 = new Thread(() -> { 
            try { 
                t2.join(); 
            } catch (InterruptedException e) { 
                e.printStackTrace(); 
            } 
            System.out.println("T3"); 
        }); 
        t1.start(); 
        t2.start(); 
        t3.start(); 
    } 
}
  1. SynchronizedMapConcurrentHashMap有什么区别?  答案:SynchronizedMapCollections类的静态方法返回的一个同步的Map,它是通过在每个方法上使用synchronized关键字来实现同步的,性能较低;ConcurrentHashMap是Java并发包中的类,它采用分段锁或CAS等技术来实现并发访问,性能较高。
  2. 什么是线程安全 答案:线程安全是指在多线程环境下,对共享资源的访问不会导致数据不一致或其他并发问题。一个类或方法如果在多线程环境下能够正确地工作,就被称为线程安全的。
  3. Thread类中的yield()方法有什么作用?  答案:yield()方法是Thread类的静态方法,它会让当前线程放弃CPU的执行权,将CPU让给其他线程,但具体是否让出CPU由操作系统决定。
  4. Java线程池中submit()execute()方法有什么区别?  答案:execute()方法是Executor接口的方法,用于执行Runnable任务,没有返回值;submit()方法是ExecutorService接口的方法,它可以执行RunnableCallable任务,并且会返回一个Future对象,用于获取任务的执行结果。
  5. 说一说自己对于synchronized关键字的了解 答案:synchronized关键字是Java中用于实现线程同步的关键字,它可以修饰方法或代码块。当修饰方法时,称为同步方法,同一时间只有一个线程可以访问该方法;当修饰代码块时,称为同步代码块,同一时间只有一个线程可以执行该代码块。synchronized关键字是基于对象的锁机制实现的,每个对象都有一个锁,线程在进入同步方法或同步代码块时需要获取对象的锁,执行完后释放锁。
  6. 说说自己是怎么使用synchronized关键字,在项目中用到了吗,synchronized关键字最主要的三种使用方式?  答案:在项目中,synchronized关键字常用于保护共享资源,避免多线程并发访问导致的数据不一致问题。synchronized关键字最主要的三种使用方式:
  7. 同步实例方法:修饰实例方法,锁是当前对象实例。
public synchronized void method() { 
    // 同步代码 
}
  • 同步静态方法:修饰静态方法,锁是当前类的Class对象。
public static synchronized void staticMethod() { 
    // 同步代码 
}
  • 同步代码块:指定锁对象。
public void method() { 
    synchronized (this) { 
        // 同步代码 
    } 
}

三、JVM

  1. JVM内存模型(JMM)与硬件内存模型的联系?  答案:JMM :定义线程与主内存的交互规则(如volatile的可见性、synchronized的原子性)。硬件模型 :通过CPU缓存一致性协议(如MESI)实现内存可见性。
  2. G1垃圾回收器的工作流程?  答案:初始标记(STW) :标记GC Roots直接关联对象;并发标记 :遍历对象图;最终标记(STW) :处理SATB(Snapshot-At-The-Beginning)记录;筛选回收 :按Region回收垃圾,优先回收价值高的Region。
  3. 如何排查OOM(OutOfMemoryError)?  答案:使用-XX:+HeapDumpOnOutOfMemoryError生成堆转储文件;通过MAT或VisualVM分析堆转储,定位大对象或内存泄漏;检查代码中的静态集合、未关闭资源、缓存策略。
  4. JVM堆的基本结构。  答案:JVM堆主要分为新生代和老年代,新生代又分为Eden区、Survivor区(S0和S1)。新创建的对象一般会分配在Eden区,当Eden区满时,会触发Minor GC,存活的对象会被移动到Survivor区。当对象经过多次Minor GC仍然存活时,会被移动到老年代。当老年代满时,会触发Full GC。
  5. JVM的垃圾算法有哪几种?CMS垃圾回收的基本流程?  答案:JVM的垃圾回收算法主要有标记-清除算法、标记-整理算法、复制算法、分代收集算法。CMS(Concurrent Mark Sweep)垃圾回收器是一种以获取最短回收停顿时间为目标的收集器,它的基本流程如下:
  6. 初始标记(STW):标记GC Roots能直接关联到的对象。
  7. 并发标记:从GC Roots的直接关联对象开始遍历整个对象图,这个过程耗时较长,但可以与用户线程并发执行。
  8. 重新标记(STW):修正并发标记期间因用户线程继续运作而导致标记产生变动的那一部分对象的标记记录。
  9. 并发清除:清除标记为垃圾的对象,这个过程可以与用户线程并发执行。
  10. JVM有哪些常用启动参数可以调整,描述几个?  答案:常用的JVM启动参数有:
  11. -Xms:设置堆的初始大小。
  12. -Xmx:设置堆的最大大小。
  13. -XX:+UseG1GC:使用G1垃圾回收器。
  14. -XX:MetaspaceSize:设置元空间的初始大小。
  15. -XX:MaxMetaspaceSize:设置元空间的最大大小。
  16. 如何查看JVM的内存使用情况?  答案:可以使用jstatjmapVisualVMMAT等工具来查看JVM的内存使用情况。例如,使用jstat命令查看堆内存的使用情况:jstat -gc <pid> <interval> <count>,其中<pid>是Java进程的ID,<interval>是统计间隔时间(单位:毫秒),<count>是统计次数。
  17. Java程序是否会内存溢出,内存泄露情况发生?举几个例子。  答案:Java程序可能会发生内存溢出和内存泄露情况。内存溢出是指程序在申请内存时,没有足够的内存空间供其使用;内存泄露是指程序中存在一些对象,这些对象不再被使用,但由于某些原因无法被垃圾回收器回收,导致内存占用不断增加。以下是一些内存溢出和内存泄露的例子:
  18. 内存溢出:创建大量对象,导致堆内存不足;使用StringBuilderStringBuffer不断追加字符串,导致内存占用过大。
  19. 内存泄露:静态集合类中持有对象的引用,导致对象无法被回收;ThreadLocal使用不当,导致对象无法被回收。
  20. 你常用的JVM配置和调优参数都有哪些?分别什么作用?  答案:常用的JVM配置和调优参数如下:
  21. -Xms-Xmx:设置堆的初始大小和最大大小,避免堆频繁扩容和收缩,提高性能。
  22. -XX:+UseG1GC:使用G1垃圾回收器,G1是一种面向服务器端应用的垃圾回收器,具有较低的停顿时间和较高的吞吐量。
  23. -XX:MetaspaceSize-XX:MaxMetaspaceSize:设置元空间的初始大小和最大大小,避免元空间频繁扩容。
  24. -XX:+HeapDumpOnOutOfMemoryError:当发生内存溢出时,自动生成堆转储文件,方便后续分析。
  25. JVM的内存结构?  答案:JVM的内存结构主要包括以下几个部分:
  26. 程序计数器:记录当前线程执行的字节码的行号。
  27. 虚拟机栈:每个线程都有一个独立的虚拟机栈,用于存储局部变量表、操作数栈、动态链接、方法出口等信息。
  28. 本地方法栈:与虚拟机栈类似,用于执行本地方法。
  29. 堆:是JVM中最大的一块内存区域,用于存储对象实例。
  30. 方法区:用于存储类的元数据、常量、静态变量等信息。在JDK 8及以后,方法区被元空间取代。

四、框架(Spring/Spring Boot)

  1. Spring Bean的生命周期?  答案:实例化 → 属性填充 → BeanNameAware → BeanFactoryAware → ApplicationContextAware → PostConstruct → InitializingBean → 自定义init方法 → 使用 → PreDestroy → DisposableBean → 自定义destroy方法。
  2. Spring Boot自动配置的实现原理?  答案:通过@EnableAutoConfiguration加载META-INF/spring.factories中的配置类;利用条件注解(如@ConditionalOnClass)按需加载Bean。
  3. Spring事务失效的常见场景?  答案:方法非public → 事务注解不生效;自调用(同一类中调用带@Transactional的方法)→ 代理失效;异常未被抛出或捕获后未回滚 → 需配置rollbackFor
  4. Spring框架中IOC和AOP的概念和作用?  答案:IOC(Inversion of Control)即控制反转,是一种设计思想,将对象的创建和依赖关系的管理交给Spring容器,而不是由对象本身来管理。IOC的作用是降低对象之间的耦合度,提高代码的可维护性和可测试性。AOP(Aspect Oriented Programming)即面向切面编程,是一种编程范式,通过将横切关注点(如日志记录、事务管理等)从业务逻辑中分离出来,提高代码的复用性和可维护性。
  5. Spring中Bean的作用域有哪些?  答案:Spring中Bean的作用域主要有以下几种:
  6. singleton:单例模式,Spring容器中只会创建一个Bean实例。
  7. prototype:原型模式,每次从Spring容器中获取Bean时,都会创建一个新的实例。
  8. request:在一次HTTP请求中,只会创建一个Bean实例。
  9. session:在一个HTTP会话中,只会创建一个Bean实例。
  10. global session:在全局会话中,只会创建一个Bean实例。
  11. Spring Boot的核心注解有哪些?  答案:Spring Boot的核心注解有:
  12. @SpringBootApplication:是一个组合注解,包含了@SpringBootConfiguration@EnableAutoConfiguration@ComponentScan,用于启动Spring Boot应用。
  13. @EnableAutoConfiguration:启用Spring Boot的自动配置功能。
  14. @ComponentScan:扫描指定包及其子包下的组件。
  15. @Configuration:用于定义配置类,相当于传统的XML配置文件。
  16. @Bean:用于在配置类中定义Bean。
  17. Spring Boot如何进行配置文件的加载?  答案:Spring Boot会自动加载application.propertiesapplication.yml配置文件,也可以通过@PropertySource注解指定其他配置文件。配置文件的加载顺序如下:
  18. 命令行参数。
  19. SPRING_APPLICATION_JSON中的属性。
  20. ServletConfig初始化参数。
  21. ServletContext初始化参数。
  22. JNDI属性(java:comp/env)。
  23. Java系统属性(System.getProperties())。
  24. 操作系统环境变量。
  25. RandomValuePropertySource生成的random.*属性。
  26. 应用程序以外的application.propertiesapplication.yml文件。
  27. 打包在应用程序内的application.propertiesapplication.yml文件。
  28. 应用程序以外的application-{profile}.propertiesapplication-{profile}.yml文件。
  29. 打包在应用程序内的application-{profile}.propertiesapplication-{profile}.yml文件。
  30. @PropertySource注解指定的属性源。
  31. 默认属性(通过SpringApplication.setDefaultProperties指定)。
  32. Spring Boot如何进行日志配置?  答案:Spring Boot默认使用Logback作为日志框架,可以通过在application.propertiesapplication.yml配置文件中进行日志配置,也可以使用自定义的日志配置文件。例如,在application.properties中配置日志级别:logging.level.root=INFO
  33. Spring Boot如何进行数据库连接配置?  答案:Spring Boot可以通过在application.propertiesapplication.yml配置文件中配置数据库连接信息,例如:
spring.datasource.url=jdbc:mysql://localhost:3306/test
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

也可以使用@Configuration注解和DataSource Bean来进行数据库连接配置。 90. Spring Boot如何进行缓存配置?  答案:Spring Boot支持多种缓存技术,如Redis、Ehcache等。可以通过在application.propertiesapplication.yml配置文件中配置缓存相关信息,也可以使用@EnableCaching注解启用缓存功能,并使用@Cacheable@CachePut@CacheEvict等注解来管理缓存。例如,使用Redis作为缓存:

spring.cache.type=redis
spring.redis.host=localhost
spring.redis.port=6379

五、分布式与微服务

  1. CAP理论中,为什么只能满足两个特性?  答案:一致性(C) :所有节点数据一致;可用性(A) :每个请求都能响应;分区容错性(P) :允许网络分区。网络分区必然存在(P必须满足),因此需在C和A之间权衡(如CP的ZooKeeper、AP的Eureka)。
  2. 什么是微服务架构?它有哪些优缺点?  答案:微服务架构是一种将单个应用程序拆分成多个小型、自治的服务的架构风格,每个服务都可以独立开发、部署和扩展。微服务架构的优点包括:可扩展性强、可维护性高、技术栈灵活、团队协作高效等;缺点包括:服务间通信复杂、运维难度大、分布式事务处理困难等。
  3. 常见的微服务框架有哪些?  答案:常见的微服务框架有Spring Cloud、Dubbo、Istio等。Spring Cloud是基于Spring Boot构建的一套微服务框架,提供了服务发现、配置管理、路由、负载均衡等功能;Dubbo是阿里巴巴开源的高性能、轻量级的Java RPC框架,用于构建分布式服务;Istio是一个开源的服务网格,提供了流量管理、策略执行、可观测性等功能。
  4. 什么是服务发现?常见的服务发现组件有哪些?  答案:服务发现是指在分布式系统中,服务提供者将自己的服务信息注册到服务注册中心,服务消费者从服务注册中心获取服务提供者的信息,从而实现服务之间的调用。常见的服务发现组件有Eureka、Consul、ZooKeeper等。
  5. 什么是配置中心?常见的配置中心有哪些?  答案:配置中心是一种用于集中管理应用程序配置的组件,它可以实现配置的动态更新、版本管理、权限控制等功能。常见的配置中心有Spring Cloud Config、Apollo、Nacos等。
  6. 什么是网关?常见的网关有哪些?  答案:网关是一种位于客户端和服务端之间的中间层,它可以实现请求的路由、过滤、限流、认证等功能。常见的网关有Spring Cloud Gateway、Zuul、Nginx等。
  7. 什么是分布式事务?常见的分布式事务解决方案有哪些?  答案:分布式事务是指在分布式系统中,涉及多个服务或数据库的事务。常见的分布式事务解决方案有两阶段提交(2PC)、三阶段提交(3PC)、TCC(Try-Confirm-Cancel)、消息事务等。
  8. 什么是容器化技术?常见的容器化技术有哪些?  答案:容器化技术是一种将应用程序及其依赖打包成一个独立的容器的技术,容器可以在不同的环境中运行,实现了应用程序的隔离和可移植性。常见的容器化技术有Docker、Kubernetes等。
  9. 什么是DevOps?它有哪些核心实践?  答案:DevOps是一种将开发(Development)和运维(Operations)结合起来的文化、理念和实践,旨在实现软件开发和部署的自动化、快速迭代和持续交付。DevOps的核心实践包括持续集成(CI)、持续交付(CD)、基础设施即代码(IaC)、监控和日志管理等。
  10. 如何进行微服务的性能优化?  答案:可以从以下几个方面进行微服务的性能优化:
  11. 服务拆分:合理拆分服务,避免服务过大导致性能问题。
  12. 缓存:使用缓存技术,减少数据库访问次数。
  13. 异步处理:使用消息队列等技术,实现异步处理,提高系统的吞吐量。
  14. 负载均衡:使用负载均衡器,将请求均匀地分配到多个服务实例上。
  15. 数据库优化:优化数据库表结构、索引、查询语句等,提高数据库的性能。
  16. 代码优化:优化代码逻辑,减少不必要的计算和内存占用。

分享一份大彬精心整理的大厂面试手册,包含计算机基础、Java基础、多线程、JVM、数据库、Redis、Spring、Mybatis、SpringMVC、SpringBoot、分布式、微服务、设计模式、架构、校招社招分享等高频面试题,非常实用,有小伙伴靠着这份手册拿过字节offer~【领取/点击】