<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[会玩代码的劫]]></title><description><![CDATA[只争朝夕，不负韶华。]]></description><link>https://blog.youkuaiyun.com/qq_43365046</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; qq_43365046]]></copyright><item><title><![CDATA[RPC调用和HTTP调用的区别]]></title><link>https://blog.youkuaiyun.com/qq_43365046/article/details/124473795</link><guid>https://blog.youkuaiyun.com/qq_43365046/article/details/124473795</guid><author>qq_43365046</author><pubDate>Thu, 28 Apr 2022 14:50:43 +0800</pubDate><description><![CDATA[一.远程调用方式
无论是微服务还是分布式服务（都是SOA，都是面向服务编程），都面临着服务间的远程调用。那么服务间的远程调用方式有哪些呢？
常见的远程调用方式有以下几种：
RPC：Remote Produce Call远程过程调用，类似的还有RMI（Remote Methods Invoke 远程方法调用，是JAVA中的概念，是JAVA十三大技术之一）。自定义数据格式，基于原生TCP通信，速度快，效率高。早期的webservice，现在热门的dubbo，都是RPC的典型
RPC的框架：webservie(c]]></description><category></category></item><item><title><![CDATA[easyexcel替换poi导出大数据量数据时解决内存溢出问题时的一个性能测试]]></title><link>https://blog.youkuaiyun.com/qq_43365046/article/details/118612663</link><guid>https://blog.youkuaiyun.com/qq_43365046/article/details/118612663</guid><author>qq_43365046</author><pubDate>Fri, 09 Jul 2021 18:48:57 +0800</pubDate><description><![CDATA[最近在项目中遇到导出大量数据到excel时发生内存溢出问题，然后看网上有人说用阿里开源的easyexcel性能非常好，我就在本地做了一个关于easyexcel和poi导出100w条一样数据时占用内存情况的测试，内存情况及GC情况用JDK自带的visualVM进行监控。

首先是poi的导出内存情况及代码示例：

public class PoiDemo {
    public static void main(String[] args) {
        Workbook w = new XSSFWo]]></description><category></category></item><item><title><![CDATA[基金里投资风险指标的计算工具类（夏普比率，波动率，Var值，最大回撤率）]]></title><link>https://blog.youkuaiyun.com/qq_43365046/article/details/114700156</link><guid>https://blog.youkuaiyun.com/qq_43365046/article/details/114700156</guid><author>qq_43365046</author><pubDate>Fri, 12 Mar 2021 16:48:49 +0800</pubDate><description><![CDATA[前段时间在项目里写了一个计算投资风险指标的计算工具类，包含夏普比率，波动率，Var值，最大回撤率四个指标。
计算全部采用BigDecimal类型，开方计算采用牛顿迭代法计算。
其计算公式如下：

工具类实现：
/**
 * @describe 投资分析数学计算工具类
 */
public class MathUtil {
    /**
     * 默认保留小数位数
     */
    private final static Integer DECIMAL_SCALE = 15;
    /**
 ]]></description><category></category></item><item><title><![CDATA[mysql之InnoDB引擎下各种锁机制笔记]]></title><link>https://blog.youkuaiyun.com/qq_43365046/article/details/114597506</link><guid>https://blog.youkuaiyun.com/qq_43365046/article/details/114597506</guid><author>qq_43365046</author><pubDate>Tue, 09 Mar 2021 20:00:03 +0800</pubDate><description><![CDATA[一.什么是锁
锁是数据库区别于文件系统的一个关键特性。锁机制用于管理对共享资源的并发访问。
二.lock 与 latch
1.latch一般称为闩锁(轻量级的锁)，在InnoDB存储引擎中，latch又可以分为mutex（互斥量）和rwlock（读写锁）。其目的是保证并发线程操作临界资源的正确性，并且通常没有检测死锁的机制。
2.lock的对象是事务，用来锁定数据库中的对象，如表、页、行。并且在事务commit或rollback后进行释放，有死锁机制。

 查看latch   命令show engine  ]]></description><category></category></item><item><title><![CDATA[JVM动态分派过程分析]]></title><link>https://blog.youkuaiyun.com/qq_43365046/article/details/114265473</link><guid>https://blog.youkuaiyun.com/qq_43365046/article/details/114265473</guid><author>qq_43365046</author><pubDate>Mon, 01 Mar 2021 19:42:07 +0800</pubDate><description><![CDATA[动态分派，简单举例来说就是运行时期根据实际的实现类型去调用对应的实现方法，多态的实现即是如此。

代码实例：
package com.company;
/*
*  方法动态分派演示
* */
public class DynamicDispatch {
    static abstract class Human{
        protected abstract void sayHello();
    }

