自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

我的技术日常

Java in a nutshell

  • 博客(54)
  • 收藏
  • 关注

原创 【Java日志系列实践2】AOP切面实现业务日志

1 业务日志的标准业务日志,也叫操作日志。主要功能: 记录用户行为,方便业务数据回溯与统计。1.1 操作日志记录内容操作日志记录主要内容:用户是谁,在什么时间,对什么数据,做了什么样的更改。逻辑中必须增加业务日志的位置:(1)业务数据的变更处(新增、修改、删除)(2)特别分支条件、边界条件处。1.2 业务常见的日志记录形式● 动态的文本记录,比如:2022-03-12 10:00 订单创建,创建用户“小新”,订单号:NO.123456 ”。● 修改类型的文本,包含修改前和修改后的

2022-04-05 23:07:45 4717 2

原创 链表相交160

想空间复杂度= O(1),则只能依靠指针。可以用两个指针的分段移动列方程式(没看过“相互遍历“的思路是真想不到)假设headA中不相交的长度为X,headB中不相交的长度为Y,相交的长度为Z。这题在空间复杂度为O(n)时是简单题,O(1)时是中等偏上题。存链表A然后匹配链表B,不相等就直接重新开始算,相等就继续。

2023-06-20 00:17:59 91

原创 【Java日志系列实践1】系统操作日志的标准使用

1 常见日志分类日志一般根据使用场景分为系统日志和操作日志。系统日志:排查定位问题操作日志:记录用户操作,业务数据回溯与统计。2 系统日志格式系统日志主要是为开发排查问题提供依据,日志一般打印在日志文件中,可读性要求没那么高。SpringBoot 默认选择的是 slf4j + logback 的组合,默认会将日志打印到控制台上。日期时间:精确到毫秒。日志级别:打印 ERROR 、 WARN 、 INFO 、 DEBUG 、 TRACE 等级别日志信息。进程 ID:当前项目进程 ID 。

2022-04-05 23:16:38 1924

原创 高效能人士的习惯.提炼一种高效能思维

读完前言和第一章,挺浓的阿德勒学派味儿(尤其还引用了弗洛姆的观点)。一直对含有数字的通识类书籍不太感冒,不过好评如潮,且关注的博主专门做过拆书之后,我还是决定一探究竟。这本书严重被它的名字耽误了。历时一周加一天,看完前述后,每天体会一个习惯。进入“习惯之前”(1)流行的思潮怎么定义成功,本书的不同在于重视品德:什么是世俗成功学:“第一次世界大战后不久,人们对成功的基本观念变了。由重视品德转变成重视个人魅力(PersonalityEthic),即认为成功与否更多取决于性格、社会形象、行为态度、人际..

2021-11-14 13:01:37 486

原创 BODAS说明书的中文版与相关资料总结

花了三天时间配了控制器的接线口,找了软件安装的一套东西。又花了一周时间零零散散在网上只找到关于控制器少得可怜的资料:1.力士乐控制器RC6系列介绍2.力士乐控制器手册不完整版3.RC6-9程序下载力士乐配套的只有德语和英语两版,人工翻译专业文件的价格太惊人,决定自己写一版方便大家。有不正之处欢迎指出。For these controllers, in the event of an...

2020-09-13 19:47:59 3787 1

原创 记一次新建操作(insert)的优化过程

