![](https://img-blog.csdnimg.cn/20201014180756922.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
基础知识
文章平均质量分 79
Shawn Jeon
Contact e-mail: shawnjeon@163.com
展开
-
Cats(二)
Cats 二单位元(Identity Law)结合律(Associative Law)Monoid(幺半群)& Semigroup(半群)Monoid(type class)Semigroup(type class)cats.Monoid& cats.Semigroup(type class)cats: Monoid Instancescats: Monoid Syntaxcats: Exercise: Adding All The Things单位元(Identity Law)单位元原创 2022-03-04 20:31:14 · 722 阅读 · 0 评论 -
Cats(一)
Cats 一Type classType class(接口)Type Class Instances(隐式值)Type Class Interface(带隐式参数的函数)使用 Type Class练习: 实现一个PrintableMeet Catscats.Show(type class)cats.Eq(type class)Controlling Instance Selection(控制 Instance的选择)Type classType class模式主要由3个部分组成:Type cla原创 2022-02-23 21:36:53 · 623 阅读 · 0 评论 -
Scala并发编程(二)之 Akka
Scala并发编程之 Akka概述Akka通信过程Actor Path入门案例定时任务案例两个进程之间的通信案例简易版 Spark通信框架实现案例概述Akka是使用 Scala开发的库, 它是基于事件驱动的, 用于构建高并发项目的工具包Akka特性:提供基于异步非阻塞, 高性能的事件驱动编程模型内置容错机制, 允许 Actor出错时, 进行恢复或重置轻量级的事件处理(每 GB堆内存几百万 Actor. *轻量级事件处理和重量级的划分, 主要看是否依赖操作系统和硬件, 依赖是重量级,原创 2022-02-12 18:30:02 · 1498 阅读 · 0 评论 -
Scala(六)
Scala 六异常处理隐式转换泛型协变和逆变泛型上下限(上下界)上下文限定异常处理为了不让程序异常终止, 使用 try-catch语句. 将可能会出异常的代码封装在 try块中, 当发生异常时, catch捕获异常, 并处理Scala没有checked(编译期)异常, 而异常都是Runtime异常运行的时候捕获当异常发生, catch子句, 是按顺序捕捉的. 因此, 范围小的异常类写在前面, 范围大的异常类写在后面, 一旦前面的异常被捕获, 写在后面的异常类, 即使也在范围内也不会被捕获fi原创 2022-02-03 19:55:31 · 514 阅读 · 0 评论 -
Scala(五)
Scala 五模式匹配模式匹配-类型模式匹配-正则表达式模式匹配-对象样例类样例对象Option类型偏函数(PartialFunction)模式匹配模式匹配时, 会从第一个 case分支开始, 如果匹配成功, 则执行对应的逻辑代码, 并结束当前模式匹配. 如果所有 case都不匹配, 那么会执行 case _分支, 类似于 Java中 default语句如果没有 case _分支, 那会抛 scala.MatchErrormatch case语句, 可以匹配任何类型, 而不单是字面量(=>原创 2022-01-31 14:51:06 · 723 阅读 · 0 评论 -
Scala(四)
Scala 四集合数组(Array/ArrayBuffer)不可变数组: Array(Scala推荐使用不可变数组可变数组: ArrayBuffer不可变数组与可变数组的转换多维数组列表(List/ListBuffer)不可变列表: List可变列表: ListBufferSet集合(Set/mutable.Set)不可变: Set可变: mutable.SetMap集合(Map/mutable.Map)不可变: Map可变: mutable.Map元组衍生集合集合计算简单函数集合高级函数WordCount原创 2022-01-27 19:24:39 · 708 阅读 · 0 评论 -
Scala(三)
Scala 三包管理面对对象类(class):封装访问权限创建对象构造器继承和多态抽象类单例对象(伴生对象)特质/特征(Trait)特质(Trait)自身类型设计模式(Design Pattern)类型检查和转换枚举类和应用类Type定义新类型包管理两种包管理风格(package):一种和 Java一样, 每一个源文件一个包(包名和源文件所在路径可以不一致, 编译后, 编译器会自动按包结构放置字节码文件), 包名用(.)进行分隔, 以表示包的层级关系 com.company.scala1-1原创 2022-01-23 16:01:57 · 476 阅读 · 0 评论 -
Scala(二)
Scala 二函数式编程Scala函数函数参数函数精简化匿名函数(Lambda)函数柯里化(Currying) &闭包(Closure)递归(Recursion)控制抽象(Control abstraction)自定义 While循环惰性加载/懒加载(Lazy loading)面向对象编程:(-) 构成问题的各个事务分解成各个对象, 建立对象的目的不是为了完成一个步骤, 而是为了描述解决问题步骤中的行为(*对象的本质: 数据和行为的一个封装)函数式编程:(-) 将问题分解成一个个步骤,原创 2022-01-19 20:42:34 · 369 阅读 · 0 评论 -
Scala(一)
Scala 一Scala简介下载安装创建 Maven项目变量和常量数据类型自动类型转换(隐式转换)强制类型转换数值类型与 String类型间的转换运算符流程控制For循环控制While和 do..While循环控制循环中断文件IO官网 https://www.scala-lang.orgScala简介Martin Odersky, 从2001年开始设计 Scala. 将函数式编程语言的特点融合到 Java中, 以此推出了两种语言 Pizza& ScalaPizza和 Scala极大地推动了原创 2022-01-15 16:32:17 · 822 阅读 · 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 · 120 阅读 · 0 评论 -
并发编程(九)
Concurrency Programming 九共享模型之不可变可变和不可变类的使用例子不可变设计: 保护性拷贝(Defensive Copy)无状态类设计享元模式(Flyweight Pattern), 归类 Structual Patterns共享模型之不可变可变和不可变类的使用例子SimpleDateFormat日期格式化类, 由于是线程不安全的, 所以多线程调用时, 会时不时的抛异常 SimpleDateFormat sdf = new SimpleDateFormat原创 2021-05-25 20:07:45 · 200 阅读 · 0 评论 -
并发编程(八)
Concurrency Programming 八无锁并发: CAS(Compare And Swap)原子整数类原子引用类原子数组类原子字段更新器类原子累加器类Unsafe无锁并发: CAS(Compare And Swap)可在多核 CPU环境下无阻塞的方式来保证原子性. 它不是通过加锁的方式来保护共享变量的线程安全*特点: CAS适用于多核 CPU, 同时线程数不能多于核数的环境原理比较:悲观锁(synchronized/ReentrantLock): 当前线程抢到锁, 则其它线程会原创 2021-05-16 17:03:14 · 91 阅读 · 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 · 116 阅读 · 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 · 116 阅读 · 0 评论 -
并发编程(五)
Concurrency Programming 五死锁活锁饥饿ReentrantLock可重入可打断锁超时通过 ReentrantLock解决哲学家就餐问题公平锁条件变量死锁多个同步块使用同一个锁对象, 会严重降低程序的并发量. 此时可以通过多把锁(锁颗粒度细分化)方式, 给每个同步块(功能块)都分配专有锁对象, 来提升并发量. 但同一个线程获取多把锁(多个 synchronized同步块), 会容易引起死锁死锁演示代码 1:public class App { public原创 2021-03-12 21:21:29 · 100 阅读 · 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 · 144 阅读 · 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 · 196 阅读 · 2 评论 -
并发编程(二)
Concurrency Programming 二并发之共享模型应用之互斥变量的线程安全常见线程安全类并发之共享模型临界区(Critical Section): 在一段代码块内, 存在多线程读写共享资源的操作, 称此段代码块为临界区竞争条件(Race Condition), 竞态条件: 不同的代码, 多线程读写相同的共享资源时, 由于执行顺序不同(字节码指令交错), 而导致结果无法预测, 称为发生了竞态条件应用之互斥互斥(Mutex): 通过竞争独占使用临界区, 同一时刻, 保证只能有一个线原创 2021-03-06 22:49:43 · 2286 阅读 · 9 评论 -
并发编程(一)
Concurrency Programming 一进程& 线程并发(Concurrent)& 并行(Parallel)同步(Synchronous)& 异步(Asynchronous)线程的五种状态(操作系统层面描述线程对象)线程的六种状态(Java API层面描述线程对象)创建线程实例线程阻塞直到获取结果(同步等待)线程类常用方法例子进程& 线程进程: 进程是用来加载指令, 管理内存和 IO的. 当一个程序被运行, 同时, 程序代码会从磁盘加载到内存, 这就是开启了原创 2021-03-06 09:37:37 · 234 阅读 · 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 · 203 阅读 · 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 · 598 阅读 · 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 · 151 阅读 · 0 评论 -
Java-BIO
Java BIO概述IO流的分类文件流(节点流)缓冲流转换流标准输入& 输出流打印流数据流对象流随机存取文件流概述全程为 Block Input/Output(同步阻塞式输入/输出), 指的就是传统 IO, 是用于处理设备之间的数据传输. 如 读写文件, 网络通讯等数据的输入或输出操作是以流(Stream)的方式进行IO流的分类按照操作数据的单位: 字节流(8bit), 字符流(16bit)字节流: 非文本文件, 就是按照二进制形式进行读写操作. 如 .mp3,.avi,.r原创 2020-11-30 22:33:50 · 155 阅读 · 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 · 143 阅读 · 1 评论 -
算法-马踏棋盘算法
马踏棋盘算法概述概述马踏棋盘算法也被称为骑士周游问题, 规则是将马随机放在国际象棋的6x6棋盘(board[05][05])的某个方格中, 马儿走棋规则(马走日字)进行移动, 且每个方格只进入一次, 走遍所有方格代码思路深度优先搜索(Depth First Search): 每当走到尽头未走完所有方格, 便会回退, 也就是会发生大量的回溯使用贪心算法(Greedy algorithm), 优化深度优先搜索时产生的回溯代码实现public class HorseChessbo原创 2020-11-14 19:49:05 · 585 阅读 · 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 · 829 阅读 · 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 · 327 阅读 · 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 · 1381 阅读 · 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 · 3713 阅读 · 1 评论 -
算法-贪心算法(Greedy algorithm)
Greedy Algorithm概述贪心算法最佳应用-集合覆盖两种方式概述贪心算法(Greedy Algorithm), 又称贪婪算法. 此算法对问题进行求解时, 在每一步选择中都采取最好或者最优(即最有利)的选择, 从而希望能够导致结果是最好或者最优的算法贪心算法最佳应用-集合覆盖假设有多个需付费的广播台, 及各个广播台有限制, 只能传递信号到部分区域. 问题: 如何选择最少的广播台, 让所有的地区都可以接收到广播信号广播台可覆盖地区K1北京, 上海, 天津K原创 2020-11-09 20:32:59 · 432 阅读 · 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 · 231 阅读 · 0 评论 -
算法-分治算法& 动态规划算法
Divide and Conquer Algorithm& Dynamic Programming Algorithm分治算法概述分治步骤分治算法最佳实践-汉诺塔动态规划算法概述动态规划算法最佳实践-背包问题分治算法概述分治算法(Divide and Conquer Algorithm)是把一个复杂的问题分成多个小问题, 再继续分成更小的, 直到问题简单到很容易求解为止, 最后将各问题的解合并的算法分治步骤分治法在每一层递归上都有的三个步骤:分解: 将原问题分解为若干个规模较小,原创 2020-11-07 21:30:28 · 210 阅读 · 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 · 223 阅读 · 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 · 353 阅读 · 0 评论 -
数据结构-平衡二叉树(五)
AVL Binary Tree概述实例代码当创建二叉树时添加的首个节点相对小于整个数列时, 会引起整个二叉树的左右节点不平衡, 严重影响查询速度. 此种情况的解决方案就是平衡二叉树概述平衡二叉树也叫平衡二叉搜索树(Self-balancing binary search tree), 又被称为 AVL树, 可以保证查询效率较高平衡二叉树的常见实现有红黑树, AVL, 替罪羊树, Treap, 伸展树等* 特点: 一棵的左右两个子树的高度差的绝对值不超过1, 并且左右两个子树都是一棵平衡原创 2020-11-04 20:33:00 · 211 阅读 · 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 · 123 阅读 · 0 评论 -
数据结构-赫夫曼树(三)
Huffman Tree|哈夫曼树|霍夫曼树概念概念路径和路径长度:路径: 从一个节点往下可以达到的子节点或子子节点之间的通路路径长度: 通路中分支的数目称之为路径长度. 根节点到指定节点的路径长度为 L层-1节点的权及带权路径长度:节点的权: 为每个节点定义字段赋予有着某种含义的数值带权路径长度: 从根节点到该节点之间的路径长度和该节点的权的乘积WPL(Weighted path length): 所有叶子节点的带权路径长度之和WPL = 132 + 72 + 82原创 2020-11-01 20:27:01 · 499 阅读 · 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 · 181 阅读 · 0 评论 -
数据结构-二叉树(一)
Binary Tree树(Tree)二叉树(Binary Tree)三种遍历查找节点删除节点树(Tree)树与数组& 链表对比数组存储优点: 通过下标访问元素, 速度快缺点: 检索具体元素值, 或数组底部或元素与元素之间插入新元素或删除元素, 效率都很低链式存储优点: 插入和删除效率较好缺点: 检索效率很低树存储增删改查4样性能都比较好二叉树(Binary Tree)每个节点最多只能有两个子节点, 一个左节点一个右节点如果二叉树的所有叶子节原创 2020-10-30 19:55:56 · 104 阅读 · 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 · 177 阅读 · 2 评论