interview
java-basics
Java基础

可选标题:面了一个应届生,我问了这些 Java 基础问题.

Java 中有哪 8 种基本数据类型?它们的默认值和占用的空间大小知道不? 说说这 8 种基本数据类型对应的包装类型.

💡 提示:Java 中有 8 种基本数据类型,分别为:

  1. 6 种数字类型 :byte,short,int,long,float,double
  2. 1 种字符类型:char
  3. 1 种布尔型:boolean.

包装类型的常量池技术了解么?

💡 提示:Java 基本类型的包装类的大部分Byte,Short,Integer,Long ,Character,Boolean都实现了常量池技术.

🌈 拓展:整型包装类对象之间值的比较应该使用 equals 方法

为什么要有包装类型?

💡 提示: 基本类型有默认值,泛型参数不能是基本类型

什么是自动拆装箱?原理?

💡 提示:基本类型和包装类型之间的互转.装箱其实就是调用了 包装类的 valueOf方法,拆箱其实就是调用了 xxxValue方法.

遇到过自动拆箱引发的 NPE 问题吗?

💡 提示:两个常见的场景:

  • 数据库的查询结果可能是 null,因为自动拆箱,用基本数据类型接收有 NPE 风险
  • 三目运算符使用不当会导致诡异的 NPE 异常

String,StringBuffer 和 StringBuilder 的区别是什么? String 为什么是不可变的?

💡 提示:可以从可变性,线程安全性,性能这几个角度来回答.

重载和重写的区别?

💡 提示:可以从下面几个角度来回答:

  • 发生范围
  • 参数列表
  • 返回值类型
  • 异常
  • 访问修饰符
  • 发生阶段

== 和 equals 的区别

💡 提示:== 对于基本类型和引用类型的作用效果是不同的,equals 不能用于判断基本数据类型的变量,只能用来判断两个对象是否相等.equals 方法存在两种使用情况:

  • 类没有重写 equals方法 :通过 equals比较该类的两个对象时,等价于通过==比较这两个对象,使用的默认是 Object 类 equals方法.
  • 类重写了 equals方法 :一般我们都重写 equals方法来比较两个对象中的属性是否相等;若它们的属性相等,则返回 true即,认为这两个对象相等.

Java 反射?反射有什么优点缺点?你是怎么理解反射的为什么框架需要反射?

💡 提示: 想想你平时使用框架为啥能够如此方便.想想动态代理以及注解和反射之间的关系.

谈谈对 Java 注解的理解,解决了什么问题?

💡 提示: 想想你平时使用框架为啥能够如此方便.另外,需要注意注解的解析依赖于反射机制,务必要提前把反射机制搞懂.

Java 泛型了解么?泛型的作用?什么是类型擦除?泛型有哪些限制?介绍一下常用的通配符?

💡 提示:

  • 好处:编译期间的类型检测安全,可读性更好
  • Java 的泛型是伪泛型

内部类了解吗?匿名内部类了解吗?

内部类分为下面 4 种:

  • 成员内部类
  • 静态内部类
  • 局部方法内部类
  • 匿名内部类

BIO,NIO,AIO 有什么区别?

IO 模型这块挺难理解的,需要很多计算机底层知识.建议小伙伴们克服困难,一定要把这个点搞明白.

可选标题:面了一个应届生,我问了这些 Java 基础问题.

Java 中有哪 8 种基本数据类型?它们的默认值和占用的空间大小知道不? 说说这 8 种基本数据类型对应的包装类型.

💡 提示:Java 中有 8 种基本数据类型,分别为:

  1. 6 种数字类型 :byte,short,int,long,float,double
  2. 1 种字符类型:char
  3. 1 种布尔型:boolean.

包装类型的常量池技术了解么?

💡 提示:Java 基本类型的包装类的大部分Byte,Short,Integer,Long ,Character,Boolean都实现了常量池技术.

