自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(16)
  • 收藏
  • 关注

转载 Hi,我们再来聊一聊Java的单例吧!

本文深入探讨了Java中的单例模式,重点分析了懒汉式和饿汉式两种实现方式及其在多线程环境下的问题。文章首先介绍了单例模式的基本概念,随后详细讨论了懒汉式单例的简单版本、synchronized版本、双重检查版本以及终极版本(使用volatile关键字)的实现及其优缺点。接着,文章介绍了饿汉式单例的实现方式及其特点。此外,还提到了《Effective Java》中推荐的静态内部类和枚举两种单例实现方法。最后,文章总结了单例模式的复杂性,并指出在实际开发中应根据具体需求选择合适的实现方式。通过本文,读者可以更全

2025-05-19 03:22:55 27

原创 力扣322.零钱兑换(动态规划完全背包问题模板题)

要装5块钱的袋子,1能装进去,所以最小值就是装4块的袋子的最小硬币数量加上这个1块的硬币,因为每个能装的硬币都试过了,所以dp[5]最后的值就是需要的最少硬币数量。但是我们并不需要知道前1到前n-1个零钱组成0到amount块钱需要的最小数量。遍历所有能装进去的硬币,即面值小于需要达到的钱包的硬币,然后把他装进去就行了。我们只关心前硬币能否装进去和钱为0到amount的时候的最小硬币数。比如我要有个5块钱的袋子,我有1,2,3块钱面值的硬币。那么dp[5]的时候就遍历1,2,3面值的硬币。

2025-05-13 19:45:36 226

原创 力扣84.柱状图中最大的矩形

第二种暴力思路是固定目标区域的高度或者宽度,每个元素都可以当高嘛,所以我们对于每个元素都向左右找到第一个小于他的值,在这个范围内,当前元素就是最低点,也就是区域的高,宽就是左右端点下标的差值,这个做法也ac不了,但是能过90%的测试用例。在这个基础上还有更好的做法,因为是单调栈,所以我们找到当前元素的右侧第一个小于他的元素的时候,在栈里左边第一个元素就是他的左端点,我举个例子验证这个逻辑。找左右第一个小于当前元素的位置,那不就是。找到右侧目标,出栈,左侧没有东西,栈为空,我们把左侧端点设未0处理边界。

2025-05-13 19:26:28 259

原创 力扣155.最小栈

这题说实话没啥营养,就是弄俩栈,一个存元素,一个存当前元素结尾的最长子串的最小值嘛就是,这样就是一一对应的。为了方便走一样的逻辑给最小栈初始了一个整数最大值。

2025-05-13 18:43:02 182

原创 力扣739.每日温度(单调栈的模板题)

那你想一下,我到每个元素的时候都遍历之前未解决的元素是不是也能拿到结果,巧妙的地方就在于因为他是单调递减的,所以你一个while循环去取栈顶,如果栈顶元素,即栈里面最小的元素都大于当前元素了,那前面的值一定也都大于他,所以当前元素不是任何结点的最右侧第一个大的元素,并且把他塞进去。如果栈不为空且栈顶元素要小于当前元素,那就说明他找到右边第一个比他大的数了,所以我们把他出栈,否则栈顶元素大于当前元素,我们把当前元素塞进去,仍然单调。字面意思就是栈内元素是单调的嘛,那么如何维护这个单调栈。

2025-05-13 18:36:51 146

原创 华为od一面复盘java

华为OD一面面试持续了50分钟,主要针对Java后端开发岗位。面试开始于自我介绍和在校经历的讨论,随后深入探讨了Java相关项目。面试官询问了技术栈、SpringBoot启动流程、ORM框架使用、线程池及其参数、池化技术应用、问题定位方法、缓存设计、锁机制、Swagger使用、鉴权方式、Linux命令、批量删除实现、Docker使用等多个方面。面试中还包含了一道力扣中等难度的算法题,涉及约瑟夫环问题,面试者使用链表快速解决并详细解释。面试官在整个过程中表现出良好的引导和教学态度,提供了实际开发中的建议,如学

2025-05-13 11:27:21 225

原创 java八股文,自己整理的大白话版(持续更新)

递归回溯全排列dfs解决地图问题01背包完全背包自定义排序双指针快排。

2025-05-09 05:30:17 766

原创 看答案理解算法之最长公共子序列【动态规划】

状态转移就两种情况,i和j对应的字符相同,可以选,直接dp[i][j] = dp[i-1][j-1]+1。不相等的话就取s1前i-1和s2前j个 与 s1前i和s2前j-1 的公共子序列的最大值即可。dp数组的含义是以i结尾的字符串和以j结尾的字符串的子序列的最大长度。

2025-05-04 02:41:22 120

原创 看答案理解算法之最长公共子串【动态规划】

