面试 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)泛型的上下界限定符有了解过吗?
泛型的上下界限定符是指在泛型类型中使用通配符 extends
和 super
来限制类型的范围。通配符 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 基础八股文十问十答第二十八期
面试 Java 基础八股文十问十答第二十八期 作者:程序员小白条,个人博客 相信看了本文后,对你的面试是有一定帮助的!关注专栏后就能收到持续更新! ⭐点赞⭐收藏⭐不迷路!⭐ 1)动态代理是什么&am…...

Excel-VBA报错01-解决方法
【已删除的部件:部件/xl/vbaProject.bin。(Visual Basic for Applications(VBA))】 1.问题复现: Win10 ;64位 ;Office Excel 2016 打开带有宏的Excel文件,报错:【已删除的部件:部件/xl/vbaProject.bin。…...
php利用阿里云短信SDK实现短信发送功能
当使用PHP结合阿里云短信服务SDK来实现短信验证码登录时,你需要遵循以下步骤: 1. 注册阿里云账号并开通短信服务 首先,你需要有一个阿里云账号,并在阿里云控制台中开通短信服务(Dysmsapi)。 2. 获取Acce…...

承装(修、试)电力工程施工许可证四级资质可以承接多大的项目?
承装(修、试)电力工程施工许可证四级资质可以承接多大的项目? 承装(修、试)电力工程施工许可证四级资质可以承接的项目规模及范围是一个复杂且细致的问题,涉及电力工程施工的多个方面。根据四级资质的相关规…...
影像图层调整图像显示效果的色彩参数汇总
在Cesium的ImageryProvider中,以下图层对象支持调整图像显示效果的色彩参数: - ArcGisMapServerImageryProvider - BingMapsImageryProvider - GoogleEarthEnterpriseImageryProvider(如果服务支持) - TileMapServiceImager…...

EasyHPC - PyTorch入门教程【笔记】
内容来源:超算习堂 (easyhpc.net) 文章目录 01 Tensors环境要求1.1 Tensors1.1.1 直接创建tensor1.1.2 在现有tensor中创建tensor1.1.3 从NumPy中创建tensor 1.2 基本运算1.2.1 使用运算符1.2.2 调用方法 1.3 CUDA Tensors 02 Autograd2.1 Tensor2.2 Gradient 03 Ne…...

