可选标题:面了一个应届生,我问了这些 Java 基础问题.
Java 中有哪 8 种基本数据类型?它们的默认值和占用的空间大小知道不? 说说这 8 种基本数据类型对应的包装类型.
💡 提示:Java 中有 8 种基本数据类型,分别为:
- 6 种数字类型 :byte,short,int,long,float,double
- 1 种字符类型:char
- 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 种基本数据类型,分别为:
- 6 种数字类型 :byte,short,int,long,float,double
- 1 种字符类型:char
- 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相关问题
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相关问题
后端经典面试题合集, 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基础
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的垃圾回收机制自动管理内存。它通过标记-
清除、复制和压缩等算法来识别和回收不再使用的对象。在实际生产环境中,垃圾回收机制有助于防止内存泄漏,并提高应用程序的性能和稳定性。但在高性能应用中,垃圾回收的开销需要精细管理。