
Java
走一步-再走一步
这个作者很懒,什么都没留下…
展开
-
log日志异常堆栈打印的正确姿势
log ,异常堆栈打印原创 2022-09-15 18:30:45 · 5357 阅读 · 0 评论 -
Function<?,?>多个组合解决多个对象判空的问题
背景:美团酒店接口更新,旧的接口将要弃用,需要修改为新的接口,而新的接口的响应参数被封装到一个个小的对象中,我们需要把对应属性存储到数据库中,那么我们就需要对小的对象判空,如果小的对象超级多那么写起来就会很麻烦,能否写一个通用的方法,自动帮我们判空,不为空才赋值?原创 2022-09-08 18:30:00 · 307 阅读 · 0 评论 -
批量查询-分批2
场景:针对一次查询结果太多,数据库查询会超时这种情况处理:需要分批次查询,把查询结果汇总在一起工具类: import lombok.Data; @Data class PageParameter{ private int start; private int limit = 20; } /** * 适合查询结果太多分页查询 * @param function * @param query *原创 2021-10-13 17:47:36 · 920 阅读 · 0 评论 -
每日一题 寻找峰值
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 · 99 阅读 · 0 评论 -
LeetCode- 复制带随机指针的链表-Java
复制带随机指针的链表给你一个长度为 n 的链表,每个节点包含一个额外增加的随机指针 random ,该指针可以指向链表中的任何节点或空节点。构造这个链表的 深拷贝。 深拷贝应该正好由 n 个 全新 节点组成,其中每个新节点的值都设为其对应的原节点的值。新节点的 next 指针和 random 指针也都应指向复制链表中的新节点,并使原链表和复制链表中的这些指针能够表示相同的链表状态。复制链表中的指针都不应指向原链表中的节点 。例如,如果原链表中有 X 和 Y 两个节点,其中 X.random --&.原创 2021-07-22 09:13:23 · 152 阅读 · 0 评论 -
生产者消费者异步调用
场景:全量同步上游酒店数据,需要同步酒店数据量近百万,上游接口一家酒店需要调用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 · 144 阅读 · 0 评论 -
借助Redis 实现限流
场景:调用上游的接口,上游不同接口有不同的调用频率限制例子:上游有接口A,B,CA接口频率 600次/minB接口频率 200次/minA接口频率 1000次/min原创 2021-06-16 12:27:07 · 175 阅读 · 0 评论 -
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 · 255 阅读 · 0 评论 -
分片查询
问题场景: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 · 682 阅读 · 0 评论 -
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 · 213 阅读 · 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 · 128 阅读 · 0 评论 -
lambda表达式 针对非runtimeException的优化处理
在写lambda表达式的时候遇到非运行时异常,会发现 lambda表达式中需要处理一遍,调用的地方还需要处理一遍例如:需要做如下处理看起来很丑,用起来很不方便,这种异常的类在RestHighLevelClient中的方法很常见,如下:每一次调用try Cathy 用起来很麻烦,能不能 用lambda 解决呢?自己定义异常类如:@FunctionalInterfacepublic interface ThrowingFunction<T,E...原创 2021-04-01 17:20:35 · 173 阅读 · 0 评论 -
重试工具类
有时候我们一次调用是败,希望能够重试,如果需要重试的地方很多一个一个写会很麻烦为了解决这种麻烦,能不能提取一个公用类简化开发?借用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 · 145 阅读 · 0 评论 -
NIO解决中文乱码
如果采取指定长度巧合分割了一个中文,造成读取中文乱码,解决方法如下:方式一:只保存读取正确的中文,从读取流中设置读取被分割的字符代码如下,采用clearprivate static StringBuilder readFromFile(String filePath) throws IOException { FileChannel fileChannel = FileChannel.open(Paths.get(filePath), StandardOpenOption.READ);原创 2021-02-05 13:31:10 · 571 阅读 · 0 评论 -
数据量比较大的高效分页查询
问题描述:查询昨天生成的记录并生成文件,原先是分批查询,每一次返回上一次查询结果的最大的ID,下一次查询 用id> 上一次查询的最大ID,最后一轮查询 超时,explain 结果如下:经过分析线上数据分布如下:采用 时间戳跨度太大造成 索引区分度不理想,因此进行了时间分片,分片长度是可以配置的,默认30分钟,在进行分页查询,并优化 查询条件如下:select * from wjs_hotel_info where create_datetime>=%s and create_date原创 2021-02-04 15:21:24 · 729 阅读 · 0 评论 -
IDEA 调试小技巧
条件断点循环中经常用到这个技巧,比如:遍历中,想让断点停在某个特定值。见上图,在断点位置,右击会弹出一个界面,在condition中填写断点条件,在调试的时候,断点会自动在断点条件,i ==6 为 true时候停下,跳过为false的条件。回退上一步针对调试中一不小心错过想要查看的方法,想要重新进入刚才的断点方法,适合使用方法套方法的场景参考上图,method1方法调用method2,当前第25行断点 ,点击下图红色箭头位置的Drop Frame图标后,瞬间回到了上一个method1多原创 2021-02-02 12:16:53 · 346 阅读 · 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 · 2834 阅读 · 0 评论 -
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 · 834 阅读 · 0 评论 -
JAVA使用POI读取EXCEL文件的简单model
JAVA使用POI读取EXCEL文件的简单model标签: exceljavastringinputclass2011-09-02 09:06 24571人阅读 评论(5) 收藏 举报 分类:JAVA(35) 版权声明:本文为博主原创文章,未经博主允许不得转载。 [java] view plain copy转载 2016-10-21 17:22:53 · 271 阅读 · 0 评论 -
String.format 的大用场
String.format 的大用场String.format是在JDK1.5中新增的静态方法,功能强。它主要功能是格式化数据,大致分为这些类(常规类型、字符类型、数值类型、日期类型)。它的语法如下: 常规类型、字符类型和数值类型的格式说明符的语法:%[参数索引位置$][转换标识符][最小官渡][.保留精度位数]转换方式日期语法:%[参数索引位置$][t或T]转换方式转载 2016-11-03 16:26:28 · 412 阅读 · 0 评论 -
clipse Debug 界面应用详解
clipse Debug 界面应用详解——Eclipse Debug不为人知的秘密标签: java开发工具java2015-05-05 18:52 378人阅读 评论(0) 收藏 举报 分类:JAva基础(4) Debug视图认识debug视图,红色部分框为线程堆栈视图,黄色部分框为表达式、断点、变量视图,蓝色部分为代码视图。 线程堆转载 2016-10-20 13:26:43 · 250 阅读 · 0 评论 -
java 自定义注解
一、元注解为其它的注解提供的注解,Java5.0定义如下注解1.@Target(说明了注解修饰的范围),2.@Retention(说明了该注解保留的时间长短),3.@Documented(标记注解,文档说明相关),4.@Inherited(标记注解,阐述了某个被标注的类型是被继承的。如果一个使用了@Inherited修饰的annotation类型被用于一个class,则转载 2017-06-28 11:13:46 · 165 阅读 · 0 评论 -
排列的递归算法
从{1,2,3,...n}个数字中找到 0思路:假设 Pn={1,2,3,...n}, Lm=Pn-m(从Pn集合中去掉 m元素的集合),那么 n个数中选取m个算法就是,先从 Pn集合中,随机选取一个,在从剩下的集合中选取 m-1个的排列,那么p(n,m)表示:n个数中选取m个数p(n,m) = Pn中选择1个,假设是k,连接上Lk 中排列 m-1的组合;代码如下:/**原创 2017-08-23 09:53:12 · 294 阅读 · 0 评论 -
递归组合
/** * 组合 * * 1,2,3,...n 个中选取m个 且 0<=n * 思路:从n个数中随机找到一个数,然后从该数字 之后 在找到剩余的m-1个的组合 * 比如 1,2,3,4 中选取2个组合 * 1,2 1,3 1,4 * 2,3 2,4 * 3,4 * */public class Combination { /** *原创 2017-08-23 11:26:12 · 331 阅读 · 0 评论 -
最长公共子序列(LCS)问题
最长公共子序列也称作最长公共子串(不要求连续),英文缩写为LCS(Longest Common Subsequence)。其定义是,一个序列 S ,如果分别是两个或多个已知序列的子序列,且是所有符合此条件序列中最长的,则 S 称为已知序列的最长公共子序列。假设 字符串A,长度为m,c(i),表示 字符串 在第i个位置的字符(String.charAt(i))字符串B,长度为n则原创 2017-08-30 10:25:38 · 261 阅读 · 0 评论 -
分解质因数
题目:将一个正整数分解质因数。例如:输入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 · 423 阅读 · 0 评论 -
JDK源码 - HashSet
说明:本文是JDK1.8 版本1.简介HashSet 实现类 Set 接口 ,内部的实现方式 是HashMap,因此 HashSet 的值 是不重复 并且是无序的,不是线程安全的,如果想要线程安全的 set则使用 Set s = Collections.synchronizedSet(new HashSet(...));2.内部实现方式set 接口的特征是 元素是不重复原创 2017-12-28 09:50:12 · 188 阅读 · 0 评论 -
大整数加法
java 中针对大整数的运算,提供了BigInteger 和BigDecimal ,那么我们 自己如何实现大整数的加法呢?我们 回忆下加法的竖式 ,在加法竖式中,我们先加个位数,再加十位数,如果个位数有进位则加上进位的一,换成更一般的说法:就是 计算第 i 位相加的时候 需要考虑到 第 i-1 位产生的进位。类比到 计算机:我们使用char[]数组进行存储 加数和被加数,结果存储...原创 2019-06-25 10:03:42 · 149 阅读 · 0 评论 -
大整数减法自己实现
java 中针对大整数的运算,提供了BigInteger 和BigDecimal ,那么我们 自己如何实现大整数的减法呢?我们 回忆下减法的竖式 ,在减法竖式中,我们先减 个位数,再减十位数,如果个位数不够减则像 十位借1,个位数加上10,计算结果作为个位数结果,十位数字 减一。小数 减大数 = - ( 大数 - 小数):(ps:小数 减大数结果就是 大数减小数 前面加一个负号)...原创 2019-06-26 10:37:20 · 1196 阅读 · 0 评论 -
enum与int、String之间的转换
转自:http://www.cnblogs.com/cuizhf/archive/2011/08/22/2150046.htmlenum与int、String之间的转换enumintenum -> int: int i = enumType.value.ordinal();int -> enum: enumType b= enumType.values()[i];转载 2016-10-09 19:11:30 · 720 阅读 · 0 评论