<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[vx539413949的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/vx539413949</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; vx539413949]]></copyright><item><title><![CDATA[一文弄懂EnumMap和EnumSet]]></title><link>https://blog.youkuaiyun.com/vx539413949/article/details/124516635</link><guid>https://blog.youkuaiyun.com/vx539413949/article/details/124516635</guid><author>vx539413949</author><pubDate>Sat, 30 Apr 2022 18:28:01 +0800</pubDate><description><![CDATA[简介
一般来说我们会选择使用HashMap来存储key-value格式的数据，考虑这样的特殊情况，一个HashMap的key都来自于一个Enum类，这样的情况则可以考虑使用本文要讲的EnumMap。
EnumMap
先看一下EnumMap的定义和HashMap定义的比较：
public class EnumMap&lt;K extends Enum&lt;K&gt;, V&gt; extends AbstractMap&lt;K, V&gt;
    implements java.io.Serializa]]></description><category></category></item><item><title><![CDATA[深入理解HashMap和LinkedHashMap的区别]]></title><link>https://blog.youkuaiyun.com/vx539413949/article/details/124516623</link><guid>https://blog.youkuaiyun.com/vx539413949/article/details/124516623</guid><author>vx539413949</author><pubDate>Sat, 30 Apr 2022 18:27:21 +0800</pubDate><description><![CDATA[简介
我们知道HashMap的变量顺序是不可预测的，这意味着便利的输出顺序并不一定和HashMap的插入顺序是一致的。这个特性通常会对我们的工作造成一定的困扰。为了实现这个功能，我们可以使用LinkedHashMap。
LinkedHashMap详解
先看下LinkedHashMap的定义：
public class LinkedHashMap&lt;K,V&gt;
    extends HashMap&lt;K,V&gt;
    implements Map&lt;K,V&gt;

LinkedHas]]></description><category></category></item><item><title><![CDATA[深入理解HashMap和TreeMap的区别]]></title><link>https://blog.youkuaiyun.com/vx539413949/article/details/124516611</link><guid>https://blog.youkuaiyun.com/vx539413949/article/details/124516611</guid><author>vx539413949</author><pubDate>Sat, 30 Apr 2022 18:26:12 +0800</pubDate><description><![CDATA[简介
HashMap和TreeMap是Map家族中非常常用的两个类，两个类在使用上和本质上有什么区别呢？本文将从这两个方面进行深入的探讨，希望能揭露其本质。
HashMap和TreeMap本质区别
先看HashMap的定义：
public class HashMap&lt;K,V&gt; extends AbstractMap&lt;K,V&gt;
    implements Map&lt;K,V&gt;, Cloneable, Serializable

再看TreeMap的定义：
public cla]]></description><category></category></item><item><title><![CDATA[Copy ArrayList的四种方式]]></title><link>https://blog.youkuaiyun.com/vx539413949/article/details/124516600</link><guid>https://blog.youkuaiyun.com/vx539413949/article/details/124516600</guid><author>vx539413949</author><pubDate>Sat, 30 Apr 2022 18:25:15 +0800</pubDate><description><![CDATA[简介
ArrayList是我们经常会用到的集合类，有时候我们需要拷贝一个ArrayList，今天向大家介绍拷贝ArrayList常用的四种方式。
使用构造函数
ArrayList有个构造函数，可以传入一个集合：
    public ArrayList(Collection&lt;? extends E&gt; c) {
        elementData = c.toArray();
        if ((size = elementData.length) != 0) {
           ]]></description><category></category></item><item><title><![CDATA[asList和ArrayList不得不说的故事]]></title><link>https://blog.youkuaiyun.com/vx539413949/article/details/124516574</link><guid>https://blog.youkuaiyun.com/vx539413949/article/details/124516574</guid><author>vx539413949</author><pubDate>Sat, 30 Apr 2022 18:23:44 +0800</pubDate><description><![CDATA[简介
提到集合类，ArrayList应该是用到的非常多的类了。这里的ArrayList是java.util.ArrayList，通常我们怎么创建ArrayList呢？
创建ArrayList
看下下面的例子：
List&lt;String&gt; names = new ArrayList&lt;&gt;();

