![](https://img-blog.csdnimg.cn/20201014180756923.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
java
文章平均质量分 73
曾小二的秃头之路
一个默默学习的小小程序员
展开
-
Spring Boot 中动态更新 @Value 配置
通常我们在项目运行过程中,会有修改配置的需求,但是在没有接入分布式配置中心的情况下,经常修改一个配置就需要重启一次容器,但是项目的重启时间久,而且重启还会影响用户的使用,因此需要在不重启的情况下,动态修改配置。我们可以通过以下两种方式,实现 @Value 配置的动态更新。原创 2022-12-11 17:07:40 · 3532 阅读 · 1 评论 -
Spring Bean 的作用域
有时候,spring内置的几种sope都无法满足我们的需求的时候,我们可以自定义bean的作用域。下面我们来实现一个线程级别的bean作用域,同一个线程中同名的bean是同一个实例,不同的线程中的bean是不同的实例。需要调用的方法,先看一下这个方法的声明/***向容器中注册自定义的Scope**@param作用域名称*@param作用域对象//配置scopecustomScopeConfigurer.setScopes(map);}}...原创 2022-07-17 02:09:13 · 169 阅读 · 0 评论 -
需求设计文档模板
如何写好一个需求设计文档原创 2022-05-04 08:50:42 · 1221 阅读 · 0 评论 -
初识Spring Data JPA
1 初识Spring Data JPA1.1 认识Spring Data1.1.1 Spring Data简介Spring Data 项⽬是从 2010 年开发发展起来的,Spring Data 利⽤⼀个⼤家熟悉的、⼀致的、基于“注解”的数据访问编程模型,做⼀些公共操作的封装,它可以轻松地让开发者使⽤数据库访问技术,包括关系数据库、⾮关系数据库(NoSQL)。同时⼜有不同的数据框架的实现,保留了每个底层数据存储结构的特殊特性。Spring Data Common 是 Spring Data 所有模块原创 2022-04-10 06:55:40 · 395 阅读 · 0 评论 -
SpringBoot 项目统一枚举转换实践
SpringBoot 项目统一枚举转换实践1 现有问题目前的项目中,有些枚举字段,在传递的时候,需要经常对枚举进行对应的转换,有如下场景:存储进数据库的时候,需要存储为 int;查询出来的时候,需要对该数值进行转换;接收前端参数的时候,需要将数字转换为我们系统的枚举;响应的参数包含枚举的时候,需要将枚举转换成 int;发送或接收 MQ 消息时,又得对枚举进行转换。可以看到,我们在系统中需要做大量的枚举转换工作,那么是不是有什么方法对枚举转换进行简化呢?2 数据库转换枚举我们这边的系统原创 2022-02-20 23:04:57 · 2219 阅读 · 3 评论 -
栈:20. 有效的括号
20. 有效的括号20. 有效的括号给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。示例 1:输入:s = "()"输出:true示例 2:输入:s = "()[]{}"输出:true示例 3:输入:s = "(]"输出:false示例 4:输入:s = "([)]"输出:false示例 5:输入:s = "{[]}"输出原创 2021-09-10 14:42:31 · 101 阅读 · 0 评论 -
链表:876. 链表的中间结点
876. 链表的中间结点876. 链表的中间结点给定一个头结点为 head 的非空单链表,返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点。示例 1:输入:[1,2,3,4,5]输出:此列表中的结点 3 (序列化形式:[3,4,5])返回的结点值为 3 。 (测评系统对该结点序列化表述是 [3,4,5])。注意,我们返回了一个 ListNode 类型的对象 ans,这样:ans.val = 3, ans.next.val = 4, ans.next.next.val = 5原创 2021-09-09 10:29:20 · 163 阅读 · 0 评论 -
链表:19. 删除链表的倒数第 N 个结点
19. 删除链表的倒数第 N 个结点19. 删除链表的倒数第 N 个结点给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。**进阶:**你能尝试使用一趟扫描实现吗?示例 1:输入:head = [1,2,3,4,5], n = 2输出:[1,2,3,5]示例 2:输入:head = [1], n = 1输出:[]示例 3:输入:head = [1,2], n = 1输出:[1]提示:链表中结点的数目为 sz1 <= sz <= 300原创 2021-09-08 11:57:36 · 201 阅读 · 0 评论 -
链表:21. 合并两个有序链表
21. 合并两个有序链表合并两个有序链表将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。示例 1:输入:list1 = [1,2,4], list2 = [1,3,4]输出:[1,1,2,3,4,4]示例 2:输入:list1 = [], list2 = []输出:[]示例 3:输入:list1 = [], list2 = [0]输出:[0]提示:两个链表的节点数目范围是 [0, 50]-100 <= Node.原创 2021-09-07 10:45:05 · 4417 阅读 · 0 评论 -
链表:141. 环形链表
141. 环形链表141. 环形链表给定一个链表,判断链表中是否有环。如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。如果链表中存在环,则返回 true 。 否则,返回 false 。进阶:你能用 O(1)(即,常量)内存解决此问题吗?示例 1:原创 2021-09-06 10:49:57 · 93 阅读 · 0 评论 -
链表:206. 反转链表
206. 反转链表206. 反转链表给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。示例 1:输入:head = [1,2,3,4,5]输出:[5,4,3,2,1]示例 2:输入:head = [1,2]输出:[2,1]示例 3:输入:head = []输出:[]提示:链表中节点的数目范围是 [0, 5000]-5000 <= Node.val <= 5000进阶: 链表可以选用迭代或递归方式完成反转。你能否用两种方法解决这道题?原创 2021-09-05 10:53:46 · 92 阅读 · 0 评论 -
华为面试手写题目:检查一个字符串是否可以打破另一个字符串
华为面试手写题目:检查一个字符串是否可以打破另一个字符串1433. 检查一个字符串是否可以打破另一个字符串给你两个字符串 s1 和 s2 ,它们长度相等,请你检查是否存在一个 s1 的排列可以打破 s2 的一个排列,或者是否存在一个 s2 的排列可以打破 s1 的一个排列。字符串 x 可以打破字符串 y (两者长度都为 n )需满足对于所有 i(在 0 到 n - 1 之间)都有 x[i] >= y[i](字典序意义下的顺序)。示例 1:输入:s1 = "abc", s2 = "xya"原创 2021-08-21 19:00:06 · 132 阅读 · 0 评论 -
华为二面算法题:寻找峰值
寻找峰值162. 寻找峰值难度中等496收藏分享切换为英文接收动态反馈峰值元素是指其值大于左右相邻值的元素。给你一个输入数组 nums,找到峰值元素并返回其索引。数组可能包含多个峰值,在这种情况下,返回 任何一个峰值 所在位置即可。你可以假设 nums[-1] = nums[n] = -∞ 。示例 1:输入:nums = [1,2,3,1]输出:2解释:3 是峰值元素,你的函数应该返回其索引 2。示例 2:输入:nums = [1,2,1,3,5,6,4]输出:1 或 5 解原创 2021-08-19 15:14:50 · 195 阅读 · 0 评论 -
华为 OD 面试题目:根据身高重建队列
华为 OD 面试题目:根据身高重建队列406. 根据身高重建队列假设有打乱顺序的一群人站成一个队列,数组 people 表示队列中一些人的属性(不一定按顺序)。每个 people[i] = [hi, ki] 表示第 i 个人的身高为 hi ,前面 正好 有 ki 个身高大于或等于 hi 的人。请你重新构造并返回输入数组 people 所表示的队列。返回的队列应该格式化为数组 queue ,其中 queue[j] = [hj, kj] 是队列中第 j 个人的属性(queue[0] 是排在队列前面的人原创 2021-08-18 15:19:58 · 819 阅读 · 0 评论 -
551 学生出勤记录 I
551 学生出勤记录 I551. 学生出勤记录 I给你一个字符串 s 表示一个学生的出勤记录,其中的每个字符用来标记当天的出勤情况(缺勤、迟到、到场)。记录中只含下面三种字符:'A':Absent,缺勤'L':Late,迟到'P':Present,到场如果学生能够 同时 满足下面两个条件,则可以获得出勤奖励:按 总出勤 计,学生缺勤('A')严格 少于两天。学生 不会 存在 连续 3 天或 3 天以上的迟到('L')记录。如果学生可以获得出勤奖励,返回 true ;否则,返回原创 2021-08-17 15:12:25 · 102 阅读 · 0 评论 -
最长公共前缀
最长公共前缀14. 最长公共前缀 - 力扣(LeetCode) (leetcode-cn.com)编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串 ""。示例 1:输入:strs = ["flower","flow","flight"]输出:"fl"示例 2:输入:strs = ["dog","racecar","car"]输出:""解释:输入不存在公共前缀。提示:1 <= strs.length <= 2000 <= s原创 2021-08-13 10:46:01 · 70 阅读 · 0 评论 -
华为OD面试题:数组构建二叉树
华为OD面试题:数组构建二叉树华为面试手写题目:根据一个数组,构建一颗二叉树,并且使用中序遍历验证输出例如:输入数组 [1, 2, 3, null, null, 4, 5]则构建的二叉树为 1 / \ 2 3 / \ 4 5然后对其进行中序遍历输出:[2, 1, 4, 3, 5]题解如下:第一步:根据数组创建一颗二叉树/** * 根据数组创建一颗二叉树 */public static TreeNode constructTree(Integer原创 2021-08-12 11:43:30 · 1529 阅读 · 0 评论 -
华为OD面试题目:n 个成对的括号
华为OD面试题目:n 个成对的括号https://leetcode-cn.com/problems/bracket-lcci设计一种算法,打印 n 对括号的所有合法的(例如,开闭一一对应)组合。说明:解集不能包含重复的子集。例如,给出 n = 3,生成结果为:[ "((()))", "(()())", "(())()", "()(())", "()()()"]深度优先算法 (DFS) + 剪枝class Solution { public List<S原创 2021-08-10 14:17:26 · 389 阅读 · 0 评论 -
低版本 Spring Cache 高并发下的问题
低版本 Spring Cache 高并发下的问题问题发现今天排查线上问题,发现了一个使用 Springboot Cache 的注解 @Cacheable 获取缓存的结果为 null ,导致空指针异常的问题。Spring Cache 缓存的实现是 spring-data-redis:1.8.1.RELEASE伪代码如下:@Override@Cacheable(key = "#id", cacheNames = "cache.getListById", sync = true)public Li原创 2021-06-15 10:07:17 · 920 阅读 · 0 评论 -
JVM_08_堆
堆1 堆的核心概述1.1 概述一个 JVM 实例只存在一个堆内存,堆也是 Java 内存管理的核心区域。Java 堆区在 JVM 启动的时候即被创建,其空间大小也就确定了。是 JVM 管理的最大一块内存空间。堆内存的大小是可以调节的。《Java 虚拟机规范》规定,堆可以处于物理上不连续的内存空间中,但在逻辑上它应该被视为连续的。所有的线程共享 Java 堆,在这里还可以划分线程私有的缓冲区(Thread Local Allocation Buffer,TLAB)。《转载 2021-05-04 05:33:51 · 98 阅读 · 0 评论 -
JVM_07_本地方法栈
本地方法栈本地方法栈(Native Method Stack)Java 虚拟机栈于管理 Java 方法的调用,而本地方法栈用于管理本地方法的调用。本地方法栈,也是线程私有的。允许被实现成固定或者是可动态扩展的内存大小。(在内存溢出方面是相同的)如果线程请求分配的栈容量超过本地方法栈允许的最大容量,Java 虚拟机将会抛出一个 StackOverflowError 异常。如果本地方法栈可以动态扩展,并且在尝试扩展的时候无法申请到足够的内存,或者在创建新的线程时没有足够的内存去创建对应的本地方法栈原创 2021-05-04 04:41:17 · 70 阅读 · 0 评论 -
JVM_06_本地方法接口
本地方法接口1. 什么是本地方法简单地讲,一个 Native Method 是一个 Java 调用非 Java 代码的接囗。一个 Native Method 是这样一个 Java 方法:该方法的实现由非 Java 语言实现,比如 C。这个特征并非 Java 所特有,很多其它的编程语言都有这一机制,比如在 C++ 中,你可以用 extern “c” 告知 c++ 编译器去调用一个 c 的函数。“A native method is a Java method whose implementation转载 2021-05-04 04:39:40 · 159 阅读 · 0 评论 -
JVM_05_虚拟机栈
虚拟机栈1 虚拟机栈概述1.1 背景由于跨平台性的设计,Java 的指令都是根据栈来设计的。不同平台 CPU 架构不同,所以不能设计为基于寄存器的。栈的优点是跨平台,指令集小,编译器容易实现,缺点是性能下降,实现同样的功能需要更多的指令。有不少 Java 开发人员一提到 Java 内存结构,就会非常粗粒度地将 JVM 中的内存区理解为仅有 Java 堆(heap)和 Java 栈(stack)?为什么?首先栈是运行时的单位,而堆是存储的单位栈解决程序的运行问题,即程序如何执行,或者说如何原创 2021-05-04 04:37:28 · 266 阅读 · 0 评论 -
JVM_04_程序计数器
程序计数器(PC寄存器)1 PC Register 介绍官网文档:https://docs.oracle.com/javase/specs/jvms/se8/html/index.htmlJVM 中的程序计数寄存器(Program Counter Register)中,Register 的命名源于 CPU 的寄存器,寄存器存储指令相关的现场信息。CPU 只有把数据装载到寄存器才能够运行。这里,并非是广义上所指的物理寄存器,或许将其翻译为 PC 计数器(或指令计数器)会更加贴切(也称为程序钩子),并转载 2021-05-04 04:21:59 · 72 阅读 · 0 评论 -
JVM_03_运行时数据区概述及线程
运行时数据区概述及线程1 概述本节主要讲的是运行时数据区,也就是下图这部分,它是在类加载完成后的阶段当我们通过前面的:类的加载-> 验证 -> 准备 -> 解析 -> 初始化 这几个阶段完成后,就会用到执行引擎对我们的类进行使用,同时执行引擎将会使用到我们运行时数据区内存是非常重要的系统资源,是硬盘和 CPU 的中间仓库及桥梁,承载着操作系统和应用程序的实时运行 JVM 内存布局规定了 Java 在运行过程中内存申请、分配、管理的策略,保证了 JVM 的高效稳定运行。不同转载 2021-05-04 04:19:51 · 63 阅读 · 0 评论 -
JVM_02_类加载子系统
类加载子系统1 内存结构概述完整图如下:如果自己想手写一个 Java 虚拟机的话,主要考虑哪些结构呢?类加载器执行引擎2 类加载器与类加载过程2.1 类加载器子系统作用类加载器子系统负责从文件系统或者网络中加载 Class 文件,Class 文件在文件开头有特定的文件标识ClassLoader 只负责 Class 文件的加载,至于它是否可以运行,则由 Execution Engine 决定。加载的类信息存放于一块称为方法区的内存空间。除了类的信息外,方法区中还会存放运行时常量池原创 2021-05-03 16:14:07 · 55 阅读 · 0 评论 -
JVM_01_JVM 与 Java 体系结构
JVM 与 Java 体系结构1 前言作为 Java 工程师的你曾被伤害过吗?你是否也遇到过这些问题?运行着的线上系统突然卡死,系统无法访问,甚至直接 OOM!想解决线上 JVM GC 问题,但却无从下手。新项目上线,对各种 JVM 参数设置一脸茫然,直接默认吧然后就 GG 了每次面试之前都要重新背一遍 JVM 的一些原理概念性的东西,然而面试官却经常问你在实际项目中如何调优 JVM 参数,如何解决 GC、OOM 等问题,一脸懵逼。大部分 Java 开发人员,除会在项目中使用到与 Jav原创 2021-05-03 08:02:36 · 157 阅读 · 0 评论 -
zookeeper的集群和监听
zookeeper事件监听和集群zookeeper 事件监听机制zookeeper 集群搭建一致性协议:zab协议zookeeper的leader选举observer角色及其配置zookeeperAPI连接集群1.zookeeper 事件监听机制1.1 watcher概念zookeeper提供了数据的发布/订阅功能,多个订阅者可同时监听某一特定主题对象,当该主题对象的自身状态发生变化时(例如节点内容改变、节点下的子节点列表改变等),会实时、主动通知所有订阅者zookeeper 采用了原创 2020-06-01 11:29:20 · 690 阅读 · 0 评论 -
zookeeper入门:基础API和java API的使用
zookeeperzookeeper简介zookeeper数据模型zookeeper单机安装zookeeper常用shell命令zookeeper的Acl权限控制zookeeper的javaApi1.zookeeper简介1.1 什么是zookeeperzookeeper官网:https://zookeeper.apache.org/zookeeper 由雅虎研究院开发,是 Google Chubby 的开源实现,后来托管到 Apache,于2010年11月正式成为Apache的顶级原创 2020-05-28 22:26:16 · 553 阅读 · 1 评论 -
JAVA实现十大基本排序算法
基本排序算法排序是计算机的核心内容,快速排序算法一直推动计算机的发展,同时也可以为我们工作生活提供一些有益的优化,帮助我们了解管理与社会的本质。0、算法概述0.1 算法分类十种常见排序算法可以分为两大类:非线性时间比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此称为非线性时间比较类排序。线性时间非比较类排序:不通过比较来决定元素间的相对次序,它可以突破基于比较排序的时间下界,以线性时间运行,因此称为线性时间非比较类排序。0.2 算法复杂度术语说原创 2020-05-26 23:12:30 · 2050 阅读 · 0 评论 -
SpringCloud学习:RestTemplate详解
RestTemplate详解一,Get请求在RestTemplate中通过如下两个方法进行调用第一种:getForEntity()函数返回:ResponseEntity(对HTTP响应的封装,重要元素:HTTP请求状态的枚举对象HttpStatus,HTTP请求头信息对象HttpHeaders,泛型的请求体对象)例如: RestTemplate restTemplate = new R...原创 2019-07-11 08:52:39 · 394 阅读 · 0 评论 -
笔记(一):java的动态代理
动态代理特点:字节码谁用谁创建,谁用谁加载。作用:不修改源代码的基础上对方法进行增强。分类:一种是基于接口的动态代理,一种是基于子类的动态代理。基于接口的动态代理使用的类:Proxy,提供者:JDK官方。如何创建代理对象:使用Proxy类中的newProxyInstance()方法。创建代理对象的要求:被代理对象至少实现一个接口,如果没有则不能使用。newProxyInst...原创 2019-05-04 17:04:04 · 104 阅读 · 0 评论