面试题目总结(一)

1. 谈谈数据库的乐观锁和悲观锁

乐观锁和悲观锁是数据库并发控制中常用的两种策略,用于处理多个事务同时访问和修改同一个数据时的并发冲突问题。

  • 数据库的乐观锁是指在读取数据时,不对数据进行加锁,而是在更新数据时检查数据版本是否发生变化,如果没有变化则更新成功,否则更新失败。乐观锁的优点是并发性能好,因为多个事物可以同时访问同一行数据,不会阻塞其他事物完成操作。但乐观锁也有缺点,即需要维护版本号或时间戳等字段,增加了系统复杂度。
  • 悲观锁是指在读取数据时,认为数据会被其他事物修改,因此对数据进行加锁,直到当前事物完成操作并释放锁。悲观锁的缺点是会导致并发性能降低,因此多个事物不能访问同一行数据,会阻塞等待其他事务完成操作。

选择何种锁机制,需要根据具体的业务情况和性能需求来决定。一般来说,对于读多写少的场景,可以采用乐观锁;对于写多读少的场景,可以采用悲观锁。

2. spring中有哪些事务管理,你在项目中常用的事务管理

  1. 编程式事务管理
    编程式事物管理是通过编写代码来显示地管理事务的开启、提交、回滚和关闭。在代码中使用事务管理器(TransactionManager)或者直接使用(PlatformTransactionManager)接口进行事务管理,手动开启、提交或回滚事物,并定义事务的边界。这种方式灵活性较高,但需要手动处理事务的开启、提交和回滚,代码相对复杂。
  2. 声明式事务管理(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>
  1. 注解驱动的事务管理:
    @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。

  1. HashSet:HashSet基于哈希表实现,它使用哈希函数对元素进行快速查找。当向HashSet中添加元素时,HashSet会计算元素的哈希码,并将元素存储在相应的哈希桶中。如果哈希桶中已经存在相同的元素(根据equals()方法判断),则新元素不会被添加进去,从而实现了去重复的效果。

  2. TreeSet:TreeSet基于红黑树(一种自平衡二叉查找树)实现,它可以对元素进行排序。当向TreeSet中添加元素时,每个元素会被插入到正确的位置以保持元素的顺序。在插入元素的过程中,TreeSet会使用compareTo()或compare()方法来比较元素的大小,并根据比较结果决定元素的插入位置。如果插入的元素已经存在于TreeSet中,则新元素不会被添加进去。

  3. LinkedHashSet:LinkedHashSet是HashSet的一个子类,它通过哈希表和链表的结合来实现。它具有HashSet的去重复功能,并且可以保持元素的插入顺序。当向LinkedHashSet中添加元素时,元素会先根据哈希码存储在相应的哈希桶中,然后在哈希桶内使用链表连接起来。这样既能提供快速的查找性能,又能保持元素的插入顺序。

无论使用哪种Set实现类,它们都依赖于元素的hashCode()方法和equals()方法来进行元素的比较和去重。因此,在使用Set集合时,需要确保元素正确实现了hashCode()和equals()方法,以便正确地判断元素是否重复。

需要注意的是,Set集合中的元素必须是唯一的,因此在自定义对象作为元素时,需要正确实现hashCode()和equals()方法,以避免出现意外的重复元素。

4. 如何给5个Dog对象排序。

要给5个Dog对象排序,需要指定排序的条件和排序规则。下面介绍两种常用的排序方法:

  1. 实现Comparable接口,重写com[areTo() 方法
    • 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();}
}
  1. 实现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调优时,可以采取以下策略来改善应用程序的性能和吞吐量:

  1. 调整堆内存大小:

    • 堆内存是JVM中用于存储对象实例的区域,通过调整堆内存大小可以提高应用程序的性能。
    • 如果应用程序频繁触发垃圾回收或者出现内存溢出问题,可以增加堆内存大小。可以通过设置-Xmx参数增加堆内存的最大值,例如-Xmx4g表示将堆内存的最大值设置为4GB。
  2. 调整垃圾回收器:

    • 垃圾回收器是负责回收无用对象的组件,在不同的场景下选择合适的垃圾回收器可以提高应用程序的性能。
    • 可以使用不同类型的垃圾回收器,如Serial、Parallel、CMS、G1等,根据应用程序的特点和需求来选择适合的垃圾回收器。
    • 可以通过设置-XX:+UseSerialGC-XX:+UseParallelGC等参数选择使用特定的垃圾回收器。
  3. 调整垃圾回收策略:

    • 垃圾回收策略包括新生代和老年代的分配比例、垃圾回收的频率等,在不同的场景下可以调整这些策略以提高性能。
    • 可以通过设置-XX:NewRatio参数调整新生代和老年代的大小比例,默认为2,表示新生代大小为老年代的1/3。
    • 可以通过设置-XX:SurvivorRatio参数调整Eden区和Survivor区的大小比例,默认为8,表示Eden区大小为Survivor区的8倍。
  4. 使用并行处理:

    • JVM提供了一些并行处理的选项,可以在多核系统上充分利用硬件资源来提高应用程序的性能。
    • 可以通过设置-XX:+UseParallelOldGC参数启用并行老年代垃圾回收器,以加速垃圾回收过程。
    • 可以通过设置-XX:+UseConcMarkSweepGC参数启用并发标记-清除垃圾回收器,以减少垃圾回收对应用程序的停顿时间。
  5. 调整线程数和线程栈大小:

    • 线程数和线程栈大小的设置也会影响应用程序的性能和稳定性。
    • 可以通过设置-Xss参数调整线程栈的大小,适当增加线程栈的大小可以防止栈溢出错误。
    • 可以通过设置-XX:ParallelGCThreads参数调整垃圾回收线程的数量,以充分利用多核系统的处理能力。