    static class Man extends Human {
    ...]]></description><category></category></item><item><title><![CDATA[开启逃逸分析后JIT编译器对代码会做哪些优化]]></title><link>https://blog.youkuaiyun.com/qq_43365046/article/details/113834588</link><guid>https://blog.youkuaiyun.com/qq_43365046/article/details/113834588</guid><author>qq_43365046</author><pubDate>Wed, 17 Feb 2021 15:24:56 +0800</pubDate><description><![CDATA[开启逃逸分析后JIT编译器对代码会做哪些优化

]]></description><category></category></item><item><title><![CDATA[Spring如何在抛出事务（声明式事务注解@Transactional）定义的回滚异常时，不回滚相关数据库操作]]></title><link>https://blog.youkuaiyun.com/qq_43365046/article/details/110819702</link><guid>https://blog.youkuaiyun.com/qq_43365046/article/details/110819702</guid><author>qq_43365046</author><pubDate>Mon, 07 Dec 2020 18:49:15 +0800</pubDate><description><![CDATA[这里写自定义目录标题
在调用的方法上加@Async注解， 在Spring中，基于@Async标注的方法，称之为异步方法；这些方法将在执行的时候，将会在独立的线程中被执行，调用者无需等待它的完成，即可继续其他的操作。 在异步方法中，如果出现异常，对于调用者而言，是不知道发生异常，所以即使异常和@Transactional注解上rollbackFor=Exception.class类型一致或者是其子类，也无法触发事务回滚。
但是要注意调用加了@Async注解的方法不能和调用的在同一类里，和@Transactio]]></description><category></category></item><item><title><![CDATA[JVM学习笔记（主要是类加载过程）]]></title><link>https://blog.youkuaiyun.com/qq_43365046/article/details/106943879</link><guid>https://blog.youkuaiyun.com/qq_43365046/article/details/106943879</guid><author>qq_43365046</author><pubDate>Sat, 27 Jun 2020 13:54:19 +0800</pubDate><description><![CDATA[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
      ]]></description><category></category></item><item><title><![CDATA[java实现PDF转tif格式并且设置颜色和dpi]]></title><link>https://blog.youkuaiyun.com/qq_43365046/article/details/106872527</link><guid>https://blog.youkuaiyun.com/qq_43365046/article/details/106872527</guid><author>qq_43365046</author><pubDate>Sat, 20 Jun 2020 15:27:22 +0800</pubDate><description><![CDATA[亲测，完美转换！
 public static void pdfToTif() {
        PDDocument doc = null;
        FileOutputStream fos = null;
        try {
            //获取pdf的内容
            doc = PDDocument.load(new File("D:\\1.pdf"));
            //获取pdf的页数
            int pageCount = ]]></description><category></category></item><item><title><![CDATA[java注解基本知识]]></title><link>https://blog.youkuaiyun.com/qq_43365046/article/details/106612153</link><guid>https://blog.youkuaiyun.com/qq_43365046/article/details/106612153</guid><author>qq_43365046</author><pubDate>Mon, 08 Jun 2020 10:51:12 +0800</pubDate><description><![CDATA[注解的定义看起来很像接口的定义，注解也会被编译成class文件。
一个注解的组成包括注解类型本身，元注解，一些元素。
元注解：

