自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 mac系统:记录一次启动vue报错node_sass,node_gyp

vue启动报错

2022-06-03 09:15:07 787

原创 自定义 RPC框架4——RMI+Zookeeper实现RPC框架

准备工作这次我们用RMI+Zookeeper实现一个远程调用的RPC框架,RMI实现远程调用,Zookeeper作为注册中心,具体的操作之前的文章都提到过,这里不再做过多赘述。自定义 RPC框架2——RMI实现RPChttps://blog.csdn.net/qq_45587153/article/details/124211478?spm=1001.2014.3001.5502自定义 RPC框架3——JAVA实现Zookeeper节点增删改查https://blog.csdn.net/qq_45

2022-04-17 11:02:30 1832

原创 自定义 RPC框架3——JAVA实现Zookeeper节点增删改查

Zookeeper安装zookeeper的安装在之前的文章中已经写过:https://blog.csdn.net/qq_45587153/article/details/123630361?spm=1001.2014.3001.5502导入POM依赖<dependency> <groupId>org.apache.zookeeper</groupId> <artifactId>zookeeper</artifactId>

2022-04-17 10:09:16 317

原创 自定义 RPC框架2——RMI实现RPC

RMI简介**RMI(Remote Method Invocation)**远程方法调用RMI是从JDK1.2推出的功能,它可以实现在一个JAVA应用中可以像调用本地方法一样调用另一个服务中Java应用(JVM)中的内容。RMI是Java语言的远程调用,无法实现跨语言执行流程**Registry(注册表)**是放置所有服务器对象的命名空间。每次服务端创建一个对象时,他都会使用bind()或者rebind()方法注册该对象。这些是使用称为绑定名称的唯一名称注册的。要调用远程对象,客户端需要该对象

2022-04-16 12:16:35 559

原创 自定义 RPC框架1——HttpClient实现RPC

HttPClient简介在JDK中java.net包下提供了用户HTTP访问的基本功能,但是它缺少灵活性或许多应用所需要的功能。HttpClient起初是Apache Jakarta Common 的子项目。用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本。2007年成为顶级项目。通俗解释:HttpClient可以实现使用Java代码完成标准HTTP请求及响应。代码实现整体代码架构server端是服务端提供远程调用方法clien

2022-04-16 09:56:08 363

原创 centos7安装zookeeper并启动

下载tar包可以在windows上下载后上传到服务器,也可以直接通过wget 链接直接在服务器上下载,我们一般放在根目录下的opt文件夹中使用wget命令的话,需要提前安装wget命令[root@VM_0_16_centos opt]# yum -y install wget//安装完成以后[root@VM_0_16_centos /]# cd opt[root@VM_0_16_centos opt]# wget http://archive.apache.org/dist/zookeeper

2022-03-21 11:06:04 3697

原创 Comparator和Comparable自定义排序规则Java

