- 博客(84)
- 资源 (1)
- 收藏
- 关注
原创 MultipartFileToFileUtils(MultipartFile 转 File)
import org.springframework.stereotype.Component;import org.springframework.web.multipart.MultipartFile;import java.io.File;import java.io.FileOutputStream;import java.io.InputStream;import java.io.OutputStream;@Componentpublic class MultipartFileTo
2021-01-07 15:18:19
1188
原创 时间工具类DateUtils
文章目录根据两个时间获取时间内的具体日期根据某个日期返回该日期对应是周几比较两个时间的先后获取昨天日期获取今天日期修改时间日期计算两个时间差以上方法用到的包,可自行来这里cv根据两个时间获取时间内的具体日期public static List<String> getPerDay(String startTime, String endTime ) throws ParseException { DateFormat df = new SimpleDateFormat("yyy
2021-01-07 15:04:22
614
原创 配置异步线程池
import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;import java.util.concurrent.ThreadPoolExecutor;@Configurationpublic
2021-01-07 14:40:58
298
原创 如何配置Swagger2
文章目录导入依赖编写Swagger2Config导入依赖 <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> <version>2.9.2</version> </dependency>
2021-01-07 14:29:53
707
原创 如何在本地实现一个缓存
文章目录编写本地缓存类@Scheduled定时任务的fixedRate,fixedDelay,cron的作用和不同编写本地缓存类import cn.hutool.core.collection.CollUtil;import lombok.extern.slf4j.Slf4j;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.scheduling.annotation.S
2021-01-07 11:45:31
403
原创 实现一个系统切面
文章目录开启切面编写切面类开启切面在启动类上加上注解@EnableAspectJAutoProxy@EnableAspectJAutoProxy(proxyTargetClass=true)编写切面类切面需要的信息存储在ThreadLocal里面@Datapublic class MethodRuntimeContext { /** * 开始时间 */ private Long beginTimestamp; /** * 结束时间
2021-01-07 10:59:23
284
原创 如何拦截所有请求请求头中的信息
开启拦截器在启动类上加上注解@ServletComponentScan//basePackages配置拦截器所在的包名@ServletComponentScan(basePackages = "com.xxx.xxx")编写RequestHeaderInfo(用于存储请求中带的一些通用请求头)@Datapublic class RequestHeaderInfo { /** * 客户端ip */ private String clientIp; /*
2021-01-07 10:42:54
1199
原创 使用HttpClients进行http请求
文章目录发送get 请求(方式一)发送get 请求(方式二)发送post请求(参数以表单方式提交)发送Post请求(参数以JSON方式提交)以上方法用到的包,可自行来这里cv发送get 请求(方式一)public static void doGet(String url){ //1.获取httpclient CloseableHttpClient httpClient = HttpClients.createDefault(); //接口返回结果
2021-01-07 10:14:30
944
原创 基数排序
文章目录简介算法描述代码实现算法分析简介基数排序是非比较的排序算法,对每一位进行排序,从最低位开始排序,复杂度为O(kn),为数组长度,k为数组中的数的最大的位数;基数排序是按照低位先排序,然后收集;再按照高位排序,然后再收集,依次类推,直到最高位。有时候有些属性是有优先级顺序的,先按低优先级排序,再按高优先级排序。最后的次序就是高优先级高的在前,高优先级相同的低优先级高的在前。基数排序基于分别排序,分别收集,所以是稳定的。算法描述取得数组中的最大数,并取得位数;arr为原始数组,从最低位开始
2021-01-06 14:10:54
115
原创 桶排序
文章目录简介算法描述图片演示代码实现算法分析简介桶排序是计数排序的升级版。它利用了函数的映射关系,高效与否的关键在于这个映射函数的确定。桶排序(Bucket sort)的工作的原理:假设输入数据服从均匀分布,将数据分到有限数量的桶里,每个桶再分别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排排序)算法描述人为设置一个BucketSize,作为每个桶所能放置多少个不同数值(例如当BucketSize==5时,该桶可以存放{1,2,3,4,5}这几种数字,但是容量不限,即可以存放1
2021-01-06 11:53:56
94
原创 计数排序
文章目录简介算法描述代码实现算法分析简介计数排序的核心在于将输入的数据值转化为键存储在额外开辟的数组空间中。作为一种线性时间复杂度的排序,计数排序要求输入的数据必须是有确定范围的整数。计数排序(Counting sort)是一种稳定的排序算法,计数排序使用一个额外的数组C,其中第i个元素是待排序数组A中值等于i的元素的个数。然后根据数组C来将A中的元素排到正确的位置,它只能对正数进行排序。算法描述找出待排序数组中最大和最小的元素;统计数组中每个值为i的元素出现的次数,存入数组C的第i项;对所
2021-01-05 17:53:18
130
原创 快速排序
文章目录简介算法描述代码实现算法分析简介快速排序的基本思想:通过一趟排序将待排序记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。算法描述快速排序使用分治法来把一个串(list)分为两个子串(sub-lists)。从数列中挑选一个元素,称为基准(pivot);重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准大的摆在基准后面(相同的数可以任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分
2021-01-05 15:31:07
89
原创 堆排序
文章目录简介算法描述代码实现算法分析简介堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子节点的键值或索引总是小于(或者大于)它的父节点。算法描述将初始待排序关键字序列(R1,R2…Rn)构建大顶堆,此堆为初始的无序堆;将堆顶元素R[1]与最后一个元素R[n]交换,此时得到新的无序区(R1,R2…Rn-1)和新的有序区(Rn),且满足R[1,2…n-1]<=R[n];由于交换后新的堆顶R[1]可能违反堆的性质,
2021-01-05 10:38:45
71
原创 归并排序
文章目录简介算法描述代码实现算法分析简介和选择排序一样,归并排序的性能不受输入数据的影响,但表现比选择排序好的多,因为始终都是O( n log n )的时间复杂度,代价是需要额外的内存空间。归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用,归并排序是一种稳定的排序方法。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为2-路归并。算法描述把长度为n的
2021-01-05 10:19:45
86
1
原创 希尔排序
文章目录简介算法描述过程演示代码实现算法分析简介希尔排序也是一种插入排序,它是简单插入排序经过改进之后的一个更高效的版本,也称之为缩小增量排序,同时该算法是冲破O(n2)的第一批算法,它与插入排序的不同之处在于,它会优先比较较远的元素。希尔排序又叫缩小增量排序。希尔排序是把记录按下表的一定增量分组,对每组使用直接插入排序算法排序,随着增量逐渐减少,每组包含的关键字越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。算法描述希尔排序的基本步骤,在此我们选择增量gap=length/2,缩小增
2021-01-04 17:43:46
136
原创 插入排序
文章目录简介算法描述代码实现算法分析简介插入算法(Insertion-Sort)的算法描述是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常采用in-place排序(即只需用到o(1)的额外空间排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。算法描述一般来说,插入排序都采用in-place在数组上实现,具体算法描述如下:从第一个元素开始,该元素可以认为已经被排
2021-01-04 17:24:12
88
原创 选择排序
文章目录简介算法描述代码实现算法分析简介表现最稳定的排序算法之一,因为无论什么数据进去都是O(n2)的时间复杂度,所以用到它的时候,数据规模越小越好。唯一的好处可能就是不占用额外的内存空间了吧。理论上讲,选择排序可能也是平时排序一般人想到的最多的排序方法了。选择排序(Selection-sort)是一种简单直观的排序算法。它的原理:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾,以此类推,直到所有元素均排序完毕
2021-01-04 16:54:09
72
原创 FutureTask
简介在Executors框架体系中,FutureTask用来表示表示可获取结果的异步任务。FutureTask实现了Future接口,FutureTask提供了启动和取消异步任务,查询异步任务是否计算结束以及获取最终的异步任务的结果的一些常用方法。通过get()方法来获取异步任务的结果,但是会阻塞当前线程直至异步任务执行结束。一旦任务执行结束,任务不能重启或取消,除非调用runAndReset()方法。在FutureTask的源码中为其定义了这些状态;FutureTask.run()方法的执行的时机,
2021-01-04 16:35:35
286
原创 并发工具之CountDownLatch与CyclicBarrier
文章目录倒计时器CountDownLatch循环栅栏CyclicBarrierCountDownLatch与CyclicBarrier的比较倒计时器CountDownLatch在多线程协作完成业务功能时,有时需要等待其他多个线程完成任务之后,主线程才能往下继续执行业务功能,在这种业务场景下,通常可以使用Thread类的join方法,让主线程等待被join的线程执行完成之后,主线程才能继续往下执行,当然,使用线程间消息通信机制也可以完成。其实,Java并发工具类中为我们提供了类似倒计时这样的工具类。举个
2021-01-04 16:09:15
226
原创 线程之间的数据共享
Java里面进行多线程通信的主要方式就是共享内存的方式,共享内存主要的关注点:可见性和有序性以及原子性。Java内存模型(JMM)解决了可见性和有序性的问题,而锁解决了原子性的问题,理想情况下我们希望做到“同步”和“互斥”。有以下常规实现放:将数据抽象成为一个类将数据抽象成一个类,并将对这个数据的操作作为这个类的方法,这么设计可以很容易做到同步,只要在方法上加”synchronized。Runnable对象作为一个类的内部类将 Runnable 对象作为一个类的内部类,共享数据作为这个类的成
2021-01-04 15:10:36
771
原创 阻塞队列(XXXQueue)
文章目录阻塞情况常用方法ArrayBlockingQueue(公平,非公平)LinkedBlockingQueue(两个独立锁提高并发)PriorityBlockingQueue(comPareTo 排序实现优先)DelayQueue(缓存失效,定时任务)SynchronousQueue(不存储数据,可用于传递数据)LinkedTransferQueue阻塞情况在阻塞队列中,队列阻塞有这样的两种情况:当队列中没有数据的情况下,消费者端的所有线程都会被自动阻塞(挂起),直到有数据放入队列;当队列中填
2021-01-04 14:49:16
238
原创 原子类(Atomicxxx)和原子集合(CopyOnWritexxx,Concurrentxxx)
文章目录原子操作类简介什么是CAS?CAS的操作过程Synchronized VS CASCAS的问题原子类AtomicLongAtomicIntegerArray原子操作类简介在并发编程中很容易出现并发安全的问题,有一个很简单的例子就是多线程更新变量i=1,比如多个线程执行i++操作,就有可能获取不到正确的值,而这个问题,最常用的方法是通过Synchronized进行控制来达到线程安全的目的(关于synchronized可以看这篇文章)。但是由于synchronized是采用的是悲观锁策略,并不是特别
2021-01-04 11:54:54
855
原创 并发工具之Semaphore与Exchanger
文章目录控制资源并发访问Semaphore线程间交换数据的工具Exchanger控制资源并发访问SemaphoreSemaphore可以理解为信号量,用于控制资源能够被并发访问的线程数量,以保证多个线程能够合理的使用特定资源。Semaphore就相当于一个许可证,线程需要先通过acquire方法获取该许可证,该线程才能继续往下执行,否则只能在该方法处阻塞等待。当执行完业务功能后,需要通过release()方法将许可证归还,以便其他线程能够获得许可证继续执行。Semaphroe可以用于流量控制,特别是在
2020-12-31 17:12:48
152
原创 Java的并发关键字
文章目录Java并发关键字-synchronized实现原理对象锁(monitor)机制synchronized的happens-before关系锁获取和锁释放的内存语义synchronized优化CAS操作Java并发关键字-synchronizedJava关键字synchronized具有使每个线程一次排队操作共享变量的功能,很显然,这种同步机制效率很低,但synchronized是其他并发容器实现的基础。实现原理使用场景:tip:synchronized可以用在方法上也可以使用在代码块
2020-12-31 14:53:19
1118
1
原创 冒泡排序
文章目录算法描述代码实现算法分析算法描述比较相邻的元素。如果第一个比第二个大,就交换它们两个;对每一对相邻元素作同样的工作,从开始第一对到结尾的最后以堆,这样在最后的元素应该会是最大的数;针对所有的元素重复以上的步骤,除了最后一个;重复步骤1-3,直到排序完成。代码实现算法分析最佳情况:T(n) = O(n)最差情况:T(n) = O(n2)平均情况:T(n) = O(n2)...
2020-12-24 17:53:52
102
1
原创 集合的一些事
文章目录HashMap,HashTable,TreeMap的区别HashMap在JDK1.7和JDK1.8中有哪些不同集合工具类CollectionsCollection 和 Collections的区别数组工具类 Arrays将数组转换成集合,有什么好处呢?集合转数组如何选择集合HashMap,HashTable,TreeMap的区别TreeMap:基于红黑树实现。HaskMap:基于哈希表实现。HashTable:和HaskMap类似,但它是线程安全的,这意味着同一时刻多个线程可以同时写入Ha
2020-12-24 16:36:59
124
原创 LinkedList详解
文章目录介绍LinkedLists实现底层数组结构介绍LinkedList同时实现了List接口和Deque对口,也就是收它既可以看作一个顺序容器,又可以看作一个队列(Queue),同时又可以看作一个栈(stack),这样看来,linkedList简直就是无敌的,当你需要使用栈或者队列时,可以考虑用LinkedList,一方面是因为Java官方已经声明不建议使用Stack类,更遗憾的是,Java里根本没有一个叫做Queue的类(只是一个接口的名字)。关于栈或队列,现在首选是ArrayDeque,它有着比
2020-12-24 15:04:01
63239
2
原创 ArrayList详解
文章目录介绍ArrayList的实现底层数据结构构造函数自动扩容机制add(),addAll()set()介绍ArrayList实现了List接口,是顺序容器,即元素存放的数据和放进去的顺序相同,允许放入null元素,底层通过数组实现。除了该类未实现同步外,其余跟Vector大致相同。每个ArrayList都有一个容量(capacity),表示底层数组的实际大小,容器内存储元素的个数不能多于当前容量。当向容器中添加元素时,如果容量不足,容器会自动增大底层数组的大小。TIP:Java泛型只是编译器提供的
2020-12-24 09:38:18
1168
原创 CAS/AQS
文章目录CAS原理实现CAS中得经典问题,ABA问题AQS原理(state资源状态计数)资源共享的方式实现方式CASCAS函数,是比较并交换函数,它是原子操作函数原理CAS是基于乐观锁的原理进行操作的。它总是认为自己可以成功完成操作。当多个线程同时使用CAS时,只有一个会胜出,并成功更新,其余均会失败。失败的线程不会被挂起,仍是被告知失败,并且允许再次尝试或放弃操作。实现构造:CAS包含3个参数CAS(V,E,N)。V表示要更新的变量(内存值),E表示预期值(旧的),N表示新值;比较并交换:
2020-12-23 16:55:10
169
原创 JAVA中常见的锁简单介绍
文章目录独享锁(互斥锁)/共享锁(读写锁)独享锁共享锁可重入锁(递归锁)公平锁/非公平锁偏向锁/轻量级锁/重量级锁自旋锁适应性自旋锁锁的优化应用优化JVM优化独享锁(互斥锁)/共享锁(读写锁)独享锁定义:独享锁是指该锁一次只能被一个线程所持有;特点:独占锁是一种悲观保守的加锁策略,他避免了读/读冲突,如果某个只读线程获取锁,则其他读线程都只能等待,这种情况下就限制了不必要的并发性,因为读操作并不会影响数据的一致性。引用:ReentrantLock就是以独占方式实现的互斥锁。共享锁定义:共
2020-12-23 16:22:23
110
原创 乐观锁和悲观锁
乐观锁前提:认为读多写少,遇到并发写的可能性低,每次去拿数据的时候都认为别人不会修改,所以不会上锁;实现:在更新的时候会判断以下在此期间别人有没有去更新这个数据,采取在写时先读出当前版本号,然后加锁操作(比较跟上一次的版本号,如果一样则更新),如果失败则要重复读-比较-写的操作。应用:在Java中java.util.concurrent.atomic包下面的原子变量类就是使用了乐观锁的一种实现方式CAS(Compare and Swap【比较并交换】)实现的。CAS是一种更新的原子操作,比较当前值跟传
2020-12-23 15:24:50
233
原创 线程池的原理及使用
文章目录线程池的原理线程复用线程池的组成拒绝策略java线程池的工作过程合理的使用线程池newCachedThreadPoolnewFixedThreadPoolnewScheduledThreadPoolnewSingleThreadExecutor使用ThreadFactoryBuilder类来创建线程工厂线程池的原理作用:线程复用,控制最大并发数,管理线程。线程池做的工作是控制运行的线程的数量,处理过程中将任务放入队列,然后在线程创建后启动这些任务,如果线程数量超过了最大数量超过数量的线程排队等候
2020-12-23 15:04:22
538
原创 线程与进程的调度算法
文章目录理解线程的上下文上下文切换实现过程引起线程上文切换的原因线程调度算法抢占式调度协同式调度jvm的线程调度线程让出CPU的情况进程调度算法优先调度算法高优先权优先调度算法高响应比优先调度算法基于时间片的轮转调度算法多级反馈队列调度算法理解线程的上下文对于单核 CPU 来说(对于多核 CPU,此处就理解为一个核),CPU 在一个时刻只能运行一个线程,当在运行一个线程的过程中转去运行另外一个线程,这个叫做线程上下文切换(对于进程也是类似)。上下文切换实现过程挂起一个进程,将这个进程在cpu中的状
2020-12-23 12:02:06
954
原创 Cenos7安装docker环境以及docker常用命令
文章目录Docker 环境安装安装yum-utils为yum源添加docker仓库位置安装docker启动dockerDocker 镜像常用命令Docker 环境安装安装yum-utilsyum install -y yum-utils device-mapper-persistent-data lvm2为yum源添加docker仓库位置yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce
2020-12-23 10:31:44
160
原创 线程的生命周期与常用方法
文章目录线程的生命周期线程的常用方法其他线程方法什么是守护线程线程的生命周期一个线程不是被创建了马上就开始执行,也不是一直处于执行状态。在线程的整个生命周期中会经历新建(NEW),就绪(Runnable),阻塞(Blocked)和销魂(Thrminated)5种状态。就绪当线程对象调用start()方法之后,该线程处于就绪状态。JVM会为其创建方法调用栈和程序计数器,等待调度运行。运行如果处于就绪状态的线程获得了CPU,开始执行run()方法的线程执行体,则该线程处于运行状态。阻塞阻塞状
2020-12-22 21:40:12
306
原创 线程的创建与终止
文章目录线程的三种创建方式线程的终止方式总结线程的三种创建方式/*使用extends Thread方式*/class MyThread extends Thread { @Override public void run() { for (int i = 0;i<10;i++){ System.out.println(Thread.currentThread().getName()+"--"+i); } }}My
2020-12-22 20:23:27
366
原创 Java内存区域与内存溢出异常详解
文章目录运行时数据区域程序计数器(线程私有)Java虚拟机栈(线程私有)局部变量表操作数栈动态链接方法返回地址本地方法栈(线程私有)Java堆(全局共享)方法区(全局共享)运行时常量池直接内存HotSpot虚拟机对象创建对象创建的详细过程对象的内存布局对象的访问定位OutOfMemoryError异常Java堆溢出虚拟机栈和本地方法栈溢出方法区和运行时常量池溢出本机直接内存溢出运行时数据区域JVM包含两个子系统和两个组件,两个子系统为Class loader(类装载)、Execution engin
2020-12-22 15:11:07
218
原创 Cenos7安装完成后如何配置ip网关以及开启远程连接
文章目录1. 检查Linux虚拟机的网络连接模式,确保它是NAT模式。2. 在VMware workstation里,点击菜单栏上的【编辑】-->【虚拟网络编辑器】,打开下方的虚拟网络编辑器。3. 在下图中,点击NAT设置4. 设置虚拟机的IP、DNS和主机名5. 设置VMnet8在Windows上的IP属性6. 配置完上述步骤后就可以成功使用Xshell连接Linux虚拟机了7. vim和ifconfig命令找不到时,使用yum install net-tools/vim安装即可1. 检查Lin
2020-12-22 12:08:00
368
原创 Java OOM 分析和线程Dump分析
Java OOM 分析和线程Dump分析Java OOM 分析Java堆内存溢出MetaSpace(元数据)内存溢出Java线程Dump分析什么是Thread DumpThread Dump特点Thread Dump抓取Thread Dump信息Thread状态分析关键状态分析案例分析JVM重要线程Java OOM 分析Java堆内存溢出在Java堆中只要不断的创建对象,并且GC-Roots到对象之间存在引用链,这样JVM就不会回收对象。只要将-Xms(最小堆),-Xmx(最大堆)设置为一样禁止自动
2020-12-22 11:32:36
1171
原创 JVM调优参数
JVM调优参数JVM参数Java 虚拟机栈(线程私有的)本地方法栈(线程私有的)堆(线程共享的)方法区(线程共享的)运行时常量池直接内存JVM参数-Xms堆最小值-Xmx堆最大值。-Xms与Xmx的单位默认字节都是以k,m做单位的。-Xmn新生代大小-Xss每个线程池的堆栈大小。在JDK1.5以上的版本,每个线程堆栈大小为1m,jdk5以前的版本是每个线程池大小为256k。一般在相同物理内存下,如果减少-xss便会产生更大的线程数,但不同的操作系统对进程内线程数是有限制的,是不能无限生成
2020-12-21 22:53:42
106
PHP完整项目(附数据)下载即可使用
2019-04-26
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