自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 如何将neo4j,4.x版本部署到服务器上

当我们使用neo4j构建知识图谱时,我们希望让别人能和我们共用neo4j进行知识图谱的构建,我们的方法之一就是将neo4j部署到我们的服务器上,然后将7474,7687端口暴露出来,这样就可以通过访问服务器公网IP的7474端口来操作我们的数据库。

2024-08-06 00:03:55 1058

原创 Agile Software Development

Individuals and interactions over processes and tools.(个人和协作超过过程和工具)working software over comprehensive documentation.(工作软件超过完全文档)Customer collaboration over contract negotiation.(客户协作超过合同谈判)Responding to change over following a plan.(随机应变)

2024-06-23 11:11:43 788

原创 Golang三色标记法

详细讲述了什么是三色标记法,三色标记法如何在golang并发增量场景下被运用。

2024-06-22 18:15:36 744 1

原创 数据结构复习

算法是解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且每条指令表示一个或多个操作。在进行算法分析时,语句总的执行次数T(n)是关于问题规模 n 的函数,进而分析T(n)随n的变化并确定T(n)的数量级。算法的时间复杂度,也就是算法的时间量度,记作。他表示随着问题规模n的增大,算法执行时间的增长率和f(n)的增长率相同,乘坐算法的渐近时间复杂度,简称为时间复杂度。其中f(n)是问题规模n的某个函数。

2024-06-06 16:00:42 777

原创 如何在JVM中基于引用计数法实现GC

而为什么我使用引用计数来实现gc呢?所以根集的收集是十分麻烦的。同时由于可达性分析法实际上是一种标记算法,即会标注每个对象是否死亡。而后续的内存释放一系列工作则需要使用抽象的分区概念(青年代,老年代,其他书也有伊甸园代等等对分区的称谓)使用标记-清除,复制-清除,标记整理法来进行处理。所以整体实现比较麻烦,然后也会存在 stop the world 来进行暂停gc,此时需要涉及到gc线程,而我的虚拟机并未实现多线程,所以这是其二原由。

2024-06-02 17:46:35 946

原创 HashMap在Go与Java的底层实现与区别

在Java中hash表的底层数据结构与扩容等已经是面试集合类问题中几乎必问的点了。网上有对源码的解析已经非常详细了我们这里还是说说其底层实现。

2024-05-27 23:30:48 1181

原创 基于树的存储数据结构demo

由于之前博主尝试Java重构redis,在redis中的的字典数据结构底层也是采用数组实现,字典中存在两个hash表,一个是用于存储数据,另一个被用于rehash扩容为前者两倍。但是我注意到了在redis的数据结构中,并没有像Java集合类中的hashmap一样的树化机制,即当链表数大于8,且通过线性搜索法查找后续hash槽,发现占用了64个了,就会将拉链上的链表转化为红黑树,涉及到自平衡等等操作。是比较麻烦的,于是博主尝试使用二叉搜索树来实现一个基础的树的存储数据的数据结构。

2024-05-23 22:13:16 1153 1

原创 谈谈关于JVM虚拟机的方法调用流程

jvm方法调用

2024-05-04 16:06:22 466 1

原创 什么是区块链?

初步了解区块链

2024-04-15 20:44:50 1011

原创 双亲委派类加载机制和java类加载当前类必须先加载父类有什么联系和区别

本文是作者在学习了jvm虚拟机的一些疑问解决:类加载机制和类加载时先加载父类之间有什么联系?因为类加载机制也是先加载启动类然后加载扩展类,然后是用户类。

2024-04-10 20:47:54 405

原创 【无标题】

从linkedlist开始,逐步创建基于线性搜索法解决哈希冲突的哈希表和结合线性搜索和拉链法解决hash冲突的hash表

2024-04-07 23:57:40 890

原创 说说JVM的class文件(二)

在前文中我们已经简单说了说class类文件的结构,但是由于我是根据JVM规范进行快速学习解释所以部分的并不是很清楚,这篇文章是在我阅读了多本数有关类结构的部分后总结出的文章或者可以叫做读书笔记。

2024-03-15 18:23:34 643

原创 说说JVM的垃圾回收机制

