自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(55)
  • 资源 (6)
  • 收藏
  • 关注

原创 手写分析文件大小工具

window 用久了磁盘变红了,又不想安装大文件分析的软件,突发奇想能否自己写一个代码,分析有哪些大文件。获取指定文件夹的文件大小信息,支持找最大的几个文件,找几层。计算文件或者文件夹的大小。文件的单位,最高记作G。

2023-12-05 20:30:28 81

原创 请求合并-把多次请求合并为一次请求

合并请求思路就是等待一段时间,把该段时间的请求一次性进行处理,把一次次查询变为批量查询,针对数据库查询能提高性能。

2023-07-11 17:45:00 569 1

原创 Zip写文件工具类

zip 压缩

2023-05-08 21:15:00 122

原创 log日志异常堆栈打印的正确姿势

log ,异常堆栈打印

2022-09-15 18:30:45 4794

原创 lambda 优化 mybatis 动态查询组装

如果属性很多就会出现一大堆if 判断,而且还容易出现 在if中的判断条件,和if执行语句中的取值不一致的情况,因为他们的逻辑是一致的能否 借助lambda表达式进行重构呢?如果查询条件比较多那么 if 判空会很多,而且重复性工作就比较多。简单一眼明了,消除了重复性判空的逻辑。if(xxx 不为空){

2022-09-13 20:45:00 751

原创 Function<?,?>多个组合解决多个对象判空的问题

背景:美团酒店接口更新,旧的接口将要弃用,需要修改为新的接口,而新的接口的响应参数被封装到一个个小的对象中,我们需要把对应属性存储到数据库中,那么我们就需要对小的对象判空,如果小的对象超级多那么写起来就会很麻烦,能否写一个通用的方法,自动帮我们判空,不为空才赋值?

2022-09-08 18:30:00 256

原创 字典树-前缀树

1.往字典树里面插入字符串2.查找以指定字符串开头的所有字符串3.字符串都是小写英文字母public class TreeNode { TreeNode[] childen; boolean isEnd; public TreeNode(){ childen = new TreeNode[26]; } public void insert(String word){ TreeNode node = this;

2022-03-17 16:44:34 361

原创 批量查询-分批2

场景:针对一次查询结果太多,数据库查询会超时这种情况处理:需要分批次查询,把查询结果汇总在一起工具类: import lombok.Data; @Data class PageParameter{ private int start; private int limit = 20; } /** * 适合查询结果太多分页查询 * @param function * @param query *

2021-10-13 17:47:36 793

原创 每日一题 寻找峰值

162. 寻找峰值根据假设 nums[-1] = nums[n] = -∞ 。那么假设nums[i]<nums[i+1]那么往右侧找一定能找到,因为右侧num[n]= -∞同理如果nums[i] < nums[i-1] 那么往左找一定能找到,因为左侧num[-1]= -∞public int findPeakElement(int[] nums) { int len = nums.length; if(len == 1){ ret

2021-09-15 17:36:57 53

原创 每日一题-LeetCode获取生成数组中的最大值

1646. 获取生成数组中的最大值动态规划:定义dp[i] 表示nums[i]的值dp 递推公式当n>=2 ,为偶数时候 nums[2 * i] = nums[i] ,两边下标都除以2,因为i为偶数,因此i/2 一定能整除,因此等价于 ==> a[i] = a[i/2];为奇数的时候 nums[2 * i + 1] = nums[i] + nums[i + 1] ==> 两边下标同时处以2nums[i+1/2] = nums[i/2]+nums[(i+1)/2]因为int

2021-08-23 22:48:14 224

原创 LeetCode- 复制带随机指针的链表-Java

复制带随机指针的链表给你一个长度为 n 的链表,每个节点包含一个额外增加的随机指针 random ,该指针可以指向链表中的任何节点或空节点。构造这个链表的 深拷贝。 深拷贝应该正好由 n 个 全新 节点组成,其中每个新节点的值都设为其对应的原节点的值。新节点的 next 指针和 random 指针也都应指向复制链表中的新节点,并使原链表和复制链表中的这些指针能够表示相同的链表状态。复制链表中的指针都不应指向原链表中的节点 。例如,如果原链表中有 X 和 Y 两个节点,其中 X.random --&.

2021-07-22 09:13:23 66

原创 1846. 减小和重新排列数组后的最大元素

减小和重新排列数组后的最大元素给你一个正整数数组 arr 。请你对 arr 执行一些操作(也可以不进行任何操作),使得数组满足以下条件:arr 中 第一个 元素必须为 1 。任意相邻两个元素的差的绝对值 小于等于 1 ,也就是说,对于任意的 1 <= i < arr.length (数组下标从 0 开始),都满足 abs(arr[i] - arr[i - 1]) <= 1 。abs(x) 为 x 的绝对值。你可以执行以下 2 种操作任意次:减小 arr 中任意元素的值,使其变.

2021-07-15 09:49:48 81

原创 生产者消费者异步调用

场景:全量同步上游酒店数据,需要同步酒店数据量近百万,上游接口一家酒店需要调用2次接口才能获取完整的酒店数据,并且一次只能查询一家酒店本地需要更新的表有9张表,7张百万级别,2张千万级别如果一个一个酒店查询,然后更新就需要更新 近千万次(100w*9),如果一次更新耗时100ms 那么一千万次耗时:270多个小时,那么开了10个线程 也要27个小时如何加快查询处理速度?比如有a,b,c,d,e,f,g,h,i这九张表处理方案:1.如果存储空间足够可以考虑采取读写分离(每一个表都有备份表, 一

2021-06-29 16:42:15 110

原创 spring RedisTemplate set

spring RedisTemplate set场景:数据库中有百万条酒店记录,我需要从上游全量同步一次结果,需要找出以下三种数据新增:上游有,本地没有修改:上游和本地都有删除:本地有,上游没有思路:1.把数据库中百万条酒店的iD,同步到Redis的set 中2.批量处理上游数据,比如一次处理100条上游记录,然后判断出这100个酒店ID是否在Redis 中从而区分出 哪些新增,哪些变更3.把第二步中的100个酒店ID 从set 中移除出去4.处理完上游,Redis的set 中剩余的

2021-06-22 16:53:17 367

原创 借助Redis 实现限流

场景:调用上游的接口,上游不同接口有不同的调用频率限制例子:上游有接口A,B,CA接口频率 600次/minB接口频率 200次/minA接口频率 1000次/min

2021-06-16 12:27:07 125

原创 Zip文件读取处理工具类

在工作中,有4家上游,处理上游的文件又比较频繁,为了减少重复代码,因此写了个Zip文件读取处理工具类public static void readZipEntry(ZipFile zipFile, ZipEntry zipEntry, Consumer<String> consumer) { InputStream inputStream = null; BufferedReader br = null; String line = nu

2021-06-10 16:14:51 193

原创 分片查询

问题场景:A表 酒店表: 索引 hotel_codeB 表价格表:同一家酒店的30天价格信息,索引 hotel_code数据库链接 超时时间6秒1、为了加速查询 采用的批量查询,一次查询 500家酒店,得到 List<String> hotelCodeList 去查询 B表,采用 hotel_code in (500家酒店代码) 超时解决方案:写了一个分片 去查询的工具类,一次分一小片查询,直到把需要的 大的List 查完,在把查询的结果组装起来返回结果@S..

2021-05-24 13:35:32 605

原创 mybatis 插件查询指定列

1.针对mybatis 我们 逆向工程生成的代码 有个方法selectByExample<select id="selectByExample" resultMap="BaseResultMap" parameterType="com.wuss.model.hotel.HotelCityInfoCriteria" > <!-- WARNING - 该映射文件为自动生成, 请勿修改. --> select <if tes...

2021-05-14 12:15:22 1940 2

原创 NIO超过1亿个字符解析

遇到一个json 文件,文件只有一行,里面内容是json 数组的形式,形如:[{"CreateTime":"2021-04-27T10:02:38.243","UpdateTime":null,"SupplierCode":"xxx","SupplierName":"xxxx","HotelId":"xxxxx","RoomCode":"xxxx"},{"CreateTime":"2021-04-27T10:02:38.243","UpdateTime":null,"SupplierCode":"xxx

2021-04-30 16:27:51 149 1

原创 手写并行化工具类

场景如果我们调用有三个方法,methodA,methodB,methodC,他们耗时:methodA:2smethodB: 3smethodC:3s如果是串行public void testTime(){ methodA() //2s methodB() //3s methodC() //3s}如果串行化 结果就是 8s,如何提高响应速度?并行:@Slf4jpublic class AsynchronousUtils { private stat

2021-04-09 14:57:11 91

原创 lambda表达式 针对非runtimeException的优化处理

在写lambda表达式的时候遇到非运行时异常,会发现 lambda表达式中需要处理一遍,调用的地方还需要处理一遍例如:需要做如下处理看起来很丑,用起来很不方便,这种异常的类在RestHighLevelClient中的方法很常见,如下:每一次调用try Cathy 用起来很麻烦,能不能 用lambda 解决呢?自己定义异常类如:@FunctionalInterfacepublic interface ThrowingFunction<T,E...

2021-04-01 17:20:35 125

原创 重试工具类

有时候我们一次调用是败,希望能够重试,如果需要重试的地方很多一个一个写会很麻烦为了解决这种麻烦,能不能提取一个公用类简化开发?借用lambda表达式可以简化代码代码如下: public static <T,R> R doWithRetry(Function<T,R> function, T query, String remark){ for (int i=0;i<3;i++){ try{ re

2021-03-26 17:18:13 96

原创 NIO解决中文乱码

如果采取指定长度巧合分割了一个中文,造成读取中文乱码,解决方法如下:方式一:只保存读取正确的中文,从读取流中设置读取被分割的字符代码如下,采用clearprivate static StringBuilder readFromFile(String filePath) throws IOException { FileChannel fileChannel = FileChannel.open(Paths.get(filePath), StandardOpenOption.READ);

2021-02-05 13:31:10 488

原创 数据量比较大的高效分页查询

问题描述:查询昨天生成的记录并生成文件,原先是分批查询,每一次返回上一次查询结果的最大的ID,下一次查询 用id> 上一次查询的最大ID,最后一轮查询 超时,explain 结果如下:经过分析线上数据分布如下:采用 时间戳跨度太大造成 索引区分度不理想,因此进行了时间分片,分片长度是可以配置的,默认30分钟,在进行分页查询,并优化 查询条件如下:select * from wjs_hotel_info where create_datetime>=%s and create_date

2021-02-04 15:21:24 671

原创 IDEA 调试小技巧

条件断点循环中经常用到这个技巧,比如:遍历中,想让断点停在某个特定值。见上图,在断点位置,右击会弹出一个界面,在condition中填写断点条件,在调试的时候,断点会自动在断点条件,i ==6 为 true时候停下,跳过为false的条件。回退上一步针对调试中一不小心错过想要查看的方法,想要重新进入刚才的断点方法,适合使用方法套方法的场景参考上图,method1方法调用method2,当前第25行断点 ,点击下图红色箭头位置的Drop Frame图标后,瞬间回到了上一个method1多

2021-02-02 12:16:53 282 1

原创 jdk8 stream peek 和 map 区别

区别:peek没有返回值,map有返回值定义:peek:Stream<T> peek(Consumer<? super T> action);其中入参是Consumer --> void accept(T t);map:<R> Stream<R> map(Function<? super T, ? extends R> mapper);其中入参:Function --> R ...

2020-09-15 11:04:43 2710

原创 springmvc 请求封装成对象,set方法调用顺序

例子:分页例子(注意会有隐藏的坑(也就是set方法调用顺序))HotelOrderInfoReq 中 set方法调用顺序 @RequestMapping(value = "/purchaser/list") @ResponseBody public JsonResult purchaserList(HotelOrderInfoReq qry) {HotelOrderInfoReq:继承自PageParameter```@Data public class ...

2020-09-08 10:51:05 772

原创 使用Maven发布jar包源码,下载jar包源码

一、jar包提供方pom文件的编译选项中增加以下配置: <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-source-plugin</artifactId> <version>3.0.1</version&.

2020-07-30 15:51:14 621

原创 大整数减法自己实现

java 中针对大整数的运算,提供了BigInteger 和BigDecimal ,那么我们 自己如何实现大整数的减法呢?我们 回忆下减法的竖式 ,在减法竖式中,我们先减 个位数,再减十位数,如果个位数不够减则像 十位借1,个位数加上10,计算结果作为个位数结果,十位数字 减一。小数 减大数 = - ( 大数 - 小数):(ps:小数 减大数结果就是 大数减小数 前面加一个负号)...

2019-06-26 10:37:20 722

原创 大整数加法

java 中针对大整数的运算,提供了BigInteger 和BigDecimal ,那么我们 自己如何实现大整数的加法呢?我们 回忆下加法的竖式 ,在加法竖式中,我们先加个位数,再加十位数,如果个位数有进位则加上进位的一,换成更一般的说法:就是 计算第 i 位相加的时候 需要考虑到 第 i-1 位产生的进位。类比到 计算机:我们使用char[]数组进行存储 加数和被加数,结果存储...

2019-06-25 10:03:42 118

原创 java 方法内部类 使用外部的变量为啥要是 final

例子:public class T { public static void main(String[] args) { T test = new T(); test.testRun(); } public void testRun() { Thread t = new Thread(this.getRun()); ...

2018-05-09 17:06:51 1608

原创 JDK源码解析--- ThreadLocal

说明:本文是JDK 1.8版本1.简介:ThreadLocal 又叫做线程本地变量,也被称为线程本地存储。ThreadLocal 为 变量 在每一个线程中创建 一个 副本(不是原来变量的引用),每一个线程都会独自拥有变量副本,而不会相互影响。2.实现方式:(1)set 方法,,因为线程Thread 类中 内置了 ThreadLocal.ThreadLocalMap

2018-01-04 10:22:06 360

原创 JDK源码 - HashSet

说明:本文是JDK1.8 版本1.简介HashSet 实现类 Set 接口 ,内部的实现方式 是HashMap,因此 HashSet 的值 是不重复 并且是无序的,不是线程安全的,如果想要线程安全的 set则使用 Set s = Collections.synchronizedSet(new HashSet(...));2.内部实现方式set 接口的特征是 元素是不重复

2017-12-28 09:50:12 153

原创 修改IntelliJ IDEA中Maven项目的默认JDK版本

解决方式有以下2种:1.针对 maven 的配置文件的修改2.针对maven 项目的 pom 文件制定jdk方案一: 指定maven的配置文件(一劳永逸)或者直接修改maven的setting.xml文件在里面添加如下内容:           jdk-1.8                         true         

2017-11-27 13:58:41 6452

原创 分解质因数

题目:将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。程序分析:对n进行分解质因数,应先找到一个最小的质数k,然后按下述步骤完成:(1)如果这个质数恰等于n,则说明分解质因数的过程已经结束,打印出即可。(2)如果n 不等于  k,但n能被k整除,则应打印出k的值,并用n除以k的商,作为新的正整数你n,重复执行第一步。(3)如果n不能被k整除,则用k+

2017-11-08 14:20:21 377

原创 适配器模式

定义:将一个类的接口转换成客户希望的另一个接口。角色:target(目标对象):客户期望的目标对象,可以使具体对象或者接口 对应上图 中的厂商类adaptee(需要适配的类):需要适配的类,上图中 现有的系统adapter(适配器):适配器 把原接口转换成目标接口方式:常用有 类适配器 和 对象适配器类适配器:采用继承实现对象适配

2017-09-28 14:04:26 174

原创 命令模式

定义:把“请求”封装成对象,以便使用不同的请求、 队列或者日志来参数化其他对象,命令模式也支持可撤销的操作。类图:角色:command:定义了命令的接口,声明了执行的方法concreteCommand:接口的实现方式,一般会持有接收者,调用接收者完成指令,也可以充当接受者receiver:接受者,真正执行命令的实体,任何类都可能成为接受者,只要能够完成相应的功能

2017-09-28 11:18:02 146

原创 简单工厂模式

定义:工厂方法模式:创建一个实现类的接口,但是由子类决定实现的类是哪一个,工厂模式让类的实现推迟到子类设计原则:依赖倒置原则 ,要依赖抽象,不要依赖具体类

2017-09-25 17:14:01 161

原创 策略模式 排序

定义:定义了算法家族,分别封装起来,让他们之间可以相互替换类型:行为类模式类图:策略模式的结构封装类:也叫上下文,对策略进行二次封装,目的是避免高层模块对策略的直接调用。抽象策略:通常情况下为一个接口,当各个实现类中存在着重复的逻辑时,则使用抽象类来封装这部分公共的代码,此时,策略模式看上去更像是模版方法模式。具体策略:具体策略角色通

2017-09-25 16:37:55 836

原创 单例模式

定义:确保一个类只有一个实例,并且自行实例化并像整个系统提供该实例特点:1.私有的构造方法2. 指向自己唯一实例的静态引用引用3. 自己创建自己的唯一实例,并向外部提供该唯一实例单例模式 常用的有懒汉模式 ,饿汉模式,饿汉模式 在类被加载的时候就被实例化,而懒汉模式 是在使用的时候才被实例化饿汉模式:public class SingelDem...

2017-09-25 15:36:11 192

Tomcat 8 免安装

apache-tomcat-8.0.17(免安装版).rar 版本 Tomcat 8 免安装

2019-01-08

Hadoop 基础教程

Hadoop基础教程pdf

2017-05-31

java开发实战经典

Java开发实战经典 李兴华 很不错的一本Java书籍,值得一看

2015-11-19

Oracle经典入门教程.pdf

Oracle经典入门教程.pdf 初学者可以看看,挺不错的一本书

2015-01-16

编译原理答案

编译原理 第二版 答案 清华大学出版 课后习题答案

2012-03-19

空空如也

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

TA关注的人

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