面试 Java 基础八股文十问十答第二十八期

2024-05-05 20:44

本文主要是介绍面试 Java 基础八股文十问十答第二十八期,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

面试 Java 基础八股文十问十答第二十八期

作者:程序员小白条,个人博客

相信看了本文后,对你的面试是有一定帮助的!关注专栏后就能收到持续更新!

⭐点赞⭐收藏⭐不迷路!⭐

1)动态代理是什么?

动态代理是一种在运行时动态生成代理类的机制,用于增强被代理类的行为。在动态代理中,代理类并不是在编译期就确定的,而是在运行时根据需要动态生成的。动态代理通常用于实现横切关注点的功能,如日志记录、性能监控、事务管理等。Java中的动态代理主要通过反射机制实现。

2)JDK 动态代理与 CGLIB 区别?

JDK 动态代理和 CGLIB(Code Generation Library)都是 Java 中常用的实现动态代理的方式,它们之间有以下区别:

  • 实现原理:JDK 动态代理是基于接口的代理,它通过反射机制动态生成代理类,被代理的类必须实现一个接口;而 CGLIB 是基于继承的代理,它通过生成被代理类的子类来实现代理。
  • 性能:由于 JDK 动态代理是基于接口实现的,所以它的性能相对于 CGLIB 来说稍差一些。而 CGLIB 代理是直接操作字节码生成子类,因此性能更高,但生成的代理类可能比较庞大。
  • 适用范围:JDK 动态代理要求被代理的类必须实现接口,因此对于没有实现接口的类无法实现动态代理;而 CGLIB 则可以代理没有实现接口的类。

3)注解是什么原理?

注解是 Java 语言的一种元数据,用于为程序提供额外的信息。在 Java 中,注解是在代码中添加元数据的一种方式,可以用来提供配置信息、编译检查、代码生成等功能。注解本身并不直接影响程序的执行,而是通过反射机制在运行时提供额外的信息。

Java 中的注解是通过 @interface 关键字定义的,使用 @ 符号将注解应用到代码中。在编译过程中,编译器会将注解信息保存在类文件中,并在运行时由 JVM 或其他工具通过反射获取注解信息。

注解的原理是基于反射机制,在运行时通过反射获取注解信息,然后根据注解信息进行相应的处理。常见的应用包括配置文件解析、自定义注解实现 AOP(面向切面编程)、JUnit 测试框架等。

4)反射用过吗?

是的,我在编程中经常使用反射。反射是指在运行时动态地获取类的信息以及操作类的属性、方法和构造函数的能力。通过反射,可以在程序运行时获取类的信息、创建类的实例、调用类的方法、访问类的字段等。我通常在需要编写通用框架、工具类或处理特定场景时使用反射,例如实现依赖注入、动态代理、对象序列化等功能。

5)SPI 有了解过吗?

SPI(Service Provider Interface)是 Java 提供的一种服务发现机制,主要用于在运行时动态地加载和注册服务实现。SPI 允许开发者定义服务接口,并提供多个不同的实现供应用程序选择。在 Java 中,通常通过在 META-INF/services 目录下创建对应服务接口的文件,列出具体的实现类来实现 SPI。

SPI 主要应用于框架和库中,例如 Java 的 JDBC、JAX-WS 等。它提供了一种松耦合的方式来扩展系统功能,使得系统更加灵活和可扩展。

6)泛型有什么用?泛型擦除是什么?

泛型是 Java 中的一种编程机制,用于在编译时提供类型安全性检查和更好的代码重用。通过泛型,可以编写更加通用和灵活的代码,减少类型转换的错误和代码冗余。泛型可以应用于类、接口、方法等各个层面,使得程序设计更加抽象和灵活。

泛型擦除是指在编译时将泛型信息擦除,以保持 Java 虚拟机的向后兼容性。在编译后的字节码中,泛型类型参数会被替换为它们的上界或 Object 类型。例如,List<String> 在编译后会被擦除为 List,而 List<Integer> 也会被擦除为 List。这样做的目的是为了让旧版的 Java 代码仍然可以在新版的 Java 虚拟机上运行,而不会出现泛型相关的问题。泛型擦除也导致了一些限制和局限性,例如无法在运行时获取泛型类型信息。

7)泛型的上下界限定符有了解过吗?

泛型的上下界限定符是指在泛型类型中使用通配符 extendssuper 来限制类型的范围。通配符 extends 表示类型的上界限定,即指定泛型类型必须是某个类的子类或者该类本身;通配符 super 表示类型的下界限定,即指定泛型类型必须是某个类的父类或者该类本身。

例如,<? extends Number> 表示泛型类型必须是 Number 类或其子类,而 <? super Integer> 表示泛型类型必须是 Integer 类或其父类。

使用上下界限定符可以增加泛型类型的灵活性,使得泛型可以适用于更广泛的情况。

8)深拷贝和浅拷贝?

深拷贝和浅拷贝都是用于复制对象的概念,它们之间的区别在于复制的程度。

  • 浅拷贝(Shallow Copy):浅拷贝只复制对象本身以及对象内部的基本数据类型字段的值,对于对象内部的引用类型字段,只是复制了引用而不是复制引用指向的对象。这意味着原始对象和拷贝对象共享内部对象,对内部对象的修改会影响到原始对象和拷贝对象。
  • 深拷贝(Deep Copy):深拷贝不仅复制对象本身,还会递归地复制对象内部的所有引用类型字段及其引用的对象,从而实现完全独立的复制。深拷贝生成的对象与原始对象之间没有任何关联,对其中一个对象的修改不会影响另一个对象。

深拷贝和浅拷贝的选择取决于具体的需求和情况。在需要完全独立的对象副本时,应该使用深拷贝,而在需要共享内部对象时,可以使用浅拷贝。