主要讲解了JVM垃圾回收机制围绕:何为GC,为什么需要GC,如何进行GC进行详细展开分析。

2024-03-13 22:51:28 878

原创 详细说说JVM的class文件(一)

class虚拟机实现可以从文件系统(环境变量)读取也可以从JAR(或者ZIP)包提取,也可以从网上下载,从数据库加载,甚至在运行中直接生成class文件。文件由8位字节流组成。16位和32位的数量分别通过读入两个和四个连续的8位字节来构造。多字节数据项总是以大端顺序存储,其中高字节放在前面。

2024-03-11 21:30:32 840

原创 说说Java三种启动类路径

在Java中,类路径(Classpath)是用来告诉Java虚拟机(JVM)在哪里查找类文件的路径。类路径可以分为三种不同的类型:启动类路径(Bootstrap Classpath)、扩展类路径(Extension Classpath)和用户类路径(User Classpath)。 启动类路径(Bootstrap Classpath): 启动类路径是用来加载Java核心类库(如java.lang、java.util等)的路径。 JVM在启动时会加载这些核心类,这些类通常位于JRE的lib目录下

2024-03-10 16:33:56 355

原创 Golang如何使用命令行-- flag库

在打印前应该加上flag.Prase()显示解析我们的参数值。

2024-03-10 16:32:30 729

原创 GO语言学习笔记(与Java的比较学习)(十一)

一个应用程序是运行在机器上的一个进程;进程是一个运行在自己内存地址空间里的独立执行体。一个进程由一个或多个操作系统线程组成,这些线程其实是共享同一个内存地址空间的一起工作的执行体。并行是一种通过使用多处理器以提高速度的能力。所以并发程序可以是并行的,也可以不是。公认的,使用多线程的应用难以做到准确,最主要的问题是内存中的数据共享,它们会被多线程以无法预知的方式进行操作,导致一些无法重现或者随机的结果(称作 竞态)。不要使用全局变量或者共享内存,它们会给你的代码在并发运算的时候带来危险。

2024-03-04 00:03:05 1088

原创 GO语言学习笔记(与Java的比较学习)(十)

这是所有自定义包实现者应该遵守的最佳实践:1)在包内部,总是应该从 panic 中 recover:不允许显式的超出包范围的 panic ()2)向包的调用者返回错误值(而不是 panic)。

2024-03-03 23:59:23 657

原创 GO语言学习笔记(与Java的比较学习)(九)

最简单的办法是使用fmt包提供的 Scan 和 Sscan 开头的函数。Scanln 扫描来自标准输入的文本,将空格分隔的值依次存放到后续的参数内,直到碰到换行。Scanf 与其类似,除了 Scanf 的第一个参数用作格式字符串,用来决定如何读取。Sscan 和以 Sscan 开头的函数则是从字符串读取,除此之外,与 Scanf 相同。

2024-03-03 23:57:01 1065

原创 GO语言学习笔记(与Java的比较学习)(八)

Go 语言不是一种 “传统” 的面向对象编程语言:它里面没有类和继承的概念。但是 Go 语言里有非常灵活的 接口 概念,通过它可以实现很多面向对象的特性。接口提供了一种方式来 说明 对象的行为:如果谁能搞定这件事,它就可以用在这儿。接口定义了一组方法(方法集),但是这些方法不包含(实现)代码:它们没有被实现(它们是抽象的)。接口里也不能包含变量。

2024-03-03 00:10:44 1033

原创 GO语言学习笔记(与Java的比较学习)(七)

当你在值类型上定义方法时,方法接收的是该值的副本。这意味着在方法内部对接收者的修改不会影响原始值。这种方式适用于不需要在方法内部修改接收者数据的情况,或者对数据的修改是独立于原始数据的。

2024-02-29 11:01:55 925

原创 GO语言学习笔记(与Java的比较学习)(六)

当写自己包的时候,要使用短小的不含有(下划线) 的小写单词来为文件命名。包的初始化:程序的执行开始于导入包,初始化 main 包然后调用 main 函数。一个没有导入的包将通过分配初始值给所有的包级变量和调用源码中定义的包级 init 函数来初始化。一个包可能有多个 init 函数,它们甚至可以存在于同一个源码文件中。它们的执行是无序的。这是测定包的值是否只依赖于相同包下的其他值或者函数的最好的例子。init 函数是不能被调用的。