Node.js里面 Path 模块的介绍和使用
Node.js path 模块提供了一些用于处理文件路径的小工具,我们可以通过以下方式引入该模块: var path require("path") 方法描述 序号方法 & 描述1path.normalize(p) 规范化路径,注意.. 和 .。2path.join([path1][, path2][,…...

【Linux】Centos7配置JDK
1.启动虚拟机、Xshell、Xftp 2.在Xshell中新建一个会话,用于连接到虚拟机中 3.因为虚拟机里自带有JDK,所以需要先卸载自带的JDK 3.1.查询已安装的 jdk 列表 rpm -qa | grep jdk3.2.将查询到的全部删除 yum -y remove XXX(上面查询到的 j…...
pytorch中统计一个数在tensor中出现了几次
pytorch中统计一个数在tensor中出现了几次 在PyTorch中,可以使用torch.eq()函数配合torch.sum()来统计某个数值在Tensor中出现的次数。torch.eq()函数会返回一个新的Tensor,其中对于每个元素来说,如果和指定的数值相等,则该位置为…...

a-auto-complete 请求后端数据做模糊查询,解决下拉框选择选不上,不回显的问题
a-auto-complete 请求后端数据做模糊查询,解决下拉框选择选不上,不回显的问题 记录一个a-auto-complete卡bug卡了两天,找不到哪里的问题下拉框选择选不上,不回显,最后终于解决了。 我还对下拉框显示的内容做了小调整。…...

Leetcode—724. 寻找数组的中心下标【简单】
2024每日刷题(129) Leetcode—724. 寻找数组的中心下标 实现代码 class Solution { public:int pivotIndex(vector<int>& nums) {int sum accumulate(nums.begin(), nums.end(), 0);int prefix 0;for(int i 0; i < nums.size(); i) {i…...

C语言 | Leetcode C语言题解之第72题编辑距离
题目: 题解: static inline int Min(const int a, const int b, const int c) {int min (a < b) ? a : b;return (min < c) ? min : c; }int minDistance(char * word1, char * word2){int m strlen(word1), n strlen(word2);int dp[m 1][n…...

AI视频教程下载:零代码创建AI智能体、AI Agents和ChatGPT的Gpts
这门课程专注于提示工程的掌握,教你以精确的方式引导GPT,利用它们的生成能力产生卓越的AI驱动结果。一步一步地,你将学会创建多样化的GPT军团——每个都设计来满足特定的专业需求。 从提供个性化职业变更指导的职业教练AI,到以惊…...

汽车之家,如何在“以旧换新”浪潮中大展拳脚?
北京车展刚刚落幕,两重利好正主导汽车市场持续升温:新能源渗透率首破50%,以及以旧换新详细政策进入落地期。 图源:中国政府网 在政策的有力指引下,汽车产业链的各个环节正经历着一场深刻的“连锁反应”。在以旧换新的…...

图神经网络(GNNs)在时间序列分析中的应用
时间序列数据是记录动态系统测量的主要数据类型,由物理传感器和在线过程(虚拟传感器)大量生成。时间序列分析对于解锁可用数据中隐含的丰富信息至关重要。随着图神经网络(GNNs)的最近进展,基于GNN的方法在时…...
Qt QShortcut快捷键类详解
1.简介 QShortcut是一个方便的工具类,用于在应用程序中创建快捷键。通过设置快捷键和关联的处理函数,可以实现快速执行某个操作的功能。 // 创建一个快捷键,关联到MyWidget类的keyPressEvent()函数 QShortcut *shortcut new QShortcut(QKe…...

003 redis分布式锁 jedis分布式锁 Redisson分布式锁 分段锁
文章目录 Redis分布式锁原理1.使用set的命令时,同时设置过期时间2.使用lua脚本,将加锁的命令放在lua脚本中原子性的执行 Jedis分布式锁实现pom.xmlRedisCommandLock.javaRedisCommandLockTest.java 锁过期问题1乐观锁方式,增加版本号(增加版本…...

Jackson工具,java对象和json字符串之间的互相转换
一、maven依赖引入jackson <dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.12.5</version></dependency>jackson-databind依赖见下: <depend…...
【设计模式】之装饰器模式
系列文章目录 【设计模式】之模板方法模式 【设计模式】之责任链模式 【设计模式】之策略模式 【设计模式】之工厂模式(三种) 前言 今天给大家介绍23种设计模式中的装饰器模式。🌈 一、什么是装饰器模式 装饰器模式(Decora…...
leetcode_46.全排列
46. 全排列 题目描述:给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。 示例 1: 输入:nums [1,2,3] 输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]示例 2&#…...

通过Wrangler CLI在worker中创建数据库和表
官方使用文档:Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后,会在本地和远程创建数据库: npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库: 现在,您的Cloudfla…...

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility
Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序
一、开发准备 环境搭建: 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 项目创建: File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...
OkHttp 中实现断点续传 demo
在 OkHttp 中实现断点续传主要通过以下步骤完成,核心是利用 HTTP 协议的 Range 请求头指定下载范围: 实现原理 Range 请求头:向服务器请求文件的特定字节范围(如 Range: bytes1024-) 本地文件记录:保存已…...
Matlab | matlab常用命令总结
常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...
rnn判断string中第一次出现a的下标
# coding:utf8 import torch import torch.nn as nn import numpy as np import random import json""" 基于pytorch的网络编写 实现一个RNN网络完成多分类任务 判断字符 a 第一次出现在字符串中的位置 """class TorchModel(nn.Module):def __in…...

排序算法总结(C++)
目录 一、稳定性二、排序算法选择、冒泡、插入排序归并排序随机快速排序堆排序基数排序计数排序 三、总结 一、稳定性 排序算法的稳定性是指:同样大小的样本 **(同样大小的数据)**在排序之后不会改变原始的相对次序。 稳定性对基础类型对象…...
Redis:现代应用开发的高效内存数据存储利器
一、Redis的起源与发展 Redis最初由意大利程序员Salvatore Sanfilippo在2009年开发,其初衷是为了满足他自己的一个项目需求,即需要一个高性能的键值存储系统来解决传统数据库在高并发场景下的性能瓶颈。随着项目的开源,Redis凭借其简单易用、…...
Git常用命令完全指南:从入门到精通
Git常用命令完全指南:从入门到精通 一、基础配置命令 1. 用户信息配置 # 设置全局用户名 git config --global user.name "你的名字"# 设置全局邮箱 git config --global user.email "你的邮箱example.com"# 查看所有配置 git config --list…...

Unity中的transform.up
2025年6月8日,周日下午 在Unity中,transform.up是Transform组件的一个属性,表示游戏对象在世界空间中的“上”方向(Y轴正方向),且会随对象旋转动态变化。以下是关键点解析: 基本定义 transfor…...