红黑树详解
红黑树详解
一、介绍
作为一颗红黑树,它是一颗特殊的AVL树,也就是一颗特殊的平衡二叉树。
对于平衡二叉树而言,它的定义是,对于任何二叉树的任何一个节点,它的左子树和右子树的高度差不能大于1。
而为什么红黑树比较特殊,它除了满足平衡二叉树的特点之外,还有以下的几个特征
每一个节点都有一个状态,红色或者黑色
根节点是黑色
红黑树的叶子节点默认都是空引用的对象,默认都是黑色
==红色==节点的两个子节点都是黑色,也就是说**红色**节点不能相连
从任意节点,到叶子节点,其经过的路径上,黑色节点的个数都是一致的
AVL树是通过自旋转来完成的平衡
但是红黑树却不全是这样,它虽然有自旋,但主要是节点特性,加上任意节点到叶子节点经过的黑色节点数量来保证了树的子平衡。
出发点不同,则实现的方式完全不同
二、示例
首先,我们针对以上五个特性,先画一个红黑树
再次讲解一下特性
不是黑就是红,没什么好说的
根节点是黑的,也没什么好说的
叶子节点都是null节点,这我认为是模拟出来的节点,仅作为第5点平衡计算使用
红色节点的子节点一定是黑的,也就是说不能出现红红相 ...
Neo4j入门
Neo4j入门
一、介绍
Neo4j是一个开源的图形数据库管理系统,它基于Java语言开发。与传统的关系型数据库不同,Neo4j使用图形结构来存储和查询数据,这使得它在处理复杂关系时更加高效和灵活。
Neo4j的核心特性包括:
1. 图形结构:Neo4j的数据模型是基于图的,每个节点表示一个实体,每个边表示两个实体之间的关系。这种结构使得Neo4j非常适合处理复杂的关系问题,例如社交网络、推荐系统等。
2. 快速查询:由于Neo4j采用基于路径的查询方式,因此它的查询速度非常快。相比之下,传统的关系型数据库需要遍历整个表才能找到所需的数据,这会导致性能问题。
3. 灵活性:Neo4j支持动态模式,这意味着它可以轻松地适应不断变化的数据模式。此外,Neo4j还支持ACID事务,确保数据的一致性和可靠性。
4. 可扩展性:Neo4j可以通过添加更多的节点和边来扩展其数据模型,这使得它非常适合处理大规模数据集。此外,Neo4j还支持集群部署,以提高可扩展性和容错能力。
总之,Neo4j是一个功能强大、灵活、高效的图形数据库管理系统,适用于处理各种复杂的关系问题。
Neo4j的优点和缺 ...
Docker入门学习
Docker入门学习
一、介绍
Docker是一个开源的容器化平台,可以将应用程序及其依赖以容器的形式封装,使其可以在任何环境中运行。Docker可以改善开发流程、提高应用程序的可移植性、简化系统配置、更易于维护等等。
Docker的优点包括:
快速构建、部署和迭代
与多种编程语言和框架兼容
节省资源和成本
增强安全性
Docker的官网为 https://www.docker.com/
二、基础
1)安装
我是在centos7上安装的docker,提供一个安装思路,可以安装下面的步骤进行安装
123456789101112131415161718192021# 在终端中输入以下命令以确保yum软件包管理器是最新的:sudo yum update# 安装必要的依赖项:sudo yum install -y yum-utils device-mapper-persistent-data lvm2# 添加Docker存储库:sudo yum-config-manager --add-repo https://download.docker.com/linux/cento ...
分享一下我是怎么使用枚举的
分享一下我是怎么使用枚举的
一、介绍
对于java枚举不陌生了,直接上代码
二、代码
使用了一个接口,用来规定一下里面的字段,统一下好处理
123456789package com.banmoon.test.enums;public interface MyEnum<T> { T getCode(); String getMsg();}
12345678910111213141516171819202122232425262728293031323334package com.banmoon.test.enums;import lombok.AllArgsConstructor;import lombok.Getter;import java.util.Arrays;@Getter@AllArgsConstructorpublic enum EnableStatusEnum implements MyEnum<Integer>{ ZERO(0, "禁用"), ONE(1, "正常 ...
SpringSecurity入门
Spring Security入门
一、介绍
Spring Security是一套权限框架,此框架可以帮助我们为项目建立丰富的角色与权限管理。
他的前身是Acegi Security,在以前SpringBoot还未出现的时候,它以繁琐臃肿的配置被人嫌弃。
当 Acegi Security 投入 Spring 怀抱之后,先把这个名字改了,这就是大家所见到的Spring Security了,然后配置也得到了极大的简化。对比同样为权限框架的shiro,相对繁琐的配置依旧让许多开发者望而却步。
直到Springboot出现后,Spring Security重新回到了大众的视野,尤其是SpringCloud出现后,Spring Security的存在感又再次提高。
核心功能:认证和授权
认证:authentication
介绍:简单说就是你是谁,比如说你是哪个用户,在系统中使用用做登录
授权:authorization
介绍:简单说就是能干什么,比如说我是管理员,我能删除别人的评论
二、入门使用
创建SpringBoot项目,这里使用的版本为2.4.5,引入相关依赖
1234 ...
什么是闭包,Java中有闭包吗?
什么是闭包,Java中有闭包吗?
一、介绍
闭包是什么?我学习Java以来,虽然听过这个名词,但我今天才第一次了解它。
所谓闭包,就是在函数中有另一个函数,这个内部函数可以作为参数,外部通过传递的方式,将函数传递进来。从而内部函数可以访问到外部函数的局部变脸。
二、演示
我们使用groovy来演示闭包的使用,它是一门由java优化而来的语言,底层正是class,可以运行再JVM虚拟机上。
1234567891011121314def sth(Closure closure) { def x = 5 def y = 5 println(closure.call(x, y))}// 加sth({x, y -> x + y})// 减sth({x, y -> x - y})// 乘sth({x, y -> x * y})// 除sth({x, y -> x / y})
运行结果如下
在Java中,我们可以使用匿名内部类来完成类似的功能,而在Java8 ...
vue2路由
vue2路由
一、介绍
本文是以前学习 vue2时整理的,对于目前的 vue3有些过时。
专注后端,前端只作为使用学习。
二、路由
作用:用于维护URL跳转和页面之间的关系
使用步骤:
引入vue-router.js文件(必须先引入vue.js)
配置路由规则,url和对应的页面的配置const routes = [{ path: "/", compontent: "组件" }]
创建路由实例对象const router = new VueRouter({routes})
routes:路由规则
path:访问的url
component:指定的组件
name:路由规则名
props:是否解耦路由参数
redirect:路由重定向
12# 当访问/home时,会自动跳转至/index[{ path: "/home" redirect: "/index" }]
linkActiveClass:指定当 ...
vue2基础
vue2基础
一、介绍
本文是以前学习 vue2时整理的,对于目前的 vue3有些过时。
专注后端,前端只作为使用学习。
二、 基础
1)数据绑定
123456789101112131415161718192021222324252627<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>VUE数据绑定</title> <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script></head><body> <div id=&q ...
优雅!Spring的重试小工具
优雅!Spring的重试小工具
一、介绍
在日常项目的开发中,避免不了调用第三方服务的情况。
如果是第三方有提供SDK包那还好说,就怕没有,第三方接口还不稳定的情况最恼火了。
这个时候,我们一般都会加上重试机制,手动捕获异常发起重试,不优雅
试试这个spring中的工具spring-retry如何
官网
github地址
二、使用
导入maven依赖,使用的是SpringBoot框架,版本号已经有管理了,直接引入即可。
记得把AOP也引用一下
12345678<dependency> <groupId>org.springframework.retry</groupId> <artifactId>spring-retry</artifactId></dependency><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starte ...
SpringBoot实现统一响应提示国际化
SpringBoot实现统一响应提示国际化
一、介绍
统一响应大家都见识过,只需要添加上@RestControllerAdvice后进行处理即可
简单示例如下
1234567891011121314151617package com.banmoon.test.core.handler;import com.banmoon.test.obj.dto.ResultData;import lombok.extern.slf4j.Slf4j;import org.springframework.web.bind.annotation.ExceptionHandler;import org.springframework.web.bind.annotation.RestControllerAdvice;@Slf4j@RestControllerAdvicepublic class ControllerHandler { @ExceptionHandler(Exception.class) public ResultData exceptionHandler(Exce ...