🌈 拓展:整型包装类对象之间值的比较应该使用 equals 方法

为什么要有包装类型?

💡 提示: 基本类型有默认值,泛型参数不能是基本类型

什么是自动拆装箱?原理?

💡 提示:基本类型和包装类型之间的互转.装箱其实就是调用了 包装类的 valueOf方法,拆箱其实就是调用了 xxxValue方法.

遇到过自动拆箱引发的 NPE 问题吗?

💡 提示:两个常见的场景:

  • 数据库的查询结果可能是 null,因为自动拆箱,用基本数据类型接收有 NPE 风险
  • 三目运算符使用不当会导致诡异的 NPE 异常

String,StringBuffer 和 StringBuilder 的区别是什么? String 为什么是不可变的?

💡 提示:可以从可变性,线程安全性,性能这几个角度来回答.

重载和重写的区别?

💡 提示:可以从下面几个角度来回答:

  • 发生范围
  • 参数列表
  • 返回值类型
  • 异常
  • 访问修饰符
  • 发生阶段

== 和 equals 的区别

💡 提示:== 对于基本类型和引用类型的作用效果是不同的,equals 不能用于判断基本数据类型的变量,只能用来判断两个对象是否相等.equals 方法存在两种使用情况:

  • 类没有重写 equals方法 :通过 equals比较该类的两个对象时,等价于通过==比较这两个对象,使用的默认是 Object 类 equals方法.
  • 类重写了 equals方法 :一般我们都重写 equals方法来比较两个对象中的属性是否相等;若它们的属性相等,则返回 true即,认为这两个对象相等.

Java 反射?反射有什么优点缺点?你是怎么理解反射的为什么框架需要反射?

💡 提示: 想想你平时使用框架为啥能够如此方便.想想动态代理以及注解和反射之间的关系.

谈谈对 Java 注解的理解,解决了什么问题?

💡 提示: 想想你平时使用框架为啥能够如此方便.另外,需要注意注解的解析依赖于反射机制,务必要提前把反射机制搞懂.

Java 泛型了解么?泛型的作用?什么是类型擦除?泛型有哪些限制?介绍一下常用的通配符?

💡 提示:

  • 好处:编译期间的类型检测安全,可读性更好
  • Java 的泛型是伪泛型

内部类了解吗?匿名内部类了解吗?

内部类分为下面 4 种:

  • 成员内部类
  • 静态内部类
  • 局部方法内部类
  • 匿名内部类

BIO,NIO,AIO 有什么区别?

IO 模型这块挺难理解的,需要很多计算机底层知识.建议小伙伴们克服困难,一定要把这个点搞明白.

QA

Step 1

Q:: Java 中有哪 8 种基本数据类型?它们的默认值和占用的空间大小知道不?说说这 8 种基本数据类型对应的包装类型。

A:: {"answer": "Java 中有 8 种基本数据类型:byte、short、int、long、float、double、char、boolean。默认值和占用空间大小分别为:\n- byte:默认值 0,占用 1 字节\n- short:默认值 0,占用 2 字节\n- int:默认值 0,占用 4 字节\n- long:默认值 0,占用 8 字节\n- float:默认值 0.0,占用 4 字节\n- double:默认值 0.0,占用 8 字节\n- char:默认值 '\\u0000',占用 2 字节\n- boolean:默认值 false,占用 1 位\n对应的包装类型分别是:Byte、Short、Integer、Long、Float、Double、Character、Boolean。"}

Step 2

Q:: 包装类型的常量池技术了解么?

A:: {"answer": "Java 基本类型的包装类的大部分(Byte, Short, Integer, Long, Character, Boolean)都实现了常量池技术。常量池技术可以缓存从 -128 到 127 之间的数值,节省内存和提高效率。整型包装类对象之间值的比较应该使用 equals 方法。"}

Step 3

Q:: 为什么要有包装类型?