2024-02-28 19:30:13 850

原创 GO语言学习笔记(与Java的比较学习)(五)

在声明的时候不需要知道 map 的长度,map 是可以动态增长的。未初始化的 map 的值是 nil(即零值为nil),nil映射既没有键,也不能添加键。key 可以是任意可以用 == 或者!= 操作符比较的类型,比如 string、int、float。所以切片和结构体不能作为 key ,但是指针和接口类型可以。(含有数组切片的结构体不能作为 key,只包含内建类型的 struct 是可以作为 key 的)如果要用结构体作为 key 可以提供Key()和Hash()

2024-02-28 19:29:19 770 1

原创 GO语言学习笔记(与Java的比较学习)(四)

一个结构体(struct)就是一组字段(field)。结构体中的字段用 . 访问。

2024-02-28 15:56:29 862

原创 GO语言学习笔记(与Java的比较学习)(三)

Go 默认使用按值传递来传递参数,也就是传递参数的副本。函数接收参数副本之后,在使用变量的过程中可能对副本的值进行更改,但不会影响到原来的变量。如果你希望函数可以直接修改参数的值,而不是对参数的副本进行操作,你需要将参数的地址(变量名前面添加 & 符号,比如 &variable)传递给函数,这就是按引用传递,如果传递给函数的是一个指针,指针的值(一个地址)会被复制,但指针的值所指向的地址上的值不会被复制;我们可以通过这个指针的值来修改这个值所指向的地址上的值。(译者注:指针也是变量类型,有自己的地址和值,通

2024-02-28 15:51:33 1073

原创 GO语言学习笔记(与Java的比较学习)(二)

关键字 if 和 else 之后的左大括号 { 必须和关键字在同一行,如果你使用了 else-if 结构,则前段代码块的右大括号 } 必须和 else-if 关键字在同一行。这两条规则都是被编译器强制规定的。if 可以包含一个初始化语句(如:给一个变量赋值)。使用简短方式 := 声明的变量的作用域只存在于 if 结构中(在 if 结构的大括号之间,如果使用 if-else 结构则在 else 代码块中变量也会存在)。如果变量在 if 结构之前就已经存在,那么在 if 结构中,该变量原来的值会被隐藏。

2024-02-28 15:48:01 879

原创 GO语言学习笔记(与Java的比较学习)(一)

一个应用程序可以包含不同的包,而且即使你只使用 main 包也不必把所有的代码都写在一个巨大的文件里:你可以用一些较小的文件,并且在每个文件非注释的第一行都使用 package main 来指明这些文件都属于 main 包。同时,带有 ++ 和 -- 的只能作为语句,而非表达式,因此 n = i++ 这种写法是无效的,其它像 f(i++) 或者 a[i]=b[i++] 这些可以用于 C、C++ 和 Java 中的写法在 Go 中也是不允许的。否则,如果这个指针为空,你使用它的话,会Crash。

2024-02-28 15:42:40 1704

原创 动态规划算法学习(基础)

确定dp数组的含义(一维或者二维)获取递推公式dp数组如何初始化确定遍历顺序打印dp数组(检查)

2024-02-23 21:28:18 1580 1

原创 解决宏碁 Windows11 更新后指纹解锁失效问题

解决acer指纹锁失效

2024-02-21 13:32:37 732

原创 Java NIO 和 Netty快速入门

channel 是读写数据的双向通道,可以从 channel将数据读入buffer,也可以将buffer数据写入channel(较之前的stream要么是输入,要么是输出更为底层)四种常见Channel:buffer用来缓冲读写数据常见buffer:ByteBufferIntBufferLongBufferCharBufferSelector多线程版本缺点:内存占用高线程上下文切换成本高只适合连接少数场景线程池版设计:缺点:阻塞模式下,线程仅能处理一个 socket连接。

2024-02-20 11:54:00 962

原创 leetcode 153

这道题,如果我们熟悉数组 api,可以直接用 Arrays.sort()秒杀,这个方法使用了双轴快速排序算法。

2024-02-10 12:38:47 470 2

原创 leetcode 24

所以对于这道题目,我们不仅仅需要改变两两链表节点 firNode, secNode 之间的指针指向关系,还要考虑 firNode 前一个节点与secNode关系,以此来保证链表不会断裂。简而言之,我们对链表结构的改变(节点的增删改),

2024-02-10 11:35:17 436 1

原创 说说RDB和AOF

众所周知,redis是一个内存数据库,当机器重启后,内存中数据都会丢失。所以redis提供了两种持久化方式,即:RDB(保存一个时间点前的数据)和AOF(保存redis服务器端执行的每一条命令)。

2024-02-03 02:02:39 588

原创 leetcode 19 , 118

哑节点(dummy node)或者哨兵节点(sentinel node)在编程中常常被用来简化边界条件的处理。这是一个特殊的节点,通常在链表的开始位置添加,其值通常无关紧要,它的主要目的是使我们在处理头节点时更加方便。使用双指针方法,让fast指针先行n节点,然后再让fast与slow指针一起走,最后当fast走到null,slow走到的节点就是需要删除的节点。观察可知,每行第一个和最后一个不变都为1,中间的每个数为上一行正上方和左上方数相加,

2024-02-01 20:58:03 411 1

原创 JUC, Java并发编程

Java并发编程

2024-01-31 21:31:30 829

原创 什么是跳表,Java如何实现跳表?

如图:每个链表存在一个指向下一节点的指针,如果我们要对其任一节点进行增删改,都需要先使用迭代器进行查询,找到指定节点进行修改,复杂度较高。

2024-01-28 16:26:17 1234

原创 什么是内网穿透?

内网限制:内网通常由路由器、防火墙等网络设备保护,其目的是保护内部网络的安全。远程访问需求:有时候,用户需要远程访问内网服务器上的服务,如远程桌面、文件共享、游戏服务器等。通过内网穿透技术,可以实现对内网服务器的远程访问,无需在物理上与服务器在同一网络环境中。接下来就来介绍服务器模式的内网穿透如何实现的:由于我们的A计算机和B计算机只能被动接收请求而不能主动发出请求,即内网电脑连接外网服务器,告诉外网服务器他的位置,然后外网服务器就可以将数据发送给内网电脑。

2024-01-20 18:46:46 442

原创 Sentinel

雪崩问题:微服务调用链路种某个服务故障,引起整个链路中的所有微服务都不可用,这就是雪崩。解决学崩问题的常见方式:超时处理:设定超时时间,请求超过一定时间没有响应就返回错误信息,不会无休止等待舱壁模式:限定每个业务能使用的线程数,避免耗尽整个tomcat资源,因此也叫线程隔离熔断降级:由统计业务执行的异常比例,如果超出阈值就会该业务,拦截访问该业务的一切请求。流量控制:限制业务访问的QPS,避免服务因流量的突增而故障。

2024-01-07 15:33:36 1248

原创 Gateway网关

而SpringCloudGateway则是基于Spring5中提供的WebFlux,属于响应式编程,具备更好的功能。当过滤器的order值一样时,会按照 defaultFilter > 路由过滤器 > GlobalFilter的顺序执行。区别在于GatewayFilter通过配置定义,处理逻辑固定的,而GlobalFilter的逻辑需要自己代码实现。全局过滤器的作用也是处理一切进入网关的请求和微服务响应,与GatewayFilter的作用一样。filters:路由过滤器,处理请求或响应。

2024-01-06 14:03:36 844

原创 Feign

类型作用说明修改日志级别包含四种不同的级别:NONE、BASIC、HEADERS、FULL响应结果的解析器http远程调用的结果做解析,例如解析json字符串作为java对象请求参数编码将请求参数编码,便于通过http请求发送支持的注解格式默认是SpringMVC失败重试机制请求失败的重试机制,默认是没有,不过会使用Ribben的重试一般我们需要配置的就是日志级别。日志级别尽量使用basic使用HttpClient或OKHttp代替URLConnection。

2024-01-06 14:01:11 1084

空空如也

空空如也

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

TA关注的人

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