注解元素：
•   所有基本类型 (int, float, boolean等）
•	String
•	Class
•	enum
•	Annotation
．以上类型的数组
如果你使用了其他类型， 那编译器就会报错。 注意， 也不允许使用任何包装类型，由于java的自动装箱机制，这个不算限制。注解也可以作为元素的类型， 也就是说注解可以嵌套。
注解中元素必须要有默认值。
注解不支持]]></description><category></category></item><item><title><![CDATA[一文带你认识java对象的序列化反序列化]]></title><link>https://blog.youkuaiyun.com/qq_43365046/article/details/106586935</link><guid>https://blog.youkuaiyun.com/qq_43365046/article/details/106586935</guid><author>qq_43365046</author><pubDate>Sat, 06 Jun 2020 15:38:26 +0800</pubDate><description><![CDATA[Java的对象序列化将那些实现了Serializable接口的对象转换成一个字节序列，并能够在以后将这个字节序列完全恢复为原来的对象。这一过程甚至可通过网络进行，这意味着序列化机制能自动弥补不同操作系统之间的差异。也就是说，可以在运行Windows系统的计算机上创建 一个对象，将其序列化，通过网络将它发送给一台运行Unix系统的计算机，然后在那里准确地重新组装，而却不必担心数据在不同机器上的表示会不同，也不必关心字节的顺序或者其他任何细节。
就其本身来说，对象的序列化是非常有趣的，因为利用它可以实现轻量级持]]></description><category></category></item><item><title><![CDATA[java nio利用通道和缓冲器提高I/O速度]]></title><link>https://blog.youkuaiyun.com/qq_43365046/article/details/106567973</link><guid>https://blog.youkuaiyun.com/qq_43365046/article/details/106567973</guid><author>qq_43365046</author><pubDate>Fri, 05 Jun 2020 13:16:42 +0800</pubDate><description><![CDATA[JDK 1.4的java.nio.＊包中引入了新的JavaI/0类库，其目的在千提高速度。实际上，旧的I/0 包已经使用nio重新实现过，以便充分利用这种速度提高，因此，即使我们不显式地用nio编写代码，也能从中受益。速度的提高在文件J/0和网络1/0中都有可能发生，我们在这里只讨论前者。
速度的提高来自于所使用的结构更接近千操作系统执行I/O的方式：通道和缓冲器。我们可以把它想像成一个煤矿，通道是一个包含煤层（数据）的矿藏，而缓冲器则是派送到矿藏的卡车。 卡车载满煤炭而归， 我们再从卡车上获得煤炭。 也就]]></description><category></category></item><item><title><![CDATA[java按行和字符读取文件内容]]></title><link>https://blog.youkuaiyun.com/qq_43365046/article/details/106546548</link><guid>https://blog.youkuaiyun.com/qq_43365046/article/details/106546548</guid><author>qq_43365046</author><pubDate>Thu, 04 Jun 2020 14:53:27 +0800</pubDate><description><![CDATA[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]]></description><category></category></item><item><title><![CDATA[Cglib包实现动态代理]]></title><link>https://blog.youkuaiyun.com/qq_43365046/article/details/106316509</link><guid>https://blog.youkuaiyun.com/qq_43365046/article/details/106316509</guid><author>qq_43365046</author><pubDate>Sun, 24 May 2020 16:31:50 +0800</pubDate><description><![CDATA[Cglib代理模式基本介绍：
Cglib代理也叫子类代理，它是在内存中构建一个子类对象并对其目标方法进行拦截从而实现对目标对象功能扩展。使用Cglib代理需要引入Cglib jar包，Cglib包的底层是通过字节码处理框架ASM来转换字节码并生成新的类。
1）首先导入cglib jar包

2）注意，cglib代理的目标对象里要被增强的方法不能是static或者final的，如果是static或者final的则不会被拦截到，因为cglib是通过继承目标类实现方法增强，而static或者final的方法是不能]]></description><category></category></item><item><title><![CDATA[静态代理和动态代理]]></title><link>https://blog.youkuaiyun.com/qq_43365046/article/details/106278892</link><guid>https://blog.youkuaiyun.com/qq_43365046/article/details/106278892</guid><author>qq_43365046</author><pubDate>Fri, 22 May 2020 16:28:04 +0800</pubDate><description><![CDATA[1.静态代理基本介绍：
静态代理，需要定义接口或父类，代理对象和被代理对象实现相同接口或者是继承相同父类，像之前博文中写的代理模式就是静态代理       静态代理例子
2.动态代理的基本介绍：
代理对象不需要实现接口，但是被代理对象要实现接口，否则不能使用动态代理
代理对象的生成，是利用JDK的api，动态的在内存中构建代理对象
动态代理也叫做：JDK代理、接口代理
JDK的动态代理依靠反射来实现，代理类和被代理类不需要实现同一个接口。被代理类需要实现接口，否则无法创建动态代理。代理类在JVM运行时动态生]]></description><category></category></item><item><title><![CDATA[设计模式：代理模式]]></title><link>https://blog.youkuaiyun.com/qq_43365046/article/details/106274633</link><guid>https://blog.youkuaiyun.com/qq_43365046/article/details/106274633</guid><author>qq_43365046</author><pubDate>Fri, 22 May 2020 12:25:48 +0800</pubDate><description><![CDATA[以下是从java设计模式刘伟一书总结：
代理模式是常用的结构型设计模式之一，当无法直接访问某个对象或访问某个对象存在困难时可以通过一个代理对象来间接访问，为了保证客户端使用的透明性，所访问的真实对象与代理对象需要实现相同的接口。根据代理模式的使用目的不同，代理模式又可以分为多种类型，例如保护代理、远程代理、虚拟代理、缓冲代理等，它们应用于不同的场合，满足用户
的不同需求。
代理模式定义如下：
代理模式：给某一个对象提供一个代理或占位符，并由代理对象来控制对原对象的访问。
Proxy Pattern: Pro]]></description><category></category></item><item><title><![CDATA[迷宫回溯问题用递归实现]]></title><link>https://blog.youkuaiyun.com/qq_43365046/article/details/106266362</link><guid>https://blog.youkuaiyun.com/qq_43365046/article/details/106266362</guid><author>qq_43365046</author><pubDate>Thu, 21 May 2020 20:40:16 +0800</pubDate><description><![CDATA[思路是先创建一个二维数组map，模拟迷宫地图，数组值1 表示墙  ； 0 表示小球可以走，小球只能从不是墙的地方走，下面是初始地图