A:: {"answer": "包装类型的存在主要有两个原因:1. 基本类型有默认值,而对象类型没有;2. 泛型参数不能是基本类型,只能是对象类型。"}

Step 4

Q:: 什么是自动拆装箱?原理?

A:: {"answer": "自动拆装箱是指基本类型和包装类型之间的互转。装箱是指将基本类型转换为对应的包装类型,调用的是包装类的 valueOf() 方法;拆箱是指将包装类型转换为基本类型,调用的是 xxxValue() 方法。"}

Step 5

Q:: 遇到过自动拆箱引发的 NPE 问题吗?

A:: {"answer": "自动拆箱可能引发 NullPointerException (NPE) 的常见场景有:1. 数据库的查询结果可能是 null,当使用基本数据类型接收时会有 NPE 风险;2. 三目运算符使用不当会导致诡异的 NPE 异常。"}

Step 6

Q:: String、StringBuffer 和 StringBuilder 的区别是什么? String 为什么是不可变的?

A:: {"answer": "String 是不可变的,因为它的设计是为了实现线程安全和高效缓存。StringBuffer 和 StringBuilder 是可变的,区别在于 StringBuffer 是线程安全的,StringBuilder 不是。性能上 StringBuilder 通常优于 StringBuffer。"}

Step 7

Q:: 重载和重写的区别?

A:: {"answer": "重载发生在同一个类中,方法名相同但参数列表不同;重写发生在子类中,方法名和参数列表与父类方法相同。重载返回值类型可以不同,重写返回值类型必须相同。重载在编译时确定,重写在运行时确定。"}

Step 8

Q:: == 和 equals() 的区别

A:: {"answer": "== 用于比较基本类型时比较的是值,用于比较引用类型时比较的是内存地址。equals() 只能用于比较引用类型,默认实现比较内存地址,但通常会被重写来比较对象属性。"}

Step 9

Q:: Java 反射?反射有什么优点/缺点?你是怎么理解反射的(为什么框架需要反射)?

A:: {"answer": "反射允许在运行时获取类的详细信息并操作类和对象。优点是提供了灵活性和动态性,缺点是性能开销较大,代码复杂度增加。框架需要反射来实现依赖注入、动态代理和注解处理。"}

Step 10

Q:: 谈谈对 Java 注解的理解,解决了什么问题?

A:: {"answer": "Java 注解是元数据,用于提供额外的信息。注解解决了配置和元数据分离的问题,提高了代码的可读性和维护性。注解的解析依赖于反射机制。"}

Step 11

Q:: Java 泛型了解么?泛型的作用?什么是类型擦除?泛型有哪些限制?介绍一下常用的通配符?

A:: {"answer": "泛型在编译期间进行类型检查,提高了类型安全性和代码可读性。Java 的泛型是伪泛型,在编译期间会进行类型擦除,限制包括不能创建泛型数组、不能用在静态上下文中等。常用的通配符有:? extends T 和 ? super T。"}

Step 12

Q:: 内部类了解吗?匿名内部类了解吗?

A:: {"answer": "内部类分为四种:成员内部类、静态内部类、局部(方法)内部类和匿名内部类。匿名内部类是没有名字的内部类,通常用在需要快速定义和实例化一个类的场景中。"}

Step 13

Q:: BIO,NIO,AIO 有什么区别?

A:: {"answer": "BIO 是同步阻塞 IO,适合处理少量连接;NIO 是同步非阻塞 IO,适合处理大量短连接;AIO 是异步非阻塞 IO,适合处理大量长连接。"}

用途

这些面试题目涵盖了 Java 基础知识和常用技术,了解这些内容有助于在开发过程中编写高效、安全、易维护的代码。实际生产环境中,这些知识在日常编码、性能优化、问题排查、系统设计等方面都会用到。\n

相关问题

🦆
什么是 JVM?JVM 的主要组成部分是什么?