上面的方法创建了一个ArrayList，如果我们需要向其中添加元素的话，需要再调用add方法。
通常我们会使用一种更加简洁的办法来创建List：
    @Test
    public void]]></description><category></category></item><item><title><![CDATA[Iterator to list的三种方法]]></title><link>https://blog.youkuaiyun.com/vx539413949/article/details/124516564</link><guid>https://blog.youkuaiyun.com/vx539413949/article/details/124516564</guid><author>vx539413949</author><pubDate>Sat, 30 Apr 2022 18:22:16 +0800</pubDate><description><![CDATA[简介
集合的变量少不了使用Iterator，从集合Iterator非常简单，直接调用Iterator方法就可以了。
那么如何从Iterator反过来生成List呢？今天教大家三个方法。
使用while
最简单最基本的逻辑就是使用while来遍历这个Iterator，在遍历的过程中将Iterator中的元素添加到新建的List中去。
如下面的代码所示：
    @Test
    public void useWhile(){
        List&lt;String&gt; stringList= ne]]></description><category></category></item><item><title><![CDATA[fail-safe fail-fast知多少]]></title><link>https://blog.youkuaiyun.com/vx539413949/article/details/124516522</link><guid>https://blog.youkuaiyun.com/vx539413949/article/details/124516522</guid><author>vx539413949</author><pubDate>Sat, 30 Apr 2022 18:19:58 +0800</pubDate><description><![CDATA[简介
我们在使用集合类的时候，通常会需要去遍历集合中的元素，并在遍历中对其中的元素进行处理。这时候我们就要用到Iterator,经常写程序的朋友应该都知道，在Iterator遍历的过程中，是不能够修改集合数据的，否则就会抛出ConcurrentModificationException。
因为ConcurrentModificationException的存在，就把Iterator分成了两类，Fail-fast和Fail-safe。
Fail-fast Iterator
Fail-fast看名字就知道它的意]]></description><category></category></item><item><title><![CDATA[在java中使用JMH（Java Microbenchmark Harness）做性能测试]]></title><link>https://blog.youkuaiyun.com/vx539413949/article/details/124500676</link><guid>https://blog.youkuaiyun.com/vx539413949/article/details/124500676</guid><author>vx539413949</author><pubDate>Fri, 29 Apr 2022 17:25:22 +0800</pubDate><description><![CDATA[在java中使用JMH（Java Microbenchmark Harness）做性能测试
JMH的全称是Java Microbenchmark Harness，是一个open JDK中用来做性能测试的套件。该套件已经被包含在了JDK 12中。
本文将会讲解如何使用JMH来在java中做性能测试。
如果你使用的不是JDK 12，那么需要添加如下依赖：
&lt;dependency&gt;
    &lt;groupId&gt;org.openjdk.jmh&lt;/groupId&gt;
    &lt;a]]></description><category></category></item><item><title><![CDATA[java中CyclicBarrier的使用]]></title><link>https://blog.youkuaiyun.com/vx539413949/article/details/124500641</link><guid>https://blog.youkuaiyun.com/vx539413949/article/details/124500641</guid><author>vx539413949</author><pubDate>Fri, 29 Apr 2022 17:24:27 +0800</pubDate><description><![CDATA[java中CyclicBarrier的使用
CyclicBarrier是java 5中引入的线程安全的组件。它有一个barrier的概念，主要用来等待所有的线程都执行完毕，然后再去执行特定的操作。
假如我们有很多个线程，每个线程都计算出了一些数据，然后我们需要等待所有的线程都执行完毕，再把各个线程计算出来的数据加起来，的到最终的结果，那么我们就可以使用CyclicBarrier。
CyclicBarrier的方法
我们先看下CyclicBarrier的构造函数：
    public CyclicBarri]]></description><category></category></item><item><title><![CDATA[java中CyclicBarrier的使用]]></title><link>https://blog.youkuaiyun.com/vx539413949/article/details/124500620</link><guid>https://blog.youkuaiyun.com/vx539413949/article/details/124500620</guid><author>vx539413949</author><pubDate>Fri, 29 Apr 2022 17:23:17 +0800</pubDate><description><![CDATA[java中CyclicBarrier的使用
CyclicBarrier是java 5中引入的线程安全的组件。它有一个barrier的概念，主要用来等待所有的线程都执行完毕，然后再去执行特定的操作。
假如我们有很多个线程，每个线程都计算出了一些数据，然后我们需要等待所有的线程都执行完毕，再把各个线程计算出来的数据加起来，的到最终的结果，那么我们就可以使用CyclicBarrier。
CyclicBarrier的方法
我们先看下CyclicBarrier的构造函数：
    public CyclicBarri]]></description><category></category></item><item><title><![CDATA[java并发中CountDownLatch的使用]]></title><link>https://blog.youkuaiyun.com/vx539413949/article/details/124500604</link><guid>https://blog.youkuaiyun.com/vx539413949/article/details/124500604</guid><author>vx539413949</author><pubDate>Fri, 29 Apr 2022 17:22:21 +0800</pubDate><description><![CDATA[java并发中CountDownLatch的使用