代码实现：

map 表示地图
i,j 表示从地图的哪个位置开始出发 (1,1)
如果小球能到 map[6][5] 位置，则说明通路找到.
约定： 当map[i][j] 为 0 表示该点没有走过 当为 1 表示墙  ； 2 表示通路可以走 ； 3 表示死路
在走迷宫时，需要确定一个策略(方法) 下-&gt;右-&gt;上-&gt;左 , 如果该点走不通，再回溯

public]]></description><category></category></item><item><title><![CDATA[java单链表逆置细致讲解]]></title><link>https://blog.youkuaiyun.com/qq_43365046/article/details/106230169</link><guid>https://blog.youkuaiyun.com/qq_43365046/article/details/106230169</guid><author>qq_43365046</author><pubDate>Wed, 20 May 2020 11:16:01 +0800</pubDate><description><![CDATA[public class ListReverse {
    //静态内部类作为链表节点
    static class  Node{
        //节点数据
        int data;
        //指向下一个节点
        Node next;
        Node(int val){
            this.data=val;
            this.next=null;
        }
        Node(){}
    }
    //]]></description><category></category></item><item><title><![CDATA[设计模式：装饰者模式]]></title><link>https://blog.youkuaiyun.com/qq_43365046/article/details/106192320</link><guid>https://blog.youkuaiyun.com/qq_43365046/article/details/106192320</guid><author>qq_43365046</author><pubDate>Mon, 18 May 2020 14:42:50 +0800</pubDate><description><![CDATA[装饰模式定义如下：
装饰模式(Decorator Pattern)：动态地给一个对象增加一些额外的职责，就增加对象功能来说，装饰模式比生成子类实现更为灵活。装饰模式是一种对象结构型模式。在装饰模式中，为了让系统具有更好的灵活性和可扩展性，我们通常会定义一个抽象装饰类，而将具体的装饰类作为它的子类，装饰模式结构如图所示：
在装饰模式结构图中包含如下几个角色：
● Component（抽象构件）：它是具体构件和抽象装饰类的共同父类，声明了在具体构件中实现的业务方法，它的引入可以使客户端以一致的方式处理未被装饰的]]></description><category></category></item><item><title><![CDATA[设计模式：适配器模式]]></title><link>https://blog.youkuaiyun.com/qq_43365046/article/details/106145274</link><guid>https://blog.youkuaiyun.com/qq_43365046/article/details/106145274</guid><author>qq_43365046</author><pubDate>Fri, 15 May 2020 17:12:24 +0800</pubDate><description><![CDATA[在适配器模式中引入了一个被称为适配器(Adapter)的包装类，而它所包装
的对象称为适配者(Adaptee)，即被适配的类。适配器的实现就是把客户类的请求转化为对适配者的相应接口的调用。也就是说：当客户类调用适配器的方法时，在适配器类的内部将调用适配者类的方法，而这个过程对客户类是透明的，客户类并不直接访问适配者类。因此，适配器让那些由于接口不兼容而不能交互的类可以一起工作。
适配器模式(Adapter Pattern)：将一个接口转换成客户希望的另一个接口，使接口不兼容的那些类可以一起工作，其别名为包装]]></description><category></category></item></channel></rss>