{"answer": "JVM 是 Java Virtual Machine(Java 虚拟机),主要负责执行 Java 字节码。它的主要组成部分包括类加载器、运行时数据区(方法区、堆、栈、本地方法栈、程序计数器)、执行引擎和本地接口。"}

🦆
什么是垃圾回收机制?有哪些垃圾回收算法?

{"answer": "垃圾回收机制是 JVM 自动管理内存的过程。常见的垃圾回收算法有:标记-清除、复制、标记-压缩和分代收集算法。"}

🦆
解释一下 Java 的内存模型?

{"answer": "Java 内存模型(JMM)定义了多线程访问内存的规则。JMM 保证了线程之间的可见性、有序性和原子性,主要包括主内存和工作内存的概念。"}

🦆
什么是并发编程?Java 中有哪些并发工具?

{"answer": "并发编程是指在程序中同时执行多个任务。Java 提供了多种并发工具,包括线程、Executor 框架、Future、Callable、Locks、Atomic 变量和并发集合等。"}

Java 基础面试题, Java基础

QA

Step 1

Q:: 什么是JVM,它的主要组件有哪些?

A:: JVM(Java Virtual Machine)是Java程序执行的虚拟机环境。它负责将字节码(Bytecode)翻译成机器代码。JVM的主要组件包括:类加载器(Class Loader)、内存区域(如堆内存和方法区)、执行引擎(Execution Engine)、垃圾收集器(Garbage Collector)和本地方法接口(JNI)。

Step 2

Q:: 什么是垃圾回收(Garbage Collection),它是如何工作的?

A:: 垃圾回收是JVM自动管理内存的一种机制,用于释放不再使用的对象所占用的内存。垃圾回收器会定期扫描堆内存,识别出那些没有被引用的对象并释放它们的内存。常见的垃圾回收算法有标记-清除、复制和标记-压缩等。

Step 3

Q:: Java中的基础数据类型有哪些?

A:: Java中的基础数据类型包括四种整型(byte、short、int、long)、两种浮点型(float、double)、一种字符型(char)和一种布尔型(boolean)。这些类型都是直接存储在栈内存中的,具有固定的大小。

Step 4

Q:: 什么是多态性(Polymorphism),它在Java中是如何实现的?

A:: 多态性是指同一方法在不同对象中具有不同实现的特性。在Java中,多态性通过继承(inheritance)和接口(interface)来实现。最典型的实现方式是方法重写(method overriding)和方法重载(method overloading)。

Step 5

Q:: 什么是异常处理(Exception Handling),如何有效地使用它?

A:: 异常处理是Java中处理程序运行时错误的机制。Java提供了try-catch-finally块来捕获和处理异常,并通过throw关键字抛出异常。为了有效使用异常处理,建议只捕获能够处理的异常、避免滥用异常、并合理使用自定义异常类。

用途

面试这些内容是为了考察候选人对Java基础知识的掌握程度。这些知识在实际生产环境中非常重要,因为Java基础决定了程序的健壮性、可维护性和性能。了解JVM的工作原理、垃圾回收机制、多态性等有助于编写更高效的代码,同时对异常处理的理解则确保了程序的可靠性。生产环境下,尤其是在开发高性能、高可用性的应用时,这些基础知识不可或缺。\n

相关问题

🦆
类加载器Class Loader是如何工作的?

类加载器负责将字节码加载到JVM中。它主要包括三个步骤:加载(Loading)、链接(Linking)和初始化(Initialization)。Java中有三种主要的类加载器:启动类加载器(Bootstrap ClassLoader)、扩展类加载器(Extension ClassLoader)和应用程序类加载器(Application ClassLoader)。

🦆
Java中的堆内存和栈内存有什么区别?

堆内存用于存储对象实例和数组,而栈内存则用于存储局部变量和方法调用。堆内存是共享的,所有线程都可以访问,而栈内存是线程私有的,每个线程都有自己的栈内存。