Comparator和Comparable自定义排序规则JavaTeacher类public class Teacher implements Comparable<Teacher>{ int age; String name; public Teacher(int age,String name){ this.age = age; this.name = name; } @Override public S

2022-03-10 22:46:19 491 1

原创 八大排序——基数排序

基数排序基本思想:推荐去看一个B站不到一分钟的视频,直接秒懂https://www.bilibili.com/video/BV1A54y1D7Kd?from=search&seid=9307508910653867725&spm_id_from=333.337.0.0第一步以LSD为例,假设原来有一串数值如下所示:73, 22, 93, 43, 55, 14, 28, 65, 39, 81首先根据个位数的数值,在走访数值时将它们分配至编号0到9的桶子中:01 812 22

2021-10-03 20:43:31 136

原创 八大排序——堆排序

堆排序二叉堆:二叉堆是完全二叉树或近似完全二叉树。二叉堆满足两个特性:(1)父结点的键值总是大于或者等于(小于或者等于)任何一个子节点的键值;(2)每个结点的左子树和右子树都是一个二叉堆;当父结点的键值总是大于或者等于任何一个子节点的键值时为大根堆。当父结点的键值总是小于或等于任何一个子节点的键值时为小根堆;基本思想:堆的存储:一般都用数组来表示堆,i结点的父结点下标就为(i-1)/2.它的左右子节点的下标分别为2i+1和2i+2.堆的插入:每次插入都是将新数据放在数组最后。可以发现从这

2021-10-03 20:27:02 228

原创 八大排序——希尔排序

希尔排序基本思想:先将整个待排序元素序列分割成若干子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序(因为直接插入排序在元素基本有序的情况下,效率很高);算法分析:稳定性:由于多次插入排序,我们知道一次插入排序是稳定的,不会改变相同元素的相对顺序,但在不同的插入排序过程中,相同的元素可能在各自的插入排序中移动,最后其稳定性就会被打乱,所以shell排序是不稳定的。使用场景:比较在

2021-10-03 20:11:45 241

原创 八大排序——快速排序

快速排序基本思想:快速排序是对冒泡排序的一种改进。快速排序算法通过多次比较和交换来实现排序,其排序流程如下:(1)首先设定一个分界值,通过该分界值将数组分成左右两部分。(2)将大于或等于分界值的数据集中到数组右边,小于分界值的数据集中到数组的左边。此时,左边部分中各元素都小于或等于分界值,而右边部分中各元素都大于或等于分界值。(3)然后,左边和右边的数据可以独立排序。对于左侧的数组数据,又可以取一个分界值,将该部分数据分成左右两部分,同样在左边放置较小值,右边放置较大值。右侧的数组数据也可以做类

2021-10-03 20:01:17 810

原创 八大排序总结

八大排序稳定/不稳定排序待排序的记录序列中可能存在两个或两个以上关键字相等的记录。排序前的序列中Ri领先于Rj(即i<j)。若在排序后的序列中Ri仍然领先于Rj,则称所用的方法是稳定的。比如int数组[1,1,1,6,4]中a[0],a[1],a[2]的值相等,在排序时不改变其序列,则称所用的方法是稳定的稳定排序:插入排序,基数排序,归并排序,冒泡排序,不稳定排序:快速排序,希尔排序,简单选择排序,堆排序平均时间复杂度O(n^2):直接插入排序,简单选择排序,冒泡排序。在数据规模较

2021-10-03 19:51:40 170

原创 八大排序——冒泡排序

冒泡排序基本思想:比较相邻的元素。如果第一个比第二个大,就交换他们两个。对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。针对所有的元素重复以上的步骤,除了最后一个。持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。算法分析:算法稳定性:冒泡排序就是把小的元素往前调或者把大的元素往后调。比较是相邻的两个元素比较,交换也发生在这两个元素之间。所以,如果两个元素相等,是不会再交换的;如果两个相等的元素没有相邻,那么即使通过前

2021-10-03 17:21:26 174

原创 八大排序——简单选择排序

简单选择排序基本思想第一趟:从第一个记录开始,将后面n-1个记录进行比较,找到其中最小的记录和第一个记录进行交换;第二趟:从第二个记录开始,将后面n-2个记录进行比较,找到其中最小的记录和第2个记录进行交换;…第i趟:从第i个记录开始,将后面n-i个记录进行比较,找到其中最小的记录和第i个记录进行交换;以此类推,经过n-1趟比较,将n-1个记录排到位,剩下一个最大记录直接排在最后;注意事项(1)从待排序序列中,找到关键字最小的元素;(2)如果最小元素不是待排序序列的第一个元素,将其和第一个

2021-10-03 16:21:50 824

原创 Spring中数据转JSON首字母大小写转换问题

问题:在数据库设计时数据库设计字段例如有一个f_name,然后对应实体类中的属性时fName,那么返回给前端的应该也是fName,但是在写完之后,发现前端并没有fName字段,只有fname{ "id": 1, "username": "xiao", "password": "123456", "lastName": "xiaoming", "fname": "wang" }问题原因:通过检查发现在后台查出的数

2021-09-15 11:08:07 1037

原创 Java设计模式——建造者模式

建造者模式建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。一个Builder类会一步一步构造最终的对象。该Builder类是独立于其他对象的。介绍**意图:**将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。**主要解决:**主要解决在软件系统中,有时候面临着"一个复杂对象"的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经

2021-08-16 10:30:17 218

原创 Java中的回溯算法

回溯算法定义:回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜素尝试过程中寻找问题的解,当发现已不满足求解条件时,就“回溯”返回,尝试别的路径。回溯法是一种选优搜索法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为回溯点。许多复杂的,规模较大的问题都可以使用回溯法。回溯算法模板void backtracking(参数){ if(终止条件){ 收集结果; retu

2021-08-14 19:35:16 564

原创 外部排序——大文件排序

外部排序外部排序指的是大文件排序,即待排序的记录存储在外存储器上,待排序的文件无法一次装入内存,需要在内存和外部存储器之间进行多次数据交换,以达到排序整个文件的目的。一般来说外排序分为两个步骤:预处理和合并排序。首先,根据可用内存的大小,将外存上含有n个纪录的文件分成若干长度为t的子文件(或段);其次,利用内部排序的方法,对每个子文件的t个纪录进行内部排序。这些经过排序的子文件(段)通常称为顺串(run),顺串生成后即将其写入外存。这样在外存上就得到了m个顺串(m=[n/t])。最后,对这些顺串进行归并

2021-08-12 21:46:58 3061

原创 八大排序——归并排序

归并排序(Merge sort)定义归并排序时建立在归并操作上的一种有效的排序算法。该算法是采用分治法的一个非常典型的应用。作为一种典型的分而治之思想的算法应用,归并排序的实现有两种方法:自上而下的递归(所有递归的方法都可以用迭代重写,所以就有了第2种方法)自下而上的迭代和选择排序一样,归并排序的性能不受输入数据的影响,但表现比选择排序好的多,因为始终都是O(nlogn)的时间复杂度。代价是需要额外的内存空间。算法步骤申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列

2021-08-12 20:37:59 243

原创 Java设计模式——单例模式

单例模式(Singleton Pattern)Java中最简单的设计模式之一。属于创建型模式,它提供了一种创建对象的最佳方式。这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例滑该对象。注意:单例只能有一个实例单例类必须自己创建自己的唯一实例单例类必须给所有其他对象提供这一实例介绍**意图:**保证一个类仅有一个实例,并提供一个访问它的全局访问点**主要解决:**一个全局使用的类频繁地创建与销毁

2021-08-12 20:08:47 145

原创 力扣-跳跃游戏Ⅱ

给你一个非负整数数组 nums ,你最初位于数组的第一个位置。数组中的每个元素代表你在该位置可以跳跃的最大长度。你的目标是使用最少的跳跃次数到达数组的最后一个位置。假设你总是可以到达数组的最后一个位置。public int jump(int[] nums) { int length = nums.length; //step记录跳跃的步数 //start为开始的点 //flag为从start开始跳跃能跳到最远的点,并将其作为下次的起点

2021-08-05 18:09:32 164

原创 动态规划-使用最小花费爬楼梯为例

动态规划-使用最小花费爬楼梯为例题目描述数组的每个下标作为一个阶梯,第 i 个阶梯对应着一个非负数的体力花费值 cost[i](下标从 0 开始)。每当你爬上一个阶梯你都要花费对应的体力值,一旦支付了相应的体力值,你就可以选择向上爬一个阶梯或者爬两个阶梯。请你找出达到楼层顶部的最低花费。在开始时,你可以选择从下标为 0 或 1 的元素作为初始阶梯。确定dp数组以及下标含义观察cost数组理解题干,cost[i]是爬上第i个数要花费的体力,每次爬到i,必须从i-1,或者i-2爬上来,新建dp数组

2021-08-05 11:30:34 210

原创 平衡二叉树——调整变换规则

平衡二叉树:由来:为了解决二叉树在某些情况下形成链表。特点:平衡因子小于2,进行平衡调整。平衡因子:结点的左孩子-右孩子的绝对值。平衡调整策略:LL型 LR型 RR型 RL型。LL型调整规则(继承左结点的左孩子影响了平衡):将不平衡节点的左孩子提升为新的根节点;将原来的根节点(指不平衡结点),降为新的根节点的右孩子;各子树按大小关系连接。RR型调整规则(继承右结点的右孩子影响了平衡):将不平衡节点的右孩子提升为新的根节点;原根结点变成新的根结点的左孩子;各子树按大小关系相接。LR型调整规则(不

2021-07-13 08:15:34 585

原创 力扣:用两个栈实现一个队列

用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )class CQueue { Deque<Integer> stack1; Deque<Integer> stack2; public CQueue(){ stack1 = new LinkedList<Intege

2021-07-12 23:07:16 130

原创 二叉树的层次遍历

给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。示例:二叉树:[3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7 返回其层序遍历结果:[ [3], [9,20], [15,7]]这是力扣上的一道题,但是我没有做出来,因此理解了一下官方给的做法。/** * Definition for a binary tree node. * publi

2021-07-12 22:33:35 68

原创 Java代理模式

Java代理代理模式代理模式是一种设计模式,提供了对目标对象额外的访问方式,即通过代理对象访问目标对标,这样可以在不修改目标对象的前提下提供额外的功能操作,扩展目标对象的功能。简单来说,代理模式类似顾客,商家,厂家的关系。在这个三角关系中,商家是代理对象,厂家是被代理对象,厂家提供的商品类似接口的功能,商家作为代理拿到商品后,可以对其进行销售,如何销售就是对接口的功能强化,而顾客关心拿到实际的商品,并不会直接与厂家接触。代理模式可以在不修改被代理对象的基础上,通过扩展代理类,进行一些功能的附加和增强

2021-07-11 22:17:17 72

原创 H指数问题

H指数题干:给定一位研究者论文被引用次数的数组(被引用次数是非负整数)。编写一个方法,计算出研究者的 h 指数。h 指数的定义:h 代表“高引用次数”(high citations),一名科研人员的 h 指数是指他(她)的 (N 篇论文中)总共有 h 篇论文分别被引用了至少 h 次。且其余的 N - h 篇论文每篇被引用次数 不超过 h 次。例如:某人的 h 指数是 20,这表示他已发表的论文中,每篇被引用了至少 20 次的论文总共有 20 篇。题解:class Solution { p

2021-07-11 07:24:40 2148

原创 128陷阱——源码分析

128陷阱——源码分析public static void main(String[] args) { Integer aInteger = 101; //自动装箱Integer.valueOf(101) Integer bInteger = 101; System.out.println(aInteger==bInteger); Integer cInteger = 1001; Integer dInteger = 1001; System.out.println(cInte

2021-07-10 20:37:00 140

原创 八大排序之直接插入排序

八大排序之直接插入排序1.算法思路​ 直接插入排序,根据文字来理解,就是向一个有序数组中插入数据,使其依旧保持有序。通过一个循环使一个无序数组变得有序。2.实现代码public static void directInsert(int[] arr) { int temp = 0; int j = 0; for(int i = 1;i < arr.length;i++) { temp = arr[i]; for( j = i-1;j >= 0;j--) {

2021-06-30 11:00:14 81

原创 spring动态导入无模板excel

spring动态导入无模板excel导入maven依赖<dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>2.1.6</version></dependency>实现层代码@Overridepublic void importExcelUserInfo(Mul

2021-06-30 09:52:21 224

原创 java 动态导出excel表单 无模板本地生成

java 动态导出excel表单 无模板本地生成这里使用的是alibaba的公共类excelWriter,注意在pom文件中要引入easyExcel的依赖public void exportExcel(Long signupId){ MettingSignup mettingSignup = mettingSignupService.getById(signupId); // 文件输出位置 String outPath = "D:\\"+metting

2021-06-14 14:36:14 1728 1

原创 java 动态导出excel表单 无模板文件下载

java 动态导出excel表单 无模板文件下载public ResponseEntity<byte[]> exportStanding(@PathVariable Long signupId) throws IOException { MettingSignup mettingSignup = mettingSignupService.getById(signupId); Meeting meeting = meetingService.getById(mettingSign

2021-06-14 14:16:24 1279 6

原创 java微信公众号授权登录

微信授权登录注意:微信授权登录测试用户必须已经关注测试号,否则会获取不到用户信息相关配置使用内网穿透,配置相关端口,在JS接口安全域名和网页授权登录处配置穿透的网址,注意:配置域名去掉http://获取code值在前台界面访问的url,判断是否有code值,if (this.wxcode == null || this.wxcode == '') { let url = "https://open.weixin.qq.com/

2021-05-10 11:35:03 977

原创 内网穿透

内网穿透什么是内网穿透?内网穿透,即 NAT 穿透,进行 NAT 穿透是为了使具有某一个特定源 IP 地址和源端口号的数据包不被 NAT 设备屏蔽而正确路由到内网主机。简单的说,内网穿透就是将自己让自己电脑上的接口能够在其他电脑上访问到。如何进行内网穿透?​ 推荐进行内网穿透的网址:https://natapp.cn/直接点击免费注册,按照正常流程注册,实名认证之后,就可以进行下一步穿透了。实名认证之后,在我的隧道——>购买隧道,个人开发使用的话,可以使用免费隧道。购买隧道之后,在

2021-05-10 10:07:48 2491 2

原创 spring boot 实现微信扫码登录

spring boot 实现微信扫码登录微信扫码功能实现基于微信开放平台,但是这个申请账号是需要收费的。我们个人在做项目的过程中可以使用微信测试号来实现扫码登录功能。申请测试号需要去[微信公众平台]: https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login,微信扫码登录就可以了。扫码登录成功后,会直接分配一个appId和appsecret,这两个参数就是我们要用的。首先,需要向微信申请一个用于登录的二维码:@GetMappin

2021-05-05 19:02:00 955

原创 JAVA基础15——方法参数

一、基本概念参数类型形参:方法被调用时需要传递进来的参数,例如:function(int a)中的a,他只有function被调用期间a才有意义,也就是被分配内存空间,在方法function方法被执行完后,a就会被销毁释放内存空间,也就不存在了。 实参:方法被调用时传递进来的实际值,他在方法被调用前就已经被初始化,并且在方法被调用时传入。值传递和引用传递值传递:在方法被调用时,实参通过把他的内容副本传入方法内部,此时形参接收的内容是实参的一个拷贝,因此在方法内对实参的任何操作,都仅...

2021-02-16 16:45:14 509 2

原创 JAVA基础14——this关键字

重点:this代表当前对象。1.this.属性名一个方法当中的局部变量和成员变量名称相同,我们的程序需要在这个方法当中访问成员变量,这个时候就必须使用this关键字,用来区分成员变量和方法当中的参数。例如,我们的set方法。public void setName(String name) { this.name = name; }2.this.方法名让类中的一个方法来访问类中的另一个方法或者实例变量。public void souPerson() { System.ou

2021-02-16 11:17:07 132

原创 JAVA基础13——构造器

普通方法java中的构造方法是一种特殊的方法,用于初始化对象。java构造函数在对象创建时被调用。它构造值,即提供对象的数据。构造器的特征1.构造器要与类同名2.当我们new对象时,new 后边的方法就代表着我们的构造函数3.我们的每一个类当中都有一个默认的不显示的无参构造器,当我们这个类当中写一个构造器的时候,我们默认调用的就是我们显示的构造器4.我们的构造器是没有返回值的,如果有返回值,即便你的方法名和类名相同那么也不是构造函数5.我们的类当中是有一个或一个以..

2021-02-16 10:25:46 99

原创 JAVA基础12——对象与类

一、什么是面向对象编程?面向对象的编程产生的历史原因:由于面向过程编程在构造系统时,无法解决重用,维护,扩展的问题,而且逻辑过于复杂,代码晦涩难懂,因此,人们开始想能不能让计算机直接模拟现实的环境,以人类解决问题的方法,思路,习惯和步骤来设计相应的应用程序。于是,面向对象的编程思想就产生了。面向对象的编程的主要思想是把构成问题的各个事物分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描述一个事物在解决问题的过程中经历的步骤和行为。对象作为程序的基本单位,将程序和数据封装其中,以...

2021-02-16 10:13:53 95

原创 JAVA基础11——数组

数组是一种数据结构,用来存储同一类型的集合。一、数组的声明:1. 类型名称[] 变量名=new 类型名称[length];2.类型名称[] 变量名={?,?,?};3.类型名称[] 变量名=new 类型名称[]{?,?,?};public static void main(String[] args) { int[] arr = new int[3]; int[] brr = {1,2,3}; int[] crr = new int[]{1,2,3}; }三种数组声明

2021-02-09 16:37:13 113 1

空空如也

空空如也

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

TA关注的人

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