
Java
文章平均质量分 56
Aristocrat l
由于个人学习太过枯燥,同时缺乏方向感,所以今天开始写博客 记录自己的学习生活
展开
-
AtomicInteger有关CAS
AtomicIntegerpublic static void main(String[] args) { AtomicInteger ai = new AtomicInteger(20); System.out.println(ai.incrementAndGet()); }在学习AtominInteger时,第一次接触了CAS,也就是在自增的时候使用CAS自旋锁解决并发问题。调用的方法时incrementAndGet方法。而这个自增的操作本质上不是一个原...原创 2022-04-25 15:39:39 · 360 阅读 · 0 评论 -
ThreadPoolExecutor源码学习
一图胜千言:源码ctl共32位,其中前3位表示线程池的状态,0(000)、1(001)、2(010)、3(011)、-1(111)各表示一种,共五种,而后29位表示线程池中的线程个数 //其中AtomicInteger变量ctl的功能非常强大:利用低29位表示线程池中线程数,通过高3位表示线程池的运行状态: private final AtomicInteger ctl = new AtomicInteger(ctlOf(RUNNING, 0)); //Inte...原创 2022-04-12 19:36:41 · 625 阅读 · 0 评论 -
AQS——hasQueuedPredecessors方法
hasQueuedPredecessors方法的名称是:是否拥有前一个队列元素。换言之:用不用排队。返回false:不用排队。返回true:乖乖排队去。h != t返回true,(s = h.next) == null返回false以及s.thread !Thread.currentThread()返回false返回false的情况就很简单了,总共有两种返回false:第一种:h != t为false这种情况就是队列为空或者队列只有一个元素的情况。队列为空很好理解...原创 2022-04-10 18:50:31 · 2486 阅读 · 0 评论 -
算法训练——97. 交错字符串
给定三个字符串s1、s2、s3,请你帮忙验证s3是否是由s1和s2 交错 组成的。两个字符串 s 和 t 交错 的定义与过程如下,其中每个字符串都会被分割成若干 非空 子字符串:s = s1 + s2 + ... + snt = t1 + t2 + ... + tm|n - m| <= 1交错 是 s1 + t1 + s2 + t2 + s3 + t3 + ... 或者 t1 + s1 + t2 + s2 + t3 + s3 + ...注意:a + b 意味着字符串 a 和...原创 2022-04-07 11:10:48 · 196 阅读 · 0 评论 -
算法日常——377. 组合总和 Ⅳ
给你一个由 不同 整数组成的数组 nums ,和一个目标整数 target 。请你从 nums 中找出并返回总和为 target 的元素组合的个数。题目数据保证答案符合 32 位整数范围。示例 1:输入:nums = [1,2,3], target = 4输出:7解释:所有可能的组合为:(1, 1, 1, 1)(1, 1, 2)...原创 2022-04-07 09:13:53 · 197 阅读 · 0 评论 -
AQS源码学习
AQS,全称:AbstractQueuedSynchronizer,是JDK提供的一个同步框架,内部维护着FIFO双向队列,即CLH同步队列。AQS依赖它来完成同步状态的管理(voliate修饰的state,用于标志是否持有锁)。如果获取同步状态state失败时,会将当前线程及等待信息等构建成一个Node,将Node放到FIFO队列里,同时阻塞当前线程,当线程将同步状态state释放时,会把FIFO队列中的首节的唤醒,使其获取同步状态state。很多JUC包下的锁都是基于AQS实现的...原创 2022-04-07 11:12:14 · 167 阅读 · 0 评论 -
日常算法——278. 第一个错误的版本
你是产品经理,目前正在带领一个团队开发新的产品。不幸的是,你的产品的最新版本没有通过质量检测。由于每个版本都是基于之前的版本开发的,所以错误的版本之后的所有版本都是错的。假设你有 n 个版本 [1, 2, ..., n],你想找出导致之后所有版本出错的第一个错误的版本。你可以通过调用 bool isBadVersion(version) 接口来判断版本号 version 是否在单元测试中出错。实现一个函数来查找第一个错误的版本。你应该尽量减少对调用 API 的次数。示例 1:...原创 2022-04-06 15:12:27 · 99 阅读 · 0 评论 -
算法训练——力扣518 零钱兑换 II
给你一个整数数组 coins 表示不同面额的硬币,另给一个整数 amount 表示总金额。请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额,返回 0 。假设每一种面额的硬币有无限个。题目数据保证结果符合 32 位带符号整数。示例 1:输入:amount = 5, coins = [1, 2, 5]输出:4解释:有四种方式可以凑成总金额:5=5...原创 2022-04-05 21:05:58 · 299 阅读 · 0 评论 -
算法训练——力扣474一和零
给你一个二进制字符串数组 strs 和两个整数 m 和 n 。请你找出并返回 strs 的最大子集的长度,该子集中 最多 有 m 个 0 和 n 个 1 。如果 x 的所有元素也是 y 的元素,集合 x 是集合 y 的 子集 。示例 1:输入:strs = ["10", "0001", "111001", "1", "0"], m = 5, n = 3输出:4解释:最多有 5 个 0 和 3 个 1 的最大子集是 {"10","0001...原创 2022-04-05 20:36:30 · 352 阅读 · 0 评论 -
AtomicInteger有关自旋锁的原子性问题
AtomicInteger public static void main(String[] args) { AtomicInteger ai = new AtomicInteger(20); System.out.println(ai.incrementAndGet()); }在学习AtominInteger时,第一次接触了CAS,也就是在自增的时候使用CAS自旋锁解决并发问题。调用的方法时incrementAndGet方法。而这个自...原创 2022-04-05 17:34:44 · 1025 阅读 · 0 评论 -
可重入锁详解
现在终于有一次学习到了锁机制,上次学习还是在学习java基础的时候遇到的,当时对于锁还只是停留在一个大致的了解上,这次是彻底的深入学习,我在学习中遇到的第一个我认为的难点就是可重入锁。我一开始想要像大多数人那样宽泛的理解:自家开门后房屋任进。后来发现这样理解有不少问题,大大忽略了锁的概念和可重入锁在这样的问题中扮演的角色。可重入锁,就是当一个类中多个方法上锁,当多个方法中嵌套调用了上锁的方法,拿到第一把锁的线程在进入其他上锁方法时,无需在次获得锁。这样...原创 2022-04-05 11:28:29 · 619 阅读 · 0 评论 -
简单上手四大函数型接口
四大函数型接口1.功能型函数接口(Function<T,R>):T为参数类型,R为返回值类型2.消费型函数接口(Consumer<T>):T为参数类型,没有返回值3.供给型函数式接口(Supplier<T>):T为返回值类型,没有参数4.断言型函数式接口(Predicate<T>):T为参数类型,返回值为Boolean类型public class Test9 { public static void main(String[]原创 2022-04-05 11:06:40 · 529 阅读 · 0 评论 -
JUC——线程池的7大参数和4种拒绝策略
线程池的优势 1.线程复用,减少线程创建、销毁的开销,提高性能 2.提高响应速度,当任务到达时,无需等待线程创建就能立即执行。 3.提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资 源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控。线程池七大参数1.corePoolSize核心线程数。当提交一个任务时,线程池会创建一个新线程执行任务,此时线程不会复用。如果当前线程数为corePoolSi...原创 2022-04-01 16:54:28 · 1394 阅读 · 0 评论 -
算法训练——最少会议室
每日一道笔试题,同学们可以进行自我测试一下,下午公布参考答案~给你一个会议时间安排的数组 intervals ,每个会议时间都会包括开始和结束的时间 intervals[i] = [starti, endi] ,返回 所需会议室的最小数量 。示例 1:输入:intervals = [[0,30],[5,10],[15,20]]输出:2示例 2:输入:intervals = [[7,10],[2,4]]输出:...原创 2022-04-01 15:30:20 · 1224 阅读 · 0 评论 -
算法训练——数组匹配最多连线数
每⽇⼀道笔试题,同学们可以进⾏⾃我测试⼀下,下午公布参考答案~在两条独⽴的⽔平线上按给定的顺序写下 nums1 和 nums2 中的整数。 现在,可以绘制⼀些连接两个数字 nums1[i] 和 nums2[j] 的直线,这些直线需要同时满⾜满⾜: nums1[i] == nums2[j] 且绘制的直线不与任何其他连线(⾮⽔平线)相交。 请注意,连线即使在端点也不能相交:每个数字只能属于⼀条连线。 以这种⽅法绘制线条,并返回可以绘制的最⼤连线数。示例1:...原创 2022-04-01 15:24:47 · 471 阅读 · 0 评论 -
算法训练——相似岛屿
每日一道笔试题,同学们可以进行自我测试一下,下午公布参考答案~给定一个非空 01 二维数组表示的网格,一个岛屿由四连通(上、下、左、右四个方向)的 1 组成,你可以认为网格的四周被海水包围。请你计算这个网格中共有多少个形状不同的岛屿。两个岛屿被认为是相同的,当且仅当一个岛屿可以通过平移变换(不可以旋转、翻转)和另一个岛屿重合。示例 1:11000110000001100011给定上图,返回结果 1 。示例 2:11011100000000111011...原创 2022-04-01 15:20:30 · 239 阅读 · 0 评论 -
算法训练——括号匹配
每日一题给定一个只包括 '(',')','{','}','[',']'的字符串 s ,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。示例 1:输入:s = "()"输出:true示例2:输入:s = "()[]{}"输出:true示例3:输入:s = "(]"输出:false示例4:输入:s = "([)]"输出:false示例5...原创 2022-04-01 15:18:14 · 255 阅读 · 0 评论 -
算法训练——最长两种字节子串
每日一题给定一个字符串 s ,找出至多包含两个不同字符的最长子串 t ,并返回该子串的长度。示例 1:输入: "eceba"输出: 3解释: t 是 "ece",长度为3。示例 2:输入: "ccaabbb"输出: 5解释: t 是 "aabbb",长度为5。解题:滑动窗口public class Day6 { public static void main(String[] args) {// int solution...原创 2022-04-01 15:15:56 · 303 阅读 · 0 评论 -
算法训练——字符串映射
每日一练给你一种规律pattern和一个字符串s,请你判断s是否和pattern的规律相匹配。如果存在单个字符到字符串的 双射映射 ,那么字符串s匹配pattern,即:如果pattern中的每个字符都被它映射到的字符串替换,那么最终的字符串则为 s 。双射 意味着映射双方一一对应,不会存在两个字符映射到同一个字符串,也不会存在一个字符分别映射到两个不同的字符串。示例 1:输入:pattern = "abab", s = "redbluer...原创 2022-04-01 15:13:37 · 1159 阅读 · 0 评论 -
算法训练——最长同步字符串
每日一练给定两个单词word1和word2,返回使得word1和word2相同所需的最小步数。每步可以删除任意一个字符串中的一个字符。示例 1:输入: word1 = "sea", word2 = "eat"输出: 2解释: 第一步将 "sea" 变为 "ea" ,第二步将 "eat "变为 "ea"示例 2:输入:word1 = "leetcode", word2 = "etco"输出:4提示:1 ...原创 2022-04-01 15:11:27 · 148 阅读 · 0 评论 -
JUC——阻塞队列四套API使用
public class Test5 { //阻塞队列第一种方法:允许抛异常 @Test public void test1() { //阻塞队列 //构造器参数为阻塞队列最大长度 BlockingQueue<Integer> queue = new ArrayBlockingQueue<>(3); //1.1使用add方法,当添加的元素超过队列最大长度之后,如果继续添加,那么抛出异常I...原创 2022-04-01 15:08:36 · 183 阅读 · 0 评论 -
读写锁的API使用
public class Test6 { //读写锁 @Test public void test1() { Data2 data2 = new Data2(); HashMap<Integer, String> map = new HashMap<>(); for (int i = 0; i < 9; i++) { final int temp = i; .原创 2022-04-01 15:06:55 · 384 阅读 · 0 评论 -
Restful风格springboot简单整合
pom.xml<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/m原创 2022-03-14 09:08:24 · 258 阅读 · 0 评论 -
力扣494.目标和(动态规划)
推导题意:本题是将数组分为两组,一组是加号,另一组是减号设加数为x,减数为y:x + y = sum;x - y = target;而数组总和可以自己求出来,数组target题目已给,所以可以推出x的值:x = (sum +target)/2;如果后者能除尽则可以用加减号计算出结果,若除有余数则不可能计算出target所以本题转化为动态规划背包问题设一维dp滚动...原创 2022-03-09 11:28:02 · 330 阅读 · 0 评论 -
力扣95.不同的二叉搜索树2(dfs暴力解法)
这题明显可以使用dfs解决分析递推公式:1.当只有一个节点时,直接返回该节点2.当有两个节点时两种情况:1.小节点在上,右孩子为大节点 2.大节点在上,左孩子为小节点3.当有三个节点时三种情况:1.最小的节点在上,中等和最大的节点按照第二种方法排序2.中间节点在上,左右分别按照第一种方法3.最大的节点在上,左节点按照第二种方法排序以此类推,当n个节点时遍历n,当第i个节点作为根...原创 2022-03-08 12:13:16 · 239 阅读 · 0 评论 -
力扣42. 接雨水(双指针解法)
思路:最后无论原图形如何都会形成阶梯型,而每个阶梯型与力扣11.最大盛水容器类似,所以本题选择双指针法,首先查找到最高的一节,然后中心扩散。第一步,找到最高点,left指针与right指针同时指向该点第二步,双指针向左右扩散,找到次高点,计算与left,right之间的容量第三步,继续向左向右找次高点,计算盛水面积第四步继续进行扩散结束,返回总面积。package oneProject;public class Trap...原创 2022-03-08 11:59:38 · 630 阅读 · 0 评论 -
力扣473. 火柴拼正方形(dfs暴力解法)
题目:你将得到一个整数数组 matchsticks ,其中 matchsticks[i] 是第 i 个火柴棒的长度。你要用 所有的火柴棍 拼成一个正方形。你 不能折断 任何一根火柴棒,但你可以把它们连在一起,而且每根火柴棒必须 使用一次 。如果你能使这个正方形,则返回 true ,否则返回 false测试1输入: matchsticks = [1,1,2,2,2]输出: true解释: 能拼成一个边长为2的正方形,每边两根火柴。测试2输入: matchsticks = [原创 2022-03-03 09:02:04 · 509 阅读 · 0 评论 -
基于注解开发spring
目录@Configuration@Bean@ComponentScan1.basePackages属性:用于设置可以扫描到的注解所在包的范围,也就是原本扫描标签的value值。2.includeFilters属性:该属性是一个数组,用于拦截除指定bean以外的所有注解bean3.excludeFilters属性:该属性是一个数组,用于拦截所有指定bean@Filter1.type属性:用于设置拦截的方式:2.classe...原创 2022-03-02 11:26:00 · 615 阅读 · 0 评论 -
力扣416.分割等和子集
日常算法打卡416.分割等和子集本题题干:给你一个 只包含正整数 的 非空 数组 nums 。请你判断是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。事例1:输入:nums = [1,5,11,5]输出:true解释:数组可以分割成 [1, 5, 5] 和 [11] 。事例2:输入:nums = [1,2,3,5]输出:false解释:数组不能分割成两个元素和相等的子集。本题可以使用dfs深搜,但是算法复杂度十分高,所以使用动态规划滚动...原创 2022-02-19 23:20:13 · 303 阅读 · 0 评论 -
01背包——滚动数组动态规划优化
在上篇讲述了01背包基础问题,但是代码思想任然存在可优化地方,比如我们可以从递推公式可以看出来:原递推公式当前承重量的背包最大容纳价值 = max(腾出新物品空位后的背包承重量最大价值 + 新物品的价值,不加入新物品的最大价值);dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]);原递推思路定义一个二维数组,每一列为从0-max解放的背包重量,每...原创 2022-02-18 13:28:34 · 572 阅读 · 0 评论 -
01背包问题——动态规划详解
有N件物品和⼀个最多能被重量为W的背包。第i件物品的重量是weight[i],得到的价值是value[i]。每件物品只能⽤⼀次,求解将哪些物品装入背包⾥物品价值总和最⼤。 在题目中我们假设有三件物品 重量 价值 物品1 1 15 物品2 3 20 物品3 ...原创 2022-02-17 19:15:07 · 2372 阅读 · 0 评论 -
Mybatis中,SQLSessionFactoryBuilder使用build方法时做了哪些事?
当我们上手mybatis时,对于mybatis如何读取xml配置文件,获取SQLSessionFactory的底层源码还是处于一个比较模糊的状态,作者本人也是比较懵,所以本文尝试一下读一下SQLSessionFactoryBuilder的build方法源码,探索一下mybatis如何初始化数据连接以及读取配置文件的。 首先我们拿出一段正常mybatis执行sql语句的基本流程@Test public void test1() throws IOExceptio...原创 2022-02-07 18:46:54 · 6262 阅读 · 2 评论 -
MyBatis基础学习知识点3
目录动态sql语句if标签where标签foreach标签sql标签动态sql语句if标签在主SQL语句之间使用,用于sql语句的拼接例如: <select id="selectIf" resultType="com.ling.mybatis.pojo.User"> select * from user where <if test="id > 0"> i原创 2022-02-06 11:17:38 · 1220 阅读 · 0 评论 -
MyBatis基础学习知识点2
本文衔接MyBatis基础学习知识点1,继续对以下两个问题进行探讨1.dao配置文件主要是用来干什么的?如何进行配置?2.使用测试方法测试程序运行是如何实现的?每条语句起什么作用?dao配置文件主要是用来干什么的?如何进行配置?我们拿出一个最简单的dao层配置文件进行分析<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE mapper PUBLIC "-//...原创 2022-02-05 17:48:01 · 766 阅读 · 0 评论 -
MyBatis基础学习知识点1
Mybatis:mybatis主要用于处理三层架构的数据访问层,也就是我们在Javaweb学习期间使用到的dao层数据。mybatis优化了JDBC操作数据库的繁琐操作,并且实现了类与sql语句之间的解耦1.简单上手1.创建普通maven项目,引入依赖依赖有数据库连接jar包,mybatis核心jar包还有junit单元测试包<dependencies> <dependency> <groupId>mysql</grou原创 2022-02-05 13:43:44 · 672 阅读 · 0 评论 -
IOC容器逻辑上如何解耦
初学SpringIOC容器,我们对于解耦可能还是处于一个相对抽象的概念理解,后面作者也是查找了一些资料,本片文章就用一个例子来说明IOC容器解耦的妙处假设现在公司需要完成一个与新闻公司的合作项目,项目需要与新闻社进行合作,获取新闻社的新闻并且存储到我们的数据库中,用于展示。我们可以分析一下:当有新的新闻时,通过我们设计的程序,定时的到指定的新闻服务器下,去抓取最新的新闻,然后将这些新闻在通过指定的程序存储到我们的数据库中。因此整个处理过程就分为两大块:...原创 2022-01-28 23:35:10 · 1794 阅读 · 3 评论 -
学习mybatis前有关jdbc复习知识点
JDBCjdbc 定义规范的接口,具体的实现有各大数据库的厂商来实现。 jdbc是java访问数据的便准规范。jdbc的好处1. 程序员开发访问数据库程序,只需要会调用jdbc接口中方法即可,具体如何实现的,可以忽略。2. 使用同一套java代码,进行少量修改可以访问其他jdbc支持的数据库。基本步骤public class Demo { public static void main(String[] args) thr...原创 2022-01-28 17:17:56 · 1132 阅读 · 0 评论 -
SpringMVC框架——初学知识点篇2
报文信息转换器HttpMessageConverter报文可以简单的理解为我们前端页面传入后端代码的一些键值对,例如在登录案例中,前端页面就需要传入浏览器中用户输入的username和password,而这些信息内容在不同的请求中处于不同的位置,但是无论是get还是post请求亦或是其他类型请求,他们把信息转化成请求键值对的格式是都是一样的:key=value&key=value... 而报文转换器的主要作用就是将请求的报文转化为java对象,或者将java对象...原创 2022-01-27 16:56:23 · 973 阅读 · 0 评论 -
SpringMVC框架——初学知识点篇1
SpringMVC框架 1.MVC模型: Model(模型):通常指的就是我们的数据模型,主要作用用于封装数据 View(视图):通知指的的是.html或者.jsp 应用,作用一般是进行数据展示的。 Controller(控制):通常指应用程序中处理用户交互的部分,作用就是处理程序的逻辑。2.SpringMVC在三层架构的位置Mybatis负责处理数据访问层...原创 2022-01-23 16:04:35 · 1343 阅读 · 0 评论 -
Spring框架——初学IOC容器
注:作者本人也是初学者,所以本文有些总结性见解可能存在问题,但是多数问题都是在上网查询过资料后总结的,如果有逻辑或者原理上的错误,或者见解不同,欢迎在评论区讨论!!!原创 2022-01-18 21:57:24 · 464 阅读 · 0 评论