- 博客(154)
- 收藏
- 关注
原创 深入研究 Java 中的 char 类型
众所周知在 Java 中,char 类型是可以储存汉字的,你可以以 char='人' 的方式对其进行赋值,也可以直接以指定编码进行赋值如:char = '\u4eba'。能达到这种效果的原因是 Java 的 char 类型比较特殊,它是以 Unicode 编码对字符进行存储,即每个 char 类型有 16bit,这一点从允许直接使用 Unicode 码的形式给 char 类型赋值就可以得知。显然,Java 中的 char 类型以 UTF-16 规范进行编码。注意:U...
2022-04-06 10:12:05
545
原创 StandardWatchEventKinds.ENTRY_MODIFY 重复触发原因及解决方案
今天在测试监听文件修改自动更新缓存数据这一功能时偶然发现 StandardWatchEventKinds.ENTRY_MODIFY 竟然会多次触发。刚开始还以为是重载代码中涉及到文件的二次保存,后来 Debug 了一波发现不是,又想了想,要真是套娃不久直接 OOM 了嘛,那就只有一种可能,是编辑器保存修改这个操作本身就涉及到两次对文件内容的更新,查看官方 doc,注释如下:这里面有句话很耐人寻味The event count for this e...
2022-03-26 02:32:52
899
原创 lazyload 重复加载完美解决方案
在开发时因为需要实现图片后置加载,又因前端使用的是 Thymeleaf + JQuery,便想着用 lazyload 插件实现。但在实际测试中发现 lazyload 会重复请求两次资源(一次为触发懒加载资源时请求,一次为替换 src 属性时请求),相关代码片段如下:发现这一点我立马就绷不住了,要知道我就是因为我的小破服务器发个图片要一直转啊转才要懒加载提高用户体验的,你倒好直接给我来个超级加倍转啊转,反正你 lazyload 拓展的功能也没多少,大不了我高度预加载...
2022-01-28 14:51:39
2275
2
原创 【已解决】资源路径重定向自动加上uri导致请求url错误
我的资源路径是 /js/demo.js。我在 localhost:8080 访问,资源路径url是 localhost:8080/js/demo.js 访问到了,我在localhost:8080/index访问,资源路径url是localhost:8080/index/js/demo.js,结果就404了,开始分析:我们是因为要实现登录功能,配置了拦截器对资源进行重定向操作,所以刚开始的时候我在想有没有可能是因为我因使用了 Thymeleaf 在解析的时候自动将客户端请求...
2022-01-27 12:57:32
1089
原创 SpringBoot - 原理 - 再看自动装配
上文说到,当我们的主方法启动时,标有 @SpringBootApplication 注解的主类(实际起到自动装配功能的为其父注解 @EnableAutoConfiguration)会加载其父注解中 @Import 里配置的 ImportSelector 接口的实现类 AutoConfigurationImportSelector,调用其中的方法,加载处于 spring-boot-autoconfigure 包下的 META-INF/spring.factories 配置文件加载默认的配置类,...
2022-01-24 11:30:00
490
原创 SpringBoot - 原理 - 初探自动装配
众所周知 SpringBoot 集成了一系列的配置文件与配置类,旨在帮助开发者快速上手开发,做到 You can just run。本文将就 SpringBoot 如何实现自动装配 @SpringBootApplication 同级路径下所有 @Component 的注册与对应 `org.springframework.web.servlet.DispatcherServlet` 中 Controller 切面的填充做一简单的探寻。@SpringBootApplication...
2022-01-23 14:07:43
449
原创 [Bukkit插件开发教程] [高质量插件系列] [协议] 教你如何从外部 Ping 通服务器
引子 总所周知,Minecraft 的服务端和客户端是分离的两部分,客户端与服务端通过 TCP / IP(特指 Java 版,基岩版使用的是 UDP) 进行数据通讯(所以我们需要在服务端配置 server.properties 的 port 属性以及客户端连接时所需输入IP:PORT)。如果我们知道客户端与服务端所采用的具体通讯协议,那么就可以伪装客户端对服务器发起访问请求从而进行一系列操作(比如压测知识点本节所涉及知识点如下:对于特定协议的解析与封装 Socket API...
2021-12-01 21:33:51
594
原创 洛谷 - P1015 [NOIP1999 普及组] 回文数 [Java版]
题目描述若一个数(首位不为零)从左向右读与从右向左读都一样,我们就将其称之为回文数。例如:给定一个十进制数5656,将5656加6565(即把5656从右向左读),得到121121是一个回文数。又如:对于十进制数8787:STEP1:87+78=16587+78=165STEP2:165+561=726165+561=726STEP3:726+627=1353726+627=1353STEP4:1353+3531=48841353+3531=4884在这里的一步是...
2021-12-01 17:36:26
744
原创 洛谷 - P1014 [NOIP1999 普及组] Cantor 表 [Java版]
题目描述现代数学的著名证明之一是 Georg Cantor 证明了有理数是可枚举的。他是用下面这一张表来证明这一命题的:1/11/1,1/21/2,1/31/3,1/41/4,1/51/5, …2/12/1,2/22/2,2/32/3,2/42/4, …3/13/1,3/23/2,3/33/3, …4/14/1,4/24/2, …5/15/1, ……我们以 Z 字形给上表的每一项编号。第一项是1/11/1,然后是1/21/2,2/12/1,3...
2021-11-30 12:33:05
532
原创 洛谷 - P1009 [NOIP1998 普及组] 阶乘之和 [Java版]
题目描述用高精度计算出S = 1! + 2! + 3! + \cdots + n!S=1!+2!+3!+⋯+n!(n \le 50n≤50)。其中“!”表示阶乘,例如:5! = 5 \times 4 \times 3 \times 2 \times 15!=5×4×3×2×1。输入格式一个正整数nn。输出格式一个正整数SS,表示计算结果。方法一:不讲武德法 java 里有个封装类叫 BigInteger,支持大数操作.... private s...
2021-11-29 19:41:39
718
原创 洛谷 - P1008 [NOIP1998 普及组] 三连击 [Java版]
题目背景本题为提交答案题,您可以写程序或手算在本机上算出答案后,直接提交答案文本,也可提交答案生成程序。题目描述将1, 2, \ldots , 91,2,…,9共99个数分成33组,分别组成33个三位数,且使这33个三位数构成1 : 2 : 31:2:3的比例,试求出所有满足条件的33个三位数。输入格式无输出格式若干行,每行33个数字。按照每行第11个数字升序排列。方法一:暴力 对于处于 (100, 333) 的每一个数我...
2021-11-28 22:01:31
753
原创 洛谷 - P1003 [NOIP2011 提高组] 铺地毯 [Java版]
题目描述为了准备一个独特的颁奖典礼,组织者在会场的一片矩形区域(可看做是平面直角坐标系的第一象限)铺上一些矩形地毯。一共有nn张地毯,编号从11到nn。现在将这些地毯按照编号从小到大的顺序平行于坐标轴先后铺设,后铺的地毯覆盖在前面已经铺好的地毯之上。地毯铺设完成后,组织者想知道覆盖地面某个点的最上面的那张地毯的编号。注意:在矩形地毯边界和四个顶点上的点也算被地毯覆盖。输入格式输入共n + 2n+2行。第一行,一个整数nn,表示总共有nn张地毯。接下来的nn行中...
2021-11-27 11:34:29
154
原创 洛谷 - P1002 [NOIP2002 普及组] 过河卒 [Java版]
题目描述棋盘上AA点有一个过河卒,需要走到目标BB点。卒行走的规则:可以向下、或者向右。同时在棋盘上CC点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对方马的控制点。因此称之为“马拦过河卒”。棋盘用坐标表示,AA点(0, 0)(0,0)、BB点(n, m)(n,m),同样马的位置坐标是需要给出的。现在要求你计算出卒从AA点能够到达BB点的路径的条数,假设马的位置是固定不动的,并不是卒走一步马走一步。输入格式一行四个正整数,分别表示BB点坐标和...
2021-11-26 21:50:07
404
原创 LeetCode-每日一题 384. 打乱数组 [Java实现]
给你一个整数数组 nums ,设计算法来打乱一个没有重复元素的数组。实现 Solution class:Solution(int[] nums) 使用整数数组 nums 初始化对象 int[] reset() 重设数组到它的初始状态并返回 int[] shuffle() 返回数组随机打乱后的结果示例:输入["Solution", "shuffle", "reset", "shuffle"][[[1, 2, 3]], [], [], []]输出[null, [3, 1, 2], [1
2021-11-22 16:00:00
118
原创 基于 Nacos 与 自定义传输协议 的 RPC 框架实现 —— 简易版 Dubbo
声明:本项目为开源项目PANDA/Panda-Rpc-Framework的自实现版,一切代码仅供学习交流使用。项目架构技术栈基于 Nacos 实现的服务注册中心 基于传统 Socket 与 Netty 实现的传输方式 基于自实现的传输协议 基于反射与注解实现的包扫描与自动注册服务 两种负载均衡算法(随机、轮转) 四种序列化&反序列化算法(Json、Kryo、Hessian、Protostuff)项目结构rpc-api—— 框架通用接口 rpc-common...
2021-11-22 10:39:55
1121
原创 LeetCode-每日一题 559. N 叉树的最大深度 [Java实现]
给定一个 N 叉树,找到其最大深度。最大深度是指从根节点到最远叶子节点的最长路径上的节点总数。N 叉树输入按层序遍历序列化表示,每组子节点由空值分隔(请参见示例)。示例 1:输入:root = [1,null,3,2,4,null,5,6]输出:3方法一:递归 唯一需要注意的地方就是传入的 root 节点可能为空,此时数的最大深度为 0,其余情况下都需要对递归结果 + 1 (根节点自身也算深度)。 public int maxDepth(Node r...
2021-11-21 10:15:00
262
原创 LeetCode-每日一题 594. 最长和谐子序列 [Java实现]
和谐数组是指一个数组里元素的最大值和最小值之间的差别 正好是 1 。现在,给你一个整数数组 nums ,请你在所有可能的子序列中找到最长的和谐子序列的长度。数组的子序列是一个由数组派生出来的序列,它可以通过删除一些元素或不删除元素、且不改变其余元素的顺序而得到。示例 1:输入:nums = [1,3,2,2,5,2,3,7]输出:5解释:最长的和谐子序列是 [3,2,2,2,3]提示:1 <= nums.length <= 2 * 10^4 -10^9<= .
2021-11-20 12:15:03
136
原创 LeetCode-每日一题 397. 整数替换 [Java实现] [极速]
给定一个正整数n ,你可以做如下操作:如果n是偶数,则用n / 2替换n 。 如果n是奇数,则可以用n + 1或n - 1替换n 。n变为 1 所需的最小替换次数是多少?示例 1:输入:n = 8输出:3解释:8 -> 4 -> 2 -> 1方法一:贪心分析所有的可能我们能列出如下情况传入 n 是偶数 -> 计数+1,n /= 2 n 是奇数 n % 4 == 1,通过分析我们可知将 n -= 1 所得结果不会比 n+= 1 更...
2021-11-19 09:00:00
531
原创 Netty万字详解 - 配置&优化
扩展序列化算法配置文件 config.propertiesserialize.type=JSON工具类public class Config { private static final Properties PROPERTIES = new Properties(); static { try (InputStream input = Config.class.getResourceAsStream("/config.properties"))...
2021-11-19 07:30:00
593
原创 LeetCode-每日一题 563. 二叉树的坡度 [Java实现]
给定一个二叉树,计算 整个树 的坡度 。一个树的 节点的坡度 定义即为,该节点左子树的节点之和和右子树节点之和的 差的绝对值 。如果没有左子树的话,左子树的节点之和为 0 ;没有右子树的话也是一样。空结点的坡度是 0 。整个树 的坡度就是其所有节点的坡度之和。示例 1:输入:root = [1,2,3]输出:1解释:节点 2 的坡度:|0-0| = 0(没有子节点)节点 3 的坡度:|0-0| = 0(没有子节点)节点 1 的坡度:|2-3| = 1(左子树就是左子节点,所以
2021-11-18 13:46:47
179
原创 Netty万字详解 - 高级进阶
粘包与半包滑动窗口为了提高 TCP 传输的效率,传输端 & 接收端 会维护一个数组动态储存维护一定数量的 TCP 连接。现象分析粘包 现象:发送 abc def,接收 abcdef 原因: 应用层:接收方 ByteBuf 设置较大(Netty 默认 1024) 滑动窗口:接收方未及时处理数据且窗口大小足够大,滑动窗口中缓存了多个报文就会粘包 Nagle 算法1:会造成粘包 半包 现象:发送 abcdef,接
2021-11-18 07:30:00
349
原创 LeetCode-每日一题 318. 最大单词长度乘积 [Java实现]
给定一个字符串数组words,找到length(word[i]) * length(word[j])的最大值,并且这两个单词不含有公共字母。你可以认为每个单词只包含小写字母。如果不存在这样的两个单词,返回 0。示例1:输入: ["abcw","baz","foo","bar","xtfn","abcdef"]输出: 16解释: 这两个单词为 "abcw", "xtfn"。方法一:位运算 一个有意思的点是要判断字符串中是否拥有任何重复小写字母,而小写字母的个数总计2...
2021-11-17 19:21:42
192
原创 Netty万字详解 - 基础入门
简介Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients.Netty 是一个异步(多线程意义上的异步)的、基于事件驱动的网络应用程序框架,用于快速开发可维护、高性能的网络服务器和客户端。Hello WordServer pu...
2021-11-17 07:30:00
293
原创 LeetCode-每日一题 391. 完美矩形 [Java实现] [极速] [极简]
给你一个数组 rectangles ,其中 rectangles[i] = [xi, yi, ai, bi] 表示一个坐标轴平行的矩形。这个矩形的左下顶点是 (xi, yi) ,右上顶点是 (ai, bi) 。如果所有矩形一起精确覆盖了某个矩形区域,则返回 true ;否则,返回 false 。示例 1:输入:rectangles = [[1,1,3,3],[3,1,4,2],[3,2,4,4],[1,3,2,4],[2,3,3,4]]输出:true解释:5 个矩形一起可以精确地覆盖一个
2021-11-16 14:55:15
681
原创 [ Java | NIO详解 | 5/5 ] NIO vs BIO ? AIO
Stream vs Channel stream 不会自动缓冲数据,channel 会利用系统提供的发送缓冲区、接收缓冲区(更为底层) stream 仅支持阻塞 APl,channel 同时支持阻塞、非阻塞 API,网络 channel 可配合 selector 实现多路复用 二者均为全双工,即读写可以同时进行 IO 模型五种 IO 模型 阻塞 IO 等待数据期间 ( read ) 用户线程停止,复制数据期间用户线程被阻塞。在等待操作 ( read / accep
2021-11-16 08:00:00
533
原创 LeetCode-每日一题 319. 灯泡开关 [Java实现] [极速] [极简]
初始时有n 个灯泡处于关闭状态。第一轮,你将会打开所有灯泡。接下来的第二轮,你将会每两个灯泡关闭一个。第三轮,你每三个灯泡就切换一个灯泡的开关(即,打开变关闭,关闭变打开)。第 i 轮,你每 i 个灯泡就切换一个灯泡的开关。直到第 n 轮,你只需要切换最后一个灯泡的开关。找出并返回 n轮后有多少个亮着的灯泡。示例 1:输入:n = 3输出:1解释:初始时, 灯泡状态 [关闭, 关闭, 关闭].第一轮后, 灯泡状态 [开启, 开启, 开启].第二轮后, 灯泡状态 [开启...
2021-11-15 10:15:00
765
原创 [ Java | NIO详解 | 4/5 ] 网络编程
通用Client public static void main(String[] args) throws IOException { SocketChannel channel = SocketChannel.open(new InetSocketAddress(25565)); // 注:Buffer大小最好为有效数据大小 -> 防止服务端解码异常 channel.write(ByteBuffer.wrap("传输的信息".ge...
2021-11-15 08:00:00
387
原创 LeetCode-每日一题677. 键值映射 [Java实现]
实现一个 MapSum 类,支持两个方法,insert和sum:MapSum() 初始化 MapSum 对象 void insert(String key, int val) 插入 key-val 键值对,字符串表示键 key ,整数表示值 val 。如果键 key 已经存在,那么原来的键值对将被替代成新的键值对。 int sum(string prefix) 返回所有以该前缀 prefix 开头的键 key 的值的总和。 示例:输入:["MapSum", "insert", "s...
2021-11-14 23:58:44
499
原创 [ Java | NIO详解 | 3/5 ] 文件编程
FileChannelFileChannel 只能工作在阻塞模式下 - 文件处于本地,无需等待获取FileChannel 无法直接打开,仅能通过 getChannel() 间接获取 通过 FileInputStream 获取的 Channel 只能读 通过 FileOutputStream 获取的 Channel 只能写 通过 RandomAccessFile 获取的 Channel 能否读写取决于构造时设置的读写模式 写入正确的姿势如下(事实上 FileC
2021-11-14 08:00:00
231
原创 LeetCode-每日一题 520. 检测大写字母 [Java实现] [极速]
我们定义,在以下情况时,单词的大写用法是正确的:全部字母都是大写,比如 "USA" 。 单词中所有字母都不是大写,比如 "leetcode" 。 如果单词不只含有一个字母,只有首字母大写,比如"Google" 。给你一个字符串 word 。如果大写用法正确,返回 true ;否则,返回 false 。示例 1:输入:word = "USA"输出:true方法一:分治由题分析可得上述三种正确的单词格式可以归类为一下三种:首字母大写 其余字母全小写 其余字母全大写 ..
2021-11-13 09:00:00
448
原创 [ Java | NIO详解 | 2/5 ] ByteBuffer全解析
重要属性 Capacity - 容量 - 初始为最大值 Position - 写入位置 - 初始为0 Limit - 读写限制 - 初始为最大值 分配内存 ByteBuffer#allocate(int) 分配 Java 堆内存,读写效率较低,受 GC 影响。 ByteBuffer#allocateDirect(int) 直接内存,读写效率高(少一次拷贝),不受 GC 影响,分配的效率低,可能造成内存泄漏。 写模式更新 Position c
2021-11-13 08:00:00
286
原创 [ Java | NIO详解 | 1/5 ] 三大组件 - Channel、Buffer、Selector
NIO - New IO | Non-blocking IO,非阻塞 IOChannel & Bufferchannel 是读写数据的双向通道,可以从 channel 将数据读入 buffer,也可以将 buffer 的数据写入 channel。channel 比 stream 更为底层。常见的 Channel FileChannel - 文件通道 DatagramChannel - UDP 通道 SocketChannel - TCP 通道 ...
2021-11-12 21:00:04
564
原创 LeetCode-每日一题 375. 猜数字大小 II [Java实现] []
我们正在玩一个猜数游戏,游戏规则如下:我从1到 n 之间选择一个数字。你来猜我选了哪个数字。如果你猜到正确的数字,就会 赢得游戏 。如果你猜错了,那么我会告诉你,我选的数字比你的 更大或者更小 ,并且你需要继续猜数。每当你猜了数字 x 并且猜错了的时候,你需要支付金额为 x 的现金。如果你花光了钱,就会 输掉游戏 。给你一个特定的数字 n ,返回能够 确保你获胜 的最小现金数,不管我选择那个数字 。示例 1:输入:n = 10输出:16解释:制胜策略如下:- 数字范围是 [..
2021-11-12 20:29:51
168
转载 LeetCode-每日一题 629. K个逆序对数组 [Java实现]
给出两个整数n和k,找出所有包含从1到n的数字,且恰好拥有k个逆序对的不同的数组的个数。逆序对的定义如下:对于数组的第i个和第j个元素,如果满i<j且a[i]>a[j],则其为一个逆序对;否则不是。由于答案可能很大,只需要返回 答案 mod 109+ 7 的值。示例 1:输入: n = 3, k = 0输出: 1解释:只有数组 [1,2,3] 包含了从1到3的整数并且正好拥有 0 个逆序对。方法一:动态规划从 nn 和 kk 数据范...
2021-11-11 23:22:11
151
原创 LeetCode-每日一题 495. 提莫攻击 [Java实现] [极速]
在《英雄联盟》的世界中,有一个叫 “提莫” 的英雄。他的攻击可以让敌方英雄艾希(编者注:寒冰射手)进入中毒状态。当提莫攻击艾希,艾希的中毒状态正好持续duration 秒。正式地讲,提莫在 t 发起发起攻击意味着艾希在时间区间 [t, t + duration - 1](含 t 和 t + duration - 1)处于中毒状态。如果提莫在中毒影响结束 前 再次攻击,中毒状态计时器将会 重置 ,在新的攻击之后,中毒影响将会在 duration 秒后结束。给你一个 非递减 的整数数组 timeS.
2021-11-10 16:37:39
548
1
原创 LeetCode-每日一题 488. 祖玛游戏 [Java实现]
你正在参与祖玛游戏的一个变种。在这个祖玛游戏变体中,桌面上有 一排 彩球,每个球的颜色可能是:红色 'R'、黄色 'Y'、蓝色 'B'、绿色 'G' 或白色 'W' 。你的手中也有一些彩球。你的目标是 清空 桌面上所有的球。每一回合:从你手上的彩球中选出 任意一颗 ,然后将其插入桌面上那一排球中:两球之间或这一排球的任一端。接着,如果有出现 三个或者三个以上 且 颜色相同 的球相连的话,就把它们移除掉。如果这种移除操作同样导致出现三个或者三个以上且颜色相同的球相连,则可以继续移除这些球,直到
2021-11-09 15:18:08
374
1
原创 LeetCode-每日一题 299. 猜数字游戏 [Java实现]
你在和朋友一起玩 猜数字(Bulls and Cows)游戏,该游戏规则如下:写出一个秘密数字,并请朋友猜这个数字是多少。朋友每猜测一次,你就会给他一个包含下述信息的提示:猜测数字中有多少位属于数字和确切位置都猜对了(称为 "Bulls", 公牛), 有多少位属于数字猜对了但是位置不对(称为 "Cows", 奶牛)。也就是说,这次猜测中有多少位非公牛数字可以通过重新排列转换成公牛数字。给你一个秘密数字secret 和朋友猜测的数字guess ,请你返回对朋友这...
2021-11-08 08:30:00
169
原创 LeetCode-每日一题 598. 范围求和 II [Java实现] [极速] [极简]
给定一个初始元素全部为0,大小为 m*n 的矩阵M以及在M上的一系列更新操作。操作用二维数组表示,其中的每个操作用一个含有两个正整数a 和 b 的数组表示,含义是将所有符合0 <= i < a 以及 0 <= j < b 的元素M[i][j]的值都增加 1。在执行给定的一系列操作后,你需要返回矩阵中含有最大整数的元素个数。示例 1:输入:m = 3, n = 3operations = [[2,2],[3,3]]输出: 4解释:初始状态,...
2021-11-07 00:18:30
158
原创 LeetCode-每日一题 268. 丢失的数字 [Java实现] [极简]
给定一个包含 [0, n]中n个数的数组 nums ,找出 [0, n] 这个范围内没有出现在数组中的那个数。示例 1:输入:nums = [3,0,1]输出:2解释:n = 3,因为有 3 个数字,所以所有的数字都在范围 [0,3] 内。2 是丢失的数字,因为它没有出现在 nums 中。方法一:排序 观察题目可以得出以一个隐含条件 给定数组中无重复项。那么对于一个无重复项的数组,在确保其首尾的合法性之后枚举中间项找到突变点索引即可。 public in...
2021-11-06 00:51:05
179
原创 LeetCode-每日一题 1218. 最长定差子序列 [Java实现] [极简]
给你一个整数数组arr和一个整数difference,请你找出并返回 arr中最长等差子序列的长度,该子序列中相邻元素之间的差等于 difference 。子序列 是指在不改变其余元素顺序的情况下,通过删除一些元素或不删除任何元素而从 arr 派生出来的序列。示例 1:输入:arr = [1,2,3,4], difference = 1输出:4解释:最长的等差子序列是 [1,2,3,4]。方法一:dp+哈希表 通过观察我们不难发现最长定差子序列的每一项的长度与...
2021-11-05 14:22:32
156
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人