自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(76)
  • 收藏
  • 关注

原创 优雅使用EasyExcel的导入导出功能

文章目录EasyExcel简介导入依赖导入EXCEL(读取)监听器(关键)读取代码下载EXCEL(写入)写EasyExcel简介Java领域解析,生成Excel比较有名的框架有Apache poi,jxl等,但他们都存在一个严重的问题就是非常的耗内存,如果你的系统并发量不大的话可能还行,但是一旦并发上来后一定会OOM或者JVM频繁的full gc.EasyExcel是阿里巴巴开源的一个excel处理框架,以使用简单,节省内存著称,EasyExcel能大大减少占用内存的主要原因是在解析Excel

2021-10-14 15:22:49 275

原创 日志升级为log4j2的方法

文章目录原因步骤1、清除log4j 1.x和slf4j 1.x.x相关的依赖2、新增log4j2的依赖3、配置新log4j24、更改原先代码中的LoggerLog4j2的配置详解根节点ConfigurationAppenders子节点Console节点File节点RollingFile节点Loggers子节点,常见的有两种:Root和Logger.全异步全异步配置方法:推荐做法全异步设定丢弃策略原因传统的log4j1.0和logback组件分别存在同步阻塞模型和AsyncContext异步方式,较为低效

2021-10-13 17:45:49 1444

原创 Log4j2性能对比 Log4j1.x,logback

文章目录历史说明Log4j2简介对比高性能零GC“惰性”打日志(lazy logging)历史说明log4j 1.0和logback都算是Java 里比较老牌的日志框架,logback从06年开始第一个版本,迭代至今也十几年了、最近一个稳定版本还停留在 2017 年,好几年都没有更新,ogback的兄弟 slf4j 最近一个稳定版也是2017年,而且 logback的异步性能实在不高,功能简陋,配置又繁琐,远不及Apache 的新一代日志框架 - log4j2。Log4j2简介Apache Log4

2021-10-13 11:33:56 948

原创 springboot中定义拦截器的两种方式

文章目录SpringBoot定义拦截器配置文件方式纯注解方式WebMvcConfigurerAdapter 失效的问题SpringBoot定义拦截器在springboot中定义一个拦截器的方式: 使自定义类实现HandlerInterceptor接口。public class MySelfInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest reque

2021-08-17 11:03:31 1018

原创 windows下通过logstash实现mysql和elasticsearch的简单数据同步 v7.12.0

文章目录前期准备elasticsearch下载elasticsearch-head下载elasticsearch-analysis-ik下载数据库elasticsearch根据数据库表创建索引logstash下载配置文件启动和效果可能的error前期准备先准备好node环境和java环境elasticsearch下载elasticsearch下载完后,双击bin目录下的elasticsearch.bat,启动。出现如下图所示,则代表成功elasticsearch-head下载elasti

2021-04-11 22:25:10 324

原创 通过controller接收参数,再利用自定义post请求,以表单上传的方式,向遇见图床上传图片