这些是一些常见的JVM调优策略,具体的调优方法和参数设置需要根据应用程序的特点和需求来确定。在进行调优时,建议进行性能测试和监控,同时注意观察内存使用情况、垃圾回收情况以及应用程序的响应时间等指标,以便及时调整和优化。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/172602.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

B树你需要了解一下

介绍B树的度数主要特点应用场景时间复杂度代码示例拓展 介绍 B树&#xff08;B-tree&#xff09;是一种自平衡的树&#xff0c;能够保持数据有序&#xff0c;常被用于数据库和文件系统的实现。 B树可以看作是一般化的二叉查找树&#xff0c;它允许拥有多于2个子节点。与自平衡…

2023.11.25 关于 MyBatis 的配置与使用

目录 引言 MyBatis 介绍 掌握两个点 在框架中的定位 创建数据库 配置 MyBatis 引入依赖 配置文件 创建实体类 构建 Mapper 层代码实现 添加 mapper 接口 添加 UserMapper.xml 实现 Service 层 实现 Controller 层 最终测验 阅读下面文章之前建议了解并创建…

树状数组专题

折叠 区间修改&#xff0c;区间查询&#xff0c;这一类题通常都可以使用线段树解决&#xff0c;但对于此题&#xff0c;树状数组同样可以&#xff0c;而且常数较小&#xff0c;代码简单。 思路&#xff1a; 考虑使用树状数组去维护差分数组&#xff0c;即对于 a i a_i ai​,我们…

使用qemu调试arm内核

参考书籍《奔跑吧Linux内核》–笨叔 下载Linux-5.0源码 https://benshushu.coding.net/public/runninglinuxkernel_5.0/runninglinuxkernel_5.0/git/files或者直接git源码 git clone https://e.coding.net/benshushu/runninglinuxkernel_5.0/runninglinuxkernel_5.0.git安装必…

【React】Memo

组件重新渲染时缓存计算的结果。 实例&#xff1a;count1计算斐波那契数列&#xff0c;count2和count1可以触发数值变化。使用memo可以使只有在count1变化时触发斐波那契数列计算函数&#xff0c;而count2变化时不触发斐波那契数列计算函数。 import { useMemo } from "r…

点云从入门到精通技术详解100篇-基于深度学习的语义分割与室内稠密点云地图研究(续)

目录 3.2稠密点云地图的预处理 3.2.1 基于密度的点云离群点去除 3.2.2 基于超体素聚类的点云地图预分割

SpringCloud微服务网关Gateway:gateway基本实现、断言工厂、过滤器工厂、浏览器同源策略、跨域问题解决方案

Gateway网关 Spring Cloud Gateway 是 Spring Cloud 的一个全新项目&#xff0c;该项目是基于 Spring 5.0&#xff0c;Spring Boot 2.0和Project Reactor 等响应式编程和事件流技术开发的网关&#xff0c;它旨在为微服务架构提供一种简单有效的统一的 API路由管理方式 为什么…

【面试题】介绍一下类加载过程,什么是双亲委派模型

背景 java 文件在运行之前&#xff0c;必须经过编译和类加载两个过程&#xff1a; 编译过程&#xff1a;把 .java 文件 编译成 .class 文件类加载过程&#xff1a;把 .class 文件加载到 JVM 内存里&#xff0c;加载完成后就会得到一个 class 对象&#xff0c;我们就可以使用 n…