9)JDK8 有哪些新特性?

JDK8 引入了许多重要的新特性和改进,其中一些主要的包括:

  • Lambda 表达式:Lambda 表达式提供了一种简洁而又强大的方式来处理函数式编程,使得代码更加清晰和易读。
  • Stream API:Stream API 提供了一种新的抽象序列操作的方式,使得对集合进行过滤、映射、排序等操作变得更加简洁和高效。
  • 接口默认方法:接口可以包含默认方法和静态方法的实现,使得接口的演化更加灵活,可以向现有的接口添加新的方法而不会破坏已有的实现类。
  • 新的日期与时间 API:引入了全新的日期与时间 API,解决了旧的 Date 和 Calendar API 存在的诸多问题,使得日期与时间的处理更加简单和易用。
  • Optional 类:Optional 类用于解决空指针异常问题,提供了一种优雅的方式来处理可能为空的对象。
  • 并行数组操作:新增的 Arrays 类的 parallelSort 方法可以对数组进行并行排序,提高排序的性能。

10)Integer 缓存池知道吗?

是的,Integer 缓存池是 Java 中的一种优化措施,用于缓存范围在 -128 到 127 之间的整型对象。在这个范围内的整数对象会被缓存起来,当程序再次需要这些整数对象时,会直接从缓存中获取而不是重新创建新的对象。

Integer 缓存池的引入主要是为了提高性能和节省内存。因为在 Java 中,Integer 是不可变对象,频繁地创建和销毁 Integer 对象会产生大量的对象实例,占用大量的内存和导致垃圾回收的开销。通过使用缓存池,可以减少对象的创建次数,提高性能和减少内存占用。

开源项目地址:https://gitee.com/falle22222n-leaves/vue_-book-manage-system

前后端总计已经 1300+ Star,2 W+ 访问!

⭐点赞⭐收藏⭐不迷路!⭐

这篇关于面试 Java 基础八股文十问十答第二十八期的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/962633

相关文章

Java实现Excel与HTML互转

《Java实现Excel与HTML互转》Excel是一种电子表格格式,而HTM则是一种用于创建网页的标记语言,虽然两者在用途上存在差异,但有时我们需要将数据从一种格式转换为另一种格式,下面我们就来看看... Excel是一种电子表格格式,广泛用于数据处理和分析,而HTM则是一种用于创建网页的标记语言。虽然两

java图像识别工具类(ImageRecognitionUtils)使用实例详解

《java图像识别工具类(ImageRecognitionUtils)使用实例详解》:本文主要介绍如何在Java中使用OpenCV进行图像识别,包括图像加载、预处理、分类、人脸检测和特征提取等步骤... 目录前言1. 图像识别的背景与作用2. 设计目标3. 项目依赖4. 设计与实现 ImageRecogni

Java中Springboot集成Kafka实现消息发送和接收功能

《Java中Springboot集成Kafka实现消息发送和接收功能》Kafka是一个高吞吐量的分布式发布-订阅消息系统,主要用于处理大规模数据流,它由生产者、消费者、主题、分区和代理等组件构成,Ka... 目录一、Kafka 简介二、Kafka 功能三、POM依赖四、配置文件五、生产者六、消费者一、Kaf

Java访问修饰符public、private、protected及默认访问权限详解

《Java访问修饰符public、private、protected及默认访问权限详解》:本文主要介绍Java访问修饰符public、private、protected及默认访问权限的相关资料,每... 目录前言1. public 访问修饰符特点:示例:适用场景:2. private 访问修饰符特点:示例:

详解Java如何向http/https接口发出请求

《详解Java如何向http/https接口发出请求》这篇文章主要为大家详细介绍了Java如何实现向http/https接口发出请求,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 用Java发送web请求所用到的包都在java.net下,在具体使用时可以用如下代码,你可以把它封装成一

SpringBoot使用Apache Tika检测敏感信息

《SpringBoot使用ApacheTika检测敏感信息》ApacheTika是一个功能强大的内容分析工具,它能够从多种文件格式中提取文本、元数据以及其他结构化信息,下面我们来看看如何使用Ap... 目录Tika 主要特性1. 多格式支持2. 自动文件类型检测3. 文本和元数据提取4. 支持 OCR(光学

Java内存泄漏问题的排查、优化与最佳实践

《Java内存泄漏问题的排查、优化与最佳实践》在Java开发中,内存泄漏是一个常见且令人头疼的问题,内存泄漏指的是程序在运行过程中,已经不再使用的对象没有被及时释放,从而导致内存占用不断增加,最终... 目录引言1. 什么是内存泄漏?常见的内存泄漏情况2. 如何排查 Java 中的内存泄漏?2.1 使用 J

JAVA系统中Spring Boot应用程序的配置文件application.yml使用详解

《JAVA系统中SpringBoot应用程序的配置文件application.yml使用详解》:本文主要介绍JAVA系统中SpringBoot应用程序的配置文件application.yml的... 目录文件路径文件内容解释1. Server 配置2. Spring 配置3. Logging 配置4. Ma

Java 字符数组转字符串的常用方法

《Java字符数组转字符串的常用方法》文章总结了在Java中将字符数组转换为字符串的几种常用方法,包括使用String构造函数、String.valueOf()方法、StringBuilder以及A... 目录1. 使用String构造函数1.1 基本转换方法1.2 注意事项2. 使用String.valu

java脚本使用不同版本jdk的说明介绍

《java脚本使用不同版本jdk的说明介绍》本文介绍了在Java中执行JavaScript脚本的几种方式,包括使用ScriptEngine、Nashorn和GraalVM,ScriptEngine适用... 目录Java脚本使用不同版本jdk的说明1.使用ScriptEngine执行javascript2.