摘要通过controller接收参数,再利用自定义post请求,以表单上传的方式,向遇见图床上传图片。之所以选择遇见图床,是因为比较方便,可以立马使用。给大家展示一下它的上传图片的API接口。不要感动,我会贴的比较详细至于前端怎么传这两个参数,想必不用多说,以下贴的都是后端代码Controller @PostMapping("/uploadImage") @ResponseBody public Object upload(MultipartFile file, String nameSe

2021-03-31 16:55:04 1790 3

原创 字符串拼接的4种常用方法

文章目录字符串拼接的办法+号拼接concat方法StringBuffer (线程安全)StringBuilder(线程不安全)一点建议字符串拼接的办法+号拼接String a="hello";String b="world";String c=a+" "+b;System.out.println(c) //hello world实际原理:对文件进行反编译 javap -c name.class 得到下面可以发现+号的底层实现原理其实类似于下面StringBuilder sb

2021-03-09 14:31:40 22399

转载 二叉树,已知两种遍历顺序,求另一种遍历顺序

转载自:https://www.cnblogs.com/lanhaicode/p/10390147.html

2021-03-08 16:51:55 160

原创 前缀树的介绍及简单实现 java

文章目录什么是前缀树前缀树的结构前缀树的数组实现(基于26个单词的)前缀树的用途前缀树的Map方式实现对比数组实现和map实现为什么要实现前缀树,对比普通树的结构对比平衡搜索树对比哈希表什么是前缀树Trie (发音为 “try”) 或前缀树是一种树数据结构,用于检索字符串数据集中的键。这一高效的数据结构有多种应用:1.自动补全2.拼写检查3.IP 路由 (最长前缀匹配)4.打字预测前缀树的结构假设我们现在要做一个关于小写英文单词的前缀匹配,这个时候我们想起来可以使用我们的前缀树呀,那么什么

2021-03-08 15:17:29 449

原创 centos8下部署rabbitmq-v3.8.12版本。

文章目录安装rabbitmq服务解决高版本rabbitmq使用guest登录不上的问题方法一方法二安装rabbitmq服务先按顺序执行以下命令yum install erlang前往rabbitmq官网,寻找下载地址(以下演示centos下载)。右键复制下载链接地址下载rabbitmq安装包wget https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.8.12/rabbitmq-server-3.8.12-

2021-02-17 14:44:15 353 3

原创 mysql8版本连接不上,报2059和1045错误的解决办法

我遇到的情况如下点击navicat中的mysql,弹出这个问题。然后百度,找到这个问题的解决办法如下:原因 :mysql8 之前的版本中加密规则是mysql_native_password,而在mysql8之后,加密规则是caching_sha2_password更改加密规则:mysql -u root -p #登录 use mysql; #选择数据库# 远程连接请将'localhost'换成'%' ALTER USER 'root'@'localhost' IDENTIFIED BY

2020-12-28 17:43:15 278

原创 根据用户输入的名字随机推荐用户名

Scala 根据用户输入的名字随机推荐用户名不是copy就能用的,要理解逻辑逻辑根据用户名字判断,如果名字长度是0,或者纯数字的名字,或者包含手机号,或者名字太长,则使用词组(写死的),来作为组装前的 ==“原型” ==。否则使用用户名自己的名字作为原型进行拼接推荐如果长度小于6,先用字母补齐至6,再用10位数的数字做一个随机长度的数字(避免了数字长度大于10,导致可能出现手机号)如果长度大于等于6,则随机用字母+数字进行拼接。前提:(可自己设置好)传进来的名字是合法的假设用户名长

2020-11-04 17:53:26 842

原创 如何利用wireshark抓取手机包

文章目录下载wireshark并启动页面介绍过滤比如你想要查看http协议内容下载wireshark并启动打开后进入如下界面查看你windows的ip的地址,win+R,输入cmd,输入ipconfig就可以查看到如果你的电脑连的是wifi,选择连接带WLAN的。如果你的电脑用的是网线,选择连接以太网。页面介绍过滤刚刚打开wireshark,你会发现是正在抓包的,会有很多的包被抓过来,这样根本难以查询到你想要的包。所以我们必须通过一定的过滤手段来过滤出我们想要的包。一般常使用的 ip.sr

2020-11-04 15:43:32 10118

原创 手机号简单校验(前端+后端scala)

看注释前端手机号校验//判断用户名是否包含手机号function checkUserName(){ var str = $("#name").val(); //if(str.length<11){ // return false; //} //这一行是取用户名中的数字。(即150ab65788sd888这样子的也会被判断为含有手机号) //可根据自己需求选择去掉或者加上,去掉的话,可以用上面注释掉的if条件来判断长度 //

2020-10-16 11:25:32 1038

原创 java中使用poi工具类,导出excel文件

记录一下学习到的poi导出excel文件方法文章目录在实际工作中,可能需要对表格进行导出,形成本地excel文件。本章例子中使用的实体类第一步,获取实体类的集合第二步,将实体类集合放入表格中表格的格式由response确定(文件名也在这里确定)设置一张表的内容,并将数据放入完整一点的Controller顺序在实际工作中,可能需要对表格进行导出,形成本地excel文件。本章例子中使用的实体类@Datapublic class TrackInfoDto { private long uid;

2020-10-09 11:28:06 259

原创 git提交项目至公司提供的分支

第二周了,终于分配到了任务。做完任务,git提交却一直小心翼翼的,生怕提交错误了。文章目录git pull 和git checkoutgit addgit commitgit statusgit loggit pushgit commit --amendgit pull 和git checkout假设公司给了你一个分支。如果你的项目里没有这个分支,那么你得先将这个分支下载下来才行随便找一个页面右击(当然,前提你的idea得安装了git环境)。下载好分之后,然后在idea的右下角,选择切换到要提交

2020-09-29 15:42:52 390

原创 页面跳转后,仅仅第一次执行js,后面刷新不执行该js

文章目录逻辑跳转前的页面跳转之后的页面实现效果 其实我的js执行的是一个弹窗,只想让其在第一次跳转的时候弹出。而之后刷新页面,不想再让其弹出逻辑从前一个跳转过来的页面中,修改地址栏,加上一个参数。在要弹窗的页面中,判断这个参数是否存在。存在则调用弹窗方法。执行完后,修改地址栏(修改并不刷新),然后刷新之后,并不会再次弹窗。跳转前的页面<a id="turnToAlumList" onclick="turnToAlumList()">新建案例</a> <scr

2020-09-29 11:09:17 2267

原创 JVM层面来理解对象的创建中的相关内容

文章目录对象的创建普通对象的创建方式类创建过程的简单步骤内存分配方法指针碰撞空闲列表需要考虑的同步问题初始化值对象的内存布局对象头实例数据jvm 默认分配顺序对齐填充对象的访问定位对象的创建普通对象的创建方式在java中,常见的java对象的创建方式有通过new关键字(也是最常见的)通过复制通过反序列化创建对象类创建过程的简单步骤一个类创建的过程中,细分的话,应该分为以下三个步骤。当遇到new关键字的时候。java虚拟机先去判断该类是否经过加载、解析和初始化,如果没有则必须执行对应的类加

2020-09-25 16:16:32 102

原创 TCP协议之三次握手和四次挥手

三次握手文章目录TCP连接三次握手过程每一步的作用握手过程中可以确认的信息连接过程中的一些重要状态半连接队列SYN-ACK包重传次数SYN攻击TCP连接想象一下,当两台电脑需要传递数据的时候,应该在这两台电脑间建立一条通道,通过该通道来传输数据。这条通道就是我们所理解的TCP。而确定通道两端究竟是哪台电脑,则是通过套接字(Socket)。ip+端口,构成了套接字。ip则确定了主机。所以两台电脑的通道则通过上述步骤简单的被建立起来了。三次握手过程根据TCP协议,在建立好上述的 “通道” 时,理应考

2020-09-25 09:05:07 83

原创 Http协议新手介绍

文章目录Http协议定义和组成特点(针对http1.0来说)http1.0和http1.1的区别Http协议定义和组成http协议的中文名是超文本传输协议,是一种建立在TCP协议之上的协议。用于指定客户端给服务端发送什么样的消息,以及得到什么样的响应。http协议分为请求报文和响应报文请求报文由请求头,请求首部字段,请求正文组成响应报文由响应头,响应首部字段,响应正文组成特点(针对http1.0来说)简单快速。因为http协议是基于C/S架构的,仅仅需要传输方法和路径,不同的请求方法规

2020-09-22 09:25:59 71

转载 多线程中出现死锁和CPU占用100%怎么解决

参考原文:Java死锁排查和Java CPU 100% 排查的步骤整理使用 jps + jstack,排查步骤:使用命令列出当前运行的java进程的pid: jps -l使用命令查看(假如第1步查到的java进程pid为 1234):jstack -l 1234注意第2步中是否有提示 “ Found x deadlock ” 如有,则表示有死锁存在,其中 x 表示死锁的个数...

2020-09-08 21:41:53 742

原创 JVM垃圾回收算法、收集器、触发情况、查看GC情况、频繁Full gc

文章目录垃圾回收算法标记-清除算法(Mark-Sweep)复制算法(Copying)标记-整理算法(Mark-Compat)分代算法垃圾回收器新生代老年代如何确定一个垃圾是可以回收的计数引用法可达性分析GC触发情况Minor GCFull GCJVM命令查看某个java进程的GC情况频繁老年代回收怎么分析解决垃圾回收算法标记-清除算法(Mark-Sweep)如果你将内存想象成一个大方格,而这个大方格又由9*9个方块组成,我们存入的数据有小有大,有的可能要占用一个方格,有的数据可能需要占用两个方格甚至更

2020-09-08 21:20:47 438

原创 HashMap的1.8源码分析(put方法)

在jdk1.8当中,HashMap的结构变为了数组+链表+红黑树,插入方法也由原来的头插变成了尾插,避免了1.7以前resize产生的死循环的问题。HashMap源码的常量 //默认容量大小 static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16 //最大容量 static final int M...

2020-09-08 13:26:22 189

原创 mysql学习--入门(三)

文章目录Mysql的锁Mysql的锁

2020-09-07 14:50:54 154

原创 并发编程之锁的原理--java并发编程之美(四)

文章目录LockSupport工具类的常用方法及作用void park()void unpark(Thread thread)方法void parkNanos(long nanos)方法void park(Object blocker)方法(推荐使用,可查阻塞线程)void parkUntil(Object blocker,long deadline)那么wait和notify呢?与park,unpark的比较锁的底层支持--AQS(抽象同步队列)独占锁ReentrantLock的原理void lock()

2020-09-04 21:01:27 228

原创 synchronized锁升级一个过程

文章目录synchronized出现锁升级的原因锁升级的状态无锁偏向锁什么是锁竞争轻量级锁重量级锁锁的优缺点synchronized出现锁升级的原因在jdk1.6以前,synchronized锁是低效的,因为synchronized在当初来讲,一直是一个重量级的锁,只允许获取锁的线程执行,而其它线程都要阻塞。等待线程释放锁之后,再由cpu进行线程调度。这种由用户态到内核态的切换,是会涉及到上下文切换,要保存环境资源,是十分消耗性能的。所以在1.6之前synchronized同步的方法,执行效率都很慢。于

2020-09-04 21:00:48 332

原创 Http与Https的学习

文章目录前情提要之TCP/IP协议族Http请求在网络传输中的封装和解封过程你输入的网址,是怎么被解析成了IP地址的TCP协议是怎么处理Http报文的你发送的Http请求,是怎么找到千里迢迢之外的对应服务器Http的三次握手Http的持久连接Http既然是无状态的协议,那么它是怎么保存状态信息的呢?前情提要之TCP/IP协议族TCP/IP协议可以分为四层,从上至下分别是应用层,传输层,网络层,数据链路层。网络层包含协议或作用应用层SMTP,DNS,HTTP传输层TCP,U

2020-09-04 21:00:00 323

原创 并发编程之并发集合--java并发编程之美(三)

文章目录CopyOnWriteArrayList的介绍CopyOnWriteArrayList的add操作CopyOnWriteArrayList的get,getArray操作CopyOnWriteArrayList的弱一致性问题CopyOnWriteArraySet简单介绍CopyOnWriteArrayList的介绍JUC并发包下的并发List只有一个CopyOnWriteArrayListCopyOnWriteArrayList是一个线程安全的ArrayList,对其进行的修改操作都是在底层的

2020-09-01 13:53:51 79

原创 Http的响应报文首部学习

文章目录Http的响应报文首部学习Accept-RangesAgeETagLocationRetry-AfterServerAllowContent-EncodingContent-LanguageContent-LengthContent-LocationContent-MD5Content-RangeContent-TypeExpireLast-Modified可以发现,其与请求报文首部是有对应关系的Http的响应报文首部学习Accept-Ranges用来告诉客户端服务器是否能处理范围请求,以指定

2020-08-15 20:39:26 275

原创 Http的请求报文首部学习

文章目录Http的报文首部学习Cache-ControlConnectionDateTransfer-EncodingUpgradeViaAcceptAccept-CharsetAccept-EncodingAccept-LanguageFromHost字段If-XXX系列Max-ForwardsRefererTEUser-AgentHttp的报文首部学习Cache-ControlCache-Control能够操作缓存的工作机制public指其它用户也可以访问该缓存priv

2020-08-15 17:19:12 304

原创 ArrayList的for循环删除和iterator循环删除

文章目录for循环删除ArrayList中的某个值Iterator删除ArrayList中的某个值来看看ConcurrentModificationException错误的产生原因而对于iterator的remove方法for循环删除ArrayList中的某个值 public static void main(String[] args) { ArrayList<Integer> arrayList = new ArrayList<>();

2020-08-12 21:51:10 599

原创 Mysql索引数据结构的选择之B+Tree

二叉树二叉树查找时间的效率是O(log2n),但当查找的东西都在一边的时候,相当于线性结构,无异于全表扫描。而且,由于插入数据的顺序的问题,当数据量大的时候,容易造成树的深度过大。平衡搜索二叉树为了解决左右树差异过大,导致树的深度过大的问题,也许可以采用平衡搜索二叉树(也称AVL树)。该树的特点是,左右子树的深度差不能超过1。当超过的时候就会通过左旋,右旋来调整。这样树的深度的问题,确实不会出现极端的情况了。但是由于不管是二叉树还是平衡二叉树,单节点的数据值都很小,对于我们的系统的IO来说,利用率比

2020-08-11 21:37:03 130

原创 指令重排序与内存屏障

文章目录重排序的概念重排序类型编译器重排序数据依赖性控制依赖性指令级并行重排序内存系统重排序内存屏障Happans-Beforehappens-before规则重排序的概念重排序是指编译器和处理器为了优化程序性能而对指令序列进行重新排序的一种手段重排序类型编译器重排序编译器会对高级语言进行分析,当编译器认为你的代码是可以优化的时候,会对你的代码进行重新排序。为了遵守as-if-serial语义,编译器和处理器不会对存在数据依赖关系的操作做重排序,以此保证单线程内程序的执行结果不被改变。优点

2020-08-11 21:34:40 293

原创 JUC学习随记

想要看视频入门的小伙伴可以去看狂神的视频哈。我觉得最为入门是很舒服的。良心up主。点击前往:遇见狂神说文章目录开始并发学习java能开启线程吗wait和sleep的区别一般怎么写线程Lock加锁三步Synchronized和Lock的区别锁的是谁的问题虚假唤醒的问题在集合类中,怎么解决不安全的问题Callable接口CountDownLatchCyclicBarrierCountDownLatch和CyclicBarrier区别开始并发学习java能开启线程吗不能,start方法的源码里,是去调用

2020-08-11 21:33:07 218

原创 锁类别的简单介绍

文章目录悲观锁乐观锁公平锁和非公平锁独占锁和共享锁可重入锁自旋锁悲观锁对任何数据类的操作持悲观的态度,认为任何数据操作都会发生线程不安全的现象。所以对每一个操作都会加上悲观锁。悲观锁的实现往往依靠数据库提供的锁机制。乐观锁任何数据操作在一般情况下是不会产生线程不安全的问题的,持乐观的态度。其不会在数据操作前加锁,这样也就不会发生等待。乐观锁会在数据进行提交更新时再上锁,再开始对数据进行检测。通过一种类似CAS的感觉,比较数据前后版本号version(自加字段)或者业务的状态来判断操作是否有效。公平

2020-08-11 21:26:22 121

原创 研究HashMap----常见问题

文章目录HashMap的遍历通过反射查看HashMap的容量HashMap的null值(h = key.hashCode()) ^ (h >>> 16)的原因HashMap的最大容量为什么是1<<30,而不是1<<31HashMap的默认负载因子为什么是0.75,而不是0.8,0.6我们可以初始化容量大小,那么扩容阈值问题是怎么保证的。HashMap的遍历 public static void test(){ HashMap<Stri

2020-08-11 21:23:55 320

原创 并发集合中对于ThreadPoolExecutor的一点理解

文章目录概念理解优缺点优点缺点根据场景确定线程数已有线程池 (4大方法)自定义线程池(7大参数)拒绝策略 (4大策略)拒绝策略的使用场景线程池的调优概念理解线程池是一种使用模式,它可以避免我们的程序频繁创建线程所消耗的时间和代价。通过线程池的方式,让已创建好的线程等待任务调用,并让执行完任务的线程重新等待。优缺点优点即时等待任务的线程模式,提高了任务响应速度。降低了创建线程的系统资源开销,充分利用了CPU核数,防止过分调度。所有线程都呆在一起,方便了统一管理和调优。缺点线程的创建和销毁是影

2020-08-11 20:03:53 306

原创 HashSet的value值为什么是个Object对象呢?

HashSet执行addHashSet<Integer> hashSet = new HashSet<>();hashSet.add(1);点进add方法查看PRESENT是什么为什么这个要让Object作为Value存入呢HashSet底层其实就是维护着HashMap,HashSet的add方法,其实是将值,作为HashMap的key存入。而如果HashSet的value 用null值的话,那么在删除操作的时候,可能remove方法返回的值就永远都是true了。

2020-08-06 21:16:54 2306 1

原创 ArrayList随记

文章目录ArrayList的私有域观察上面,你发现实际数组用了transient关键字修饰使用ArrayList的add方法ArrayList的容量初始化是在什么时候??ArrayList的扩容方法,同样是数组初始化的地方ArrayList的扩容一定是10,15,22嘛???ArrayList的私有域 //默认初始化容量大小 private static final int DEFAULT_CAPACITY = 10; //空数组,预定义 private static final

2020-08-06 16:54:46 158

原创 数组转集合的三种方式,集合转数组

数组转集合在java中的数组有两种情况,一种是存放基本数据类型的数组,一种是存放对象类型的数组。对于存放对象类型的数组,直接使用Arrays.asList方法即可对于存放基本数据类型的,如果我们单纯使用Arrays.toList的方法去转换,只会得到对象类型为int[]的集合。这样子每一个元素都是一个基本数据类型数组的对象,而不是我们要存放的数据。public static void main([]args){ int []a = new int[10]; for(int i=0;i<a.

2020-08-06 10:19:33 13313

空空如也

空空如也

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

TA关注的人

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