发布了文章2019-04-25
队列是我们日常开发中经常会用到的一种数据结构,我们经常使用队列进行异步处理、系统解耦、数据同步、流量削峰、缓冲、限流等。例如,不是所有的业务都必须实时处理、不是所有的请求都必须实时反馈结果给用户、不是所有的请求都必须100%处理成功、不知道谁依赖“我”...
发布了文章2019-01-29
原文链接:[链接] 前面,我们学习了 链表 的实现,今天我们来学习链表的一个经典的应用场景——LRU淘汰算法。 缓存是一种提高数据读取性能的技术,在硬件设计、软件开发中都有着非常广泛的应用,比如常见的 CPU 缓存、数据库缓存、浏览器缓存等等。 缓存的大小有限,当...
发布了文章2019-01-25
原文链接: [链接] 前面,我们实现了 删除单链表倒数第N个节点 操作,本篇来聊聊,如何求一个链表的中间节点。 求链表的中间结点 Leetcode 876. Middle of the Linked List 给定一个非空的单链表,要求返回它的中间节点,如果中间节点有两个则返回第二个。 例如: {代...
发布了文章2019-01-25
原文链接:[链接] 前面,我们实现了 两个有序链表的合并 操作,本篇来聊聊,如何删除一个链表的倒数第N个节点。 删除单链表倒数第N个节点 Leetcode 19. Remove Nth Node From End of List 给定一个单链表,如: 1->2->3->4->5,要求删除倒数第N个节点,假...
发布了文章2019-01-18
原文链接:[链接] 前面,我们学习了 栈的实现及其应用 ,今天我们基于栈,来实现一个简单的计算器功能。 简单计算器实现 Leetcode 224. Basic Calculator 实现一个能够对简单的表达式进行计算的基础计算器。 表达式字符串包含括号 ( 、),加号(+),减号(-),非负整数...
发布了文章2019-01-14
原文链接:[链接] 前面,我们实现了两种常见的线性表 —— 顺序表 和 链表 ,本篇我们来介绍另外一种常用的线性表 —— 栈。 栈 定义 线性表中的一种特殊数据结构,数据只能从固定的一端插入数据或删除数据,另一端是封死的。 特点 FILO(First In Last Out): 先进后出...
发布了文章2019-01-08
原文链接:[链接] 前面,我们实现了链表的 环检测 操作,本篇来聊聊,如何合并两个有序链表。 有序链表合并 Leetcode 21:Merge Two Sorted Lists 示例 {代码...} 使用虚假的Head节点 定义一个临时虚假的Head节点,再创建一个指向tail的指针,以便于在尾部添加节点。 ...
发布了文章2019-01-04
前面,我们实现了链表的 反转 操作,本篇来聊聊,如何检测单链表中的环。 链表环检测 Leetcode 141: Linked List Cycle 有两种方法来解决这个问题: 使用Hashing 思路 定义一个Map,当循环遍历Linked List时,依次将Node放入Map中,等到循环到下一轮时,检查Node是否...
发布了文章2019-01-04
前面我们实现了几种常见的 链表 ,接下来,我们来聊聊如何实现 单链表 的反转? 链表反转 Leetcode 206: Reverse Linked List 示例: {代码...} 我们可以通过循环遍历和递归这两种方式来实现链表的反转。 遍历 思路 定义三个指针,分别为prev、curr、next,然后遍历...
发布了文章2018-12-29
逻辑结构上一个挨一个的数据,在实际存储时,并没有像顺序表那样也相互紧挨着。恰恰相反,数据随机分布在内存中的各个位置,这种存储结构称为线性表的链式存储。
发布了文章2018-12-29
原文链接:[链接] 线性表 定义 将具有线性关系的数据存储到计算机中所使用的存储结构称为线性表。 线性,是指数据在逻辑结构上具有线性关系。 <!--more--> 分类 逻辑结构上相邻的数据在物理结构存储分两种形式: 数据在内存中集中存储,采用顺序表示结构,称为...
发布了文章2018-11-01
前面的一些章节,我们分析了Netty的三大组件 —— Channel 、EventLoop、Pipeline ,对Netty的工作原理有了深入的了解。在此基础上,我们来分析一下当Netty服务端启动后,Netty是如何处理新连接接入的。
发布了文章2018-11-01
原文链接:[链接] 前面 ,我们分析了Netty Pipeline的初始化及节点添加与删除逻辑。接下来,我们将来分析Pipeline的事件传播机制。 Netty版本:4.1.30 inBound事件传播 示例 我们通过下面这个例子来演示Netty Pipeline的事件传播机制。 {代码...} 源码 通过 telnet ...
发布了文章2018-11-01
前面,我们分析了Netty EventLoop的 创建 与 启动 原理,接下里我们来分析Netty中另外两个重要组件—— ChannelHandler 与 Pipeline。Netty中I/O事件的传播机制均由它负责,下面我们来看看它是如何实现的。
发布了文章2018-11-01
在之前分析 Channel绑定 的文章中,提到过下面这段代码,先前只讲了 channel.bind() 绑定逻辑,跳过了execute() 接口,现在我们以这个为例,开始分析NioEventLoop的execute()接口,主要逻辑如下:
发布了文章2018-11-01
原文链接:[链接] 前面 ,我们分析了Netty中的Channel组件,本篇我们来介绍一下与Channel关联的另一个核心的组件 —— EventLoop。 Netty版本:4.1.30 概述 EventLoop定义了Netty的核心抽象,用于处理网络连接生命周期中所有发生的事件。 我们先来从一个比较高的视角来...
发布了文章2018-11-01
原文地址:[链接] 前面,我们大致了解了Netty中的几个核心组件。今天我们就来先来介绍Netty的网络通信组件,用于执行网络I/O操作 —— Channel。 Netty版本:4.1.30 概述 数据在网络中总是以字节的形式进行流通。我们在进行网络编程时选用何种传输方式编码(OIO、NIO等...
发布了文章2018-09-30
Java11 已于 2018/09/25 成功发布,不过目前 绝大多数人 在生产环境仍旧使用的是Java 8。这篇以案例为主的教程涵盖了从 Java 9 到 Java 11的绝大多数重要的语法与API特性。让我们开始吧!
赞了文章2018-09-11
同步IO和异步IO,阻塞IO和非阻塞IO分别是什么,到底有什么区别?不同的人在不同的上下文下给出的答案是不同的。所以先限定一下本文的上下文。
发布了文章2018-04-16
在这一系列文章的最开始部分,我们提到过区块链是一个分布式的数据库。那时候,我们决定跳过"分布式"这一环节,并且聚焦于"数据存储"这一环节。到目前为止,我们几乎实现了区块链的所有组成部分。在本篇文章中,我们将会涉及一些在前面的文章中所忽略的一些机制,并...