java
文章平均质量分 53
会写代码的劫
厚积薄发,一个小小的码农
展开
-
RPC调用和HTTP调用的区别
一.远程调用方式无论是微服务还是分布式服务(都是SOA,都是面向服务编程),都面临着服务间的远程调用。那么服务间的远程调用方式有哪些呢?常见的远程调用方式有以下几种:RPC:Remote Produce Call远程过程调用,类似的还有RMI(Remote Methods Invoke 远程方法调用,是JAVA中的概念,是JAVA十三大技术之一)。自定义数据格式,基于原生TCP通信,速度快,效率高。早期的webservice,现在热门的dubbo,都是RPC的典型RPC的框架:webservie(c原创 2022-04-28 14:50:43 · 15328 阅读 · 0 评论 -
easyexcel替换poi导出大数据量数据时解决内存溢出问题时的一个性能测试
最近在项目中遇到导出大量数据到excel时发生内存溢出问题,然后看网上有人说用阿里开源的easyexcel性能非常好,我就在本地做了一个关于easyexcel和poi导出100w条一样数据时占用内存情况的测试,内存情况及GC情况用JDK自带的visualVM进行监控。首先是poi的导出内存情况及代码示例:public class PoiDemo { public static void main(String[] args) { Workbook w = new XSSFWo原创 2021-07-09 18:48:57 · 4466 阅读 · 7 评论 -
基金里投资风险指标的计算工具类(夏普比率,波动率,Var值,最大回撤率)
前段时间在项目里写了一个计算投资风险指标的计算工具类,包含夏普比率,波动率,Var值,最大回撤率四个指标。计算全部采用BigDecimal类型,开方计算采用牛顿迭代法计算。其计算公式如下:工具类实现:/** * @describe 投资分析数学计算工具类 */public class MathUtil { /** * 默认保留小数位数 */ private final static Integer DECIMAL_SCALE = 15; /**原创 2021-03-12 16:48:49 · 3274 阅读 · 0 评论 -
JVM动态分派过程分析
动态分派,简单举例来说就是运行时期根据实际的实现类型去调用对应的实现方法,多态的实现即是如此。代码实例:package com.company;/** 方法动态分派演示* */public class DynamicDispatch { static abstract class Human{ protected abstract void sayHello(); } static class Man extends Human { ...原创 2021-03-01 19:42:07 · 197 阅读 · 0 评论 -
开启逃逸分析后JIT编译器对代码会做哪些优化
开启逃逸分析后JIT编译器对代码会做哪些优化转载 2021-02-17 15:24:56 · 117 阅读 · 0 评论 -
Spring如何在抛出事务(声明式事务注解@Transactional)定义的回滚异常时,不回滚相关数据库操作
这里写自定义目录标题在调用的方法上加@Async注解, 在Spring中,基于@Async标注的方法,称之为异步方法;这些方法将在执行的时候,将会在独立的线程中被执行,调用者无需等待它的完成,即可继续其他的操作。 在异步方法中,如果出现异常,对于调用者而言,是不知道发生异常,所以即使异常和@Transactional注解上rollbackFor=Exception.class类型一致或者是其子类,也无法触发事务回滚。但是要注意调用加了@Async注解的方法不能和调用的在同一类里,和@Transactio原创 2020-12-07 18:49:15 · 335 阅读 · 0 评论 -
JVM学习笔记(主要是类加载过程)
java代码执行流程图由于跨平台的设计,jvm指令根据栈来设计的。优点跨平台,指令集小,编译器容易实现,缺点是性能跟寄存器比有所下降。int i = 3;int j = 2;int var10000 = i + j;例如上面三行代码 我们编译后执行javap -v 命令后解析的指令有以下几步: stack=2, locals=4, args_size=1 0: iconst_3 1: istore_1 2: iconst_2原创 2020-06-27 13:54:19 · 166 阅读 · 0 评论 -
java实现PDF转tif格式并且设置颜色和dpi
亲测,完美转换! public static void pdfToTif() { PDDocument doc = null; FileOutputStream fos = null; try { //获取pdf的内容 doc = PDDocument.load(new File("D:\\1.pdf")); //获取pdf的页数 int pageCount =原创 2020-06-20 15:27:22 · 1536 阅读 · 11 评论 -
java注解基本知识
注解的定义看起来很像接口的定义,注解也会被编译成class文件。一个注解的组成包括注解类型本身,元注解,一些元素。元注解:注解元素:• 所有基本类型 (int, float, boolean等)• String• Class• enum• Annotation.以上类型的数组如果你使用了其他类型, 那编译器就会报错。 注意, 也不允许使用任何包装类型,由于java的自动装箱机制,这个不算限制。注解也可以作为元素的类型, 也就是说注解可以嵌套。注解中元素必须要有默认值。注解不支持原创 2020-06-08 10:51:12 · 218 阅读 · 0 评论 -
一文带你认识java对象的序列化反序列化
Java的对象序列化将那些实现了Serializable接口的对象转换成一个字节序列,并能够在以后将这个字节序列完全恢复为原来的对象。这一过程甚至可通过网络进行,这意味着序列化机制能自动弥补不同操作系统之间的差异。也就是说,可以在运行Windows系统的计算机上创建 一个对象,将其序列化,通过网络将它发送给一台运行Unix系统的计算机,然后在那里准确地重新组装,而却不必担心数据在不同机器上的表示会不同,也不必关心字节的顺序或者其他任何细节。就其本身来说,对象的序列化是非常有趣的,因为利用它可以实现轻量级持原创 2020-06-06 15:38:26 · 173 阅读 · 0 评论 -
java nio利用通道和缓冲器提高I/O速度
JDK 1.4的java.nio.*包中引入了新的JavaI/0类库,其目的在千提高速度。实际上,旧的I/0 包已经使用nio重新实现过,以便充分利用这种速度提高,因此,即使我们不显式地用nio编写代码,也能从中受益。速度的提高在文件J/0和网络1/0中都有可能发生,我们在这里只讨论前者。速度的提高来自于所使用的结构更接近千操作系统执行I/O的方式:通道和缓冲器。我们可以把它想像成一个煤矿,通道是一个包含煤层(数据)的矿藏,而缓冲器则是派送到矿藏的卡车。 卡车载满煤炭而归, 我们再从卡车上获得煤炭。 也就原创 2020-06-05 13:16:42 · 318 阅读 · 0 评论 -
java按行和字符读取文件内容
public class BufferedInputFile { public static String read(String filename) throws IOException { BufferedReader reader = new BufferedReader(new FileReader(filename)); String s; StringBuilder sb = new StringBuilder(); whi原创 2020-06-04 14:53:27 · 772 阅读 · 0 评论 -
Cglib包实现动态代理
Cglib代理模式基本介绍:Cglib代理也叫子类代理,它是在内存中构建一个子类对象并对其目标方法进行拦截从而实现对目标对象功能扩展。使用Cglib代理需要引入Cglib jar包,Cglib包的底层是通过字节码处理框架ASM来转换字节码并生成新的类。1)首先导入cglib jar包2)注意,cglib代理的目标对象里要被增强的方法不能是static或者final的,如果是static或者final的则不会被拦截到,因为cglib是通过继承目标类实现方法增强,而static或者final的方法是不能原创 2020-05-24 16:31:50 · 1041 阅读 · 0 评论 -
静态代理和动态代理
1.静态代理基本介绍:静态代理,需要定义接口或父类,代理对象和被代理对象实现相同接口或者是继承相同父类,像之前博文中写的代理模式就是静态代理 静态代理例子2.动态代理的基本介绍:代理对象不需要实现接口,但是被代理对象要实现接口,否则不能使用动态代理代理对象的生成,是利用JDK的api,动态的在内存中构建代理对象动态代理也叫做:JDK代理、接口代理JDK的动态代理依靠反射来实现,代理类和被代理类不需要实现同一个接口。被代理类需要实现接口,否则无法创建动态代理。代理类在JVM运行时动态生原创 2020-05-22 16:28:04 · 186 阅读 · 0 评论 -
设计模式:代理模式
以下是从java设计模式刘伟一书总结:代理模式是常用的结构型设计模式之一,当无法直接访问某个对象或访问某个对象存在困难时可以通过一个代理对象来间接访问,为了保证客户端使用的透明性,所访问的真实对象与代理对象需要实现相同的接口。根据代理模式的使用目的不同,代理模式又可以分为多种类型,例如保护代理、远程代理、虚拟代理、缓冲代理等,它们应用于不同的场合,满足用户的不同需求。代理模式定义如下:代理模式:给某一个对象提供一个代理或占位符,并由代理对象来控制对原对象的访问。Proxy Pattern: Pro原创 2020-05-22 12:25:48 · 279 阅读 · 0 评论 -
迷宫回溯问题用递归实现
思路是先创建一个二维数组map,模拟迷宫地图,数组值1 表示墙 ; 0 表示小球可以走,小球只能从不是墙的地方走,下面是初始地图代码实现:map 表示地图i,j 表示从地图的哪个位置开始出发 (1,1)如果小球能到 map[6][5] 位置,则说明通路找到.约定: 当map[i][j] 为 0 表示该点没有走过 当为 1 表示墙 ; 2 表示通路可以走 ; 3 表示死路在走迷宫时,需要确定一个策略(方法) 下->右->上->左 , 如果该点走不通,再回溯public原创 2020-05-21 20:40:16 · 170 阅读 · 0 评论 -
java单链表逆置细致讲解
public class ListReverse { //静态内部类作为链表节点 static class Node{ //节点数据 int data; //指向下一个节点 Node next; Node(int val){ this.data=val; this.next=null; } Node(){} } //原创 2020-05-20 11:16:01 · 838 阅读 · 0 评论 -
设计模式:适配器模式
在适配器模式中引入了一个被称为适配器(Adapter)的包装类,而它所包装的对象称为适配者(Adaptee),即被适配的类。适配器的实现就是把客户类的请求转化为对适配者的相应接口的调用。也就是说:当客户类调用适配器的方法时,在适配器类的内部将调用适配者类的方法,而这个过程对客户类是透明的,客户类并不直接访问适配者类。因此,适配器让那些由于接口不兼容而不能交互的类可以一起工作。适配器模式(Adapter Pattern):将一个接口转换成客户希望的另一个接口,使接口不兼容的那些类可以一起工作,其别名为包装原创 2020-05-15 17:12:24 · 241 阅读 · 0 评论 -
设计模式:建造者模式
在建造者模式结构图中包含如下几个角色:● Builder(抽象建造者):它为创建一个产品Product对象的各个部件指定抽象接口,在该接口中一般声明两类方法,一类方法是buildPartX(),它们用于创建复杂对象的各个部件;另一类方法是getResult(),它们用于返回复杂对象。Builder既可以是抽象类,也可以是接口。●ConcreteBuilder(具体建造者):它实现了Builder接口,实现各个部件的具体构造和装配方法,定义并明确它所创建的复杂对象,也可以提供一个方法返回创建好的复杂产品对原创 2020-05-13 15:00:23 · 135 阅读 · 0 评论 -
数据结构(五):排序算法
/*插入排序*/public static void insertSort(int[] arr){ int tmp = 0; for (int i = 0; i < arr.length; i++) { for (int j = i; j >=0; j--) { if (arr[i]<arr[j]){ ...原创 2020-05-07 15:13:13 · 151 阅读 · 0 评论 -
数据结构(四):用二叉堆实现优先队列
优先队列是用来找出、返回并删除优先队列中最小的元素。插入等于入队,删除等于出队。用二叉堆来实现插入和删除的最坏时间复杂度为O(logN)。//二叉堆为完全二叉树结构public class BinaryHeap<AnyType extends Comparable<? super AnyType>> { private static final int DEFA...原创 2020-04-18 19:17:24 · 612 阅读 · 0 评论 -
数据结构(三) :二叉查找树的基本实现
public class BinarySearchTree<AnyType extends Comparable<? super AnyType>> { private static class BinaryNode<AnyType>{ BinaryNode(AnyType theElement){ this(th...原创 2020-04-14 13:52:49 · 127 阅读 · 0 评论 -
数据结构(一):自己实现一个MyLinkedList
最近开始学习数据结构,看的是数据结构与算法分析(java语言描述)第3版,自己看着书上敲了一个MyLinkedList加上了自己分析的注释。public class MyLinkedList<AnyType> implements Iterable<AnyType> { //集合长度 private int theSize; //用来在迭代器循环...原创 2020-04-08 16:27:13 · 397 阅读 · 0 评论 -
关于mybatis-plus里作用实体类中注解的使用介绍
mybatis-plus的中文文档里面有详细的介绍https://www.bookstack.cn/read/mybatis-plus-3.x/43b94a8da9a4298c.md需要注意的是主键上要映射数据库字段一定要用@TableId 非主键字段才用@TableField value属性指定数据库要映射的字段...原创 2020-04-01 17:16:32 · 1243 阅读 · 0 评论 -
搭建JDK源码阅读环境,方便对源码的调试以及注释
首先建一个基础的java工程创建两个包,一个source放jdk的源码,一个test放测试源码的入口2.导入jdk源码首先找到安装jdk的目录,解压src.zip,即为jdk源码然后放到项目里导入之后,然后我们可以创建一个hashmap的入口类,去debug看一下hashmap的插入元素过程的源码。第一个需要编译较长时间,需要等待一会,然后编译会报错,系统资源不足,我们需...原创 2020-03-28 15:05:02 · 740 阅读 · 1 评论 -
浅谈hashmap的插入元素的过程
在想要了解hashmap插入元素过程之前我们应该了解hashmap的基本数据结构,以及hashmap的一些相关机制,先了解以下术语:基本结构:hashmap插入元素时的源码(jak1.8):final V putVal(int hash, K key, V value, boolean onlyIfAbsent, boolean evict) { ...原创 2020-03-27 17:03:41 · 2348 阅读 · 0 评论 -
关于重写equals()为什么一定要重写hashcode()自己的一点心得
首先我们看下下面代码及输出和String重写equals和hashcode的源码:package com.zzy.test;public class Test6 { public static void main(String[] args) { String s1="aaa"; String s2="aaa"; String s3=n...原创 2020-03-26 19:29:49 · 282 阅读 · 1 评论 -
利用数组完成map的简单实现
package com.zzy.test;public class MyMap<K,V> { private Object[][] pairs; //代表map的一个K,V数据对应的下标 private int index; public MyMap(int length){ //定义一个二维数组length代表map的容量,长度为...原创 2020-03-26 10:44:19 · 352 阅读 · 0 评论 -
Java集合总结
1)Collection:一个独立元素的序列,这些元素都服从一条或多条规则。List必须按照插入的顺序保存元素,而Set不能有重复的元素。Queue按照排队规则来确定对象产生的顺序(通常与它们被插入的顺序相同)。2)Map:一组成对的键值对对象,允许用键来查找值。它也被称为“关联数组”或者“字典”。3)通过Arrays.asList()创建出的集合不能进行add()或者delete()方法在这...原创 2020-03-22 18:48:05 · 108 阅读 · 0 评论 -
Java多态的全面总结
向上转型例如创建子类对象时引用指向父类对象时,我们把这种情况叫做向上转型比如 多边形 x=new 正方形()多边形 y=new 菱形()静态绑定与动态绑定当我们执行以下代码,虽然大家都知道我们创建的是子类对象,只是把引用指向了父类对象,但是编译器是怎么知道我们想要调哪个子类呢?这就涉及到了方法的动态绑定,将一个方法调用同一个方法主体关联起来被称作绑定。编译时期进行绑定叫...原创 2020-03-20 16:10:52 · 141 阅读 · 0 评论 -
java中final关键字总结
final关键字关于java中final关键字以下是本人在阅读java编程思想这本书中总结的一些知识final通常含义是指“不可改变的”,使用此关键字的理由有两种:设计和效率。为了防止误用final关键字,应该从以下几个方面去了解final的用法。final 数据final修饰基本类型变量,该变量必须进行赋值,并且这个值不会再改变,但是这并不能说该变量的值一开始就必须是固定的,比如使用随...原创 2020-03-19 15:25:56 · 156 阅读 · 0 评论 -
使用mybatis分页插件PageHelper报java.util.ArrayList cannot be cast to com.github.pagehelper.Page的几种可能原因
使用mybatis分页插件PageHelper报java.util.ArrayList cannot be cast to com.github.pagehelper.Page的几种可能原因首先导入依赖就不多说了 com.github.pagehelper pagehelper 4.1.0## 第一个可能出现的原因在mybatis-config.xml中加入以下配置<?xml...原创 2019-04-03 09:56:01 · 7262 阅读 · 0 评论