
java
文章平均质量分 82
愤怒的可乐
主要研究NLP、深度学习、大模型。
展开
-
图解B树
引言今天去面试面试官:mysql数据库索引这么快,知道是通过什么实现的吗?我(一脸懵逼):不知道面试官淡淡的说:你心里有没有点B数概念?我:(擦,不就是不知道吗,用得着骂人吗)当场站起来走了,回去搜了一下,才知道面试官问我知不知道B-树。今天我们要介绍的就是B树,看完这篇文章之后,我相信你心里一定有B树了。B树也称B-树,它是一颗平衡的多路搜索树。我们描述一颗B树时需要指定它的...原创 2020-04-18 15:45:26 · 2092 阅读 · 2 评论 -
一文带你弄懂什么是索引二叉堆
索引二叉堆是啥?索引二叉堆又称为最小索引优先队列。它的特点是堆元素位置不变,通常改变索引的位置来实现二叉堆的结构。原创 2020-03-31 08:58:17 · 910 阅读 · 2 评论 -
十分钟弄懂什么是跳表,不懂可以来打我
今天我们来学习一种可以快速查找、插入、删除的数据结构,据说可以代替红黑树。这些都不重要,重要的是原理简单,实现起来也简单!原创 2020-03-28 13:27:41 · 29336 阅读 · 60 评论 -
一文弄懂nginx反向代理和负载均衡
文章目录基本概念常用命令查看版本号关闭nginx启动nginx重新加载配置文件配置文件全局块events块http块http全局块server块server中的location`=`无符号`~``~*``^~``@`反向代理实例细说反斜杠情形一情形二情形三情形四负载均衡实例轮询weightip_hashfair(第三方)动静分离实例基本概念Nginx (engine x) 是一个高性能的HTT...原创 2020-03-19 11:35:00 · 664 阅读 · 0 评论 -
Java实现Word画折线图(非图片)
引言最近需要实现Java在Word中画折线图功能,不能简单的生成折线图再导入。实现方法就是利用Apache poi 工具。实现的效果如下,把鼠标放上去可以显示值。比较简单,有一些坑,发出来记录一下。模板要实现上述效果需要一个Word模板,直接新建一个Word文件,插入Word内置的折线图图表即可。插入完成就是这样子:把这个模板保存为line-chart-template.docx...原创 2020-03-01 13:16:21 · 5143 阅读 · 11 评论 -
实现简单的Java内存缓存
引言实现了一个简单的内存缓存:元素个数有限能自动移除最老的条目通过插入顺序遍历它是线程安全的集合适用于读多写少的场景基于组合优于继承的思想,封装了LinkedHashMap,并且只有在写操作的时候才进行加锁。代码import java.util.*;import java.util.concurrent.locks.ReentrantLock;/** * 遍历顺序(v...原创 2019-11-28 17:27:04 · 1419 阅读 · 0 评论 -
图论算法——最短路径算法
引言在Prim算法和Kruskal算法中,我们学习了寻找加权无向图的最小生成树的Prim算法:构造最小生成树的每一步都向生成树中添加一条新的边。今天要学习类似的方法来计算最短路径——Dijkstra算法。Dijkstra算法最短路径树中的边:edgeTo[v]的值为树中连接v和它的父节点的边。最短路径树:包含了顶点s到所有可达的顶点的最短路径...原创 2019-06-10 21:02:06 · 3269 阅读 · 0 评论 -
图论算法——加权有向图的数据结构
引言要解决最短路径问题,先引入加权有向图的数据结构。这和 加权无向图的数据结构很类似。有关概念可参考博文数据结构之图的概述加权有向边package com.algorithms.graph;/** * @author yjw * @date 2019/6/5/005 */public final class DirectedEdge { /** * 边的起...原创 2019-06-05 18:11:44 · 4722 阅读 · 0 评论 -
图论算法——加权无向图的数据结构
引言我们要在一幅加权连通无向图中找到它的最小生成树。首先要考虑的是如何表示这个无向图。加权边的表示package com.algorithms.graph;/** * 带权重的无向边的数据结构(不可变类) * * @author yjw * @date 2019/5/23/023 */public final class Edge implements Comparable&...原创 2019-05-24 10:59:22 · 5783 阅读 · 5 评论 -
《Effective Java 3rd》读书笔记——创建和销毁对象
用静态工厂方法代替构造器类可以提供一个静态工厂方法(static factory method) :一个返回类的实例的静态方法。下面是来自Boolean的简单示例:public static Boolean valueOf(boolean b) { return b ? Boolean.TRUE : Boolean.FALSE;}注意这与工厂方法设计模式不同静态工厂方法与...原创 2019-05-22 22:32:42 · 384 阅读 · 0 评论 -
栈和队列的Java实现
引言因为其他文章中用到了栈和队列,有时会进行改动。因此把实现贴在这里。暂且不分析实现原理。栈的实现package com.algorithms.stack;import java.util.ConcurrentModificationException;import java.util.Iterator;import java.util.NoSuchElementException...原创 2019-05-22 18:15:08 · 1129 阅读 · 0 评论 -
图论算法——无向图的连通分量
引言深度优先搜索的一个直接应用就是找出一幅图的所有连通分量。原创 2019-05-22 19:19:37 · 32419 阅读 · 9 评论 -
图论算法——有向图中的强连通性
引言本文我们着重分析下有向图的强连通性以及其应用。强连通在一幅无向图中,如果有一条路径连接顶点v和w,则它们就是连通的;然后,在一幅有向图中,如果从顶点v有一条有向路径达到w,则顶点w是从顶点v可达的,但如果从w到达v的路径可能不存在。这两个顶点不是强连通的。如果两个顶点互相可达,则它们是强连通的。如果一幅有向图中任意两个顶点都是强连通的,则这幅有向图也是强连通的。强连通分量有向图...原创 2019-05-23 16:24:10 · 20588 阅读 · 1 评论 -
图论算法——Prim算法和Kruskal算法
引言我们要学习的第一种计算最小生成树的算法,它每一步都会为一颗生长中的树添加一条边。下面分析下算法思路思路一开始这棵树只有一个顶点,然后会向它添加V-1条边,每次总是将下一条连接树中的顶点与不在树中的顶点且权重最小的边加入树中。每次当我们向(生成)树中添加了一条边之后,也向树中添加了一个顶点。要维护一个包含所有横切边的集合,就要将连接这个顶点和其他所有不在树中的顶点的边加入优先队列。要注...原创 2019-05-24 15:56:48 · 1371 阅读 · 0 评论 -
排序算法之——三路快排分析
引言在快速排序分析中我们探讨了经典快排的实现,已经进行了一些小优化。但是若序列中包含大量重复的元素,这种情况下,快排的性能就不那么理想了。在下篇文章中我们会一起学习双基准快速排序,学习完了之后,我们再一起来看一下这三种快排算法的实际运行性能。下面开始学习三路快排的思想吧。思路将数组分为三部分,分别对应于小于、等于和大约哨兵元素v的子序列。切分方法为从左到右遍历(扫描)数组一次,维护一...原创 2019-05-10 17:49:49 · 2141 阅读 · 0 评论 -
图解二叉树的遍历
引言本文介绍了二叉树的先/中/后序遍历的递归实现和非递归实现,以及层次遍历的实现。先序遍历所谓先序遍历,就是先访问根节点,再访问左右子节点。在这些遍历策略中,左子节点的访问都在右节点访问之前。我们以这样一颗二叉树为例,其实它是更为严格的二叉搜索树。对该树进行先序遍历,输出:3 1 0 8 5 16 11 10 13 19...原创 2019-06-13 18:38:35 · 1254 阅读 · 2 评论 -
数据结构——树的概述
引言对于大量的输入数据,链表的线性访问时间太慢,不宜使用。本篇讨论一种简单的数据结构——树,它大部分操作的运行时间平均为O(logN)O(logN)O(logN)。数据结构中有很多树的结构,其中包括二叉树、二叉搜索树、2-3树、红黑树等等。基本概念树(tree)是一些节点的集合。该集合可以是空集,若不是空集,则树由称为根(root)r的节点以及0个或多个非空的子树组成。每颗子树的根就做根...原创 2019-06-11 18:36:35 · 2778 阅读 · 0 评论 -
一文弄懂Java中的四种引用类型
引言Java虚拟机会为我们管理内存,当内存不足时,通过垃圾回收算法来释放不可达的内存。作为Java程序员我们似乎不需要关注这些。但是在工作中我们可能会遇到内存充足的情况下,也会出现OutOfMemoryError。笔者就多次遇到过这种情况,有一次是加载内容过多引起的,通过Xmx2g,在分配了2G内存的情况下出现了内存溢出的问题,最后定位到了是压测的时候压测导出Excel接口没有分页导致一次...原创 2019-10-11 20:36:38 · 645 阅读 · 0 评论 -
Java线程池分析
Executor框架为了更好地控制多线程,JDK提供了一套Executor框架,可以有效地进行线程控制,其本质上就是一个线程池。其中ThreadPoolExecutor表示一个线程池。Executors类则扮演着线程池工厂的角色,通过Executors可以取得一个拥有特定功能的线程池。从上图可知,ThreadPoolExecutor类实现了Executor接口,因此,通过这个接口,任何Run...原创 2019-09-03 14:21:17 · 458 阅读 · 0 评论 -
图解双层伸展树
引言伸展树的出发点是这样的:考虑到局部性原理(刚被访问过的数据,极有可能很快地再次被访问),因此将刚被访问过的节点移(旋转)到根节点。如果没有了解过AVL树,建议先看下 图解AVL树伸展策略那么该如何旋转呢?逐层伸展联系刚刚学过的AVL树,我们可以从待访问的节点开始,逐层往上旋转。我们使用的手段无非是,当待访问节点v是左孩子,进行一次右旋操作。若是右孩子,则进行一次左旋操...原创 2019-06-26 18:04:27 · 775 阅读 · 0 评论 -
图解AVL树
引言AVL树是带有平衡条件的二叉查找树,它保证树的深度须是O(logN)O(logN)O(logN)。特性:它每个节点的左子树和右子树的高度最多差1。空树的高度定义为-1。上图中左边的树是AVL树,而右边不是。右边树左子树高度为3,右子树高度为1,相差超过1。实现树节点结构private static class Node<E> { E data; No...原创 2019-06-18 17:43:33 · 1088 阅读 · 0 评论 -
《Effective Java 3rd》读书笔记——泛型
不要使用原生类型声明中具有一个或多个类型参数的类或者接口就是泛型类或接口。泛型类和接口统称为泛型。每一种泛型都定义一个原生(态)类型,即不带任何实际类型参数的泛型名称。例如,与List<E>相对应的原生类型是List。private final Collection<Stamp> stamps = ...;通过这条声明,编译器知道stamps应该只包含Stamp实...原创 2019-06-25 22:46:53 · 520 阅读 · 0 评论 -
图解二叉查找树
引言二叉树的一个重要应用是它们在查找中的使用。二叉查找树(二叉排序树\二叉搜索树)定义:二叉查找树或者是一棵空树,或者是具有下列性质的二叉树:若左子树不空,则左子树上所有结点的值均小于它的根结点的值若右子树不空,则右子树上所有结点的值均大于或等于它的根结点的值左、右子树也分别为二叉查找树没有键值相等的节点上图中只有左边的是二叉查找树,右边的因为节点7属于根节点6的左子树,但是大...原创 2019-06-11 18:36:48 · 1480 阅读 · 3 评论 -
《Effective Java 3rd》读书笔记——对于所有对象都通用的方法
覆盖equals方法时遵守通用约定覆盖equals()方法看起来似乎简单,但是许多覆盖方式会导致错误,并且后果非常严重。最能避免这些问题的办法就是不覆盖equals()方法,在这种情况下,类的每个实例都只与它自己相等。如果满足了以下任意一个条件,那可以不覆盖equals()方法:类的每个实例本质上都是唯一的类没有必要提供逻辑相等的功能超类已经覆盖了equals(),超类的行为对于子类也是...原创 2019-06-04 21:30:47 · 352 阅读 · 0 评论 -
图论算法——有向图的可达性与寻路
有向图的可达性利用了有向图的深度优先算法,它解决了单点连通性的问题,可以判定其他顶点和给定的起点是否连通。package com.algorithms.graph;/** * @author yjw * @date 2019/5/20/020 */public class DirectedDFS { private boolean[] marked; publi...原创 2019-05-20 18:46:10 · 5378 阅读 · 2 评论 -
图论算法——无向图的深度优先搜索和广度优先搜索
深度优先搜索类似树的深度优先遍历,所谓深度优先即递归的对相邻节点进行访问。从图来访问的越来越深。在访问某个顶点时:将它标记为已访问递归地访问它的所有没有标记过的临接顶点package com.algorithms.graph;/** * 图的深度优先搜索 * @author yjw * @date 2019/5/16/016 */public class DepthF...原创 2019-05-20 18:39:15 · 5587 阅读 · 0 评论 -
图论算法——有向图的邻接链表实现
引言给定有向图如下:注意0和2节点之间的双向箭头表示0→2和2→0的两条边。代码package com.algorithms.graph;import java.util.HashSet;import java.util.Set;/** * 有向图 * * @author yjw * @date 2019/5/15/015 */@SuppressWarnings("...原创 2019-05-20 18:30:32 · 4894 阅读 · 0 评论 -
SpringCloud 配置服务器
创建配置服务器pom如下:&amp;amp;amp;lt;?xml version=&amp;amp;quot;1.0&amp;amp;quot; encoding=&amp;amp;quot;UTF-8&amp;amp;quot;?&amp;amp;amp;gt;&amp;amp;amp;lt;project xmlns=&amp;amp;quot;http://maven原创 2018-11-21 21:31:30 · 5515 阅读 · 0 评论 -
《Spring微服务实战》读书笔记——通过配置服务器来管理配置
管理配置管理配置的四个原则隔离将服务配置信息与服务的实例物理部署完全分离抽象抽象服务接口背后的配置数据访问集中将应用程序配置集中到尽可能少的存储库中稳定实现高可用和冗余建立Spring Cloud 配置服务器Spring Cloud配置服务器是构建在Spring Boot之上基于REST的应用程序。添加一个新的项目,称为confsvr。添加如下依赖: &amp;lt;...原创 2018-11-21 22:14:39 · 420 阅读 · 0 评论 -
《Spring微服务实战》读书笔记——构建微服务
设计微服务架构构建代码的脚手架分解业务问题描述业务问题,安装名词来描述问题注意动词寻找数据内聚性确定服务粒度使用数据模型作为将单体应用分解到微服务的基础。可以通过下面的概念来确定正确的服务粒度:广泛的使用微服务和重构为更小的服务关注你的服务如何与其他服务交互随着你对问题领域的理解不断增长,服务职责将不断变化感受不好的微服务设计服务粒度太粗:服务具有太多的职责...原创 2018-11-21 22:14:51 · 1203 阅读 · 0 评论 -
SpringCloud Eureka 高可用
文章目录Spring Cloud Eureka 高可用高可用客户端(HA Client)Spring Cloud Eureka Client应用元信息实例客户端配置服务器配置高可用注册中心(HA Registry Center)实例服务器配置客户端配置Spring Cloud Eureka 高可用Eureka和Zookeeper对比Eureka在高可用方面好一点;Zookeeper在一致性...原创 2018-10-15 23:11:11 · 434 阅读 · 0 评论 -
Spring Cloud——服务发现与注册
文章目录版本说明服务发现服务注册高可用服务发现:Eureka服务端:Eureka Server创建服务端客户端:Eureka Client创建客户端调整健康检查页面版本说明&amp;amp;lt;parent&amp;amp;gt; &amp;amp;lt;groupId&amp;amp;gt;org.springframework.boot&amp;amp;lt;/groupId&amp;amp;gt;原创 2018-10-14 21:14:56 · 763 阅读 · 0 评论 -
javap 指令集 (转)
栈和局部变量操作 将常量压入栈的指令 aconst_null 将null对象引用压入栈 iconst_m1 将int类型常量-1压入栈 iconst_0 将int类型常量0压入栈 iconst_1 将int类型常量1压入栈 iconst_2 将int类型常量2压入栈 iconst_3 将int类型常量3压入栈 iconst_4 将int类型常量4压入栈 iconst_5 将int...转载 2018-07-26 13:10:06 · 357 阅读 · 0 评论 -
Java网络编程之客户端中的Socket
SocketSocket是两个主机之间的连接,它有下面7种基本操作:连接到远程主机发送数据接受数据关闭连接绑定端口监听输入数据在绑定的端口上接受远程机器的连接前面4中操作是客户端和服务端共有的,后面3种只有服务端才需要(定义在ServerSocket类中)。从Server读取数据 @Test public void readFromTimeServ...原创 2018-06-15 15:49:42 · 768 阅读 · 0 评论 -
Java网络编程之流的详解
前言大部分网络程序做的事情就是接受输入并产生输出。读服务器发送过来的数据与读取本地文件的数据并没有多大的区别,同时服务器将数据发送给客户端与写数据到本地文件也很像。Java的IO操作基于streams实现的。输入流读数据,输出流写数据。输出流(Output Streams)所有输出流的基类是OutputStream 定义的方法如下:public abstract void...原创 2018-04-17 18:19:18 · 1230 阅读 · 0 评论 -
Java网络编程之服务端中的Socket
Java提供了ServerSocket类代表服务端的socket,服务端的socket主要工作是在某个端口上等待tcp连接。当远程的客户端尝试连接服务端,服务端就会被“唤醒”,然后协调处一条与客户端的连接并返回一个代表客户端和服务器之间的套接字的Socket对象。ServerSocket的使用在Java中,服务器程序的基本生命周期是这样的:使用ServerSocket()构造函数...原创 2018-06-22 13:38:52 · 410 阅读 · 0 评论 -
JAVA IO中的设计模式
在java语言 I/O库的设计中,使用了两个结构模式,即装饰模式和适配器模式。 在任何一种计算机语言中,输入/输出都是一个很重要的部分。与一般的计算机语言相比,java将输入/输出的功能和使用范畴做了很大的扩充。因此输入输出在java语言中占有极为重要的位置。java语言采用流的机制来实现输入/输出。所谓流,就是数据的有序排列,流可以是从某个源(称为流源,或者 Source of Str...转载 2018-04-26 15:39:09 · 865 阅读 · 0 评论 -
Java网络编程之IP地址
概念IP地址对应在Java中的类是InetAddress类,在了解InetAddress之前先介绍几个概念节点(node) 连接到网络的设备叫节点主机(host) 如果节点是计算机则叫主机IP地址 网络中区分节点的唯一数字叫IP地址InetAddress类InetAddress是Ipv4地址和Ipv6地址的父类,它同时包含了hostname和IP地址创建InetAddress对象它没有原创 2018-04-11 21:16:27 · 1811 阅读 · 0 评论 -
ThreadPool中变量ctl的分析
引用如果看了ThreadPoolExecutor的源码,看到了第一个变量便是一个AtomicInteger类型的ctlprivate final AtomicInteger ctl = new AtomicInteger(ctlOf(RUNNING, 0));用来描述线程池的状态(pool control state)本来就来分析一下这个ctl。相关代码与ctl的相关代码如下:private fin原创 2017-08-30 17:04:42 · 2436 阅读 · 4 评论 -
BlockingQueue接口分析
简介一个阻塞队列接口定义,当队列为空时,取数据等待;当队列满时,存数据等待。 BlockingQueue定义的常用方法如下: \ 抛出异常 特定值 阻塞 超时 Insert add(e) offer(e) put(e) offer(e, time, unit) Remove remove() poll() take() poll(time,原创 2017-08-23 11:34:17 · 436 阅读 · 0 评论