🦆
Java中的方法重载Overloading和方法重写Overriding有什么区别?

方法重载是同一类中方法名相同但参数不同的多种实现方式;而方法重写是子类对父类中继承方法的一种重新实现。重载发生在编译时,重写则发生在运行时。

🦆
Java中的final关键字有哪些应用?

final关键字可以用来修饰类、方法和变量。final类不能被继承,final方法不能被重写,final变量的值一旦赋值后就不能再改变。

🦆
Java中的线程安全Thread Safety是如何实现的?

线程安全可以通过多种方式实现,如使用同步机制(synchronized关键字)、使用java.util.concurrent包中的并发工具类、使用原子变量(Atomic Variables),以及使用不可变对象(Immutable Objects)来确保多个线程同时访问时不导致数据不一致。

后端经典面试题合集, Java基础

QA

Step 1

Q:: 什么是Java的内存模型?

A:: Java内存模型(Java Memory Model, JMM)定义了Java程序中线程之间如何通过内存交互,以及在并发执行时,变量的修改如何对其他线程可见。JMM规定了可见性、原子性和有序性,以确保并发操作的正确性。理解JMM有助于理解多线程编程中的数据一致性和线程安全问题。

Step 2

Q:: Java中的Volatile关键字是什么作用?

A:: Volatile是Java中的一个关键字,它用于标记一个变量在多线程环境下的可见性。当一个变量被声明为volatile时,每次线程读取这个变量的值时,都会直接从主内存中读取,而不会从线程的工作内存中读取,这确保了对该变量的修改对其他线程立即可见。Volatile并不能保证操作的原子性,它适合用于标记状态标志等场景。

Step 3

Q:: Java中的线程池是什么?如何使用?

A:: 线程池是一种多线程处理机制,它可以用来减少线程的创建和销毁的开销,提高性能。Java中的Executor框架提供了线程池的实现,如ThreadPoolExecutor。通过使用线程池,可以复用已经创建的线程,从而提升系统的效率,尤其在处理大量短时间任务时。常见的使用场景包括服务器端的请求处理和任务执行。

Step 4

Q:: Java中的HashMap是线程安全的吗?为什么?

A:: Java中的HashMap本质上不是线程安全的。在并发访问的情况下,多个线程同时操作HashMap可能会导致数据不一致、死循环等问题。可以使用Collections.synchronizedMap()方法或者ConcurrentHashMap来实现线程安全的Map。ConcurrentHashMap在并发场景下表现更好,因为它使用了分段锁机制,减少了锁的竞争。

用途

这些问题主要用于考察面试者对Java基础知识的掌握程度,特别是在并发编程和性能优化方面。对于后端开发来说,理解Java内存模型和线程池管理至关重要,因为它们直接关系到应用程序的稳定性、性能以及线程安全性。在实际生产环境中,这些知识用于优化服务器性能、处理并发请求、避免死锁和数据不一致等问题。\n

相关问题

🦆
什么是Java中的锁机制?有哪几种锁?

Java中的锁机制用于控制多个线程对共享资源的访问。常见的锁机制包括内置锁(即synchronized关键字)、显式锁(如ReentrantLock),以及读写锁(ReadWriteLock)。这些锁机制帮助开发者在并发环境下管理对共享资源的访问,防止数据不一致问题。

🦆
Java中的synchronized与Lock有什么区别?

synchronized是Java内置的锁机制,使用方便但功能有限;而Lock(如ReentrantLock)是一个接口,提供了更灵活的锁控制功能,如锁的公平性、可中断性等。Lock需要手动加锁和解锁,更适用于复杂的并发控制场景。

🦆
什么是Java中的原子类?它们有什么作用?

Java中的原子类(如AtomicInteger、AtomicBoolean等)提供了一种非阻塞的线程安全操作方式。原子类利用了CAS(Compare-And-Swap)机制,在无锁的情况下实现线程安全的变量操作,常用于计数器、标志位等场景。