Vue快速实践总结 · 上篇

文章目录 模板语法数据绑定事件处理计算属性监视属性&#xff08;监听器&#xff09;条件渲染列表渲染数据监视原理内置指令总结生命周期组件化编程组件使用步骤组件的嵌套this指向单文件组件ref、props 脚手架(Vue CLI)render函数 参考自己的Vue专栏以及Vue官方文档 模板语法 …

目标检测YOLO实战应用案例100讲-基于改进YOLO深度学习模型的烟支外观质量检测

目录 前言 研究意义 国内外研究现状 烟支缺陷检测的研究

Java PriorityQueue

一般情况下, 我们使用队列是为了能够建造队列的先进先出 (First-In-First-Out) 模式的, 达到一种资源的公平分配, 先到达的任务 (元素) 先处理, 但有时需要在队列中基于优先级处理对象。 存入队列中的任务 (元素) 具有优先级, 需要根据优先级修复里面的数据。而在 JDK 1.5 引入…

Java 泛型知识总结

1、基础知识 泛型是 JDK5 引入的参数化类型特性&#xff0c;所谓参数化类型就是把类型当成参数一样传递&#xff0c;它使得一个类型在定义类、接口和方法时成为一个参数&#xff0c;类似于方法声明中的形式参数&#xff0c;不同之处在于形式参数的输入是值&#xff0c;而类型形…

微机原理_5

一、单项选择题(本大题共15小题,每小题3分,共45分。在每小题给出的四个备选项中,选出一个正确的答案,请将选定的答案填涂在答题纸的相应位置上。) 8086微处理器CLK引脚输入时钟信号是由(提供。 A. 8284 B. 8288 C.8287 D. 8289 2.下面4个寄存器中,不能作为间接寻址的寄存器是(…

go语言基础 break和contine区别

背景 break和continue是编程语言的标准语法&#xff0c;几乎在所有的语言都有类似的用法。 go语言及所有其他编程语言for循环或者其他循环 区别 for i : 0; i < 10; i {if i 5 {continue}fmt.Println(i)for j : 0; j < 3; j {fmt.Println(strconv.Itoa(j) "a&q…

Java + openCV更换证件照背景色

最近在小红书上看到很多更换证件照背景色的需求&#xff0c;联想到以前自己也更换过证件照背景色而且还是付费的&#xff0c;碰巧最近在看一本书《JavaOpenCV高效入门》&#xff0c;于是查找资料&#xff0c;找到了通过技术解决这个需求的办法。 先看效果图&#xff08;图片来自…

使用CMake构建

使用CMake构建 CMake是一个工具,用于简化跨不同平台的开发项目的构建过程。CMake自动生成生成系统,如Makefiles和Visual Studio项目文件。 CMake是一个自带的第三方工具证明文件。本主题描述了如何使用CMake3.1.0带Qt 5。 开始使用CMake 开始find_package找到Qt附带的库和…

java源码之变量和运算符

1、源码使用背景 2、基础讲解 1、数据类型变量 数据类型包括基本数据类型与引用数据类型。 基本数据类型&#xff1a;整数类型、浮点类型、字符类型与布尔类型&#xff08;1&#xff09;整数类型&#xff1a;byte&#xff08;1字节&#xff09;、short&#xff08;2字节&…

职场如战场!!!

一、与他们相处的经历和故事 尊重他人&#xff1a;无论是同事还是领导&#xff0c;在职场中都应该相互尊重。尊重他人的看法、意见和信仰&#xff0c;可以建立积极的工作关系&#xff0c;促进工作效率。 跟随公司文化&#xff1a;不同的公司有不同的文化&#xff0c;理解和遵循…

62 权限提升-烂土豆dll劫持引号路径服务权限

目录 演示案例:Win2012-烂士豆配合令牌窃取提权-Web权限Win2012-DLL劫持提权应用配合MSF-Web权限Win2012-不安全的服务权限配合MSF-本地权限Win2012-不带引号服务路径配合MSF-Web&#xff0c;本地权限补充说明: dll劫持提权及AlwaysInstallElevated等说明关于Windows相关知识点…

vue 中 keep-alive 组件的作用

Vue中的<keep-alive>组件主要用于缓存不活动的组件实例&#xff0c;而不是销毁它们。当组件在<keep-alive>内时&#xff0c;它的激活和停用状态会被相应的触发。这对于性能优化特别有用&#xff0c;尤其是对于那些需要大量计算或产生大量DOM操作的组件。 在<ke…