![](https://img-blog.csdnimg.cn/20190918135101160.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
java
文章平均质量分 77
java开发案例和问题
海燕技术栈
既然巅峰留不住,那就重走来时路
展开
-
如何利用maven进行依赖管理
Maven 提供了强大的依赖管理功能,让我们能够轻松管理项目的依赖关系,确保项目能够正确地构建和运行。以下是关于 Maven 依赖管理的一些重要特点。原创 2024-02-23 23:12:27 · 1044 阅读 · 0 评论 -
Apache Maven简介
Apache Maven 是一个用于项目构建、依赖管理和项目信息管理的强大工具。它基于项目对象模型(Project Object Model,POM)进行构建,通过描述项目的结构和依赖关系来管理项目的构建过程。原创 2024-02-23 23:11:08 · 1569 阅读 · 0 评论 -
跨语言的序列化与反序列化
在Java中实现跨语言的序列化与反序列化通常可以采用以下几种方式。原创 2024-02-23 22:32:08 · 1137 阅读 · 0 评论 -
利用序列化和反序列化实现深拷贝
在上面的示例中,MyClass实现了接口,通过deepCopy()方法实现了深拷贝。在deepCopy()方法中,首先将原始对象序列化为字节流,然后从字节流中反序列化出一个新的对象,从而完成了深拷贝。原创 2024-02-23 21:59:12 · 1137 阅读 · 0 评论 -
Serializable 接口和 Externalizable 接口的区别
接口和接口都用于支持对象的序列化,但它们在实现方式和使用方法上有一些区别。原创 2024-02-23 21:58:15 · 1055 阅读 · 0 评论 -
Java 序列化与反序列化的原理
在某些情况下,开发者可以通过自定义反序列化过程来处理循环引用。例如,可以在反序列化方法中手动管理循环引用的解析顺序,或者采用特定的数据结构来辅助循环引用的处理。这种方式需要开发者对反序列化过程有深入的理解,并具备一定的编程能力。总结一下,当一个对象在反序列化过程中具有循环依赖时,Java运行时系统会采取一些特殊的策略来构建对象图,以确保对象之间的关联关系能够正确地建立,并避免出现无限递归或者栈溢出等问题。原创 2024-02-23 21:57:35 · 1126 阅读 · 0 评论 -
Gson 库的使用
Gson 允许开发者注册自定义的序列化器和反序列化器,以满足特定类型的定制需求。可以通过和接口来实现自定义的适配器,然后通过注册到 Gson 实例中。例如,可以为特定的日期格式注册自定义的序列化器和反序列化器.create();原创 2024-02-21 20:49:17 · 833 阅读 · 0 评论 -
java序列化之Jackson
在Jackson中,可以通过自定义序列化器(Serializer)和反序列化器(Deserializer)来实现对特定类型的定制化序列化和反序列化行为。这种方式可以让我们完全控制JSON数据的生成和解析过程,以满足特定的需求和场景。自定义序列化器是通过继承类并重写方法来实现的。在方法中,我们可以通过将Java对象序列化为JSON数据。原创 2024-02-21 20:48:32 · 1187 阅读 · 0 评论 -
maven打包全流程原理
Maven 是一个项目管理和构建自动化工具,它提供了一个标准化的方式来管理项目的结构、依赖关系和构建过程。原创 2023-07-10 21:51:33 · 912 阅读 · 0 评论 -
Spring框架中的线程池
Spring框架中的线程池原创 2023-06-16 09:35:27 · 1065 阅读 · 0 评论 -
java中的线程模型和线程池
Executor接口和Executor: 接受一个Runnable任务,并在将来的某个时间执行该任务。接口继承了Executor: 平缓关闭线程池,等待所有已提交的任务执行完成后关闭。: 立即关闭线程池,尝试停止所有正在执行的任务,并返回未执行的任务列表。: 判断线程池是否已经关闭。: 判断线程池中所有任务是否已经执行完成。: 阻塞当前线程,直到线程池中的所有任务执行完成或者达到指定的超时时间。Future<?: 提交一个Runnable任务给线程池执行,并返回一个Future。原创 2023-06-15 10:15:50 · 964 阅读 · 0 评论 -
对话AI-了解SpringBoot注解和原理
springboot里面有哪些类型的注解。原创 2023-03-31 22:42:05 · 654 阅读 · 0 评论 -
Java实现多继承
首先利用接口定义出get,set方法,这里有一个知识前提,就是框架在对参数进行反序列化时,其实都是看的get方法,而不是里面的具体的值,所以我们在接口中定义好方法,本质上就间接定义好了参数。而使用该接口,就间接继承了该参数。利用接口可以定义基本方法的方式来做,这样在修改接口的时候,会影响到对应实现层,从而达到多继承一处更改,其他地方也能被感知的目的。未来我们修改了接口中的方法,在编译的时候,这些实现类会报错,也会强制修改,从而达到了防止改掉的目的,也间接达到了多继承。原创 2022-10-12 09:56:36 · 250 阅读 · 0 评论 -
安全研发必备的安全知识
互联网上安全开发的资料不多,很多时候查资料只能查个大概,核心的东西还是得自己摸索,所以,具备一定的数据结构和算法的能力是必不可少的。目前我工作中使用到的顺丰有如下几种:1、动态规划2、树的遍历,图的遍历3、字典树4、字符串相关算法(正则表达式也是一种算法)等等。原创 2022-10-09 14:58:36 · 1212 阅读 · 0 评论 -
数据导入任务并行化
当我们需要做入库操作的时候,一般采取导入的方式,而导入的方式中,一般采取excel导入的方式比较多,而当excel中数据量很大的时候,导入的时长就不受控制,所以我们需要考虑异步并行化处理。原创 2022-10-08 13:36:43 · 291 阅读 · 0 评论 -
343-整数拆分
https://leetcode-cn.com/problems/integer-break/给定一个正整数 n ,将其拆分为 k 个 正整数 的和( k >= 2 ),并使这些整数的乘积最大化。返回 你可以获得的最大乘积 。**输入: **n = 2 **输出: **1 **解释: **2 = 1 + 1, 1 × 1 = 1。**输入: **n = 10 **输出: **36 **解释: **10 = 3 + 3 + 4, 3 × 3 × 4 = 36。要求2 &原创 2022-05-07 09:13:57 · 149 阅读 · 0 评论 -
322-零钱兑换
https://leetcode-cn.com/problems/coin-change/给你一个整数数组 coins ,表示不同面额的硬币;以及一个整数 amount ,表示总金额。计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额,返回 -1 。你可以认为每种硬币的数量是无限的。**输入:**coins = [1, 2, 5], amount = 11 **输出:**3 **解释:**11 = 5 + 5 + 1**输入:**coins = [2原创 2022-05-07 09:13:20 · 168 阅读 · 0 评论 -
309-最佳买卖股票时机含冷冻期
https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-with-cooldown/给定一个整数数组prices,其中第 prices[i] 表示第 i 天的股票价格 。设计一个算法计算出最大利润。在满足以下约束条件下,你可以尽可能地完成更多的交易(多次买卖一支股票):卖出股票后,你无法在第二天买入股票 (即冷冻期为 1 天)。注意:你不能同时参与多笔交易(你必须在再次购买前原创 2022-05-06 22:18:40 · 287 阅读 · 0 评论 -
279-完全平方数
https://leetcode-cn.com/problems/perfect-squares/给你一个整数 n ,返回 和为 n 的完全平方数的最少数量 。完全平方数 是一个整数,其值等于另一个整数的平方;换句话说,其值等于一个整数自乘的积。例如,1、4、9 和 16 都是完全平方数,而 3 和 11 不是。**输入:**n = 12 **输出:**3 **解释:**12 = 4 + 4 + 4**输入:**n = 13 **输出:**2 **解释:**13 = 4 + 9要求1 <原创 2022-05-06 22:17:52 · 345 阅读 · 0 评论 -
最长递增子序列
https://leetcode-cn.com/problems/longest-increasing-subsequence/给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。子序列 是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。**输入:**nums = [10,9,2,5,3,7,101,18] **输出:**4 **解释:**最长递增子序列是 [2,3,7,101]原创 2022-05-06 15:03:14 · 174 阅读 · 0 评论 -
极验使用流程
炒鸡辣鸡记得很久以前,那时候人与人之间还比较信任,发送短信验证码也没有那么多恶心的要求,拿来做短信轰炸机非常的方便。可是好景不长,时间到了2019年底,现在随便去找一个网站inurl:register intitle:注册 intext:获取短信验证码就会发现,大家现在都加了发送前验证,来判断当前发送验证码的是不是合法用户,验证非程序直接调用,过滤机器人等操作。大大增加了人们做短信轰炸机的工...原创 2019-11-18 15:13:11 · 1547 阅读 · 0 评论 -
爬虫框架Playwright在Java环境下的开发实践
<dependency> <groupId>com.microsoft.playwright</groupId> <artifactId>playwright</artifactId> <version>1.20.0</version></dependency>官方文档传送门出现问题首要的是查看官方文档简单的页面抓取public static BrowserContext c原创 2022-04-22 17:33:21 · 928 阅读 · 0 评论 -
用Java发起同步和异步HTTP请求的方法
Java发起HTTP请求的包有很多,在Spring里面也提供了一些基础的方法。RestTemplate直接注入到项目中,提供了方便的方法调用API。支持与服务发现等服务,可以直接使用名字进行调用。在分布式场景中使用比较多。HttpClient<dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId>原创 2022-04-11 09:31:30 · 2031 阅读 · 0 评论 -
Java线程池使用场景和方法分析
线程池的研究前期准备程序Executor executor = ExecutorUtils.getExecutor(2);创建新的线程,直接在最外层Executornew Thread(new Runnable() { @Override public void run() { while (true){ executor.execute(()->{ logger.info(Thread.currentT原创 2022-04-07 17:29:01 · 2256 阅读 · 0 评论 -
手写一个垂直领域的搜索引擎
前言:想要谷歌和百度已经够用了,这里实现的搜索只是为了方便自己做后续的事情的一个小实践。理论架构想要实现一个搜索引擎,首先需要考虑出完整的架构。页面抓取存储分析搜索实现展现页面抓取首先,页面抓取我打算采取最简单的HttpClient的方式,可能有人会说,你这样做会漏掉大量使用Web2.0的网站的,是的,没错,最开始我为了验证架构的可用性,就是要漏掉一些复杂的点。存储然后,存储,我打算直接使用文件系统进行实体存储,在搜索使用的时候,全部将结果加载到内存中。可能有的人会说,你这样好原创 2022-02-09 23:52:17 · 1439 阅读 · 0 评论 -
架构抽象之通用流程管理实施部分
在实验阶段,我们定义了三个结构,分别是流程图结构,流程节点结构和流程边结构。这三个结构构造的流程在行为上,通过测试,可以得出基本是可以满足流程的基本需求的。那么,我们就可以开始进入实际的开发工作中,来完善这一抽象的实现。如何与业务耦合完善抽象首先需要考虑的点是如何与业务耦合,即,这样的数据结构,我们该应用到业务场景中呢?通用流程的抽象我们已经做完了,现在就需要让这个抽象跟业务耦合。我首先想到了两种思路:在业务表里面添加控制字段,用来标识该业务进展到了哪个阶段建一个单独的表来存储流程流转的历史原创 2022-01-30 18:09:08 · 1502 阅读 · 0 评论 -
架构抽象之通用流程管理抽象
通用流程管理要做些什么通用流程管理旨在抽象出流程部分,让流程与业务进行松耦合,那么这个抽象过程就需要考虑出完整的结构,以适合尽可能多的业务。我们通常做项目的时候,都把业务流程两个词儿放到一起考虑,其实我们不妨把业务和流程分开考虑。当业务和流程分开之后,可以想象,业务层就可以减轻大量的工作。当然,随之而来的要求就是需要我们通用流程部分不断去迭代。以兼容更多的业务流程情形。基础的结构首先,我们还是按照一个有向无环图的理论点去推进。那么整个流程就可以抽象成以下几个点:流程图流程节点流程边.原创 2022-01-29 16:46:26 · 1701 阅读 · 0 评论 -
架构抽象之通用表单管理
问题分析表单管理做为要求性功能存在,所以通用表单管理需要考虑以下几个方面的内容:监管问题:如何让用户知道自己某个时间点该填哪些表格,还有哪些表格没有填。给用户生成未填写的历史上报表单,这就要求数据库中必须要有一个参考的列表点,与用户已经填写的进行对照,然后生成未填写的状态列表。表单中的字段和类型是相似的,前端没必要字字去实现,可以考虑实现一个表单配置的模式。主要做如下抽象:数据类型的抽象:普通字符串类型,单选类型,多选类型、数字类型还是布尔类型等;是否必填;字段名称;等等。在之前写的amd项目的.原创 2022-01-28 16:29:14 · 1741 阅读 · 0 评论 -
敏感词检测理论算法过程
准备工作环境和技术栈Java、多线程广度优先算法、正则表达式、页面抓取等等确认需要实现的功能加载词库数据到Tire字典树中,用字典树存储词库,速度比较快利用广度优先遍历抓取整站的数据去除标签,获取每个页面的实际数据对实际数据进行分词,得到分词-偏移量列表将分词列表与Tire字典树进行对比,得到敏感词列表再根据偏移量和词组情况,回归确定是否确认是敏感词,并根据结果判断是否报警对敏感句子的识别对敏感词拼音的识别确认功能所需的解决方案利用playwrite抓取页面利用广.原创 2022-01-27 15:01:20 · 3211 阅读 · 0 评论 -
用Java实现网站聚合工具
互联网上有数以万亿计的网站,每个网站大都具有一定的功能。搜索引擎虽然对互联网上的部分网站建立了索引,但是其作为一个大而全的搜索系统,无法很好的定位到一些特殊的需求,基于这样的背景,我尝试了写了一个网站数据聚合的程序。现在将原理和实现代码分享给大家。原理可以把互联网上的网站看做一张巨大的连通图,不同的网站处于不同的连通块中,然后以广度优先算法遍历这个连通块,就能找到所有的网站域名,利用广度优先算法遍历该连通块的结构可以抽象为:然后,我们对该网站的返回内容进行分词,剔除无意义的词语和标点符号,就得原创 2022-01-27 11:09:12 · 2010 阅读 · 0 评论 -
动态规划之完全背包和多重背包
完全背包描述: 有 N 种物品和一个容量为 V 的背包,每种物品都有无限件可用。第 i 种物 品的费用是 c[i],价值是 w[i]。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且 价值总和最大。 分析:完全背包和01背包的区别就是物品的数量,01背包的结果对于一个物品来说是要么有0个要么有1个(所以称之为01背包),而完全背包,不仅需要考虑有没有,还需要考虑有多少个。只需要对01背包的代码进行简单改造,就可以解决这样的问题。每个物品有无限个import java.util..原创 2022-01-25 11:28:14 · 1113 阅读 · 0 评论 -
动态规划之用Java实现01背包
背包问题有很多种,是最简单的动态规划类型。01背包描述: 有 N 件物品和一个容量为 V 的背包。(每种物品均只有一件)第 i 件物品 的费用是 c[i],价值是 w[i]。求解将哪些物品装入背包可使价值总和最大。解析:N件物品可以看做是有N种备选方案,容量为V的背包可以看做是成本为V,c[i]是每种方案的成本,价值是每种方案带来的效益。那么问题就变成了,在不超过总成本V的情况下,使用哪些备选方案,可以使效益最大。不过,这里针对的是单一物品特性,如果一个复杂系统是多个组成部分,每个部分有多种不同原创 2022-01-24 22:36:20 · 427 阅读 · 0 评论 -
对自研Java orm框架进行使用
上一篇中,实现了对数据库层的抽象。有些读者朋友提到了,里面使用的是HashMap作为入参,不符合ORM标准的操作。说的没错,不过上一篇是抽象基础查询,弄成hashMap作为入参,只需要业务查询层在继承的时候去实现Object类型的查询。再来看看数据库层抽象的架构图这一部分,我就以实现业务部分的数据库查询为例,将数据库层进一步封装。一个简单的业务例子让我们以每个系统中都有的组织架构场景为例,来使用上述抽象查询。建表首先,创建组织表sys_organization--组织表CREATE原创 2022-01-22 22:16:46 · 685 阅读 · 0 评论 -
一次尝试自研Java Orm层框架原理及代码实现
数据库层提出原因提出做数据库层的想法主要有以下几个原因:Java中已有的orm框架书写起来不够优雅,无论是Mybatis还是Spring-data,都不算特别优雅。一直以来想要实现一个类似于Laravel的Orm框架那样,靠点点的方法实现基础的SQL构造。建了表就自动生成各种默认的ORM层的函数,而不需要手动实现,只对特殊方法需要手动去写。数据库层的存在可以反向规范建表规则,比如,数据库层定义了必须要有创建人,创建时间,更新人,更新时间,删除人,删除时间等等,如果在引入的项目中没有使用这些字段.原创 2022-01-22 12:03:40 · 1392 阅读 · 0 评论 -
用Java实现线段树
线段树是为区间更新和区间查询而生的数据结构,旨在快速解决区间问题。一般来说,线段树是不会加节点的,也不支持动态添加节点。线段树也是二叉树的一种,不过它的节点是以一个区间来定义节点的。具有一个单一区间的就是叶子节点。所以线段树,本质上就是一棵区间树。我们在查找的时候,只需要找出结果区间由哪些子区间构成即可。实现代码首先定义出基础的结构public class SegmentTree { private Integer value; private Integer ma原创 2022-01-21 21:30:08 · 1252 阅读 · 0 评论 -
用Java实现二叉堆、大顶堆和小顶堆
先了解了解什么是二叉堆二叉堆就是完全二叉树,或者是靠近完全二叉树结构的二叉树。在二叉树建树时采取前序建树就是建立的完全二叉树。也就是二叉堆。所以二叉堆的建堆过程理论上讲和前序建树一样。什么是大顶堆、小顶堆二叉堆本质上是一棵近完全的二叉树,那么大顶堆和小顶堆必然也是满足这个结构要求的。在此之上,大顶堆要求对于一个节点来说,它的左右节点都比它小;小顶堆要求对于一个节点来说,它的左右节点都比它大。建堆二叉堆建堆本质上和前序建堆差不多,只不过需要考虑的一点就是大小关系,这一点和二叉搜索树建树有.原创 2022-01-21 21:27:13 · 1354 阅读 · 0 评论 -
不会写并查集?看看这篇用Java实现并查集
并查集就是将原本不在一个集合里面的内容合并到一个集合中。在实际的场景中用处不多。除了出现在你需要同时去几个集合里面查询,避免出现查询很多次,从而放在一起查询的情况。下面简单实现一个例子,我们来举例说明一下什么是并查集,以及究竟并查集解决了什么问题。代码解析package com.chaojilaji.book.andcheck;public class AndCheckSet { public static Integer getFather(int[] father, in原创 2022-01-21 21:21:22 · 779 阅读 · 0 评论 -
二叉树的实现和遍历
什么是二叉树简单理解为对于一个节点来说,最多拥有一个上级节点,同时最多具备左右两个下级节点的数据结构。由于很多排序算法都是基于二叉树实现的,多叉树也是二叉树延伸过去的,所以二叉树的建树和遍历就显得非常重要。二叉树建树一般情况是给你一个串,要求让你以前序,中序,后序的方式建树。那么此时我们就需要首先了解三个概念:前序遍历中序遍历后序遍历我们来看看一棵二叉树的结构: .原创 2022-01-21 20:48:22 · 615 阅读 · 0 评论 -
不会写平衡二叉树?看这一篇就够了
什么是二叉搜索树简单来说,就是方便搜索的二叉树,是一种具备特定结构的二叉树,即,对于节点n,其左子树的所有节点的值都小于等于其值,其右子树的所有节点的值都大于等于其值。以序列2,4,1,3,5,10,9,8为例,如果以二叉搜索树建树的方式,我们建立出来的逐个步骤应该为第一步:第二步:第三步:第四步:第五步:第六步:第七步:第八步:按照不平衡的普通方法生成的二叉搜索树就是这么一个样子。其实现代码如下:package com.chaojilaji.book.searcht.原创 2022-01-21 20:14:58 · 577 阅读 · 0 评论 -
深度优先入门?先看看迷宫问题吧
什么是深度优先什么是深度,即向下,深度优先,即向下优先,一口气走到底,走到底发现没路再往回走。在算法实现上来讲,深度优先可以考虑是递归的代名词,深度优先搜索必然需要使用到递归的思路。有的人可能会说了,我可以用栈来实现,以迭代的方式,那么问题来了,栈这种数据结构,同学们认为是否也囊括了递归呢?Java语言的方法区本身也是实现在一个栈空间上的。一个简单的例子我们以一个简单的迷宫为例,以1代表墙,0代表路径,我们构造一个具有出入口的迷宫。1 1 0 1 1 1 1 1 11 0 .原创 2022-01-21 19:46:23 · 310 阅读 · 0 评论