自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(18)
  • 收藏
  • 关注

原创 Java8中特殊写法

最近在做一个手机App里的设置中心,之前旧代码设置中心数据结构是多个List集合然后嵌套一层子集,现在要重新设计,商量后觉得嵌套的结构比较合适产品的PRD,有点类似于之前利用Mybatis实现评论嵌套功能,相比之下写法更加简单1、首先我们把所有的设置项都放在一张表进行存储,子设置项通过parent_id和父设置项进行关联,这样的结构允许设置项可以嵌套多层,如果以后产品需要加三级设置页,也是能够兼容滴!大概思路,通过SELECT All 拿到所有设置项,然后根据parentId进行分组List<S

2022-04-17 22:05:03 419

原创 Java语言中的函数式编程简介

所谓函数式编程,是指能够将方法当做参数传递给方法,前面“方法”是业务逻辑,后面“方法”是代理,将业务逻辑传递给代理,就实现了统一收口的目的。能够实现此功能的接口有四个,分别是:Consumer、Supplier、Predicate与Function,怎么使用可以网上查询。本方案使用的是Consumer,因为它是用来消费的,即需要传入一个参数,没有返回值,符合本方案的设计。@Servicepublic class CheckLandingCoverAreaService extends Abstract

2021-11-07 15:57:40 274

原创 使用Springboot收发邮件,如此简单!

准备工作目前大部分的邮件服务都不允许直接使用用户名/密码的方式在代码种发送邮件,都是先要申请授权码,这里以qq邮箱为例,向大家演示授权码的申请流程,首先我们需要登陆到QQ邮箱中进行设置在账户选项中开启POP3/SMTP服务项目创建接下来我们只需要创建springboot项目,由于springboot对邮件发送做了自动配置类,我们只需要加入相关的依赖就可以进行邮件的发送了。完成创建后,项目依赖如下<dependency> <groupId>org.spri

2021-06-27 18:56:43 3019

原创 Git基本使用

Git数据模型1. 什么是快照 (snapshot) 呢首先我们来学两个 Git 中的术语blob,就是单个的文件;tree,就是一个文件夹;快照则是被追踪的最顶层的树。比如我的“公众号”文件夹的这么一个结构那么一个快照就是追踪的“公众号”这颗树。2. 本地库的数据模型Git 记录了每个快照的 parent,也就是当前这个文件夹的上一个版本。那么快照的迭代更新的过程就可以表示为一个有向无环图每个快照其实都对应了一次 commit,我们用代码来表示一下:class co

2021-06-27 18:55:14 251

原创 Heap Sort 堆排序与 Top K 问题(Java集合实现)

  现代基础性计算环境中,输入量的元素规模N会非常大,但有时候会只要求从中找出K个最大(或最小)的元素,即Top K问题。如果使用之前介绍的传统排序算法,先对N个元素进行全排序然后再取前K个元素,计算代价会变的非常高昂。因为我们实际上只需要Top K元素的排序,而剩余元素的详细排序结果我们其实并不care。而本文介绍的Heap Sort堆排序不仅是一种高效的排序算法,还可以很好地解决Top K问题二叉堆定义 堆 Heap, 一种特殊的树状数据结构。在堆中,对于任意节点都有其值恒大于等于或小于等于

2021-06-27 18:54:35 215

原创 编程中list我们所踩过的坑

本文设计的知识点如下:一、arraylist不支持增加和删除?what?用ArrayList所遇到的坑:先看一段简单的代码String[] arrays = {"1","2","3"};List<String> list = Arrays.asList(arrays);list.add("other element");这段代码表面上看是没有什么问题的,编译也能通过,但在测试时候就会抛出UnsupportedOperationException刚开始很不解,Arrays#a

2021-06-27 18:54:10 233

原创 BFS概念介绍

