java
文章平均质量分 92
小码农叔叔
这个作者很懒,什么都没留下…
展开
-
Java虚拟机栈详解
前言虚拟机栈也称为Java栈,每个方法被执行的时候,Java虚拟机都会同步创建一个栈帧(Stack Frame)栈特点基本介绍Java虚拟机栈属于线程私有,它的生命周期与线程相同(随线程而生,随线程而灭)虚拟机栈说明了线程运行时的瞬时状态每次方法调用,都会产生对应的栈帧栈帧包括局部变量表、操作数栈、动态链接、方法返回地址和一些附加信息每个方法被调用至执行完毕的过程,就对应这个栈帧在虚拟机栈中从入栈到出栈的完整过程栈的深度有限制局部变量表局部变量表(Local Variable T原创 2021-01-23 22:44:38 · 6373 阅读 · 0 评论 -
Java工厂设计模式详解
前言工厂设计模式在开发过程中有大量的运用,不管是spring框架,还是诸多的中间件,都有着工厂设计模式的体现比如,手机生产工厂,当提供了相关生产手机的原材料,工厂就可以按要求生产出手机工厂模式介绍工厂模式提供了一种创建对象的最佳方式,我们在创建对象的时候不会对客户端暴露具体的创建对象的逻辑,并通过使用一个共同创建的接口来指向新创建的对象工厂模式常用实现方式简单工厂模式通过传入相关的类型参数来返回相应的类,这是最简单的一种实现方式,功能相对单一,ke扩展性较差工厂方法模式通过实现类原创 2021-01-13 22:18:52 · 1006 阅读 · 0 评论 -
JVM类加载器详解
前言在上一篇中,通过下面这幅图大致了JVM整体的内部运行结构图,在JVM的结构中,类加载子系统作为连接外部class文件与真正将class文件加载到运行时数据区,承担着重要的作用类加载器是什么?有什么作用?1、负责从文件或者网络加载class文件字节流2、读取字节码中的信息,并在运行时存储到JVM的内存区域3、检查并确保加载的class文件信息符合JVM字节码规范...原创 2021-01-11 23:12:03 · 6131 阅读 · 2 评论 -
spring自定义生命周期的几种方法
前言作为一门功能完善的后端应用框架,spring在满足日常的开发基础上,还提供了许多有用的扩展功能点。我们知道,spring框架中一个重要的体系叫IOC,也即IOC容器,IOC管理的其实是注册在spring中众多的bean,在spring中,IOC对于bean的管理就非常重要。bean的一个很重要的概念就是他具有完整的生命周期,Bean 的生命周期指的是 Bean 的创建、初始化、销毁的过程。...原创 2020-03-07 15:46:52 · 33029 阅读 · 0 评论 -
阿里easy excel操作excel总结
阿里在18年3月份左右发布easyexcel,刚发布就是打着“低内存”解决POI的oom的口号,本人在测试过程中发现相比poi,确实在使用的体验、操作简便性上有不少提升,感谢阿里团队的努力,官方给出的项目demp的github地址:https://github.com/alibaba/easyexcel下面就easy excel操作excel的常用操作做简单总结如下导入依赖jar包<...原创 2020-01-15 11:01:36 · 3518 阅读 · 3 评论 -
java使用nio读写文件
IO原理最近在研究 JAVA NIO 的相关知识,学习NIO,就不能提到IO的原理和事项,必经NIO是基于IO进化而来IO涉及到的底层的概念大致如下:缓冲区操作。2) 内核空间与用户空间。3) 虚拟内存。4) 分页技术一,虚拟存储器虚拟存储器是硬件异常(缺页异常)、硬件地址翻译、主存、磁盘文件和内核软件的完美交互,它为每个进程提供了一个大的、一致的和私有的地址空间。虚拟存储器的三大...原创 2019-11-16 16:24:30 · 15418 阅读 · 1 评论 -
深入理解jvm和jvm基本调优参数
Java虚拟机原理所谓虚拟机,就是一台虚拟的机器。他是一款软件,用来执行一系列虚拟计算指令,大体上虚拟机可以分为:系统虚拟机和程序虚拟机, 大名鼎鼎的Visual Box、Vmare就属于系统虚拟机,他们完全是对物理计算的仿真,提供了一个可以运行完整操作系统的软件平台。程序虚拟机典型代码就是Java虚拟机,它专门为执行单个计算程序而计算,在Java虚拟机中执行的指令我们成为Java自己码指令。...原创 2019-04-06 21:33:13 · 26030 阅读 · 0 评论 -
解决 mysql 树形结构插入数据查询死循环问题
在项目中,大家可能会遇到这样一个问题,就是当你操作那些具有上下级的树的表的时候,如果是单纯的父子级关系,可能不会碰见这个问题,但是如果这个看起来具有树形结构的表形成闭环的时候,问题就来了,我遇到的结果就是,一旦碰到这样的情况,就是页面一直卡在那里,对应着后台就是,要么程序死循环,要么数据库死循环,直到系统卡死崩溃。这个问题很是头疼,在网上找了不少资料没有发现真正能够解决我的问题的,究其原因,还是...原创 2019-04-06 19:08:58 · 2918 阅读 · 1 评论 -
二叉树基本使用
什么是二叉树?在计算机科学中,二叉树是每个结点最多有两个子树的树结构。通常子树被称作“左子树”(left subtree)和“右子树”(right subtree)。二叉树常被用于实现二叉查找树和二叉堆。为什么要学习二叉树?在树中查找数据项的速度和在有序数组中查找一样快,并且插入数据项和删除数据项的速度和在链表中一样快。二叉树结合了数组与链表结构的优点,成为了更加快速的高级数据结构。下面...原创 2019-03-24 22:00:51 · 3520 阅读 · 0 评论 -
java计数排序
什么是计数排序呢?简单来说,就是通过额外开辟一个数组或者类似的集合空间,将原数组待排序元素进行整理放到这个新开辟的数组中,最后,再将这个数组排序好的元素重新填充到原数组中,可以看出来,这个计数排序是需要额外消耗空间的。计数排序的核心在于将输入的数据值转化为键存储在额外开辟的数组空间中。 作为一种线性时间复杂度的排序,计数排序要求输入的数据必须是有确定范围的整数(局限性)。计数排序算法Java...原创 2019-03-17 23:09:41 · 7109 阅读 · 0 评论 -
springboot整合websocket实现简易版单人聊天
websockt在作为即时通讯类的聊天方面有较多的应用,其主要的特点就是轻量,使用方便,容易快速上手,通过webscoket整合服务端,就可以实现简单的类似聊天的功能,下面说说springboot整合socketjs实现一个简易版的点对点聊天过程,1、pom依赖:<parent> <groupId>org.springframework.boot</group...原创 2019-03-12 21:34:58 · 2711 阅读 · 2 评论 -
java垃圾回收理解与算法
垃圾回收机制概述Java语言中一个显著的特点就是引入了垃圾回收机制,使c++程序员最头疼的内存管理的问题迎刃而解,它使得Java程序员在编写程序的时候不再需要考虑内存管理。由于有个垃圾回收机制,Java中的对象不再有“作用域”的概念,只有对象的引用才有“作用域”。垃圾回收可以有效的防止内存泄露,有效的使用空闲的内存。ps:内存泄露是指该内存空间使用完毕之后未回收,在不涉及复杂数据结构的一般情况...原创 2019-04-06 21:45:34 · 6886 阅读 · 0 评论 -
Jwt简单使用
在分布式项目中,经常需要处理session共享的问题,解决的方式有很多,比如采用session或者cookie,或者redis进行存储都是解决方案,今天给大家介绍另一种比较轻量级的解决方式,就是使用jwt生成token,服务端进行加解密来处理;首先要了解一下jwt的三个基本术语,HeaderHeader是由以下这个格式的Json通过Base64编码(编码不是加密,是可以通过反编码的方式获取到...原创 2019-04-11 23:00:35 · 9569 阅读 · 1 评论 -
Hystrix 线程池隔离与接口限流
认识HystrixHystrix是Netflix开源的一款容错框架,包含常用的容错方法:线程隔离、信号量隔离、降级策略、熔断技术。在高并发访问下,系统所依赖的服务的稳定性对系统的影响非常大,依赖有很多不可控的因素,比如网络连接变慢,资源突然繁忙,暂时不可用,服务脱机等。我们要构建稳定、可靠的分布式系统,就必须要有这样一套容错方法。本文主要讨论线程隔离技术。为什么要做线程隔离比如我们现在有...原创 2019-04-14 21:26:57 · 45011 阅读 · 0 评论 -
java简单模拟实现数据库连接池
为什么要使用数据库连接池这个问题在一开始学习线程池或者整合ssm框架的时候经常会问自己这个问题,只知道这样使用可以在一定程度上优化程序的性能,提升系统的资源利用率,至于为什么这样使用一直没有搞明白。从原理上讲,池化是一种思想,设想把所有的资源集中在一个池子里,那样对于使用资源的人来说就很容易也很方便的取用了,而且池化另外一个好处就是一开始就把资源价加载好,而不是需要的时候再去创建,对于调用者来...原创 2019-04-23 23:58:46 · 2831 阅读 · 2 评论 -
java使用百度人脸识别API
随着人工智能和大数据分析技术越来越广泛,众多的生活场景都存在着这些技术的身影,比如像现在比较流行的人脸识别技术,其底层的算法实现的支撑,为众多的业务场景铺垫了基础,像支付宝的刷脸支付,我们在火车站安检经过闸机口时的刷脸识别等,都是上层应用对于这类技术的具体应用,那么其实现原理是怎样的呢?大体来说,我把理解整理成如下步骤,1、用户注册,即首次刷脸之前需通过应用层向人脸数据库提交个人原始照片;...原创 2019-05-15 23:14:53 · 15714 阅读 · 7 评论 -
RocketMq发送延迟消息
什么是延迟消息?对于消息中间件来说,producer将消息发送到mq的服务器,但并不期望这条消息马上被消费,而是推迟到当前时间点之后的某个时间点后再投递到queue中让consumer进行消费,延迟消息的使用场景很多,一种比较常见的场景就是在电商系统中,订单创建后,会有一个等待用户支付的时间窗口,一般为30分钟,30分钟后consumer收到这条订单消息,然后程序去订单表中检查当前这条订单的支付...原创 2019-05-25 10:59:51 · 25663 阅读 · 3 评论 -
rocketMq 顺序消费
什么是顺序消费?消息有序指的是一类消息消费时,能按照发送的顺序来消费。例如:一个订单产生了 3 条消息,分别是订单创建、订单付款、订单完成。消费时,要按照这个顺序消费才有意义。与此同时多笔订单之间又是可以并行消费的。rocketmq是怎么实现顺序消费的呢?①rocketmq保证同一个订单的消息,一定要发送到同一个队列②并且该队列只有一个消费者,也就是说 同一个队列,不能出现多个消费者并行消...原创 2019-05-25 18:27:34 · 2066 阅读 · 0 评论 -
支付宝沙箱环境下模拟下单流程
目前,市面上比较流行的支付方式有支付宝支付,微信支付,银联支付,其他聚合支付等,支付市场发展到目前,算是比较稳定和成熟了,有了这么多支付方式,不论是web端还是移动端,需要支付的场景很多,今天来简单模拟一下使用较多的支付宝支付。由于条件限制,个人无法提供工商营业执照,因此无法在支付宝官方平台注册企业开发用户,好在支付宝开发者平台提供了沙箱环境,可为个人开发者提供一套和真实环境差不多的沙箱模式,开...原创 2019-06-23 19:51:26 · 6978 阅读 · 7 评论 -
java模拟双向链表实现
双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点下图是双向链表的逻辑结构图,和单链表不同的是,双向链表中每个节点包含两个节点的指针引用,和一个数据域,这两个节点分别指向前一个节点和后一个节点;双向链表的这种结构比起单链表,其改进之处正在于此,通过对前后节点的引用可以使得在...原创 2019-03-10 20:11:17 · 6340 阅读 · 6 评论 -
java堆排序
堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。堆排序的过程描述如下:将初始待排序关键字序列(R1,R2….Rn)构建成大顶堆,此堆为初始的无序区;将堆顶元素R[1]与最后一个元素R[n]交换,此时得到新的无序区(R1,R2,……Rn-1)和新的有序区(Rn)...原创 2019-03-14 22:39:44 · 1948 阅读 · 0 评论 -
java优先级队列使用
优先级队列是比栈和队列更专用的结构,在多数情况下都非常有用。优先级队列像普通队列一样,有一个队头和队尾,并且也是从队头移除数据。优先级队列中,数据按关键词有序排列,插入新数据的时候,会自动插入到合适的位置保证队列有序。举个例子来说,一组整型数,如果使用优先级队列的话,不管队列之前放入的数据如何,后面添加进去的数据总会被按照升序或者降序排列,当然这个只是优先级队列最基本的使用,在实际生产中可能有...原创 2019-02-21 21:40:11 · 9514 阅读 · 0 评论 -
阻塞和非阻塞队列下两种生产者消费者实现
队列可分为两种,一种是阻塞队列,一种是非阻塞队列。阻塞队列和非阻塞队列的区别:阻塞队列可以阻塞,非阻塞队列不能阻塞,只能使用队列wait(),notify()进行队列消息传送。而阻塞队列当队列里面没有值时,会阻塞直到有值输入。输入也一样,当队列满的时候,会阻塞,直到队列不为空。自从Java 1.5之后,在java.util.concurrent包下提供了若干个阻塞队列,主要有以下几个:Arr...原创 2019-02-21 20:52:38 · 21385 阅读 · 0 评论 -
java实现单词或字符串反转
最近抽空研究java数据结构发现栈和队列的特殊用处,比如像实现单词或字符串反转这一个功能,传统的做法是,将单词切分成一个个字符,然后重新组装成一个新的单词,如果用栈来实现是不是也可以做呢?思考一下栈的结构可以知道,栈是先进后出的数据结构,我们设想将单词切成一个个字符后入栈,取出来的时候不就是最后放入的那个字符吗?利用这一思路来实现一下上述的猜想,其实代码实现并不难,下面直接贴上两种实现方式的代码...原创 2019-02-21 19:44:53 · 3066 阅读 · 1 评论 -
java多叉树的遍历
用过了二叉树后,正好业务上有一个需求,就是需要求出从根节点到每个叶子节点的路径集合,由于不是二叉树,而是如同一种多叉树的结构,下面来看具体代码,1、节点对象,包含3个属性,当前节点Id,持有的父节点Id,当前节点的内容,public class TreeNode { /** 节点Id */ private String nodeId; /** 父节点Id */ private Str...原创 2019-01-23 08:54:26 · 8147 阅读 · 0 评论 -
java操作二叉树
下面聊聊二叉树的使用,二叉树的基本理论想必大家都很明白了,直接上代码,1、首先是一个节点Node,这个节点有下面几个属性,数据项,以及对左右子节点的引用,public class Node { // 数据项 public long data; private String sData; // 左子节点 public Node leftChild; // 右子节点 publi...原创 2019-01-22 23:08:54 · 2185 阅读 · 0 评论 -
java开放地址法和链地址法解决hash冲突
hashMap对各位小伙们来说,没有不知道的了,使用过的人想必或多或少的都了解一点hashMap的底层实现原理,总结来说就是,数组+链表,至于源码的实现,大家可参看源码,今天想说的是hashMap是怎么解决hash冲突的呢?首先看一张图,从这张图也大概可以看出来,hashMap维护的是一个数组,数组里面的每个单元又是一个个链表,那么为什么会产生hash冲突呢?这也就是接下来要探讨的问题。既...原创 2019-01-27 18:50:48 · 10078 阅读 · 0 评论 -
java集合对字符串或对象去重
由于开发中遇到了集合中筛选重复字符串或对象的操作,下面记录几种常用的方法,以备后续查询使用,直接上代码,/** * list去掉重复元素 * * @param datas * @return */ public static List&amp;lt;String&amp;gt; getNoDuplicate1(List&amp;lt;String&amp;gt; datas) { List&amp;原创 2019-01-21 00:00:25 · 2625 阅读 · 2 评论 -
java中map和对象互转工具类
在项目开发中,经常碰到map转实体对象或者对象转map的场景,工作中,很多时候我们可能比较喜欢使用第三方jar包的API对他们进行转化,而且用起来也还算方便,比如像fastJson就可以轻松实现map和对象的互转,但这里,我想通过反射的方式对他们做转化,也算是对反射的学习和研究吧;1、map转对象;主要思路,将map中的key-value取出来,然后和给定的对象去匹配,为了使工具方法更具通用性...原创 2019-01-05 13:33:41 · 52976 阅读 · 15 评论 -
java归并排序
和选择排序一样,归并排序的性能不受输入数据的影响,但表现比选择排序好的多,因为始终都是O(n log n)的时间复杂度。代价是需要额外的内存空间。归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。归并排序是一种稳定的排序方法。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有...原创 2019-02-22 23:54:25 · 7407 阅读 · 1 评论 -
java排序算法之冒泡排序
冒泡排序是java十大排序算法中的基础算法,了解其实现原理很有必要,下面就来说说冒泡排序,其实现代码并不复杂,主要是弄清楚执行的流程,一、基本概念:依次比较相邻的两个数,将小数放在前面,大数放在后面。即在第一趟:首先比较第1个和第2个数,将小数放前,大数放后。然后比较第2个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后。至此第一趟结束,将最大的数放到了最...原创 2019-02-12 16:41:52 · 6949 阅读 · 0 评论 -
netty整合使用webscoket
上一篇我们简单说了一下netty的基本操作,其实在netty底层,提供了大量的支持服务端和客户端进行通讯的组件,比如像http协议,支持webscoket的整合等,可以很方便的进行使用,当然,我们也可以单纯的使用websocket进行客户端和服务端的通信,可根据业务场景和自己项目的情况进行选择,下面来实现一个通过页面发送消息到netty服务端,再有服务端推送消息给客户端的功能,整个部分分为2步,...原创 2019-03-14 21:43:32 · 3005 阅读 · 0 评论 -
java获取指定倒退或向前的时间工具类
最近,业务中碰见需要获取指定的时间,比如向前倒推一定的时间,向后倒推一定的时间,此次记载一下处理的相关代码逻辑,//获取当前时间向后推一天 public static String getDayAfterOne(){ SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd"); Calendar c =...原创 2019-03-14 18:23:54 · 8532 阅读 · 0 评论 -
java手动分页工具类
开发中,碰到了一些奇葩的业务逻辑,无法使用框架自身的分页功能,想了很久最后还是决定自己手写一个分页工具类,以备后续参考和使用,下面直接上代码,/** * 手动分页类 * @param datas * @param pageSize * @param pageNo * @param &lt;T&gt; * @return *...原创 2019-03-04 14:14:20 · 5763 阅读 · 0 评论 -
java实现单链表
链表是java数据结构中一种很基础很常见却也很重要的数据结构,JDK中许多内置jar包基于单链表实现,比如像我们熟悉的linkedList等,为什么要使用链表呢?我们知道java中很多集合的底层是基于数组实现的,数组有一个很重要的结构就是索引,通过索引可以快速定位数据,并对数据进行删除等操作,但问题是,我们的业务中,数组有自身的局限性,如果知道索引还好,如果不知道索引就需要一个个遍历查找,然后再...原创 2019-03-06 22:08:37 · 46698 阅读 · 15 评论 -
java使用netty
Netty为什么会高效?回答就是良好的线程模型,和内存管理。在Java的NIO例子中就我将客户端的操作单独放在一个线程中处理了,这么做的原因在于如果将客户端连接串起来,后来的连接就要等前一个处理完,当然这并不意味着多线程比单线程有优势,而是在于每个客户端都需要进行读取准备好的缓存数据,再执行一些业务逻辑。如果业务逻辑耗时很久,那么顺序执行的方式没有多线程优势大。另一个方面目前多核CPU很常见了,...原创 2019-03-13 22:41:31 · 9390 阅读 · 0 评论 -
disruptor模拟高速处理大规模订单类业务场景
什么是Disruptor?Disruptor是一个开源的JAVA框架,它被设计用于在生产者—消费者(producer-consumer problem,简称PCP)问题上获得尽量高的吞吐量(TPS)和尽量低的延迟。Disruptor是LMAX在线交易平台的关键组成部分,LMAX平台使用该框架对订单处理速度能达到600万TPS,除金融领域之外,其他一般的应用中都可以用到Disruptor,它可以带...原创 2019-03-05 19:49:47 · 2690 阅读 · 3 评论 -
java排序算法之希尔排序
希尔排序相对插入排序来说更加高效,是时间复杂度突破T(n*n)的另一种高效的简单排序,希尔排序的执行流程可描述为: 一组无序的数列,选择一个增量,即gap = arr.length/2,以此增量为标的,进行第一趟数据分组与排序,然后缩小增量,继续以gap = gap/2的方式进行分组和排序, 每趟排序,根据对应的增量ti,将待排序列分割成若干长度为m 的子序列,分别对各子表进行直接插入...原创 2019-02-13 22:47:00 · 6848 阅读 · 0 评论 -
java排序算法之选择排序
选择排序是表面最稳定的排序算法之一,因为无论什么数据进去,其时间复杂度都是O(n*n),所以如果你的数据规模不大的话,可以考虑使用选择排序,因为它是基于内存排序的算法,速度很快,它的工作原理是:在未排序的序列中找到最小(最大)的元素,放在序列的起始位置,然后再从剩余序列中继续寻找最小最大元素,放到已排序的元素末尾,以此类推,直到所有的元素都排序完毕;原理很好理解,下面就来看具体的代码实现,/...原创 2019-02-12 17:20:25 · 7077 阅读 · 0 评论 -
java校验入参的有效性的工具类
闲来无事的时候,对之前项目中写过的代码做个简单的总结,其中有一个用于校验入参是否有效的工具类,在此记录一下,以便后续查询使用,现贴出以下代码,public void validateRequestParamAndValueNotNull(Map<String, Object> params, String... args) throws Exception { if...原创 2018-12-27 17:30:43 · 2616 阅读 · 0 评论