
Java
文章平均质量分 76
Shawn Jeon
Contact e-mail: shawnjeon@163.com
展开
-
Java设计模式之(代理模式)
Java代理模式Java代理模式静态代理:JDK代理/接口代理(动态代理):CGlib代理(动态代理):Java代理模式代理模式的基本介绍为一个对象提供一个替身, 控制该对象的访问. 即通过代理对象访问目标对象被代理的对象可以是远程对象, 创建开销大的对象或需要安全控制的对象代理模式主要有三种形式: 静态代理, JDK代理/接口代理(动态代理)和 CGlib代理(可在内存动态的创建对象, 而不需要实现接口)静态代理:特点: 代理对象与目标对象实现同一个接口, 然后通过调用相同的方原创 2022-01-11 20:13:57 · 407 阅读 · 0 评论 -
Netty(四)
Netty 四RPC基本介绍RPC基本介绍RPC(Remote Procedure Call 远程过程调用)是一个计算机通信协议. 用于在一个程序调用执行另一个程序的子程序(如方法)两个或多个程序部署在不同的服务器上, 只要都实现了 RPC, 互相之间调用方法是和本地调用一样RPC中, Client叫服务消费者, Server叫服务提供者常见的 RPC框架有: 阿里的 Dubbo, Google的 gRPC, Go语言的 rpcx, Apache的 thrift, Spring Cloud原创 2022-01-10 21:25:20 · 1326 阅读 · 0 评论 -
Netty(三)
Netty 三Netty Handler的调用机制Netty的编& 解码ByteToMessageDecoder解码器(继承自 ChannelOutboundHandlerAdapter)ReplayingDecoder解码器(继承自 ByteToMessageDecoder)整合 Log4j到 Netty便于排查问题Protobuf(全称为 Google Protocol Buffers)TCP粘包和拆包基本介绍Netty Handler的调用机制ChannelHandler充当处理入站&a原创 2022-01-08 13:31:09 · 566 阅读 · 0 评论 -
Netty(二)
Netty 二Netty模块组件Netty模块组件ServerBootstrap& Bootstrap:在 Netty, ServerBootstrap类是服务端的启动引导类, Bootstrap类是客户端的启动引导类. 主要作用是配置整个 Netty程序常见方法:public ServerBootstrap group(EventLoopGroup parentGroup, EventLoopGroup childGroup), 该方法用于服务器端设置两个 EventLoopGr原创 2022-01-05 22:03:52 · 486 阅读 · 0 评论 -
Netty(一)
Netty 一概述版本架构设计Reactor模式又分3种实现概述Netty是一个异步事件驱动的网络应用框架, 可以快速开发高性能服务器和客户端Netty对 JDK的 NIO API进行了封装, 解决了 Epoll Bug, 导致 Selector空轮询的问题& 改善了 NIO的使用繁琐& 难的等问题官网: https://netty.io版本版本分为 netty3.x, netty4.x和 netty5.x. 其中5.x, 出现重大 bug, 已被官网废弃, 目前推荐使用原创 2022-01-02 15:21:35 · 769 阅读 · 0 评论 -
并发编程(十)
Concurrency Programming 十自定义线程池例子1自定义线程池例子2自定义线程池例子1class Pool { // 1. 连接池大小 private final int poolSize; // 2. 连接对象数组 private Connection[] connections; // 3. 连接状态数组 0 表示空闲, 1 表示繁忙 private AtomicIntegerArray states; // 4. 构造方法原创 2021-05-30 18:38:40 · 153 阅读 · 0 评论 -
并发编程(九)
Concurrency Programming 九共享模型之不可变可变和不可变类的使用例子不可变设计: 保护性拷贝(Defensive Copy)无状态类设计享元模式(Flyweight Pattern), 归类 Structual Patterns共享模型之不可变可变和不可变类的使用例子SimpleDateFormat日期格式化类, 由于是线程不安全的, 所以多线程调用时, 会时不时的抛异常 SimpleDateFormat sdf = new SimpleDateFormat原创 2021-05-25 20:07:45 · 248 阅读 · 0 评论 -
并发编程(八)
Concurrency Programming 八无锁并发: CAS(Compare And Swap)原子整数类原子引用类原子数组类原子字段更新器类原子累加器类Unsafe无锁并发: CAS(Compare And Swap)可在多核 CPU环境下无阻塞的方式来保证原子性. 它不是通过加锁的方式来保护共享变量的线程安全*特点: CAS适用于多核 CPU, 同时线程数不能多于核数的环境原理比较:悲观锁(synchronized/ReentrantLock): 当前线程抢到锁, 则其它线程会原创 2021-05-16 17:03:14 · 115 阅读 · 0 评论 -
并发编程(七)
Concurrency Programming 七Java JMM(Java Memory Model, 内存模型)可见性有序性volatile原理原子性终止模式之两阶段终止模式同步模式之 BalkingJava JMM(Java Memory Model, 内存模型)JMM定义了主存, 工作内存(抽象概念). 底层对应着 CPU寄存器, 缓存, 硬件内存, CPU指令优化等JMM体现在以下几个方面原子性: 保证指令不会受到线程上下文切换的影响可见性: 保证指令不会受 CPU缓存的影响有序原创 2021-05-06 21:13:21 · 135 阅读 · 1 评论 -
并发编程(六)
Concurrency Programming 六同步模式之顺序控制1. 固定运行顺序1.1 wait& notify版1.2 park& unpark版2. 交替输出2.1 wait& notify版2.2 ReentrantLock条件变量版2.3 park& unpark版同步模式之顺序控制1. 固定运行顺序1.1 wait& notify版public class App { private static Object obj = new O原创 2021-03-13 20:38:13 · 142 阅读 · 0 评论 -
并发编程(五)
Concurrency Programming 五死锁活锁饥饿ReentrantLock可重入可打断锁超时通过 ReentrantLock解决哲学家就餐问题公平锁条件变量死锁多个同步块使用同一个锁对象, 会严重降低程序的并发量. 此时可以通过多把锁(锁颗粒度细分化)方式, 给每个同步块(功能块)都分配专有锁对象, 来提升并发量. 但同一个线程获取多把锁(多个 synchronized同步块), 会容易引起死锁死锁演示代码 1:public class App { public原创 2021-03-12 21:21:29 · 119 阅读 · 0 评论 -
并发编程(四)
Concurrency Programming 四wait& notifywait& notify简单示例park& unparkpark& unpark原理wait& notify和 park& unpark的区别同步模式之保护性暂停异步模式之生产者/消费者wait& notify方法功能说明void wait()释放对象锁, 并将当前线程加到 Monitor.WaitSet内(阻塞等待)void notify()随原创 2021-03-10 19:16:14 · 171 阅读 · 0 评论 -
并发编程(三)
Concurrency Programming 三synchronized的3种锁1. 重量级锁: Monitor2. 轻量级锁2.1 锁膨胀(轻量级锁变为重量级锁)2.2 自旋优化(Adaptive Spinning)3. 偏向锁(Biased Locking)3.1 撤销3.2 批量重偏向3.3 批量撤销3.4 锁消除优化(Lock Elimination)3.5 锁粗化优化(Lock Coarsening)synchronized的3种锁偏向锁 2. 轻量级锁 3. 重量级锁1. 重量级锁:原创 2021-03-08 20:16:33 · 237 阅读 · 2 评论 -
并发编程(二)
Concurrency Programming 二并发之共享模型应用之互斥变量的线程安全常见线程安全类并发之共享模型临界区(Critical Section): 在一段代码块内, 存在多线程读写共享资源的操作, 称此段代码块为临界区竞争条件(Race Condition), 竞态条件: 不同的代码, 多线程读写相同的共享资源时, 由于执行顺序不同(字节码指令交错), 而导致结果无法预测, 称为发生了竞态条件应用之互斥互斥(Mutex): 通过竞争独占使用临界区, 同一时刻, 保证只能有一个线原创 2021-03-06 22:49:43 · 2316 阅读 · 9 评论 -
并发编程(一)
Concurrency Programming 一进程& 线程并发(Concurrent)& 并行(Parallel)同步(Synchronous)& 异步(Asynchronous)线程的五种状态(操作系统层面描述线程对象)线程的六种状态(Java API层面描述线程对象)创建线程实例线程阻塞直到获取结果(同步等待)线程类常用方法例子进程& 线程进程: 进程是用来加载指令, 管理内存和 IO的. 当一个程序被运行, 同时, 程序代码会从磁盘加载到内存, 这就是开启了原创 2021-03-06 09:37:37 · 261 阅读 · 3 评论 -
Java-AIO
Java AIOAIO概述Path接口Paths工具类Files工具类使用例子AIO概述AIO(Asynchronous IO)是 Java 1.7之后引入的包. 特点是异步非阻塞, 属 NIO的扩展, 又称 NIO.2主要新增 Path接口, Paths和 Files工具类Path接口java.nio.file.Path代表一个平台无关的路径, 表示目录结构和指定文件的位置常用方法:方法说明boolean isAbsolute()判断是否为绝对路径Path原创 2021-02-27 18:42:59 · 243 阅读 · 2 评论 -
Java-NIO
Java NIONIO概述NIO与传统 IO的区别通道(Channel)直接与非直接缓冲区通道& 缓冲区(Buffer)NIO非阻塞式网络通信阻塞式例子非阻塞式管道(Pipe)NIO概述Java NIO(New IO, Non-Blocking IO)是从 Java 1.4开始引入的全新的 IO. 特点是同步非阻塞, 面向缓冲区的NIO与传统 IO的区别IONIO面向流(Stream Oriented)单向的面向缓冲区(Buffer Oriented)双向的阻原创 2021-02-21 18:58:38 · 641 阅读 · 12 评论 -
Java-网络编程
Java TCP& UDP& URL网络层级标准(协议)Socket编程TCP网络通信UDP网络通信URL编程网络层级标准(协议)ISO七层模型: 过于理想化, 未能在因特网上进行广泛推广TCP/IP四层模型: ISO七层模型的简化版, 事实上的国际标准IP地址:计算机(通信实体)在 Internet上的唯一的标识IP地址分为: IPV4和 IPV6IPV4: 4个0~255的组成, 共4个字节, 约有42亿个IPV6: 8个无符号整数, 每个整数用四个十六进制位原创 2020-12-20 21:04:27 · 171 阅读 · 0 评论 -
Java-BIO
Java BIO概述IO流的分类文件流(节点流)缓冲流转换流标准输入& 输出流打印流数据流对象流随机存取文件流概述全程为 Block Input/Output(同步阻塞式输入/输出), 指的就是传统 IO, 是用于处理设备之间的数据传输. 如 读写文件, 网络通讯等数据的输入或输出操作是以流(Stream)的方式进行IO流的分类按照操作数据的单位: 字节流(8bit), 字符流(16bit)字节流: 非文本文件, 就是按照二进制形式进行读写操作. 如 .mp3,.avi,.r原创 2020-11-30 22:33:50 · 179 阅读 · 0 评论 -
Java-List& Set& Map
List& Set& MapArrayList / LinkedList / Vector特点及比较ArrayList特点:LinkedList特点:Vector特点:MapHashMap / LinkedHashMap / TreeMap / Hashtable / Properties特点及比较HashMap特点:LinkedHashMap特点:TreeMap特点:Hashtable特点:Properties特点:HashSet / LinkedHashSet / TreeSet特点及比原创 2020-11-23 21:02:44 · 167 阅读 · 1 评论 -
算法-马踏棋盘算法
马踏棋盘算法概述概述马踏棋盘算法也被称为骑士周游问题, 规则是将马随机放在国际象棋的6x6棋盘(board[05][05])的某个方格中, 马儿走棋规则(马走日字)进行移动, 且每个方格只进入一次, 走遍所有方格代码思路深度优先搜索(Depth First Search): 每当走到尽头未走完所有方格, 便会回退, 也就是会发生大量的回溯使用贪心算法(Greedy algorithm), 优化深度优先搜索时产生的回溯代码实现public class HorseChessbo原创 2020-11-14 19:49:05 · 659 阅读 · 1 评论 -
算法-最短路径算法(弗洛伊德算法 Floyd`s algorithm)
Floyd`s algorithm概述最短路径问题概述弗洛伊德算法(Floyd’s algorithm)也是最短路径算法, 用于计算图中各个顶点之间的最短路径. 与迪杰斯特拉算法(Dijkstra’s algorithm)不同的是, 迪杰斯特拉算法是指定某一个顶点到其它顶点的最短路径, 而弗洛伊德算法是每一个(所有)顶点到其它顶点的最短路径最短路径问题胜利乡有7个村庄(A,B,C,D,E,F,G)各个村庄的距离用边线权值来表示, 比如 A-B距离5公里计算出各个村庄到其它各个村庄的最原创 2020-11-13 19:17:47 · 885 阅读 · 0 评论 -
算法-最短路径算法(迪杰斯特拉算法 Dijkstra`s algorithm)
Dijkstra Algorithm概述最短路径问题概述迪杰斯特拉算法(Dijkstra Algorithm)是最短路径算法, 用于计算一个节点到其它节点的最短路径. 它的主要特点是以起始点为中心向外层层扩展(广度优先搜索思想), 直到扩展到终点为止最短路径问题战争时期, 胜利乡有7个村庄(A,B,C,D,E,F,G), 现在有六个邮差, 从 G点出发, 需要分别把邮件分别送到 A,B,C,D,E,F,G六个村庄各个村庄的距离用边线权值来表示, 比如 A-B距离5公里计算出 G村庄到其原创 2020-11-12 20:22:07 · 366 阅读 · 0 评论 -
算法-最小生成树算法(克鲁斯卡尔算法 Kruskal`s algorithm)
Kruskal`s algorithm概述公交站问题概述克鲁斯卡尔算法(Kruskal`s algorithm)也是求最小生成树的算法, 也就是在包含 n个顶点的带权无向连通图中, 找出(n-1)条边的最小耗费生成树(Minimum Cost Spanning Tree), 简称 MST克鲁斯卡尔算法的时间复杂度为 O(eloge) e为网中的边数基本思想: 将所有的边, 按照权值从小到大进行排序, 并保证边的终点不构成回路(指每个边的终点不允许重合)公交站问题某城市有7个居民区(A,B,原创 2020-11-11 20:45:26 · 1533 阅读 · 2 评论 -
算法-最小生成树算法(普里姆算法 Prim`s algorithm)
Prim’s algorithm概述修路问题概述普里姆算法(Prim’s algorithm)是求出最小生成树的算法, 也就是在包含 n个顶点的带权无向连通图中, 找出(n-1)条边的最小耗费生成树(Minimum Cost Spanning Tree), 简称 MST普里姆算法的时间复杂度为: 邻接矩阵 O(v^2), 邻接表 O(elog2v) e为网中的边数修路问题有叫(A,B,C,D,E,F,G)的7个村庄, 现在需要将这7个村庄通过修路连通. 各个村庄的距离用边线权值来表示, 比如原创 2020-11-10 19:54:33 · 3961 阅读 · 1 评论 -
算法-贪心算法(Greedy algorithm)
Greedy Algorithm概述贪心算法最佳应用-集合覆盖两种方式概述贪心算法(Greedy Algorithm), 又称贪婪算法. 此算法对问题进行求解时, 在每一步选择中都采取最好或者最优(即最有利)的选择, 从而希望能够导致结果是最好或者最优的算法贪心算法最佳应用-集合覆盖假设有多个需付费的广播台, 及各个广播台有限制, 只能传递信号到部分区域. 问题: 如何选择最少的广播台, 让所有的地区都可以接收到广播信号广播台可覆盖地区K1北京, 上海, 天津K原创 2020-11-09 20:32:59 · 476 阅读 · 0 评论 -
算法-字符串匹配算法(暴力匹配算法& KMP算法)
Brute Force Match Algorithm& KMP Algorithm暴力匹配算法(Brute Force Match Algorithm)KMP算法(KMP Algorithm)暴力匹配算法(Brute Force Match Algorithm)从原文字符串 str1中匹配, 子字符串 str2如果当前字符匹配成功, 即 str1[i]==str2[j], 则 i++; j++; 继续匹配下一个字符如果当前字符匹配失败, 则 i=i-(j-1); j=0; 也就是每次原创 2020-11-08 17:58:17 · 258 阅读 · 0 评论 -
算法-分治算法& 动态规划算法
Divide and Conquer Algorithm& Dynamic Programming Algorithm分治算法概述分治步骤分治算法最佳实践-汉诺塔动态规划算法概述动态规划算法最佳实践-背包问题分治算法概述分治算法(Divide and Conquer Algorithm)是把一个复杂的问题分成多个小问题, 再继续分成更小的, 直到问题简单到很容易求解为止, 最后将各问题的解合并的算法分治步骤分治法在每一层递归上都有的三个步骤:分解: 将原问题分解为若干个规模较小,原创 2020-11-07 21:30:28 · 239 阅读 · 0 评论 -
数据结构-图
Graph概述2种表示方式两种访问策略由于线性表和树结构都局限于一个直接前驱和一个直接后继的关系, 无法表示多对多的关系. 此时通过图来实现概述图是一种数据结构, 其中节点可以有零个或多个相邻节点. 节点与节点之间的的连接称为边. 节点也可以称为顶点图的常用概念:顶点(Vertex)边(Edge)路径: 比如从 D->C的路径有2个(1) D->B->C(2) D->A->B-C无向图: 顶点之间的连接没有方向, 比如 A-B, 既可原创 2020-11-06 20:59:33 · 266 阅读 · 0 评论 -
数据结构-B树(六)
23 tree, 234 tree, B tree, B+tree, B*tree概述23树& 234树(23 tree& 234 tree)B+树(B+tree)B*树(B*tree)二叉树的问题是当数据量多时, 容易产生海量节点, 会直接引起树的高度变大, 导致整体性能下降. 此种情况的解决方案就是多路查找树, 简称多叉树概述B树(B tree, Balanced tree), 属于多叉树(节点的路径可能不止两个), 它通过重新组织节点, 降低树的高度, 且减少 I/O次数来原创 2020-11-05 20:42:37 · 449 阅读 · 0 评论 -
数据结构-平衡二叉树(五)
AVL Binary Tree概述实例代码当创建二叉树时添加的首个节点相对小于整个数列时, 会引起整个二叉树的左右节点不平衡, 严重影响查询速度. 此种情况的解决方案就是平衡二叉树概述平衡二叉树也叫平衡二叉搜索树(Self-balancing binary search tree), 又被称为 AVL树, 可以保证查询效率较高平衡二叉树的常见实现有红黑树, AVL, 替罪羊树, Treap, 伸展树等* 特点: 一棵的左右两个子树的高度差的绝对值不超过1, 并且左右两个子树都是一棵平衡原创 2020-11-04 20:33:00 · 301 阅读 · 0 评论 -
数据结构-二叉排序树(四)
Binary Sort Tree概述概述二叉排序树(BST, Binary Sort Tree), 任何一个非叶子节点相比左子节点大, 相比右子节点小.* 如果值相同, 即可以放左或右子节点## 实例代码public class BinarySortTreeApp { public static void main(String[] args) { int[] arr = {7, 3, 10, 12, 5, 1, 9, 11, 13}; BinaryS原创 2020-11-03 20:16:07 · 142 阅读 · 0 评论 -
算法-赫夫曼编码
Huffman Coding简介3种编码原理代码实现简介赫夫曼编码是可变字长编码(VLC)的一种, 常用于数据文件压缩. 其压缩通常在20%~90%之间3种编码原理在通信领域中信息的处理方式定长编码:变长编码:* 变长编码的缺点是编码格式重叠无法避免, 即不能匹配重复的编码3) 赫夫曼编码:代码实现字符串解压缩public class HuffmanCodeApp { public static void main(String[] args)原创 2020-11-02 19:47:14 · 1357 阅读 · 1 评论 -
数据结构-赫夫曼树(三)
Huffman Tree|哈夫曼树|霍夫曼树概念概念路径和路径长度:路径: 从一个节点往下可以达到的子节点或子子节点之间的通路路径长度: 通路中分支的数目称之为路径长度. 根节点到指定节点的路径长度为 L层-1节点的权及带权路径长度:节点的权: 为每个节点定义字段赋予有着某种含义的数值带权路径长度: 从根节点到该节点之间的路径长度和该节点的权的乘积WPL(Weighted path length): 所有叶子节点的带权路径长度之和WPL = 132 + 72 + 82原创 2020-11-01 20:27:01 · 588 阅读 · 2 评论 -
数据结构-顺序存储二叉树& 线索化二叉树(二)
Binary Tree顺序存储二叉树线索化二叉树(Threaded Binary Tree)顺序存储二叉树节点编号规则:顺序存储二叉树通常只会考虑完全二叉树第 n个元素的左子节点为2*n+1第 n个元素的右子节点为2*n+2第 n个元素的父节点为(n-1)/2* n表示二叉树的第几个元素(起始编号从0开始)通过以上规则, 可以将树和数组互相转换的public class ArrayToBinaryTreeApp { public static void main(St原创 2020-10-31 21:09:53 · 207 阅读 · 0 评论 -
数据结构-二叉树(一)
Binary Tree树(Tree)二叉树(Binary Tree)三种遍历查找节点删除节点树(Tree)树与数组& 链表对比数组存储优点: 通过下标访问元素, 速度快缺点: 检索具体元素值, 或数组底部或元素与元素之间插入新元素或删除元素, 效率都很低链式存储优点: 插入和删除效率较好缺点: 检索效率很低树存储增删改查4样性能都比较好二叉树(Binary Tree)每个节点最多只能有两个子节点, 一个左节点一个右节点如果二叉树的所有叶子节原创 2020-10-30 19:55:56 · 132 阅读 · 0 评论 -
数据结构-哈希表
Hash table哈希表(Hash table)哈希表(Hash table)又称散列表, 它是键值对数据结构, 也就是 key& value的映射集, 其中键是通过散列计算后, 将映射到表中某一个位置, 以此加快查找的速度. 此映射函数叫做散列函数, 存放值的数组叫做散列表public class HashtableApp { public static void main(String[] args) { HashTab hashTab = new Hash原创 2020-10-29 20:22:34 · 212 阅读 · 2 评论 -
算法-查找算法(顺序查找,二分查找,插值查找,斐波那契查找)
Search Algorithm:Sequence Search, Binary Search, Interpolation Search, Fibonacci Search线性查找算法(Sequence Search)二分查找(Binary Search)插值查找(Interpolation Search)斐波那契(黄金分割法)查找(Fibonacci Search)线性查找算法(Sequence Search)又称线性查找时间复杂度为线性阶 O(n)public class Sequenc原创 2020-10-24 20:57:04 · 241 阅读 · 0 评论 -
算法-排序算法(冒泡排序,选择算法,插入排序,希尔排序,快速排序,归并排序,基数排序,堆排序)
Sort Algorithm:Bubble Sort, Selection Sort, Insertion Sort, Shell`s Sort, Quick Sort, Merge Sort, Radix Sort排序算法概述排序的分类冒泡排序(Bubble Sort)选择排序(Selection Sort)插入排序(Insertion Sort)希尔排序(Shell`s Sort)快速排序(Quick Sort)归并排序(Merge Sort)基数排序(Radix Sort)排序算法概述排序算法(原创 2020-10-18 16:03:02 · 667 阅读 · 0 评论 -
算法-时间频度& 时间复杂度& 空间复杂度
Temporal Frequency& Time Complexity& Space Complexity计算算法执行时间时间复杂度(Time Complexity)常数阶O(1)对数阶O(log2n)线性阶O(n)线性对数阶O(nlog2n)平方阶O(n2)立方阶O(n^3)k次方阶O(n^k)指数阶O(2^n)空间复杂度(Space Complexity)计算算法执行时间时间频度(Temporal Frequency): 一个算法所花费的时间与算法中语句的执行次数成正比. 算法中的原创 2020-10-15 19:46:48 · 2161 阅读 · 0 评论