广度优先遍历广度优先遍历,指的是从图的一个未遍历的节点出发,先遍历这个节点的相邻节点,再依次遍历每个相邻节点的相邻节点。上文所述树的广度优先遍历动图如下,每个节点的值即为它们的遍历顺序。所以广度优先遍历也叫层序遍历,先遍历第一层(节点 1),再遍历第二层(节点 2,3,4),第三层(5,6,7,8),第四层(9,10)。深度优先遍历用的是栈,而广度优先遍历要用队列来实现,我们以下图二叉树为例来看看如何用队列来实现广度优先遍历动图如下相信看了以上动图,不难写出如下代码/** * 使用队列实现

2021-06-27 18:53:00 326

原创 DFS概念介绍

深度优先遍历(Depth First Search, 简称 DFS) 与广度优先遍历(Breath First Search)是图论中两种非常重要的算法,生产上广泛用于拓扑排序,寻路(走迷宫),搜索引擎,爬虫等,也频繁出现在 leetcode,高频面试题中。本文将会从以下几个方面来讲述深度优先遍历,广度优先遍历,相信大家看了肯定会有收获。深度优先遍历,广度优先遍历简介习题演练DFS,BFS 在搜索引擎中的应用深度优先遍历简介1、深度优先遍历深度优先遍历主要思路是从图中一个未访问的顶点 V

2021-06-27 18:52:13 8680

原创 SpringBoot实现定时任务的两种方式

定时任务的两种实现方式@Scheduled使用@Scheduled非常容易,直接创建一个SpringBoot项目,并且添加web依赖spring-boot-starter-web,项目创建成功后,添加@EnableScheduling注解,开启定时任务:@SpringBootApplication@EnableSchedulingpublic class SpringbootQuartzScheduledApplication { public static void main(String[

2021-06-23 18:37:51 746

原创 JDK线程池如何对线程进行回收

一、runWorker(Worker w)任务在被提交到线程池之后,就会进入runWorker(Worker w)方法,这里面通过getTask()来获取任务,如果取不到任务,就会退出循环执行processWorkerExit(w,completedAbruptly),把这个工作线程移除掉。取出任务主要在于getTask()方法,线程如果要回收就要看getTask()在什么时候会返回null二、getTask()返回null的情况第一种情况,线程池的状态已经是STOP,TIDYING, TERMIN

2021-06-23 18:36:30 311

原创 Springboot和Mybatis实现评论嵌套功能(一张表搞定哦)

一、首先我们需要设计comment表的字段每个字段都包括了注释,这里就不再详细赘述。二、对应的实体类属性public class Comment implements Serializable { private Long id; private String picture; private String nickname; private String email; private String content; private Date cre

2021-06-23 18:35:44 1462 1

转载 字典树的实现

字典树一般使用在前缀名搜索中,例如我要搜索自己微信朋友中的某个好友,只需要输入它的前几个字,系统就会给我返回一个包含这些字符的姓名集合。大致效果如下所示:再没有任何限制的条件下我们最简单的实现是把这些所有的字符串存放在一个容器中(List,Set)查询时挨个遍历,利用String.startWith(“prefix”)来进行搜索但这样有几个问题第一、首先存储资源比较浪费第二、查询效率比较低,需要遍历集合后再遍历字符串的char数组假设我需要存放 java,javascript,jsp,php 这

2021-06-23 18:35:10 225

原创 Kafka producer的几个重要配置参数

acksacks参数指定了必须要有多少个分区副本收到消息,生产者才认为该消息是写入成功的,这个参数对于消息是否丢失起着重要作用,该参数的配置具体如下:acks=0,表示生产者在成功写入消息之前不会等待任何来自服务器的响应. 换句话说,一旦出现了问题导致服务器没有收到消息,那么生产者就无从得知,消息也就丢失了. 改配置由于不需要等到服务器的响应,所以可以以网络支持的最大速度发送消息,从而达到很高的吞吐量。acks=1,表示只要集群的leader分区副本接收到了消息,就会向生产者发送一个成功响应

2021-06-23 18:28:39 920

原创 Innodb中的事务隔离级别和锁的关系

数据库中的两段锁数据库遵循的是两段锁协议,将事务分成两个阶段,加锁阶段和解锁阶段(所以叫两段锁)加锁阶段:在该阶段可以进行加锁操作。在对任何数据进行读操作之前要申请并获得S锁(共享锁,其它事务可以继续加共享锁,但不能加排它锁),在进行写操作之前要申请并获得X锁(排它锁,其它事务不能再获得任何锁)。加锁不成功,则事务进入等待状态,直到加锁成功才继续执行。解锁阶段:当事务释放了一个封锁以后,事务进入解锁阶段,在该阶段只能进行解锁操作不能再进行加锁操作。事务的四种隔离级别隔离级别脏读不可

2021-06-23 18:27:57 100

原创 SpringBoot启动时, 让方法自动执行的 5种 方法!

SpringBoot实现提前加载的几种方式1.实现SerlvetContextAware接口并重写其setServletContext方法@Component public class TestStarted implements ServletContextAware { /** * 在填充普通bean属性之后但在初始化之前调用 * 类似于 initializingbean的afterpropertiesset或自定义init方法的回调

2021-06-23 18:27:19 6551

原创 设计模式——策略模式

那么什么是策略模式呢?比如一个人要从广州去北京,这个人可以选择乘坐飞机去,也可以选择乘坐火车去。两种交通方式的选择,可以认为是两种策略。映射到程序中,可以认为是两种算法,比如支付的时候,选择支付宝支付或者微信支付。策略模式的特点是不管过程怎么样,结果都是一样的。不管乘坐飞机还是火车,最后都会到达北京;不管哪种支付方式,最终都会支付成功。过程不一样,结果都一样。一、支付案例@PostMapping("/makeOrder")public ResultData makeOrder(@RequestBod

2021-06-23 18:26:47 67

原创 java反射的基本内容

首先说一下获取类名称的几种方式package org.java;/** * @author yangkun * @date 2021-04-07 */public class Reflect { public static void main(String[] args) { Class<? extends Object> c1 = Reflect.class; System.out.println(c1.getName());

2021-06-23 18:25:52 62

原创 java反射的应用

传统日志有关反射的一些基本知识就不说了,可以自行Google,也可以看下上一篇文章反射基础。日志相信大家都不陌生,在实际开发中一些比较敏感的数据表我们需要对它的每一次操作都记录下来。先来看看传统的写法:@Testpublic void insertSelective() throws Exception { Content content = new Content() ; content.setContent("asdsf"); content.setCreateDat

2021-06-23 18:25:07 93

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除