🦆
如何避免Java中的死锁?

避免死锁的常见方法包括:避免嵌套锁、使用定时锁(tryLock)、对锁的获取顺序进行全局排序等。死锁是多线程编程中的一个常见问题,它会导致程序的部分或全部失效,因此在设计并发程序时要特别注意防止死锁的发生。

Java基础面试题, Java基础

QA

Step 1

Q:: 什么是Java中的多态性?

A:: 多态性是面向对象编程中的一个核心概念,它允许对象在不同的上下文中以不同的形式表现自己。Java中的多态性主要通过继承和接口实现。方法的重载和重写是实现多态性的主要手段。在实际使用中,多态性可以提高代码的灵活性和可维护性,允许我们编写更加通用的代码。

Step 2

Q:: Java中的抽象类和接口有什么区别?

A:: 抽象类是不能实例化的类,可以包含抽象方法和非抽象方法。接口是一种特殊的抽象类,只能包含抽象方法(Java 8之后可以包含默认方法和静态方法)。在实际生产环境中,抽象类通常用来表示具有部分实现的通用概念,而接口用来定义一组行为规范,供不同类实现。

Step 3

Q:: final、finally和finalize的区别是什么?

A:: final是一个修饰符,可以用来修饰类、方法和变量,表示它们不能被修改;finally是一个代码块,通常与try-catch语句一起使用,无论是否发生异常,finally块中的代码都会被执行;finalize是Object类中的一个方法,当垃圾回收器确定一个对象不再被引用时,它的finalize方法将被调用。

Step 4

Q:: Java中的异常处理机制是如何工作的?

A:: Java中的异常处理机制基于try-catch-finally语句。当在try块中发生异常时,程序控制转移到catch块以处理异常。如果存在finally块,则它无论是否发生异常都会执行。异常处理机制在生产环境中非常重要,它能够有效地捕获和处理运行时错误,确保程序的健壮性。

Step 5

Q:: Java中的垃圾回收机制如何工作?

A:: Java的垃圾回收机制自动管理内存。它通过标记-清除、复制和压缩等算法来识别和回收不再使用的对象。在实际生产环境中,垃圾回收机制有助于防止内存泄漏,并提高应用程序的性能和稳定性。但在高性能应用中,垃圾回收的开销需要精细管理。

用途

这些面试题主要考察应聘者对Java基础概念的理解和掌握。这些基础概念在实际生产环境中随处可见,比如多态性在设计模式中的广泛应用,抽象类和接口用于系统的架构设计,异常处理机制确保代码的健壮性,垃圾回收机制帮助管理内存。因此,理解这些概念对编写高效、可维护的Java代码至关重要。\n

相关问题

🦆
什么是设计模式?举例说明你在项目中使用过的设计模式.

设计模式是解决特定问题的通用解决方案。常见的设计模式有单例模式、工厂模式、观察者模式等。比如,单例模式用于确保某个类只有一个实例存在,工厂模式用于创建对象时对实例化过程进行封装。

🦆
Java中的线程池是什么?

线程池是一种线程管理机制,允许多个线程任务复用线程资源,减少线程的创建和销毁开销。它通过维护一个线程队列来执行任务,从而提高系统的响应速度和稳定性。在并发编程和高性能应用中,线程池是非常常见的技术。

🦆
解释一下Java中的反射机制.

反射机制允许程序在运行时获取有关类的信息(如类名、方法、字段等)并动态调用它们。反射机制常用于框架设计、动态代理和注解处理等场景。虽然反射机制强大,但由于性能开销较大,应谨慎使用。

🦆
谈谈你对Java内存模型的理解.

Java内存模型(JMM)定义了Java虚拟机如何与计算机的内存进行交互,尤其是在多线程环境中。JMM规定了主内存和工作内存的交互方式,以及volatile关键字、synchronized块的工作机制。理解JMM对于编写线程安全的代码至关重要。