return this.ucdpMngTransactionTemplate.execute(new TransactionCallback<Boolean>() { @Override public Boolean doInTransaction(TransactionStatus transactionStatus) { try { GrayBO copy = uc...

2020-07-16 17:30:35 407

转载 git的回滚操作

已经 push 到远程的回滚其中的某个 commit场景: 你已经执行了 git push, 把你的修改发送到了远程,但是这些 commit 中其中一个是有问题的,你需要回滚那一个 commit.方法: git revert 原理: git revert 会产生一个新的 commit,它和指定 SHA 对应的 commit 是相反的(或者说是反转的)。如果原先的 commit 是“物质”,新的 commit 就是“反物质” —— 任何从原先的 commit 里删除的内容会在新的 commit 里被加

2020-07-15 22:21:22 775

原创 maven如何解决依赖冲突?示例三种bug的解决

Bug1:本地pull了总分支后无法加载用到的jar包因为本地之前用的依赖版本,和总分支用了同样版本的依赖,但是两个相同版本的jar包里有一个不同的函数。这样一来本地检测到相同版本。解决方案:1.先在Setting里找到Maven的本地仓库路径,进入roepository2.在repository下的common文件夹中找到以项目名命名的文件夹然后删除,之后再IDEA里执行更新命令Bug2:部署编译失败通过如下命令行将远端仓库的jar包同步到本地mvn clean install -Dmave

2020-07-01 11:18:02 190

原创 分布式系统中的消息队列传递

1.消息队列在分布式系统架构中,消息队列的核心职责是为不同的应用系统提供异步通信服务,通常涉及以下三个重要角色:• 消息发布者,发送消息的应用系统,负责创建消息对象并通过网络发布到消息Broker,发布的过程一般是同步的。• 消息Broker,异步消息的“代理人”,负责接收并持久化消息,保证将消息投递到指定的消息订阅者应用系统。• 消息订阅者,订阅消息的应用系统,负责消费消息Broker投递过来的消息。异步消息队列“账单服务” 处理 “账单查询Case” 的耗时由 60 ms 缩减至 13

2020-06-25 21:10:43 725 1

原创 操作系统之进程调度与内存管理

1.进程间的通信与调度1.1进程间的通信(Inter Process Communication)生产者消费者问题数据存到有界缓冲区bounded-buffer中,设置count记录缓冲区的数据量,如果缓冲区满count=size,让生产者睡眠;如果缓冲区为空count=0,让消费者睡眠。解决方法:(1)用信号量(semaphore)需要三个信号量:full记录充满缓冲区数目,empty记录空的缓冲区数目。mutex用来保证任意时刻只有一个进程读写缓冲区变量。(2)用互.

2020-06-14 22:47:49 1549

原创 Java内存溢出的典型场景测试

引言:本文是阅读经典的《深入理解Java虚拟机》后,对第二章的内存溢出异常情况进行总结,通过实际代码实现来验证知识点的正确性。1.堆内存溢出Java的堆用于存储对象实例,只要不断地创建对象,并且保证GC root 到对象之间有可达路径,就无法被收集器回收。在java工程的目录下新建一个类,这里命名为MemoryController,代码如下:@RestControllerpublic class MemoryController { private List<TestEntity&g

2020-05-29 14:32:21 461

原创 Java虚拟机(JVM)调优和Debug的常用参数详解

引言:JVM中的参数,根据是否常修改,可分为标准类型和非标准类型。标准类型的代表有 -server,-client和-version这种无论在那个版本JVM中都是自带不可改的部分。 —Xint,-Xcomp和-Xmixed这类X开头的也是不可修改。其它部分则可统一归类到非标准类型中,也是本文要详解的主要内容。1.堆内存的配置信息参数-Xms -Xmx 堆的容量-XX:NewSize -XX:MaxNewSize 新生代的大小-XX:NewRatio 设置Yong 和 Old的比例 -XX:S

2020-05-29 11:28:58 956

原创 Java性能监控工具Arthas实践

1. 启动Demo在dos窗口输入:curl -O https://alibaba.github.io/arthas/arthas-demo.jarjava -jar arthas-demo.jararthas-demo是一个简单的程序,每隔一秒生成一个随机数,再执行质因数分解,并打印出分解结果。2. 启动arthas在命令行下面执行(使用和目标进程一致的用户启动,否则可能attach失败):蓝线以左是java开的demo(质数分解),蓝线以右是启动arthas的窗口dashboard

2020-05-26 14:53:08 408

原创 《Java编程思想第四版》中在算法题中常用的概念总结(持续更新)

总结今年前期在《Java编程思想第四版》中常见的几个问题:1.OOP相关概念向上转型(upcasting)书中那句“新类是现有类的一种类型”的概括很到位,也直接解释了继承的关系。Java编译器支持向上转型,是指子类引用转换成父类引用这一动作,可以理解为继承的实现方式。先用小例子感受一下upcasting://父类:乐器public class Instruments { public void play(Note n){ System.out.println("Ins

2020-05-25 20:00:29 266

原创 git常用工具的原理介绍以及项目使用中常见问题(持续更新)

1.工具中的重要原理1.SSH KEy在《GitHub入门与实践》一书中对SSH Key的介绍并不多,只是简短的说了使用。针对不同的git平台,所生产的公开密钥其实是不一样的。重点:id_rsa文件是私有密钥,id_rsa.pub 是公开密钥2. Merge 和Rebase操作的区别在对当前某公共分支中(通常dev线或pro线)操作时,Merge是将公共分支最新版合并到自己的分支中,形成一个新的 commit 提交。而Rebase则像公共分支又重新拉出来这个分支一样。Merge(合并)是最常

2020-05-24 22:28:15 3914

原创 从SpringMVC源码分析原理

1.SpringMVC下获取web资源的功能实现WebMvcAutoConfiguration(mvc自动配置类)中的添加资源处理器代码如下: public void addResourceHandlers(ResourceHandlerRegistry registry) { //如果静态资源已经自定义,就失效了 if (!this.resourceProperties.isAddMappings()) { logger.de

2020-05-19 11:21:14 233

原创 ThreadLocal的原理,特点和使用详解

1. ThreadLocal概述1.ThreadLocal提供线程局部变量;开箱即用开销小,可以代替多线程访问共享变量时需要上锁的需要。在各种涉及的多线程语言都有,Java用哈希表表实现(ThreadLocalMap)3.实现原理2. 基本API1.构造函数ThreadLocal()2.初始化 initialValue()只有线程在第一次调用get方法时,执行此方法。3.访问器 get/setpublic T get(),返回ThreadLocal中当前线程副本的值。变量第一次get时

2020-05-18 21:04:32 3525

原创 关于DeadLock(死锁)的总结及Java代码实现

本篇文章演示死锁的场景,在现实中你可能不会写出这样的代码。但是,在一些更为 复杂的场景中,你可能会遇到这样的问题,比如t1拿到锁之后,因为一些异常情况没有释放锁 (死循环)。又或者是t1拿到一个数据库锁,释放锁的时候抛出了异常,没释放掉。一旦出现死锁,业务是可感知的,因为不能继续提供服务了,那么只能通过dump线程查看 到底是哪个线程出现了问题,以下线程信息告诉我们是DeadLockDemo类的第42行和第31行引 起的死锁1.创建t1和t2两个线程,互相加锁public class NormalLo

2020-05-18 16:17:59 597

原创 二次封装数组及数组功能,泛型的总结(Java实现)

1. 自定义数组的二次封装主要想实现的功能:boolean isEmpty();add( E e)E get( int index, E e)E set()boolean contains(E e)2. 数组功能1.找出数组中的最大值double max = arr[0]; for(int i; i<arr.length; i++){ if(arr[i]>max) max = arr[i]; }2.复制数组int N = arr.le

2020-05-10 14:56:11 173

原创 CANOpen 通信

在此系统的编程中,CANOpen 通信使用了两种方式:一种是过程数据对象 ( PDO) ,一种是网络管理 ( NMT) 。 PDO 通信速度快,实时性高; 而在NMT 通信中,主机可以控制节点的状态。

2020-05-08 22:10:40 2889

原创 关于测控系统的CAN通讯协议总结

1.CAN:Controller Area Network,控制器局域网一种能有效支持分布式控制和实时控制的串行通讯网络。2. CANopen的数据类型基本类型NIL:类似于高级语言里的NULL,但是NULL表示值为0,NIL表示无值BOOLEAN: 布尔类型,0和1VOID:无类型,常用在函数的参数类型,返回值,函数中的指针类型进行声明USIGNED INT: 无符号整型SIG...

2020-05-06 21:43:19 837

原创 BODAS安装的安装与配置

前提:BODAS的安装需要给电脑插上Rexroth的电子狗(一个不显示的USB),才能看到exe文件1.安装BODAS的资源选项,next后建议新建一个文件夹存储所有的资料2.选择一个您要在其中创建程序快捷方式的开始菜单文件夹Select the start menu folder in which you would like to create the program...

2020-05-03 11:15:02 3344

原创 关于比较器Comparable和Comparator

半年之前看Collection里关于排序的源码时就纠结过这个Comparable和Comparator的区别,最近在PriorityQueue的中又遇到了这个问题,发现仍有理解模糊之处,温故知新,特别写一篇文章汇总所有。JournalDev上的两种比较器介绍注:JournalDev - Java、Java EE、 Android、Web 开发教程1.Comparable和Comparator...

2020-05-01 11:17:45 182

原创 Letcode双指针题的Java实现(盛水容器和合并区间)

1.合并区间打开合并区间题目class Solution { public int[][] merge(int[][] intervals) { if(intervals.length < 2) return intervals; // 排序:根据区间起始值升序 Arrays.sort(intervals, (o1,o2)->(o...

2020-04-14 23:29:28 118

原创 布隆过滤器的介绍

位数组中的每个元素都只占用 1 bit ,并且每个元素只能是 0 或者 1。这样申请一个 100w 个元素的位数组只占用 1000000Bit / 8 = 125000 Byte = 125000/1024 kb ≈ 122kb 的空间。总结:一个名叫 Bloom 的人提出了一种来检索元素是否在给定大集合中的数据结构,这种数据结构是高效且性能很好的,但缺点是具有一定的错误识别率和删除难度。并且...

2020-04-13 23:53:28 173

原创 Leetcode上动态规划系列经典题的Java详解

宅家防疫期间leetcode上小刷了十余道线性动态规划算法题,是时候自己总结提炼一下DP思想了。我把总结的题目主要分为两类序列匹配类和生活类。第一类的代表热题:leetcode300. 最长上升子序列leetcode53.最大子序和leetcode1143. 最长公共子序列leetcode72. 编辑距离第二类的代表热题:leetcode121. 买卖股票的最佳时机leetcod...

2020-04-12 17:41:16 332

原创 牛客网编程OJ的典型输入Java模板

笔试的时候一般都需要自己写输入输出,为了尽可能减少因为格式问题而爆0这种委屈之事,我在此以牛客网OJ为例总结了常见的6种典型情况输入描述的模板。希望可以帮助到广大考友把更多的精力放在解题思路上。1. 输入是已知大小的二维数组输入描述第一行是一个正整数n,表示二维数组有n行n列。 public static void main(String[] args) { Scanner sc...

2020-04-12 16:39:31 4085 1

原创 归并排序和快速排序Java实现与深度对比

在leetcode上小刷了十余道动态规划算法题,是时候自己总结一下这种思想的套路了。目前我刷的题目有:leetcode1143. 最长公共子序列leetcode300. 最长上升子序列leetcode53.最大子序和leetcode72. 编辑距离我主要分为两大类:一维数组问题和二维数组问题。第一类的代表热题有最长上升子序列第二类的代表热题有最长上升子序列,最长回文串和编辑距离3...

2020-04-10 13:38:16 167

原创 双指针-滑动窗口问题(Leetcode题的java实现)

Leetcode141. 判断链表中是否有环思路:设定快慢双指针,慢指针+1则快指针+2。如果不含有环,快指针最终会遇到 null,说明链表不含环;如果含有环,快指针最终会超慢指针⼀圈,和慢指针相遇,说明链表含有环。时间复杂度为O(n)。public class Solution { //如果环的长度为 M,经过 M 次迭代后,快指针肯定会多绕环一周,赶上慢指针。 publ...

2020-04-09 23:38:08 266

原创 2020.4.8华为笔试二题(Java实现)

1. 编译器找ID总数小华设计了一种编译语言最大支持N个字不同的字符,由这些字符组成的ID长度范围是“1<length<L”,求设计的语言最多能组成多少个ID。思路:大数取模 + 组合数import java.util.Scanner;public class Test1 { public static void main(String[] args) { ...

2020-04-08 23:52:11 2232

原创 整型转化为字符串的Java实现

整型转化为字符串string int2String(int n){ if(n == 0) return 0; stiring s = ""; while(n){ s += '0' + n%10; num/=10; } reverse(s);//逆序输出 return s; }时间复杂度为O(lgN)...

2020-04-08 22:58:10 437

原创 牛客网编程OJ输入输出的加速版(缓冲)

简单版:Scanner1.输入已知大小的二维数组 public static void main(String[] args) { Scanner scan = new Scanner(System.in); int n=scan.nextInt();//定义需要的阶层数n int[][]array=new int[n][n];//定义一个n*n的数组arr...

2020-04-03 23:58:55 874

原创 SSM框架中三层数据传输(VO,DO,AO)

1.接口层VO和逻辑层DO1.xxDO是数据库直接取来或注册进去的数据,基本和xxMapper.java以及xxMapper.xml有关xxVO通常是和H5界面直接相关的数据,两者在代码中相互转换比如 PatientDO patient = convertVO2DO(patientVO);user_client里的vo有3个…VO类,均继承于Serializable接口。 privat...

2020-04-01 23:34:04 3296

原创 两种经典的单源最短路径算法图解与java实现(贪心Dijkstra和A*)

典型的启发式搜索有两种,分别是贪婪最佳优先搜索(Greedy best-first search)和A*寻路搜索。这篇文章以最短路径问题为例来展开讨论两种搜索方法的思路。可求最短路径的结构往往是有向带权图,用代码表示就是public class Graph { // 有向有权图的邻接表表示 private LinkedList<Edge> adj[]; // 邻接表 pri...

2020-03-28 16:19:04 1796

原创 二叉树的详细分类与应用场景(Java代码实现)

1.二叉搜索树(Binary Search Tree)leetcode450.删除BST的结点class Solution { public TreeNode deleteNode(TreeNode root, int key) { if (root == null) return null; if (key < root.val) { ...

2020-03-27 23:57:16 1814 1

原创 定位错误日志排查Bug的基本思路大汇总(持续更新)

前言:根据项目提炼了的经验总结。主要提供一种BugFree的思路1.写日志时要养成的好习惯保证在定位日志时可以离开代码情镜还能看懂问题是什么。在方法前加 @Transactional,抛出异常之后,事务会自动回滚,数据不会插入到数据库。规范打印日志的格式其中最重要的是接口和关键字,用于追踪定位log.warn(String.format("[接口名或操作名][Key Msg]:%s...

2020-03-26 12:05:19 4175

原创 非线性数据结构——图的相关概念

1.图的相关概念用于深度和广度搜索算法一般就是用来做图的遍历,或者说图是搜索算法的最常用数据结构,因此需要先储备一些图的概念。图是由一个非空的顶点集合和一个边的集合组成。 G=( V, E )无向图:任意两顶点构成的偶对(vi , vj )是无序的。一个完全无向图有n(n-1)/2 条边有向图:邻接表:对每个顶点vi 建立一个单链表,把与vi有关联的边的信息(度)链接起来。以下是无向图...

2020-03-25 15:29:57 703

原创 广度优先搜索(BFS)总结及其Java实现

搜索算法的存储结构一般都是图。因此先给出无向图的代码:public class Graph{ private int v; private LinkedList<Integer> adj[]; public Graph(int v){ this.v=v; adj = new LinkedList[v]; for(int...

2020-03-25 00:07:40 535

原创 贪心算法思路总结及其java实现

1. 贪心算法条件与思路的解题步骤1.一次性:某个状态以后的过程不会影响以前的状态,只与当前状态有关。2.局部最优集合能得到全局最优。(如果某次选择会对之后选择产生影响,局部最优不能获得全局最优可以直接KO贪心思路)第一步,判断是否属于贪心算法的情况:对一组数据加了一定的限制,希望从中选出几个数据,在满足限制值的情况下,达到最大期望值。第二步,用简单例子检测贪心算法是否最优。2.贪心算...

2020-03-22 23:10:58 660

原创 采用jmeter进行抢购商品的压力测试

测试内容疫情物资抢购项目提供了三种解决方案来比较系统性能:1.利用MySQL的update行锁实现悲观锁。2.MySQL加字段version实现乐观锁。3.添加Redis缓存;使用了JMeter在保证错误率为零的基础上,进行压力与性能测试(实验设置的是10秒内产生3000个请求或酌情5000个请求),分析每秒处理请求数、平均响应时间、等参数,最后得出相应结论。测试步骤1.建立线程组...

2020-03-17 11:07:49 1137

空空如也

空空如也

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

TA关注的人

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