JAVA
渡人既是渡己
程序员改变世界。
展开
-
二分法查找 模板代码
二分查找。两遍二分,分别查找出左边界和右边界。模板 1:boolean check(int x) {}int search(int left, int right) { while (left < right) { int mid = (left + right) >> 1; if (check(mid)) { right = mid; } else { left = mid +原创 2022-04-06 10:30:21 · 6338 阅读 · 0 评论 -
easyexcel 导出excel文件
easyexcel 引入: <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-collections4</artifactId> <version>4.4</version> </dependency>原创 2021-11-22 16:10:17 · 6718 阅读 · 0 评论 -
约瑟夫环问题
public class 约瑟夫环 { public static int[] answer(int m, int n){ Node head = new Node(1,null); Node temp = null; for (int i = 2; i <= m; i++) { temp = temp==null?head:temp; temp.next = new Node(i,null); temp=temp.next; }原创 2021-10-12 20:17:40 · 120 阅读 · 0 评论 -
一篇了解常用数据结构
1. 数组 Array[]下标访问 顺序遍历 不方便扩容2. 链表 LinkedList<>增删方便 不支持随机访问3. 队列 Queue 先进先出数组链表都可以实现4. 栈 stack 先进后出数组链表都可以实现5. 堆 heap 大顶堆 小顶堆树+数组6. 哈希表 hashmap哈希定位索引 底层数组+链表哈希冲突 处理 开放地址法 和 拉链法 next指针 头插法7. 树 tree进化:二叉树 > 平衡二叉树(AVL)> 红原创 2021-10-11 15:03:53 · 109 阅读 · 0 评论 -
spring boot 使用 caffeine 缓存
缓存依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-cache</artifactId> </dependency> <dependency> <groupId>原创 2021-08-17 14:53:37 · 284 阅读 · 0 评论 -
SpringBoot 2.4.X 接入Jaeger
SpringBoot 2.4.X 接入,建议 springcloud 版本 2020.0.X,该版本支持 kafka 接入调用链步骤一:POM 文件中引入jaeger依赖<dependency> <groupId>io.opentracing.contrib</groupId> <artifactId>opentracing-spring-jaeger-cloud-starter</artifactId> <version>3原创 2021-08-16 11:17:26 · 1413 阅读 · 0 评论 -
jaeger对接内存溢出问题分析
通过dump文件分析,发现大量jaeger对象没能及时回收。用了线程池异步报价,新起的线程是没有trace的。 但是我们早期有个针对消息的优化,使用logback filter在没有trace的时会自动生成一个trace。 生成的trace使用MDC.put(“X-B3-TraceId”, traceId)存放在ThreadLocal,在使用线程池时,因线程不回收,导致trace一直不变。 而LogData对象使用了map保存trace,导致线程池里相同trace的日志越来越大,而且无法回收,.原创 2021-08-16 11:05:30 · 854 阅读 · 0 评论 -
现金计算 AmountUtil
/** * * @author qsh * */public abstract class AmountUtil { private AmountUtil() { } /** * 加法运算 * * @param v1 * @param v2 * @return */ public static double add(double v1, double v2) { BigDecimal b1 = new BigDecimal(Double.toStri原创 2021-07-02 11:05:53 · 241 阅读 · 0 评论 -
配置Ons
/** * 本类是配置Ons * * @author * @created */@Configuration@ConditionalOnClass(ONSFactory.class)@ConditionalOnExpression("${" + OnsProperties.PREFIX + ".enabled:false}")@EnableConfigurationProperties({ OnsProperties.class })public class OnsAutoConfi原创 2021-07-02 11:05:21 · 6352 阅读 · 1 评论 -
SpringBoot @EnableAsync 线程池配置 实现AsyncConfigurer接口方法
import java.lang.reflect.Method;import java.util.concurrent.Executor;import java.util.concurrent.ThreadPoolExecutor;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler;impor原创 2021-07-02 10:44:36 · 811 阅读 · 0 评论 -
CacheKeyGenerator
import java.lang.reflect.Array;import java.lang.reflect.Method;import java.math.BigDecimal;import java.nio.charset.Charset;import org.springframework.cache.interceptor.KeyGenerator;import org.springframework.util.ClassUtils;import com.google.common原创 2021-07-01 19:31:08 · 592 阅读 · 0 评论 -
加签/验签工具类SignUtil
import java.beans.BeanInfo;import java.beans.Introspector;import java.beans.PropertyDescriptor;import java.lang.reflect.Method;import java.util.HashMap;import java.util.Map;import java.util.TreeMap;import org.apache.commons.codec.digest.DigestUtils原创 2021-07-01 19:24:16 · 1923 阅读 · 0 评论 -
NioUtils
import org.apache.commons.lang3.ArrayUtils;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import java.io.File;import java.io.IOException;import java.io.RandomAccessFile;import java.nio.MappedByteBuffer;import java.nio.channels.FileChannel;原创 2021-07-01 19:20:24 · 216 阅读 · 0 评论 -
LruCacheUtils
import java.util.LinkedHashMap;import java.util.Map;import java.util.Map.Entry;/** * Cache保存一个强引用来限制内容数量, 每当Item被访问的时候, 此Item就会移动到队列的头部. 当cache已满的时候加入新的item时, 在队列尾部的item会被回收 * <p> * 如果cache的某个值需要明确释放, 重写{@link #entryRemoved} * <p> * 如果原创 2021-07-01 19:13:08 · 199 阅读 · 0 评论 -
分布式定时任务 jobkeeper
/** * 初始化调度器 * * @return */ @Bean public TaskScheduler poolScheduler() { //使用ZK-LeaderElector ScheduledProperties.ZKLeaderElector zkLeaderElector = properties.getLeaderElector(); //配置zkLeaderElecto则使用Z.原创 2021-07-01 19:11:26 · 220 阅读 · 0 评论 -
JAVA 四中引用类型
强引用(StrongReference)在Java中最常见的就是强引用,把一个对象赋给一个引用变量,这个引用变量就是一个强引用。当一个对象被强引用变量引用时,它处于可达状态,它是不可能被垃圾回收机制回收的,即使该对象以后永远都不会被用到JVM也不会回收。因此强引用是造成Java内存泄漏的主要原因之一。String str = new String(“abc”);软引用(SoftReference)软引用需要用SoftReference类来实现,对于只有软引用的对象来说,当系统内存足够时它不会被回原创 2021-05-08 22:33:27 · 109 阅读 · 0 评论 -
Spring Bean生命周期
Spring Bean生命周期比较复杂,可以分为创建和销毁两个过程。首先,创建Bean会经过一系列的步骤,主要包括:实例化Bean对象。设置Bean属性。如果我们通过各种Aware接口声明了依赖关系,则会注入Bean对容器基础设施层面的依赖。具体包括BeanNameAware、BeanFactoryAware和ApplicationContextAware,分别会注入Bean ID、Bean Factory或者ApplicationContext。调用BeanPostProcess原创 2021-05-07 15:32:05 · 99 阅读 · 0 评论 -
ReentrantLock和synchronized
ReentrantLock是Lock的实现类,是一个互斥的同步器,在多线程高竞争条件下,ReentrantLock比synchronized有更加优异的性能表现。1 用法比较Lock使用起来比较灵活,但是必须有释放锁的配合动作Lock必须手动获取与释放锁,而synchronized不需要手动释放和开启锁Lock只适用于代码块锁,而synchronized可用于修饰方法、代码块等2 特性比较ReentrantLock的优势体现在:具备尝试非阻塞地获取锁的特性:当前线程尝试获取锁,如果这一时刻锁没原创 2021-05-07 15:17:40 · 542 阅读 · 0 评论 -
死锁
避免死锁:参考银行家算法 顺序获取多个锁 A->B获取锁 设置超时机制过静态代码分析(如FindBugs)去查找死锁死锁代码:public class DeadLockSample extends Thread { private String frs; private String second; public DeadLockSample(String name, String frs, String second) { super(name); th原创 2021-05-07 14:54:46 · 103 阅读 · 0 评论 -
BufferedRandomAccessFile 缓存随机读写文件
netty: NIO 框架,高性能原创 2021-05-07 11:52:00 · 6767 阅读 · 1 评论 -
Java序列化Long类型数据到前端数据越界
Java序列化Long类型数据到前端数据失真现象项目中用到了唯一ID生成器.生成出的ID是long型的(比如说4616189619433466044).通过某个rest接口中返回json数据后,发现浏览器解析完变成了4616189619433466000.原因大致描述:java中得long能表示的范围比js中number大,也就意味着部分数值在js中存不下(变成不准确的值).解决方法方法就是不用number来保存long值,而是使用string.可以在客户端js修改,也可以在服务端序列化的时原创 2021-05-07 11:33:11 · 555 阅读 · 0 评论 -
Java导出CSV文件 window下excel打开 乱码
window下utf8编码跟Linux下不同 需要在文件头写入BOM头//BOM的UTF-8 头 防止Excel打开乱码byte[] uft8bom={(byte)0xef,(byte)0xbb,(byte)0xbf};看代码:CsvExport 工具类代码:public class CsvExport {private static final String SPLIT_LINE_SEPARATOR = "\n";private List<String> headList;p原创 2021-05-07 11:31:13 · 282 阅读 · 0 评论 -
@Size、@Length、@Max、@Min注解的含义和区别
@Min 验证 Number 和 String 对象是否大等于指定的值@Max 验证 Number 和 String 对象是否小等于指定的值@Size(min=, max=) 验证对象(Array,Collection,Map,String)长度是否在给定的范围之内@Length(min=, max=) 验证字符串长度是否在给定的范围之内max和min是对你填的“数字”是否大于或小于指定值,这个“数字”可以是number或者string类型。长度限制用length。...原创 2021-04-29 20:39:57 · 118476 阅读 · 4 评论 -
正则提取单引号里面的内容 判断是否是JSON
sql修改数据库里面的json字段 判断json内容是否符合格式: public static void main(String[] args) throws Exception { String a = "\\'\\S*\\'";//正则 Pattern p = Pattern.compile(a); BufferedReader br = new BufferedReader(new FileReader("D:\\config.sql")); String lin原创 2020-10-19 17:50:52 · 368 阅读 · 0 评论 -
Java 日期 calendar中 DATE 和 DAY_OF_MONTH 和 DAY_OF_YEAR
calendar中 DATE 和 DAY_OF_MONTH 和 DAY_OF_YEAR这几个字段名字起得确实有点。。其中 DATE 和 DAY_OF_MONTH 都是 5当前日期减去一天: public static void main(String[] args) { out(Calendar.DATE); out(Calendar.DAY_OF_MONTH); out(Calendar.DAY_OF_YEAR); } public static void out原创 2020-10-12 17:33:19 · 7613 阅读 · 0 评论 -
判断cron表达式 是否包含今天(生产任务重复运行定位)
判断cron表达式 是否包含今天 判断cron表达式 是否包含今天判断cron表达式 是否包含今天 CronExpression exp = new CronExpression("43 59 18 ? * 6 *"); Calendar c1 = Calendar.getInstance(); Calendar c2 = Calendar.getInstance(); Date nextValidTime = exp.getNextValidTimeAf原创 2020-10-09 13:04:04 · 1082 阅读 · 0 评论 -
字符编码
二进制位(bit)字节(byte)byte = 8 bit = 256标准ASCII = 256 = 1byteGB2312 = 标准ASCII+简体汉字 = 2byteGBK = GB2312 + 繁体汉字 = 2byteUNICODEutf8 = 3byteutf16 = 4bytemysql的utf8并不完全兼容标准的utf8编码,后续推出了utf8mb4完全兼容,推荐采用utf8mb4...原创 2020-06-16 17:43:23 · 226 阅读 · 0 评论 -
对接不同消息队列抽象提取
背景:公司对外输出服务 希望对消息队列抽象 在不修改业务代码的情况下 替换MQ 例如 kafka 替换 阿里云 RocketMQMQ分类整理:kafka :Apache 自有协议 性能 十万级 消费消息 只支持 pullRocketMQ :Ali 自有协议 性能 十万级 消费消息 支持 pull/pushrabbitmq 或者 activeMQ:支持AMQP协议 性能 万级 消费消息 支持 pull/pushRedis:Redis的 MQ 实现是使用 lists (队列)数据类型 使原创 2020-06-12 16:23:15 · 749 阅读 · 0 评论 -
分布式 sequence 高性能简单易用
公司内部mysql数据库分表自增索引生成工具反编译代码实现:原来是注入datasoure 和使用jdbc 操作数据库的 现在为了简单直接使用mybatis如果你愿意可以改回去 这样比较通用。NO BB,show Code.import java.util.concurrent.atomic.AtomicLong;@Data@Slf4jpublic class SequenceServiceImpl implements SequenceService { private int r原创 2020-06-12 15:43:25 · 930 阅读 · 0 评论 -
缓存 和 Log4j 配置
<!-- redis --> <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-redis</artifactId> <version>1.3.4.RELEASE</version>原创 2015-08-31 22:42:19 · 533 阅读 · 0 评论 -
Java 工具类
字符串 非空判断:if (anonymoty_code==null|| "".equals(anonymoty_code.trim()))加密 解密public static void TestStr(){//null 和 ""操作~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//判断是否Null 或者 ""System.out.println(StringUt原创 2015-09-30 13:36:46 · 374 阅读 · 0 评论 -
redis 配置说明
#是否以后台进程运行,默认为no,如果需要以后台进程运行则改为yesdaemonize no#如果以后台进程运行的话,就需要指定pid,你可以在此自定义redis.pid文件的位置。pidfile /var/run/redis.pid#接受连接的端口号,如果端口是0则redis将不会监听TCP socket连接port 6379# If you want you can bind a single原创 2015-09-30 13:44:27 · 405 阅读 · 0 评论 -
系统当前时间
System类代表系统,系统级的很多属性和控制方法都放置在该类的内部。该类位于java.lang包。currentTimeMillis方法public static long currentTimeMillis()该方法的作用是返回当前的计算机时间,时间的表达格式为当前计算机时间和GMT时间(格林威治时间)1970年1月1号0时0分0秒所差的毫秒数。转载 2015-09-30 14:57:37 · 899 阅读 · 0 评论 -
Java String 判断为空
以下是java 判断字符串是否为空的四种方法:方法一: 最多人使用的一个方法, 直观, 方便, 但效率很低: if(s == null ||"".equals(s));方法二: 比较字符串长度, 效率高, 是我知道的最好一个方法:if(s == null || s.length() <= 0);方法三: Java SE 6.0 才开始提供的原创 2015-09-14 16:57:00 · 546 阅读 · 0 评论 -
Spring集成Quartz定时任务框架介绍和Cron表达式详解
在JavaEE系统中,我们会经常用到定时任务,比如每天凌晨生成前天报表,每一小时生成汇总数据等等。 我们可以使用java.util.Timer结合java.util.TimerTask来完成这项工作,但时调度控制非常不方便,并且我们需要大量的代码。 使用Quartz框架无疑是非常好的选择,并且与Spring可以非常方便的集成,下面介绍它们集成方法和Cron表达式的详细介绍。一、增加所依赖的JAR转载 2015-10-21 15:42:40 · 492 阅读 · 0 评论 -
Java 类加载与初始化
Java 类加载与初始化理解类在JVM中什么时候被加载和初始化是Java编程语言中的基础概念,正因为有了Java语言规范,我们才可以清晰的记录和解释这个问题,但是很多Java程序员仍然不知道什么时候类被加载什么时候类被初始化,类加载和初始化好像让人很困惑,对初学者难以理解,在这篇教程中我们将看看类加载什么时候发生,类和接口是如何被初始化的,我并不会拘泥于类加载器的细节或者说类加载器的工作方式。仅仅使转载 2016-05-10 15:48:49 · 394 阅读 · 0 评论 -
JDBC批处理Select语句
JDBC批处理Select语句注:为了更好理解本文,请结合原文阅读 在网络上开销最昂贵的资源就是客户端与服务器往返的请求与响应,JDBC中类似的一种情况就是对数据库的调用,如果你在做数据插入、更新、删除操作,你可以使用executeBatch()方法减少数据库调用次数,如: Statement pstmt = conn.createStatement();pstmt.addBatch("ins转载 2016-05-10 15:50:08 · 901 阅读 · 0 评论 -
生产环境部署Solr
生产环境部署Solrsolr安装包自带有Jetty服务器,如果是运行单实例Solr的话,使用内置的Jetty没有问题,如果需要运行多个实例,就必须下载完整的Jetty包,否则会出现不可预知的错误,Solr官方文档有说明。 For non-trivial installations (multi-instances) with Jetty 6, you need to download ful转载 2016-05-10 15:52:09 · 1249 阅读 · 0 评论 -
全文检索原理
全文检索原理场景:小时候我们都使用过新华字典,妈妈叫你翻开第38页,找到“坑爹”所在的位置,此时你会怎么查呢?毫无疑问,你的眼睛会从38页的第一个字开始从头至尾地扫描,直到找到“坑爹”二字为止。这种搜索方法叫做顺序扫描法。对于少量的数据,使用顺序扫描是够用的。但是妈妈叫你查出坑爹的“坑”字在哪一页时,你要是从第一页的第一个字逐个的扫描下去,那你真的是被坑了。此时你就需要用到索引。索引记录了“坑”字在转载 2016-05-10 15:53:27 · 635 阅读 · 0 评论 -
为什么java的main方法是public static void
为什么java的main方法是public static voidMain方法是学习Java编程语言时知道的第一个方法,你是否曾经想过为什么main方法是public、static、void的。当然,很多人首先学的是C和C++,但是在Java中main方法与前者有些细微的不同,它不会返回任何值,为什么main方式是public、static、void ,这篇文章尝试去找到一些答案。 Main方法是转载 2016-05-10 15:56:08 · 1436 阅读 · 0 评论