面试 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

相关文章

SpringSecurity显示用户账号已被锁定的原因及解决方案

《SpringSecurity显示用户账号已被锁定的原因及解决方案》SpringSecurity中用户账号被锁定问题源于UserDetails接口方法返回值错误,解决方案是修正isAccountNon... 目录SpringSecurity显示用户账号已被锁定的解决方案1.问题出现前的工作2.问题出现原因各

Java继承映射的三种使用方法示例

《Java继承映射的三种使用方法示例》继承在Java中扮演着重要的角色,它允许我们创建一个类(子类),该类继承另一个类(父类)的所有属性和方法,:本文主要介绍Java继承映射的三种使用方法示例,需... 目录前言一、单表继承(Single Table Inheritance)1-1、原理1-2、使用方法1-

Spring @Scheduled注解及工作原理

《Spring@Scheduled注解及工作原理》Spring的@Scheduled注解用于标记定时任务,无需额外库,需配置@EnableScheduling,设置fixedRate、fixedDe... 目录1.@Scheduled注解定义2.配置 @Scheduled2.1 开启定时任务支持2.2 创建

SpringBoot中使用Flux实现流式返回的方法小结

《SpringBoot中使用Flux实现流式返回的方法小结》文章介绍流式返回(StreamingResponse)在SpringBoot中通过Flux实现,优势包括提升用户体验、降低内存消耗、支持长连... 目录背景流式返回的核心概念与优势1. 提升用户体验2. 降低内存消耗3. 支持长连接与实时通信在Sp

Spring Boot 实现 IP 限流的原理、实践与利弊解析

《SpringBoot实现IP限流的原理、实践与利弊解析》在SpringBoot中实现IP限流是一种简单而有效的方式来保障系统的稳定性和可用性,本文给大家介绍SpringBoot实现IP限... 目录一、引言二、IP 限流原理2.1 令牌桶算法2.2 漏桶算法三、使用场景3.1 防止恶意攻击3.2 控制资源

Mac系统下卸载JAVA和JDK的步骤

《Mac系统下卸载JAVA和JDK的步骤》JDK是Java语言的软件开发工具包,它提供了开发和运行Java应用程序所需的工具、库和资源,:本文主要介绍Mac系统下卸载JAVA和JDK的相关资料,需... 目录1. 卸载系统自带的 Java 版本检查当前 Java 版本通过命令卸载系统 Java2. 卸载自定

springboot下载接口限速功能实现

《springboot下载接口限速功能实现》通过Redis统计并发数动态调整每个用户带宽,核心逻辑为每秒读取并发送限定数据量,防止单用户占用过多资源,确保整体下载均衡且高效,本文给大家介绍spring... 目录 一、整体目标 二、涉及的主要类/方法✅ 三、核心流程图解(简化) 四、关键代码详解1️⃣ 设置

Java Spring ApplicationEvent 代码示例解析

《JavaSpringApplicationEvent代码示例解析》本文解析了Spring事件机制,涵盖核心概念(发布-订阅/观察者模式)、代码实现(事件定义、发布、监听)及高级应用(异步处理、... 目录一、Spring 事件机制核心概念1. 事件驱动架构模型2. 核心组件二、代码示例解析1. 事件定义

SpringMVC高效获取JavaBean对象指南

《SpringMVC高效获取JavaBean对象指南》SpringMVC通过数据绑定自动将请求参数映射到JavaBean,支持表单、URL及JSON数据,需用@ModelAttribute、@Requ... 目录Spring MVC 获取 JavaBean 对象指南核心机制:数据绑定实现步骤1. 定义 Ja

javax.net.ssl.SSLHandshakeException:异常原因及解决方案

《javax.net.ssl.SSLHandshakeException:异常原因及解决方案》javax.net.ssl.SSLHandshakeException是一个SSL握手异常,通常在建立SS... 目录报错原因在程序中绕过服务器的安全验证注意点最后多说一句报错原因一般出现这种问题是因为目标服务器