基础
文章平均质量分 88
码农随笔
这个作者很懒,什么都没留下…
展开
-
Redis AOF日志浅析
Redis AOF 日志浅析,介绍Redis AOF日志相关的内容原创 2022-01-15 23:30:25 · 838 阅读 · 0 评论 -
epoll本质
从事服务端开发,少不了要接触网络编程。epoll 作为 Linux 下高性能网络服务器的必备技术至关重要,nginx、Redis、Skynet 和大部分游戏服务器都使用到这一多路复用技术。epoll 很重要,但是 epoll 与 select 的区别是什么呢?epoll 高效的原因是什么?网上虽然也有不少讲解 epoll 的文章,但要么是过于浅显,或者陷入源码解析,很少能有通俗易懂的。笔者于是决定编写此文,让缺乏专业背景知识的读者也能够明白 epoll 的原理。文章核心思想是:要让读者清晰明白转载 2022-01-10 18:48:38 · 122 阅读 · 0 评论 -
IO多路复用
如果直接抛出多路复用的概念,或许会一脸懵逼,这次,我们以最简单 socket 网络模型,然后带着「如何服务更多的用户」的思考,一步一步的过度到 I/O 多路复用,到后面你就会突然弄懂了这个概念!最基本的 Socket 模型要想客户端和服务器能在网络中通信,那必须得使用 Socket 编程,它是进程间通信里比较特别的方式,特别之处在于它是可以跨主机间通信。Socket 的中文名叫作插口,咋一看还挺迷惑的。事实上,双方要进行网络通信前,各自得创建一个 Socket,这相当于客户端和服务器都开了一个“转载 2022-01-09 22:42:34 · 94 阅读 · 0 评论 -
滑动窗口最大值
滑动窗口算法详解原创 2022-01-06 11:23:33 · 4756 阅读 · 0 评论 -
数据流中的第 K 大元素
设计一个找到数据流中第 k 大元素的类(class)。注意是排序后的第 k 大元素,不是第 k 个不同的元素。请实现 KthLargest类:KthLargest(int k, int[] nums) 使用整数 k 和整数流 nums 初始化对象。int add(int val) 将 val 插入数据流 nums 后,返回当前数据流中第 k 大的元素。如下:输入:["KthLargest", "add", "add", "add", "add", "add"][[3, [4, 5, 8.原创 2022-01-03 21:48:57 · 688 阅读 · 0 评论 -
跳表(skip list)
前面博文(链表相关的)有提过,链表查询一个元素的时间复杂度是O(n)。数组根据下标查找的时间复杂度是O(1),前面的文章也提到过二分查找算法对于元素查找的改变,但是二分查找算法的底层其实是依赖于数组的随机访问特性,分配内存时,对于数组,是需要连续的空间,有时候给数组分配内存时可能会引发频繁的GC。那既然二分查找算法查找性能那么高,但是底层使用数组对内存的要求很高,那可否使用链表来代替元素的存储,即如果元素底层是基于链表存储时能不能有相应效率的“二分查找算法”?其实我们可以稍微对链表进行改造,就可以支持类原创 2021-10-22 14:51:22 · 233 阅读 · 0 评论 -
Leetcode打家劫舍系列问题
Leetcode198你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。给定一个代表每个房屋存放金额的非负整数数组,计算你不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。输入:[2,7,9,3,1]输出:12解释:偷窃 1 号房屋 (金额 = 2), 偷窃 3 号房屋 (金额 = 9),接着偷窃 5 号房屋 (金额 = 1...原创 2021-09-28 20:01:24 · 339 阅读 · 0 评论 -
单调栈的简单应用
栈是一种先进后出的数据结构,只能在栈顶进行元素的入栈和出栈,原创 2021-09-23 23:11:45 · 381 阅读 · 0 评论 -
初识位运算
初识计算机时就听说过一句话,计算机只认识0和,在现代计算机中所有的数据在内存中都是以二进制存在的。位运算直接对位进行操作,如果使用得好,很多时候能够取得很好的效果,下面简要的计算几种常见的位运算及其位运算相关的题。1、与(&)运算符只有当两位都是 1 时结果才是 1,否则为 02、或(|)运算符只有当两位都是 0时结果才为 0,否则为 13、异或(^)运算符当两位相同时,则结果为 0,两位不同时结果为 14、取反(~)运算符位的值为 0则变为 1 ,...原创 2021-09-08 20:24:22 · 1831 阅读 · 0 评论 -
浅析Java中的资源关闭
内存是计算机很宝贵的资源,我们在使用资源时如果不关闭打开的资源,就有可能导致内存泄露的风险,下面浅析下Java中几种常见的资源关闭方案先定义一个资源类表示需要关闭的资源public class MyResource implements Closeable { @Override public void close() throws IOException { System.out.println("MyResource的close方法被调用!"); }}原创 2021-04-16 14:18:30 · 2113 阅读 · 4 评论 -
简单工厂模式 和 工厂方法模式
我们来看下面一种场景,在我们日常的开发中,会涉及到很多的配置文件,配置文件的存储、加载和使用往往都很重要。下面我们来看一种场景,我们的配置文件的后缀是(json、xml、yaml、redis和properties等)来表示配置文件的存储形式。我们针对不同的存储形式采用不同的方式加载、解析配置文件,然后装载到内存中的RuleConfig对象。/** * 配置对象 */public class RuleConfig {}我们一般的做法是像下面这样的public class RuleCon原创 2021-03-30 17:32:40 · 262 阅读 · 0 评论 -
线性排序算法-计数排序
我们前面分析过几种排序算法,时间复杂度为O()如冒泡排序,插入排序和选择排序等,时间复杂度为O(nlogn),如归并排序和快速排序等,接下来我们来分析一种时间复杂度为O(n)的排序算法。既然存在排序时间复杂度为O(n)的算法,为什么我们还要去分析时间复杂度更高的算法?我们知道每一种排序算法其实都有其限制条件和适用场景。其实计数排序虽然时间复杂度为O(n),但是这种算法有其先决条件,接下来我们来分析下当要排序的 n 个数据,所处的范围并不大的时候,比如最大值是 k,我们就可以把数据划分成 k 个桶。每个桶原创 2021-03-15 23:29:32 · 449 阅读 · 0 评论 -
快速排序
上面这边文章我们讲过归并排序的时间复杂度是O(nlogn),但是需要的空间复杂度是O(N),合并时需要额外的辅助空间,其实还有一种算法,大多数情况下时间复杂度也是O(nlogn),而且是原地排序算法,不需要偶外的空间协助。快速排序。其实快速排序也是使用的分治的思想,快速排序的原理比较简单,随机挑选一个元素(一般是挑选第一个),把小于基准元素(选择的元素)的值放置到左边,把大于基准元素的值放置到选择的元素的右边。最后再分别针对左半部分和右半部分进行相同的操作。...原创 2021-03-11 23:12:42 · 436 阅读 · 0 评论 -
插入排序、选择排序和冒泡排序详解
排序对于任何一个程序员来说可能都不陌生,在我们日常的开发中多多少少都会涉及到排序的场景,如按照订单交易时间排序,按照金额排序等等。很多语言都内置了相应的排序函数,而且讲起排序算法时都可以列出一大堆,此文初步探索下插入排序,选择排序和冒泡排序。此处先说明下排序算法的稳定性:稳定性,这个概念是说,如果待排序的序列中存在值相等的元素,经过排序之后,相等元素之间原有的先后顺序不变,如下待排序的序列。图中框住的两个元素2,排序后相对位置不变,前面的2还是在前面,后面的2还是相对在后面。其实你也许有疑问.原创 2021-03-10 12:24:33 · 1329 阅读 · 0 评论 -
Java单例模式详解
单例模式可以说是设计模式中最简单和最基础的一种设计模式了,但是想写对单例模式真的很难,下面看下单例模式的几种写法及其存在的问题分析。饿汉式饿汉式是最常见也是最不需要考虑太多的单例模式,因为本就是线程安全的,饿汉式也就是在类被加载的时候就创建实例对象,饿汉式的代码如下:public class Singleton { private static Singleton singleton = new Singleton(); /** * 私有构造函数 */原创 2021-02-20 20:49:18 · 196 阅读 · 0 评论 -
Java switch支持类型详解
switch支持哪些类型?(1)最早时,只支持int、char、byte、short这样的整型的基本类型或对应的包装类型Integer、Character、Byte、Short常量,包装类型最终也会经过拆箱为基本类型,本质上还是只支持基本类型(2)JDK1.5开始支持enum,原理是给枚举值进行了内部的编号,进行编号和枚举值的映射(3)1.7开始支持String,但不允许为null,原理是借助 hashcode( ) 来实现。我们首先看下Jdk的官方文档。官方文档中对于switch有如下描述。原创 2021-01-27 19:49:04 · 4341 阅读 · 1 评论 -
Java switch及tableswitch、lookupswitch介绍
在Java中switch的形式:switch(key){ case num1: //可以加入自己的业务逻辑 break; case num2: //可以加入自己的业务逻辑 break; default: //可以加入自己的业务逻辑 break;}上述代码中switch(key)中的key可以是什么类型?(1)最早时,只支持int、char、byte、short这样的整型原创 2021-01-26 23:36:28 · 1325 阅读 · 1 评论 -
Leetcode对称二叉树
题目描述给定一个二叉树,检查它是否是镜像对称的。例如,二叉树[1,2,2,3,4,4,3]是对称的。但是下面这个[1,2,2,null,3,null,3]则不是镜像对称的:假设二叉树的节点定义如下所示:public class TreeNode { public int val; public TreeNode left; public TreeNode right; public TreeNode() { } pub...原创 2021-01-19 21:08:36 · 333 阅读 · 0 评论 -
ByteBuf 内部结构设计
一、首先介绍下 ReferenceCounted 接口public interface ReferenceCounted { /** * 返回对象的引用数量,如果返回0,表示这个对象已经被释放 */ int refCnt(); /** * 引用计数加 1 */ ReferenceCounted retain(); /** * 引用计数加 increment */ ReferenceCount原创 2020-12-09 23:53:05 · 199 阅读 · 0 评论 -
Class.forName和ClassLoader
Java类加载过程装载:通过累的全限定名获取二进制字节流,将二进制字节流转换成方法区中的运行时数据结构,在内存中生成Java.lang.class对象链接:执行下面的校验、准备和解析步骤,其中解析步骤是可以选择的; 校验:检查导入类或接口的二进制数据的正确性;(文件格式验证,元数据验证,字节码验证,符号引用验证) 准备:给类的静态变量分配并初始化存储空间; 解析:将常量池中的符号引用转成直接...原创 2020-12-09 12:16:40 · 272 阅读 · 0 评论 -
JDK源码阅读-Reference
Java最初只有普通的强引用,只有对象存在引用,则对象就不会被回收,即使内存不足,也是如此,JVM会爆出OOME,也不会去回收存在引用的对象。如果只提供强引用,我们就很难写出“这个对象不是很重要,如果内存不足GC回收掉也是可以的”这种语义的代码。Java在1.2版本中完善了引用体系,提供了4中引用类型:强引用,软引用,弱引用,虚引用。使用这些引用类型,我们不但可以控制垃圾回收器对对象的回收策略,同时还能在对象被回收后得到通知,进行相应的后续操作。引用与可达性分类Java目前有4中引用类型:转载 2020-12-08 22:36:27 · 144 阅读 · 0 评论 -
JVM源码分析之堆外内存完全解读
广义的堆外内存说到堆外内存,那大家肯定想到堆内内存,这也是我们大家接触最多的,我们在jvm参数里通常设置-Xmx来指定我们的堆的最大值,不过这还不是我们理解的Java堆,-Xmx的值是新生代和老生代的和的最大值,我们在jvm参数里通常还会加一个参数-XX:MaxPermSize来指定持久代的最大值,那么我们认识的Java堆的最大值其实是-Xmx和-XX:MaxPermSize的总和,在分代算法下,新生代,老生代和持久代是连续的虚拟地址,因为它们是一起分配的,那么剩下的都可以认为是堆外内存(广义的)了,这转载 2020-12-08 21:47:16 · 248 阅读 · 0 评论 -
leetcode-142.环形链表II
给定一个链表,返回链表开始入环的第一个节点。如果链表无环,则返回null。为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。注意,pos 仅仅是用于标识环的情况,并不会作为参数传递到函数中。说明:不允许修改给定的链表。进阶:你是否可以使用 O(1) 空间解决此题?示例 1:输入:head = [3,2,0,-4], pos = 1输出:返回索引为 1 的链表节点解释:链表中...原创 2020-11-19 12:48:54 · 190 阅读 · 0 评论 -
类关系总结
泛化关系(generalization)类的继承结构表现在UML中为:泛化(generalize)与实现(realize):继承关系为 is-a的关系;两个对象之间如果可以用 is-a 来表示,就是继承关系:(..是..)eg:自行车是车、猫是动物泛化关系用一条带空心箭头的直接表示;如下图表示(A继承自B)注:最终代码中,泛化关系表现为继承非抽象类实现关系(realize)实现关系用一条带空心箭头的虚线表示;eg:”车”为一个抽象概念,在现实中并无法直接用来定义对象;只有原创 2020-07-23 23:35:21 · 497 阅读 · 0 评论 -
Thread类源码解读
本文源码基于jdk1.8 。一、创建线程有哪几种方式(实现Runnable接口和继承Thread类)Runnable接口我们看Thread类的定义知道,它实现了Runable接口public class Thread implements Runnable { ...}而Runnable接口的定义如下:@FunctionalInterfacepublic interface Runnable { public abstract void run();}.原创 2020-06-11 18:55:41 · 699 阅读 · 0 评论 -
ThreadLocal探究
ThreadLocal为Java并发提供了一个新的思路, 它用来存储Thread的局部变量, 从而达到各个Thread之间的隔离运行。它被广泛应用于框架之间的用户资源隔离、事务隔离等。但是用不好会导致内存泄漏, 本文重点用于对它的使用过程的疑难解答, 相信仔细阅读完后的朋友可以随心所欲的安全使用它。一、内存泄漏原因探索ThreadLocal操作不当会引发内存泄露,最主要的原因在于它的内...转载 2019-12-02 10:29:57 · 401 阅读 · 0 评论 -
【JDK1.8】Future<V>
一、方法如下: 二、方法解释boolean cancel(boolean mayInterruptIfRunning);1、试图取消此任务的执行,如果这个任务已经完成、已经被取消或者由于其他原因导致该任务不能取消,会执行失败(返回false)。如果任务已经2、被成功取消,没有开始执行的任务不再被执行。如果这个任务已经开始,然后参数 mayInterruptIfRu...原创 2019-12-03 20:14:11 · 451 阅读 · 0 评论