面试题目总结(一)
1. 谈谈数据库的乐观锁和悲观锁
乐观锁和悲观锁是数据库并发控制中常用的两种策略,用于处理多个事务同时访问和修改同一个数据时的并发冲突问题。
- 数据库的乐观锁是指在读取数据时,不对数据进行加锁,而是在更新数据时检查数据版本是否发生变化,如果没有变化则更新成功,否则更新失败。乐观锁的优点是并发性能好,因为多个事物可以同时访问同一行数据,不会阻塞其他事物完成操作。但乐观锁也有缺点,即需要维护版本号或时间戳等字段,增加了系统复杂度。
- 悲观锁是指在读取数据时,认为数据会被其他事物修改,因此对数据进行加锁,直到当前事物完成操作并释放锁。悲观锁的缺点是会导致并发性能降低,因此多个事物不能访问同一行数据,会阻塞等待其他事务完成操作。
选择何种锁机制,需要根据具体的业务情况和性能需求来决定。一般来说,对于读多写少的场景,可以采用乐观锁;对于写多读少的场景,可以采用悲观锁。
2. spring中有哪些事务管理,你在项目中常用的事务管理
- 编程式事务管理
编程式事物管理是通过编写代码来显示地管理事务的开启、提交、回滚和关闭。在代码中使用事务管理器(TransactionManager)或者直接使用(PlatformTransactionManager)接口进行事务管理,手动开启、提交或回滚事物,并定义事务的边界。这种方式灵活性较高,但需要手动处理事务的开启、提交和回滚,代码相对复杂。 - 声明式事务管理(XML配置)
通过在XML配置文件中声明事务切面(TransactionAspect),使用tx:advice来定义事务的传播行为、隔离级别、回滚规则等。实现方式示例:
<tx:advice id="txAdvice" transaction-manager="transactionManager"><tx:attributes><tx:method name="save*" propagation="REQUIRED" rollback-for="Exception" /><tx:method name="*" propagation="REQUIRED" /></tx:attributes>
</tx:advice><aop:config><aop:advisor advice-ref="txAdvice" pointcut="execution(* com.example.*.*(..))" />
</aop:config>
- 注解驱动的事务管理:
@Transactional注解可以用来标注在方法(必须是public方法上才能生效)或类级别上,用来声明一个或多个方法需要进行事务管理。该注解具有一系列的属性,用于控制事务的传播行为、隔离级别、超时时间和只读标识等。它是基于AOP的实现
实现方式示例:
@Configuration
@EnableTransactionManagement
public class AppConfig {// 配置数据源、实体管理器等相关Bean
}@Service
public class MyService {@Autowiredprivate MyRepository myRepository;@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)public void saveData(Data data) {// 执行数据库操作或其他业务逻辑myRepository.save(data);}
}
3. Set集合是怎么实现去除重复元素的
Set 集合底层是通过 Map 集合的 key 储存元素(value是一个固定的值),这就保证了Set 不重复。比如 Set 中的 HashSet。
-
HashSet:HashSet基于哈希表实现,它使用哈希函数对元素进行快速查找。当向HashSet中添加元素时,HashSet会计算元素的哈希码,并将元素存储在相应的哈希桶中。如果哈希桶中已经存在相同的元素(根据equals()方法判断),则新元素不会被添加进去,从而实现了去重复的效果。
-
TreeSet:TreeSet基于红黑树(一种自平衡二叉查找树)实现,它可以对元素进行排序。当向TreeSet中添加元素时,每个元素会被插入到正确的位置以保持元素的顺序。在插入元素的过程中,TreeSet会使用compareTo()或compare()方法来比较元素的大小,并根据比较结果决定元素的插入位置。如果插入的元素已经存在于TreeSet中,则新元素不会被添加进去。
-
LinkedHashSet:LinkedHashSet是HashSet的一个子类,它通过哈希表和链表的结合来实现。它具有HashSet的去重复功能,并且可以保持元素的插入顺序。当向LinkedHashSet中添加元素时,元素会先根据哈希码存储在相应的哈希桶中,然后在哈希桶内使用链表连接起来。这样既能提供快速的查找性能,又能保持元素的插入顺序。
无论使用哪种Set实现类,它们都依赖于元素的hashCode()方法和equals()方法来进行元素的比较和去重。因此,在使用Set集合时,需要确保元素正确实现了hashCode()和equals()方法,以便正确地判断元素是否重复。
需要注意的是,Set集合中的元素必须是唯一的,因此在自定义对象作为元素时,需要正确实现hashCode()和equals()方法,以避免出现意外的重复元素。
4. 如何给5个Dog对象排序。
要给5个Dog对象排序,需要指定排序的条件和排序规则。下面介绍两种常用的排序方法:
- 实现Comparable接口,重写compareTo() 方法
- Comparable接口是Java中定义的一个用于排序的接口,如果一个类实现了Comparable接口,就可以使用Collections.sort()方法对该类进行排序。
- 要实现Comparable接口,需要在类中定义一个
compareTo()方法,用来指定对象的排序规则。例如,假设Dog类有一个属性age,我们可以按照age从小到大进行排序,可以这样实现compareTo()方法:
public class Dog implements Comparable<Dog> {private int age;// getter和setter方法省略public int compareTo(Dog otherDog) {return this.age - otherDog.getAge();}
}
- 实现Comparator接口,实现 compare() 方法
- 如果无法修改Dog类,或者希望根据不同的条件进行排序,可以实现Comparator接口,它允许我们定义多个排序规则。
- 要实现Comparator接口,需要在另一个类中定义一个
compare()方法,用来指定对象的排序规则。例如,假设我们想按照名字进行排序,可以这样实现compare()方法:
public class DogNameComparator implements Comparator<Dog> {public int compare(Dog dog1, Dog dog2) {return dog1.getName().compareTo(dog2.getName());}
}
然后,在使用排序时,可以选择使用compareTo()方法或者compare()方法进行比较,例如:
List<Dog> dogs = new ArrayList<>();
dogs.add(new Dog("Charlie", 5));
dogs.add(new Dog("Buddy", 3));
dogs.add(new Dog("Max", 7));
dogs.add(new Dog("Rocky", 2));
dogs.add(new Dog("Jack", 4));// 使用Comparable接口排序
Collections.sort(dogs);// 使用Comparator接口排序
Collections.sort(dogs, new DogNameComparator());
以上代码演示了如何对5个Dog对象按照age或者name属性进行排序。
5. JVM的调优策略
在进行JVM调优时,可以采取以下策略来改善应用程序的性能和吞吐量:
-
调整堆内存大小:
- 堆内存是JVM中用于存储对象实例的区域,通过调整堆内存大小可以提高应用程序的性能。
- 如果应用程序频繁触发垃圾回收或者出现内存溢出问题,可以增加堆内存大小。可以通过设置
-Xmx参数增加堆内存的最大值,例如-Xmx4g表示将堆内存的最大值设置为4GB。
-
调整垃圾回收器:
- 垃圾回收器是负责回收无用对象的组件,在不同的场景下选择合适的垃圾回收器可以提高应用程序的性能。
- 可以使用不同类型的垃圾回收器,如Serial、Parallel、CMS、G1等,根据应用程序的特点和需求来选择适合的垃圾回收器。
- 可以通过设置
-XX:+UseSerialGC、-XX:+UseParallelGC等参数选择使用特定的垃圾回收器。
-
调整垃圾回收策略:
- 垃圾回收策略包括新生代和老年代的分配比例、垃圾回收的频率等,在不同的场景下可以调整这些策略以提高性能。
- 可以通过设置
-XX:NewRatio参数调整新生代和老年代的大小比例,默认为2,表示新生代大小为老年代的1/3。 - 可以通过设置
-XX:SurvivorRatio参数调整Eden区和Survivor区的大小比例,默认为8,表示Eden区大小为Survivor区的8倍。
-
使用并行处理:
- JVM提供了一些并行处理的选项,可以在多核系统上充分利用硬件资源来提高应用程序的性能。
- 可以通过设置
-XX:+UseParallelOldGC参数启用并行老年代垃圾回收器,以加速垃圾回收过程。 - 可以通过设置
-XX:+UseConcMarkSweepGC参数启用并发标记-清除垃圾回收器,以减少垃圾回收对应用程序的停顿时间。
-
调整线程数和线程栈大小:
- 线程数和线程栈大小的设置也会影响应用程序的性能和稳定性。
- 可以通过设置
-Xss参数调整线程栈的大小,适当增加线程栈的大小可以防止栈溢出错误。 - 可以通过设置
-XX:ParallelGCThreads参数调整垃圾回收线程的数量,以充分利用多核系统的处理能力。
这些是一些常见的JVM调优策略,具体的调优方法和参数设置需要根据应用程序的特点和需求来确定。在进行调优时,建议进行性能测试和监控,同时注意观察内存使用情况、垃圾回收情况以及应用程序的响应时间等指标,以便及时调整和优化。
相关文章:
面试题目总结(一)
1. 谈谈数据库的乐观锁和悲观锁 乐观锁和悲观锁是数据库并发控制中常用的两种策略,用于处理多个事务同时访问和修改同一个数据时的并发冲突问题。 数据库的乐观锁是指在读取数据时,不对数据进行加锁,而是在更新数据时检查数据版本是否发生变…...
建造者设计模式
3. 建造者设计模式 3.1 原理 Builder 模式,中文翻译为建造者模式或者构建者模式,也有人叫它生成器模式。 建造者模式是用来创建一种类型的复杂对象,通过设置不同的可选参数,“定制化”地创建不同的对象。 创建者模式主要包含以…...
YOLO目标检测——垃圾检测数据集下载分享【含对应voc、coco和yolo三种格式标签】
实际项目应用:智能化垃圾分类系统、垃圾回收和处理领域的优化管理等方面数据集说明:垃圾分类检测数据集,真实场景的高质量图片数据,数据场景丰富,含报纸、蛋壳、矿泉水瓶、电池、拉链顶罐、塑料餐盒、纸质药盒、香蕉皮…...
Vue CLI的介绍【vue利器之一】
文章目录 前言Vue CLI 介绍CLICLI 服务CLI 插件后言 前言 hello world欢迎来到前端的新世界 😜当前文章系列专栏:vue.js 🐱👓博主在前端领域还有很多知识和技术需要掌握,正在不断努力填补技术短板。(如果出现错误&am…...
【学习笔记】插值之拉格朗日插值(Lagrange)
0 插值介绍 插值法是广泛应用于理论研究和工程实际的重要数值方法。用提供的部分离散的函数值来进行理论分析和设计都是极不方便的,因此希望能够用一个既能反映原函数特征,又便于计算的简单函数去近似原函数。 1 低次拉格朗日插值 定理:设…...
无人机电力巡检系统运行流程全解读
随着电力行业体系不断完善,保障电网运营的安全成为至关重要的任务。传统的人工巡检方式在面对电力设备广泛分布和复杂工况时显得效率低下,为了解决这一难题,无人机电力巡检系统应运而生,以智能化的运行流程,为电网安全…...
有关全局变量和sizeof的题
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> int i; int main() {i--;if (i > sizeof(i)){printf(">");}else{printf("<");}return 0; } 这道题结果是 > 首先对于一个全局变量,当没有对其初始化时,它…...
vue简述
vue为渐进式框架:vmmv 1.易用 有html、css、javascript基础,即可学习vue框架 2.高效、开发前端页面 非常高效 1.vue的体积小、压缩完只需要20k的大小 2.超快的虚拟dom操作js中非常多的dom操作,vue设计虚拟dom非常快 3.设计时vue底层深度优化 …...
YOLOv8 训练自己的分割数据集
之前写过一篇 使用YOLOv8训练自己的【目标检测】数据集-【收集数据集】-【标注数据集】-【划分数据集】-【配置训练环境】-【训练模型】-【评估模型】-【导出模型】,里面带大家整个流程走过一遍了, 这篇文章我们来介绍如何使用 YOLOv8 训练分割数据集&a…...
Python实现DDos攻击实例详解
文章目录 SYN 泛洪攻击Scapy3k 基本用法代码实现DDos 实现思路argparse 模块socket 模块代码实现Client 端程序测试后记关于Python技术储备一、Python所有方向的学习路线二、Python基础学习视频三、精品Python学习书籍四、Python工具包项目源码合集①Python工具包②Python实战案…...
微信小程序实现【点击 滑动 评分 评星(5星)】功能
wxml文件: <view class"wxpl_xing"><view class"manyidu">{{scoreContent}}</view><view><block wx:for{{scoreArray}} wx:for-item"item"><view classstarLen bindtapchangeScore data-sy"{{…...
堡垒机的用途
堡垒机的用途 堡垒机,即在一个特定的网络环境下,为了保障网络和数据不受来自外部和内部用户的入侵和破坏,而运用各种技术手段监控和记录运维人员对网络内的服务器、网络设备、安全设备、数据库等设备的操作行为,以便集中报警、及时…...
超全超实用行业解决方案合集,覆盖十大行业数据应用需求
现代企业面对复杂的业务需求,对数据分析的需求日益增加。 从实时销售到市场趋势,从客户行为到产品优化,每个环节都依赖于数据支持。然而,传统的数据分析平台常分散在不同系统和团队中,形成数据孤岛,降低了…...
一盏茶的时间,入门 Node.js
一、.什么是 Node.js? Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行时,用于构建高性能、可伸缩的网络应用。 它采用事件驱动、非阻塞 I/O 模型,使其在处理并发请求时表现出色。 二、安装 Node.js 首先,让我们从 Node.…...
关于Java多线程的一些随笔
Synchronized与ReentrantLock有哪些相同点和不同点? 在Java中,synchronized关键字和ReentrantLock类都用于管理线程间的同步,但它们在实现方式、功能和灵活性方面存在一些差异。以下是它们的相同点和不同点: 相同点 互斥性&…...
Answering difficult questions in other way
I’m not (too) sure Q:Do you think computers make life easier? A:I’m not (too) sure, to be honest, but I reckon they do make life easier because… I can’t say for sure, but … Q:Do you think computers make lif…...
RabbitMQ教程:Linux下安装、基本命令与Spring Boot集成
RabbitMQ教程:Linux下安装、基本命令与Spring Boot集成 1. RabbitMQ简介 RabbitMQ是一个开源的消息代理和队列服务器,用于通过轻量级消息传递协议(AMQP)在分布式系统中传递消息。它支持多种编程语言,包括Java、Pytho…...
王者荣耀小游戏
第一步是创建项目 项目名自拟 第二部创建个包名 来规范class 然后是创建类 GameFrame 运行类 package com.sxt; package com.sxt;import java.awt.Graphics; import java.awt.Image; import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.…...
JAVA小游戏“简易版王者荣耀”
第一步是创建项目 项目名自拟 第二部创建个包名 来规范class 然后是创建类 GameFrame 运行类 package com.sxt;import java.awt.Graphics; import java.awt.Image; import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; im…...
Nginx高级
Nginx高级 第一部分:扩容 通过扩容提升整体吞吐量 1.单机垂直扩容:硬件资源增加 云服务资源增加 整机:IBM、浪潮、DELL、HP等 CPU/主板:更新到主流 网卡:10G/40G网卡 磁盘:SAS(SCSI) HDD(机械…...
龙虎榜——20250610
上证指数放量收阴线,个股多数下跌,盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型,指数短线有调整的需求,大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的:御银股份、雄帝科技 驱动…...
装饰模式(Decorator Pattern)重构java邮件发奖系统实战
前言 现在我们有个如下的需求,设计一个邮件发奖的小系统, 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其…...
shell脚本--常见案例
1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件: 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...
【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密
在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...
vue3 字体颜色设置的多种方式
在Vue 3中设置字体颜色可以通过多种方式实现,这取决于你是想在组件内部直接设置,还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法: 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...
用机器学习破解新能源领域的“弃风”难题
音乐发烧友深有体会,玩音乐的本质就是玩电网。火电声音偏暖,水电偏冷,风电偏空旷。至于太阳能发的电,则略显朦胧和单薄。 不知你是否有感觉,近两年家里的音响声音越来越冷,听起来越来越单薄? —…...
Linux nano命令的基本使用
参考资料 GNU nanoを使いこなすnano基础 目录 一. 简介二. 文件打开2.1 普通方式打开文件2.2 只读方式打开文件 三. 文件查看3.1 打开文件时,显示行号3.2 翻页查看 四. 文件编辑4.1 Ctrl K 复制 和 Ctrl U 粘贴4.2 Alt/Esc U 撤回 五. 文件保存与退出5.1 Ctrl …...
LRU 缓存机制详解与实现(Java版) + 力扣解决
📌 LRU 缓存机制详解与实现(Java版) 一、📖 问题背景 在日常开发中,我们经常会使用 缓存(Cache) 来提升性能。但由于内存有限,缓存不可能无限增长,于是需要策略决定&am…...
STM32---外部32.768K晶振(LSE)无法起振问题
晶振是否起振主要就检查两个1、晶振与MCU是否兼容;2、晶振的负载电容是否匹配 目录 一、判断晶振与MCU是否兼容 二、判断负载电容是否匹配 1. 晶振负载电容(CL)与匹配电容(CL1、CL2)的关系 2. 如何选择 CL1 和 CL…...
篇章二 论坛系统——系统设计
目录 2.系统设计 2.1 技术选型 2.2 设计数据库结构 2.2.1 数据库实体 1. 数据库设计 1.1 数据库名: forum db 1.2 表的设计 1.3 编写SQL 2.系统设计 2.1 技术选型 2.2 设计数据库结构 2.2.1 数据库实体 通过需求分析获得概念类并结合业务实现过程中的技术需要&#x…...