在java并发中，控制共享变量的访问非常重要，有时候我们也想控制并发线程的执行顺序，比如：等待所有线程都执行完毕之后再执行另外的线程，或者等所有线程都准备好了才开始所有线程的执行等。
这个时候我们就可以使用到CountDownLatch。
简单点讲，CountDownLatch存有一个放在QueuedSynchronizer中的计数器。当调用countdown() 方法时，该计数器将会减一。然后再调用await()来等待计数器归零。

private sta]]></description><category></category></item><item><title><![CDATA[java 中的fork join框架]]></title><link>https://blog.youkuaiyun.com/vx539413949/article/details/124500536</link><guid>https://blog.youkuaiyun.com/vx539413949/article/details/124500536</guid><author>vx539413949</author><pubDate>Fri, 29 Apr 2022 17:19:38 +0800</pubDate><description><![CDATA[java 中的fork join框架
fork join框架是java 7中引入框架，这个框架的引入主要是为了提升并行计算的能力。
fork join主要有两个步骤，第一就是fork，将一个大任务分成很多个小任务，第二就是join，将第一个任务的结果join起来，生成最后的结果。如果第一步中并没有任何返回值，join将会等到所有的小任务都结束。
还记得之前的文章我们讲到了thread pool的基本结构吗？

ExecutorService - ForkJoinPool 用来调用任务执行。
workerTh]]></description><category></category></item><item><title><![CDATA[java中ThreadPool的介绍和使用]]></title><link>https://blog.youkuaiyun.com/vx539413949/article/details/124500416</link><guid>https://blog.youkuaiyun.com/vx539413949/article/details/124500416</guid><author>vx539413949</author><pubDate>Fri, 29 Apr 2022 17:17:38 +0800</pubDate><description><![CDATA[java中ThreadPool的介绍和使用
Thread Pool简介
在Java中，threads是和系统的threads相对应的，用来处理一系列的系统资源。不管在windows和linux下面，能开启的线程个数都是有限的，如果你在java程序中无限制的创建thread，那么将会遇到无线程可创建的情况。
CPU的核数是有限的，如果同时有多个线程正在运行中，那么CPU将会根据线程的优先级进行轮循，给每个线程分配特定的CPU时间。所以线程也不是越多越好。
在java中，代表管理ThreadPool的接口有两个]]></description><category></category></item><item><title><![CDATA[springBoot~跨域后PUT,DELETE方法出现403Forbidden]]></title><link>https://blog.youkuaiyun.com/vx539413949/article/details/124447028</link><guid>https://blog.youkuaiyun.com/vx539413949/article/details/124447028</guid><author>vx539413949</author><pubDate>Wed, 27 Apr 2022 11:28:43 +0800</pubDate><description><![CDATA[ajax中的put和delete
SpringBoot默认跨域方法只支持HEAD,GET,POST，部分源代码
//package org.springframework.web.cors.CorsConfiguration
/** Wildcard representing &lt;em&gt;all&lt;/em&gt; origins, methods, or headers. */
    public static final String ALL = "*";

    private stat]]></description><category></category></item><item><title><![CDATA[springboot~将一个Integer类型序列为k/v对象]]></title><link>https://blog.youkuaiyun.com/vx539413949/article/details/124446998</link><guid>https://blog.youkuaiyun.com/vx539413949/article/details/124446998</guid><author>vx539413949</author><pubDate>Wed, 27 Apr 2022 11:27:41 +0800</pubDate><description><![CDATA[对于一些带着固定标签的字段来说，我们通常把它们配置到字段中，而在数据库中存它们的字典code，或者是字典主键，不是一个整型的数字，而在前端显示时，有时需要将它们翻译成名称，这时后端可以帮他们进行翻译，或者前端通过code自己使用字典翻译；下面说一下第一种，后端在View model中将integer类型的字典字典翻译成一个k/v的对象。
