- 博客(68)
- 收藏
- 关注
原创 一篇文章带你认识go channel
channel 是连接并发 goroutine 的管道。可以将值从一个 goroutine 发送到 channel,并将这些值接收到另一个 goroutine 。
2022-06-09 16:07:14
344
原创 快速排序(Quick sort)
package com.ww.algorithm.sort.exchange;import org.junit.Test;import java.util.Arrays;import java.util.HashMap;import java.util.Map;import java.util.Stack;/** * 快速排序:快速排序是从冒泡排序演变而来的算法,但是比冒泡排序要高效的多,所以叫快速排序。快速排序之所以快速,是因为它用了分治法。同冒泡排序一样, * 快速排序也属于交换排
2021-07-21 15:57:45
202
原创 鸡尾酒排序(Cocktail sort)
package com.ww.algorithm.sort.exchange;import org.junit.Test;import java.util.Arrays;/** * 鸡尾酒排序:冒泡排序的每一个元素都可以像小气泡一样,根据自身大小,一点一点地向着数组的一侧移动。算法的每一轮都是从左至右来比较元素,进行 * 单向的位置交换。那么鸡尾酒排序做了怎样的优化呢?鸡尾酒排序的元素和交换过程是双向的。 * 下面举一个例子:有数组[2, 3, 4, 5, 6, 7, 8, 1],希望对其
2021-07-20 16:18:49
500
原创 冒泡排序(Bubble sort)
package com.ww.algorithm.sort.exchange;import org.junit.Test;import java.util.Arrays;/** * 冒泡排序(Bubble sort) * <p> * 冒泡排序基本思想:对待排序序列从前向后,依次比较相邻元素的值,发现逆序则进行交换,使值较大的元素逐渐从前移向后部,就象水底下的气泡一样逐渐向上冒。 * * @author: Sun * @create: 2021-07-06 16:06 *
2021-07-20 15:19:01
178
原创 实现稀疏数组
package com.ww.dataStructure.array;import org.junit.Test;import java.io.*;/** * 稀疏数组:稀疏数组可以看做是压缩版的普通数组,这里说的普通数组是指无效数据量远大于有效数据量的数组。 * <p> * 为什么要对普通数组进行压缩存储呢? * - 原数组中存在大量的无效数据,占据了大量的存储空间,真正有用的数据却少之又少。 * - 压缩存储可以节省存储空间以避免资源不必要的浪费,在数据序列化到磁盘时,
2021-07-19 16:11:10
107
原创 实现一个支持动态扩容的数组
package com.ww.dataStructure.array;/** * 实现一个支持动态扩容的数组 * * @author: Sun * @create: 2021-04-23 15:23 * @version: v1.0 */public class DynamicArray { // 源数组 private int[] data; // 数组中的元素个数 private int count; /** * 查找指定索引对应的
2021-07-19 16:06:26
193
原创 实现大小固定的有序数组并支持增删改查操作
package com.ww.dataStructure.array;/** * 实现一个大小固定的有序数组,支持动态增删改操作 * * @author: Sun * @create: 2021-04-23 15:23 * @version: v1.0 */public class StaticArray { // 源数组 private int[] data; // 数组中的元素个数 private int count; /** *
2021-07-19 15:48:55
322
原创 org.apache.commons.net.ftp.FTPClient上传中文文件乱码问题
前一段时间做了一个文件上传到FTP服务器的功能(使用org.apache.commons.net.ftp.FTPClient进行上传文件到FTP服务器),做的过程当中也遇到了和大家很多人都遇到过的问题:上传中文文件乱码问题,当时一通百度然后挨个挨个的试,最后使用了下面这两行代码解决了中文乱码问题,但是知其然并不知其所以然。最近正好不忙,所以了解了一下为什么使用这两行代码后上传中文文件就不乱码了。ftpClient.sendCommand("OPTS UTF8", "ON");ftpClient.sto
2020-09-11 12:24:43
1592
1
原创 第二章 微服务构建:SpringBoot
框架简介在这里介绍SpringBoot的目的除了它是SpringCloud的基础之外,也由于其自身的各项优点,如自动化配置、快速开发、轻松部署等,非常适合作为微服务架构中各项具体微服务的开发框架。所以我们强烈推荐使用SpringBoot来构建微服务,它不仅可以帮助我们快速地构建微服务,还可以轻松简单地整合SpringCloud实现系统服务化,而如果使用了传统的Spring构建方式的话,在整合过程中我们还需要做更多的依赖管理工作才能让它们完好地运行起来。SpringBoot的宗旨并非要重写Spring或是
2020-06-23 10:13:02
409
原创 第一章 基础知识
什么是微服务架构?微服务是系统架构上的一种设计风格,它的主旨是将一个原本独立的系统拆分成多个小型服务,这些小型服务都在各自独立的进程中运行,服务之间通过基于HTTP的RESTful API进行通信协作。被拆分成的每一个小型服务都围绕着系统中的某一项或一些耦合度较高的业务功能进行构建,并且每个服务都维护着自身的数据存储、业务开发、自动化测试案例以及独立部署机制。由于有了轻量级的通信协作基础,所以这些微服务可以使用不同的语言来编写。单体架构:在业务发展初期,由于所有的业务逻辑在一个应用中,开发、测试、部署都
2020-06-22 18:01:26
183
原创 第9章 Java并发包中ScheduledThreadPoolExecutor原理探究
9.1 介绍ThreadPoolExecutor只是Executors工具类的一部分功能。下面来介绍另外一部分功能,也就是ScheduledThreadPoolExecutor的实现,这是一个可以在指定一定延迟时间后或者定时进行任务调度执行的线程池。9.2 类图介绍Executors其实是个工具类,它提供了好多静态方法,可根据用户的选择返回不同的线程池实例。ScheduledThreadPoolExecutor继承了ThreadPoolExecutor并实现了ScheduledExecutorServ
2020-06-17 17:11:42
208
原创 第8章 Java并发包中线程池ThreadPoolExecutor原理探究
8.1 介绍线程池主要解决两个问题:一是当执行大量异步任务时线程池能够提供较好的性能。在不使用线程池时,每当需要执行异步任务时直接new一个线程来运行,而线程的创建和销毁是需要开销的。线程池里面的线程是可复用的,不需要每次执行异步任务时都重新创建和销毁线程。二是线程池提供了一种资源限制和管理的手段,比如可以限制线程的个数,动态新增线程等。每个ThreadPoolExecutor也保留了一些基本的统计数据,比如当前线程池完成的任务数目等。另外,线程池也提供了许多可调参数和可扩展性接口,以满足不同情
2020-06-16 11:12:05
215
原创 微信支付-SDK问题
微信官方并没有把SDK挂到Maven Repository中,只在官方提供了SDK的下载地址。大家在集成SDK的时候尽量选择集成官方的SDK,免得节外生枝。
2020-06-11 21:28:03
240
原创 第7章 Java并发包中并发队列原理剖析
JDK中提供了一系列场景的并发安全队列。总的来说,按照实现方式的不同可分为阻塞队列和非阻塞队列,前者使用锁实现,而后者则使用CAS非阻塞算法实现。Java并发包中的并发队列:ConcurrentLinkedQueue是线程安全的无界非阻塞队列独占锁实现的有界阻塞队列LinkedBlockingQueue有界数组方式实现的阻塞队列ArrayBlockingQueuePriorityBlockingQueue是带优先级的无界阻塞队列DelayQueue并发队列是一个无界阻塞延迟队列7.1 Co
2020-06-01 15:28:15
283
原创 第6章 Java并发包中锁原理剖析
6.1 LockSupport工具类JDK中的rt.jar包里面的LockSupport是个工具类,它的主要作用是挂起和唤醒线程,该工具类是创建锁和其他同步类的基础。LockSupport类与每个使用它的线程都会关联一个许可证,在默认情况下调用LockSupport类的方法的线程是不持有许可证的。LockSupport是使用Unsafe类实现的。下面介绍LockSupport中的几个主要函数:/** * 如果调用park方法的线程已经拿到了与LockSupport关联的许可证,则调用LockSuppo
2020-05-21 17:58:17
172
原创 第5章 Java并发包中并发List源码剖析
5.1 5.2 主要方法源码解析 略5.3 总结CopyOnWriteArrayList使用写时复制的策略来保证list的一致性,而获取—修改—写入三步操作并不是原子性的,所以在增删改的过程中都使用了独占锁,来保证在某个时间只有一个线程能对list数组进行修改。另外CopyOnWriteArrayList提供了弱一致性的迭代器,从而保证在获取迭代器后,其他线程对list的修改是不可见的,迭代器遍历的数组是一个快照。...
2020-05-21 17:56:42
159
原创 第4章 Java并发包中原子操作类原理剖析
4.1 原子变量操作类JUC并发包中包含有AtomicInteger、AtomicLong和AtomicBoolean等原子性操作类,它们的原理类似。AtomicLong是原子性递增或者递减类,其内部使用Unsafe来实现。在没有原子类的情况下,实现计数器需要使用一定的同步措施,比如使用synchronized关键字等,但是这些都是阻塞算法,对性能有一定损耗,原子操作类都使用CAS非阻塞算法,性能更好。但是在高并发情况下AtomicLong还会存在性能问题。JDK 8提供了一个在高并发下性能更好的Lon
2020-05-19 15:56:16
218
原创 简单聊聊CI&CD
CI/CD是啥?CI(Continuous integration,中文意思是持续集成)。CI是一种软件开发实践。持续集成强调开发人员提交了新代码之后,立刻进行构建、(单元)测试。根据测试结果,我们可以确定新代码和原有代码能否正确地集成在一起。借用网络图片对CI加以理解。CD(Continuous Delivery, 中文意思持续交付)。CD是在CI的基础上,将集成后的代码部署到更贴近真实运行环境(类生产环境)中。比如,我们完成单元测试后,可以把代码部署到连接数据库的Staging环境中更多的测试。
2020-05-13 15:41:59
390
原创 第3章 Java并发包中ThreadLocalRandom类原理剖析
3.1 Random类及其局限性随机数的生成需要一个默认的种子,这个种子其实是一个long类型的数字,可以在创建Random对象时通过构造函数指定,如果不指定则在默认构造函数内部生成一个默认的值。新的随机数的生成需要两个步骤:首先根据老的种子生成新的种子。然后根据新的种子来计算新的随机数。每个Random实例里面都有一个原子性的种子变量用来记录当前的种子值,当要生成新的随机数时需要根据当前种子计算新的种子并更新回原子变量。在多线程下使用单个Random实例生成随机数时,当多个线程同时计算随机数来
2020-05-12 17:32:30
401
原创 第2章 并发编程的其他基础知识
2.1 什么是多线程并发编程并发:是指同一个时间段内多个任务同时都在执行,并且都没有执行结束。并发任务强调在一个时间段内同时执行,而一个时间段由多个单位时间累积而成,所以说并发的多个任务在单位时间内不一定同时在执行。在单CPU的时代多个任务都是并发执行的,这是因为单个CPU同时只能执行一个任务。在单CPU时代多任务是共享一个CPU的,当一个任务占用CPU运行时,其他任务就会被挂起,当占用CPU的任务时间片用完后,会把CPU让给其他任务来使用,所以在单CPU时代多线程编程是没有太大意义的,并且线程间频繁的上
2020-05-09 16:15:57
284
原创 第1章 并发编程线程基础
1.1 什么是线程进程是代码在数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,线程则是进程的一个执行路径,一个进程中至少有一个线程,进程中的多个线程共享进程的资源。操作系统在分配资源时是把资源分配给进程的,但是CPU资源比较特殊,它是被分配到线程的,因为真正要占用CPU运行的是线程,所以也说线程是CPU分配的基本单位。在Java中,当我们启动main函数时其实就启动了一个JVM的进程,而main函数所在的线程就是这个进程中的一个线程,也称主线程。进程和线程的关系如图一个进程中有多个
2020-05-08 17:38:14
206
原创 JWT简介
什么是JWT?Json web token (JWT),是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519)。该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景。JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也可以增加一些额外的其它业务逻辑所必须的声明信息,该token也可直接被...
2020-04-02 18:30:23
175
原创 泛型通配符?
在看Java核心技术卷I中泛型通配符相关的知识时产生了很多疑问,通过了解后简单的做下笔记方便回顾。本文重点记录了一下这几个问题:为什么要用泛型通配符?? extends T为什么只能调用使用了泛型取出对象的成员方法,不能调用使用泛型设置对象的成员方法?? super T为什么可以调用使用泛型设置对象的成员方法,调用使用了泛型取出对象的成员方法会返回Object对象?使用了泛型的成员方...
2020-03-05 11:26:24
126
原创 再次抛出异常与异常链
摘自Java核心技术卷I 第10版 274页 7.2.3再次抛出异常与异常链在catch子句中可以抛出一个异常,这样做的目的是改变异常的类型。如果开发了一个供其他程序员使用的子系统,那么,用于表示子系统故障的异常类型可能会产生多种解释。ServletException就是这样一个异常类型的例子。执行servlet的代码可能不想知道发生错误的细节原因,但希望明确地知道servlet是否有问题。...
2020-02-28 15:07:30
456
2
原创 Java中的几种内部类
在看Java核心技术卷I 6.4小节内部类时有些混乱,故整理些笔记方便查看。什么是内部类?将一个类的定义放在另一个类的定义内部,这就是内部类。为什么要使用内部类?1、内部类方法可以访问该类定义所在的作用域中的数据,包括私有的数据,所以与常规类比较起来功能更加强大。2、内部类可以对同一个包中的其他类隐藏起来。3、当想要定义一个回调函数且不想编写大量代码时,使用匿名(anonymous...
2020-02-27 12:53:03
408
原创 Java中方法调用的完整处理过程(编译到运行)
摘自Java核心技术卷I 第10版 155页 5.1.6理解方法调用弄清楚如何在对象上应用方法调用非常重要。下面假设要调用x.f(args),隐式参数x声明为类C的一个对象。下面是调用过程的详细描述:1)编译器査看对象的声明类型和方法名。假设调用x.f(param),且隐式参数x声明为C类的对象。需要注意的是:有可能存在多个名字为f,但参数类型不一样的方法。例如,可能存在方法f(int)和...
2020-02-13 14:25:07
554
原创 this和super关键字并不是一类概念
摘自Java核心技术卷I 第10版 150页注释有些人认为super与this引用是类似的概念,实际上,这样比较并不太恰当。这是因为super不是一个对象的引用,不能将super赋给另一个对象变量,它只是一个指示编译器调用超类方法的特殊关键字。package com.ww;/** * @author: Sun * @create: 2020-02-13 12:42 * @vers...
2020-02-13 12:49:53
141
原创 隐式参数和显式参数
摘自Java核心技术卷I 第10版 108页方法用于操作对象以及存取它们的实例域。例如方法:public void raiseSalary(double byPercent) { double raise = salary * byPercent / 100; salary += raise; }将调用这个方法的对象的 salary 实例域设置为新值。 看看下面这个调用:num...
2020-02-13 11:19:51
2121
原创 Java值传递
摘自Java核心技术卷I 第10版 118~120页首先回顾一下在程序设计语言中有关将参数传递给方法(或函数)的一些专业术语。按值调用(call by value)表示方法接收的是调用者提供的值。而按引用调用(call by reference)表示方法接收的是调用者提供的变量地址。一个方法可以修改传递引用所对应的变量值,而不能修改传递值调用所对应的变量值。“按…调用”(callby)是一个...
2020-02-13 10:52:08
160
原创 类设计技巧
摘自 Java核心技术卷I 第10版 144~146页应用这些技巧可以使得设计出来的类更具有 OOP 的专业水准。1. 一定要保证数据私有这是最重要的; 绝对不要破坏封装性。有时候,需要编写一个访问器方法或更改器方法,但是最好还是保持实例域的私有性。很多惨痛的经验告诉我们,数据的表示形式很可能会改变,但它们的使用方式却不会经常发生变化。当数据保持私有时,它们的表示形式的变化不会对类的使用...
2020-02-13 10:25:42
269
原创 org.springframework.web.multipart.MultipartException: Failed to parse multipart servlet request;
对,没错,就是今天。已经很久没有写代码的我突然被告知自己维护的服务出BUG了。第一眼看到下面的错误时一脸懵逼,这是什么乱七八糟的玩意?2019-12-25 15:04:56.607 ERROR 15105 --- [http-nio-8765-exec-8] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for se...
2019-12-25 16:35:59
2062
原创 Git-本地仓库关联远程仓库
本篇博客介绍如果将本地仓库正确与远程仓库进行关联。第一步:Github中创建一个新的仓库第二步:本地创建一个项目(本地已存在项目则跳过此步骤)第三步:进入到本地项目的根文件夹下输入如下命令:git init # 初始化本地仓库git remote add origin https://github.com/LittleSheepW/study-log.git # 本地仓库...
2019-10-30 10:58:05
209
原创 Jenkins集成Github webhook
Jenkins集成Github webhook配置前要求:1.Jenkins已经安装Github插件2.Jenkins服务器已经拥有一个公网IP地址第一步:Jenkins–>Manage Jenkins–>Configure System–>GitHub–>覆盖Hook URLps: HookUrl除了域名可以改变其他的都不要改变。我当时配置的为http...
2019-10-24 11:07:34
974
原创 Java ObjectMapper get() path()方法的区别
在项目中有一个需求需要读取Json数据中固定key的值,这里使用到了ObjectMapper。但是在使用过程中发现get()、path()方法都可以读取Json数据,但是实际上两者是有些区别的。话不多说,上码public static void main(String[] args) { String result = "{\"code\":0,\"message\":...
2019-10-21 11:31:18
3012
原创 IDEA 不插电情况下点击Debug会卡住十几秒钟
近些天在家里不插电使用Mac 点击Debug的时候会卡主十几秒钟,插上电就没问题。经过百度找到如下答案进行解决。如下是电脑配置:解决方案:# 终端中查看自己的hostname$ hostname# 修改hosts文件sudo vim /private/etc/hosts# 将127.0.0.1 localhost修改为 127.0.0.1 localho...
2019-10-18 10:31:04
255
原创 Java微信支付-退款成功异步回调验签
接上一篇Java微信支付-申请退款API,本篇在上篇文章的基础上讲述调用申请退款API后退款成功之后微信异步回调通知下文中所需配置、类都在以请查看以上链接内容。在调用微信支付-统一下单API时,会传递notify_url这个参数给微信,这个参数是用户成功支付之后微信端会向此地址进行通知,我们应该在接受到微信发来的通知时进行验签确保安全性。注意:notify_url必须为外网可访问的ur...
2019-10-14 10:39:16
3252
原创 Java微信支付-申请退款API
接上一篇Java微信支付-统一下单API,本篇在上篇文章的基础上讲述微信支付-申请退款API下文中所需配置、类都在以请查看以上链接内容。话不多说,直接上码package com.kkcode.kkclass.wechat.pay.service;import com.kkcode.kkclass.wechat.pay.exception.WxPayException;impo...
2019-10-14 10:22:22
769
原创 Java微信支付-支付成功异步回调验签
接上一篇Java微信支付-统一下单API,本篇在上篇文章的基础上讲述统一下单支付成功之后微信异步回调通知在调用微信支付-统一下单API时,会传递notify_url这个参数给微信,这个参数是用户成功支付之后微信端会向此地址进行通知,我们应该在接受到微信发来的通知时进行验签确保安全性。注意:notify_url必须为外网可访问的url,不能携带参数。测试时可以使用内网穿透进行测试,这个东西...
2019-10-12 14:07:16
3918
原创 Java微信支付-统一下单API
**我们项目中的支付交互流程:**用户点击购买时后台首先创建订单,然后调用微信支付统一下单API返回给前台相应的参数,如果为NATIVE支付方式,前台将参数中的支付连接生成二维码展示给用户,如果为JSAPI支付方式,前台(微信客户端)调用JSAPI支付拉起柜台进行支付。在接入微信支付之前阅读对应的官方文档(开发步骤、业务流程、API列表)非常有必要。不过微信文档写的写很坑,坑在哪?在API...
2019-10-11 17:15:19
1067
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人