其实本质上还是一个选不选的问题,如果当前字符相等,那就选他,dp[i-1]j-1]+1就行,不相等的话dp肯定为0了,因为我们的dp含义是以i,j结尾的公共子串。大家刷算法主要是为了做对题,我觉得90%的算法题第一次遇见都不可能想出正规解法,不如直接看答案理解,看懂答案比自己干坐着几个小时想更能应付面试,毕竟咱不是为了创新。dp含义是以下标为i结尾的字符串和以下标为j结尾的字符串的最长公共子串长度,且这个公共子串以i和j结尾。因为是两个for,所以能覆盖所有情况。

2025-05-04 01:36:42 213

原创 mysql索引相关知识

假如你直接用第二个索引来查,那么这个联合索引是无效的,因为我们加索引本质上是利用了索引的有序性来进行查找提高我们的查找效率,但是如果直接使用用第二个索引,他只是在第一个索引相同的条件下是局部有序的,后面仍然可能会有需要命中的数据,那我们这个索引就相当于没有意义了,等同于全表扫描。还有一个很重要的点,因为uuid不是自增的,我们在插入数据的时候,为了保证有序性,需要往树的中间结点里插入而不是尾插,而中间结点显然是满的,这时b+树的叶子结点就会进行分裂,显然消耗性能。自己的话讲的,如有不对欢迎指出。

2025-01-01 20:03:47 318

原创 HashMap中为什么要重写hashcode 和equals方法?

这里我建了一个Person类只写了构造方法,没有重写hashcode和equals方法,显然hashmap没有把两个john当作同一个人。hashmap首先判断hashcode是否相同,因为存在哈希碰撞的问题,所以还得通过equals来确认是否是同一个key。即hashcode相同且equals返回true,hashmap才会认为是同一个key,进行覆盖。首先我们要知道,HashMap中是不允许存在两个相同的key的,即相同的键会覆盖值。重写equals后,hashmap还是没有把john当作一个人。

2024-12-25 06:21:06 285

原创 每天一道算法题之力扣55.跳跃游戏

虽然我们用 maxReach = Math.max(maxReach, i + nums[i]) 来更新 maxReach,但是并没有检查每个索引 i 是否真的能到达(即 i 之前的位置是否已经到达 i)。,比如我们目前维护的最远端只能到i-1,而i+num[i]一定比i-1要大,一定更新最远端,但是实际上一定到不了i+num[i]这个位置,因为目前的最远端是i-1,连i都到不了,何谈i+num[i]。如果 maxReach 小于 i,说明当前位置 i 就超出了我们能够到达的范围,无法到达。

2024-12-18 12:59:06 466

原创 Redis中的字符串类型(序列化相关知识)

今天在写某外卖项目的时候看到这样一段代码代码的逻辑很简单,缓存查过的数据到redis当中,缓存过就不走mysql可以看到这里是缓存了一个实体类列表,但是使用的是redis当中的字符串结构Redis的List数据结构支持有序的多个元素存储,适用于需要频繁操作元素的场景(如插入、删除),但是这里的场景是根据一个categoryId查询并缓存一个完整的DishVO列表,而非频繁地对单个菜品进行增删操作。所以使用的是String类型的存储方式。和是针对单一键值的操作,适用于保存普通的对象或序列化后的数据。因为。

2024-12-15 02:25:14 616

原创 Spring 中 @Bean 和 @Component 的区别

Bean主要用于手动配置和创建 Bean,尤其适合需要更多控制和灵活性、或者需要为第三方库创建 Bean 时使用。@Component是用于自动扫描并注册 Bean的注解,适用于大多数常规的 Spring Bean 创建场景。在配置类中使用@Bean的最大好处是,它允许你显式地控制对象的创建、初始化和配置,并且可以在同一配置类中为不同的 Bean 设定复杂的初始化逻辑和依赖关系。而@Component主要适用于 Spring 自动扫描并注册 Bean 的场景。

2024-12-09 21:24:39 1057

原创 springboot3从零到精通

我们都知道springboot是基于spring的,他并不是替代,而是简化了spring搭建和开发的过程。具体来说就是通过各种默认配置。springboot有一句很著名的话叫做约定大于配置。你想用的第三方库比如redis、MongoDB等等都被集成在里面,开箱即用,只用做很少的配置。这让开发者能够投入更多精力到业务当中。同时springboot通过集成大量的框架使得包版本冲突等问题得以解决。可以看到,在启动类中,我们调用了SpringApplication类的静态方法run来启动我们的项目。

2024-12-07 16:25:50 875 2

原创 基于redis命令实现分布式锁

我们设定的过期时间是10s,假如if语句判断完过了9.9s,然后系统卡了,在释放锁之前锁就已经过期了,线程2拿到了锁,然后线程1系统恢复,把线程2的锁给释放了,又回到了刚才说的那个问题。可以看到的是,刚才提出的种种bug其实都是与锁过期的时间相关,我们把锁过期的时间设置的大一点,当然可以一定程度的降低风险,但生产环境这显然是不合理的,后面的线程不可能等太久。开一个子线程,监测锁还在不在,如果还在,那就把锁的过期时间重新设定为10s,执行完业务逻辑,释放掉锁之后子线程也随之消失。

2024-12-03 16:15:37 318

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除