JsonSerializer
一个json序列化的基类，我们可以继承它，并实现自己的原因，在springboot框架中，你返回的json对象事实上是jackson帮我们做了]]></description><category></category></item><item><title><![CDATA[springboot~jackson和redis日期序列化]]></title><link>https://blog.youkuaiyun.com/vx539413949/article/details/124446952</link><guid>https://blog.youkuaiyun.com/vx539413949/article/details/124446952</guid><author>vx539413949</author><pubDate>Wed, 27 Apr 2022 11:26:25 +0800</pubDate><description><![CDATA[日期类型，我们需要统一它在被序列化后的格式，序列化是指把java类型通过网络系统或者IO进行持久化，如把一个java对象保存到txt文件里，或者把java对象保存到redis里，又或者把java对象通过网络以JSON的格式输出到浏览器上。
jackson的日期序列化
public class JacksonDateSerializerModifier extends BeanSerializerModifier {
    @Override
    public List&lt;BeanPropertyW]]></description><category></category></item><item><title><![CDATA[java~PECS原则]]></title><link>https://blog.youkuaiyun.com/vx539413949/article/details/124446902</link><guid>https://blog.youkuaiyun.com/vx539413949/article/details/124446902</guid><author>vx539413949</author><pubDate>Wed, 27 Apr 2022 11:25:02 +0800</pubDate><description><![CDATA[pecs

全称是Producer Extends Consumer Super
使用extends确定上界的只能是生产者，只能往外生产东西，取出的就是上界类型。不能往里塞东西。
使用Super确定下界的只能做消费者，只能往里塞东西。取出的因为无法确定类型只能转成Object类型看代码更好理解。

代码
List&lt;? extends Number&gt; numbers = new ArrayList();
numbers.add(4); //报错
Number number = numbers.ge]]></description><category></category></item><item><title><![CDATA[springboot~mybatis-plus枚举到数据库整型字段]]></title><link>https://blog.youkuaiyun.com/vx539413949/article/details/124446876</link><guid>https://blog.youkuaiyun.com/vx539413949/article/details/124446876</guid><author>vx539413949</author><pubDate>Wed, 27 Apr 2022 11:23:54 +0800</pubDate><description><![CDATA[数据库字段为int类型
实体字段为了可读性强，使用枚举类型

默认情况

一般来说，数据库为varchar时，你的枚举元素直接会进行转换

字段为整型

这些如果你是mybatis-plus，可以使用如下default-enum-type-handler参数开启@EnumValue特性，将每句的@EnumValue注释的字段添加到数据表字段中。

测试

枚举

public enum ModuleType implements NameValueEnum {
  LOGIN(0, "登录"),
  LO.]]></description><category></category></item><item><title><![CDATA[java~并行计算~Future和Callable实现大任务的并行处理]]></title><link>https://blog.youkuaiyun.com/vx539413949/article/details/124425282</link><guid>https://blog.youkuaiyun.com/vx539413949/article/details/124425282</guid><author>vx539413949</author><pubDate>Tue, 26 Apr 2022 12:46:15 +0800</pubDate><description><![CDATA[Callable是一个泛型接口，也是一个FunctionalInterface,即函数式接口，它可以使用在Lambda表达式上，即现在比较流行的函数式编程，其实java8之后，封装了好多函数式接口，今天说的Callable它是一个带有返回值的接口，它主要和Future一起使用，用在并行计算上；并行计算就是说，一个大任务，多个线程并发执行，这样可以缩减程序运行的时间，当然前提是你要保持线程的安全性。
大任务实现类
/**
     * 干一件不好干的事，使用Callable接口，需要 FutureTask实现]]></description><category></category></item><item><title><![CDATA[springboot~对@RequestParam中Date参数的适配]]></title><link>https://blog.youkuaiyun.com/vx539413949/article/details/124425275</link><guid>https://blog.youkuaiyun.com/vx539413949/article/details/124425275</guid><author>vx539413949</author><pubDate>Tue, 26 Apr 2022 12:45:26 +0800</pubDate><description><![CDATA[@RequestParam中的Date类型的参数，如果前端给一个2001-01-01在后端默认是不认的，我们在后端需要对这种情况进行适配，我们可以通过@ControllerAdvice注解来拦截请求，然后对Date参数进行转换，最终实现我们的需求。
实现org.springframework.core.convert.converter.Convert接口，来完成日期格式的转换

    public class CourseDateConverter implements Converter&lt;Str]]></description><category></category></item></channel></rss>