自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(43)
  • 收藏
  • 关注

转载 海量数据TOP K问题

含义在海量数据找出频率最高的前k个数,或从海量数据中找出最大的前k个数,1.利用堆找出最大的K个数  首先,先理解下用堆找出最大的K个数的常用解法,例如问题是“从M(M <= 10000)个数中找出最大的K个数”利用最大堆 (适合于M规模不大的场景)  建立一个N=M大小的大顶堆,然后输出根节点之后,将根节点删除,然后再将剩余的元素调整成大顶堆;依次重复K次这个过程,最终就找出了K个最大的数。这实质上就是堆排序的过程。这种方法的时间复杂度为O(K *logM)利用最小堆(适用于小内

2022-01-17 22:44:43 298

原创 锁升级的过程

锁升级的过程锁升级分为两种情况:当偏向锁开关打开时(-XX:+UseBiasedLocking)的升级过程如下(默认打开):无锁 -> 偏向锁 ->轻量级所->重量级锁。具体为:对象首先是无锁状态,当对象第一次被线程获取的时候,虚拟机将会把对象头中的标志位设置为01,即偏向模式。同时使用CAS方式将获取到这个锁的线程id记录到对象的Mark Word中,如果操作成功,持有偏向锁的线程下一次进入这个锁的同步块时,不需要在进行任务同步操作。当有另一个线程去尝试获取这个锁时,偏向

2022-01-09 19:20:43 883

转载 图的常见算法

一、图结构图有很多种存储方式,主要有邻接表和邻接矩阵两种。邻接表以点集为单位,邻接矩阵以边集为单位。//图的大结构public class Graph { public HashMap<Integer,Node> nodes; //点集 public HashSet<Edge> edges; //边集 public Graph(){ nodes = new HashMap<>(); edges = new HashSet&l

2021-11-30 23:50:11 1427

转载 二叉树常见算法

链接:二叉树结构

2021-11-30 22:15:20 131

转载 链表常见题目总结

1.判断回文回文就是链表是否对称,比如1 -> 2 ->3 ->2->1;解题思路:1)使用栈将所有数据压入栈,当弹出时和原来的链从头开始依次表对比,如果完全一样,则是回文链表2)使用栈将前n/2的数据压入栈,当弹出时和原来的后n/2的数据对比,如果一致,则是回文3)使用快慢指针,快指针一次走两步,慢指针一次走一步。这样当快指针走到终点时,慢指针指向中间位置。把中间位置指向null,同时把终点位置的链表逆序,直到遇到null(中间位置),这样从两端开始遍历链表,如

2021-11-26 00:03:37 146

转载 计算机网络-网络层

概述网络层的主要目的是将分组从源端传到目的端,为分组交换网络上的不同主机提供通讯服务,网络层的传输单位是数据报。网络层的主要功能:路由选择与分组转发(最佳路径)异构网络互联 (手机,局域网,无线网)拥塞控制若所有结点都来不及接受分组,而要丢弃大量分组的话,网络就处于拥塞状态。因此要采取一定措施,缓解这种拥塞。方式一:开环控制(静态方法,类似数据链路层中的信道划分介质访问控制)方式二:闭环控制(动态方法,类似数据链路层中的随机访问介质访问控制)1.数据交换电路交换报文交换分

2021-11-23 23:36:19 855

转载 设计模式-行为型

概述行为型模式用于描述程序在运行时的复杂控制流程,即描述多个类怎样协同完成单个类无法完成的任务。行为型模式分为类行为型和结构行为型模式,前者采用继承在类之间分派行为;后者使用聚合或者组合在对象之间分派行为。由于聚合关系比继承关系更满足合成复用原则,所以具有更大的灵活性。行为型模式有11种:模板方法模式:定义一个骨架,将某些步骤延迟到子类中去实现,可以在不改变结构的情况下重新定义某些特定步骤。策略模式:定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的改变不会影响使用算法的客户

2021-11-21 22:41:19 84

转载 设计模式-结构型

概述结构型模型是指如何将类或者对象按照某种布局组成更大的结构。分为类型结构型和对象结构型,前者是通过继承机制来组织接口和类,后者是通过组合或者聚合来组合对象。结构型模型有7种:代理模式:为放个对象一个代理以控制对该对象的访问,从而达到限制、增强或者修改对象的某些属性。常用的有在访问某个具体功能前先校验安全性,某个操作之后记录日志等。适配器模式:比如充电器就是一个适配器将220V电压转换成5V桥接模式:将抽象和实现分开,使得他们可以独立变化。它是用组合关系来代替继承关系,从而降低了抽象和组合

2021-11-21 16:50:02 659

转载 设计模式-创建型

设计模式分为创建型、结构型和行为型。创建型(5种):需要new一个对象出来。包括:单利模式、工厂模式、抽象工厂模式、原型模式、创建者模式。1、单利模式在内存中只有一个实例,常用于工具方法,缓存,读取配置文件等操作,或者占用内存比较大的对象。有5种:饿汉式懒汉式(懒加载)双重检查静态内部类枚举饿汉式线程安全,但是不能懒加载。会造成内存浪费原理:虚拟机在类加载阶段会初始化静态变量,并保证该过程的线程安全。所以静态变量instance只会被初始化一次。(instance实例的创建放在静

2021-11-21 14:15:39 76

转载 设计模式-7大原则

设计模式主要为了降低代码的耦合性,提高内聚性、可重用性、可拓展性和灵活性。设计模式7大原则:1)单一职责原则2)接口隔离原则3)依赖倒置原则4)里氏替换原则5)开放封闭原则6)迪米特法则7)合成复用原则单一职责原则:规定每个类的职责单一,不能太复杂接口隔离原则:一个类不应该依赖他不需要的接口,一个类通过接口对另一个类的依赖应该建立在最小接口上。所谓最小接口就是将用不到的方法拆成多个接口,不要集中在一个接口中。依赖倒置原则:高层(基础模块)不应该依赖于底层,二者都应该依赖于抽象。

2021-11-11 21:18:27 91

转载 计算机网络-数据链路层

数据链路层脑图

2021-11-11 20:37:04 270

转载 计算机网络-物理层

1、三种通讯方式单工通讯只有一个方向的通讯,而没有反方向,只需要一条信道。半双工通讯:通讯双方都可以相互通讯,但是同一时刻只允许一个方向的通讯。需要两条信道全双工通讯:通讯双方可以同时发送和接受信息,需要两条信道。2、两种数据传输方式串行传输速度慢,费用低,适合远距离传输并行传输速度快,费用高,适合近距离。一般用于计算机内部传输。3、基本名词码元用一个固定时长的信号波形(数字脉冲),代表不同离散数字,是数字通讯的基本计量单位。当码元的离散状态有M个时,称为M进制的码元

2021-11-02 20:45:32 112

转载 操作系统-进程互斥

信号量实现进程互斥信号量代表系统中的某种资源数量。信号量的初始值是资源数量。申请资源时,信号量减1;当信号量小<=0,阻塞当前要申请资源的进程。使用完,毕释放资源时,信号量加1。唤醒阻塞队列里的进程。wait对应下面的P操作, signal对应下面的V操作生产者消费者问题需要一个表示空闲缓冲区和一个产品数量的信号量实现同步操作。同时需要一个互斥信号量(一般为1)使得同一时刻只有一个进程能够访问缓冲区。注意: 互斥信号量在同信号量P操作(加锁)之后,不能颠倒顺序,否则可能会死锁。

2021-11-02 20:43:42 669

转载 操作系统-进程调度

一、进程调度按照某种算法,在就绪队列中选择一个进程为其分配处理机。1.1 进程调度时机需要进行进程调度与切换的情况当前运行的进程主动释放处理机:进程正常终止运行过程中发生异常而终止进程主动请求阻塞(如等待I/O)当前运行的进程被动释放处理机:分配给进程的时间片用完有更紧急的事情需要处理(中断)有更高优先级的进程进入就绪队列不能进行进程切换的场景处理中断的过程进程在操作系统内核临界区在原子操作过程中1.2 进程调度的方式1)非抢占式:只允许进程主动地释放处理机,

2021-11-02 20:43:06 461

转载 操作系统-磁盘调度算法

一、一次磁盘读写所需要的的时间以机械硬盘为例,一次磁盘读写所需要的的时间由三部分组成:寻道时间、延迟时间、传输时间。寻道时间:磁头移动到数据所在磁道所需的时间。每个磁道耗时m,总共需要跨越的磁道数n,耗时为Ts = s + m*n.(s为机械臂启动时间)延迟时间:旋转磁头定位到数据所在扇区的时间。设r为磁盘转速,则延迟平均时间为 (1/r)*(1/2)传输时间:从磁盘读出或者写入磁盘所需的时间。设每个磁道上的字节数为N.则所花时间为(1/r)*(b/N)二、磁盘调度算法传输时间和延迟时间都

2021-10-21 22:54:28 1586

转载 操作系统-文件存储空间管理

一、存储空间的划分与初始化操作系统可以将一块磁盘划分为不同的逻辑盘(C盘/D盘),每个逻辑区分为目录区和文件取二、存储空间管理方法存储空间管理方法要从以下几个方面考量,1)用什么方法管理和组织空闲块,2)如何分配磁盘块,3)如何回收磁盘块。主要有以下几种方式1)空闲表法2)空闲链表法(空闲盘区链、空闲盘块链)3)位示图法4)组成链接法2.1 空闲表法创建一张表,有两个字段,分别表示第一个空闲盘块和一共有几个空闲盘块。适用于连续分配。分配:可结合内存分配中的首次适应法、最佳适应和最

2021-10-20 19:42:25 765

原创 文件管理-文件结构

一、 文件的逻辑结构文件的逻辑结构分为无结构文件和有结构文件。有结构文件分为顺序文件、索引文件和索引顺序文件。逻辑结构:是指用户看起来该文件是如何组织的。物理结构:是指在操作系统看来,文件在外存中如何存放。无结构文件:由字节流或者字符流组成,无明显的逻辑结构。如txt文本文件。有结构文件:由记录组成,分为定长记录、可变长记录。顺序文件...

2021-09-28 22:51:46 3262

原创 堆数据结构与堆排序

堆数据结构堆的逻辑结构就是一颗完全二叉树(从上至下,从左到右依次编号的二叉树),底层可以使用数组实现。堆的特点:对于一个节点i (i是二叉树的节点的编号,或者数组的下标)该节点的左孩子是:i * 2 + 1;该节点的右孩子是:i * 2 + 2;该节点的父节点是:(i -1) / 2;大顶堆:对于一个堆,如果所有的子树的根节点都大于他的左右子树的值,则这个堆是大顶堆。小顶堆:对于一个堆,如果所有的子树的根节点都小于于他的左右子树的值,则这个堆是小顶堆。大顶堆和小顶堆常用语有序队列,比如

2021-09-15 23:02:49 78

转载 操作系统-内存管理4(虚拟内存)

一、虚拟内存由于局部性原理,在程序装入内存时,将很快用到的那一部分装到内存中,暂时不用的留在外存。在程序执行过程中,当所访问的信息不存在时,有操作系统负责将所需的信息由外存调入内存。若内存不足,由操作系统将暂时不使用的信息交换到外存。在操作系统的管理下,在用户看来有一个比实际内存大得多的内存,这就是虚拟内存。特点:多次性:无需在作业运行时一次调入内存,而是被允许多次调入内存。对换性:在作业运行过程中无需常驻内存,而是在运行时调入调出。虚拟性:从逻辑上扩充了内存的容量,使用户看到的内存远大于实

2021-09-15 19:29:11 297

转载 操作系统-内存管理3(非连续内存分配)

一、基本概念页帧:连续内存分配存在内部碎片或者外部碎片,可以考虑将物理内存分为一个个大小固定的分区,叫做页帧(或者页框)。页帧的编号叫做页帧号(或者页框号,内存块号),页帧号从0开始。页面:将用户进程的地址空间也分为和页帧大小相同的一个个区域,称为页或者页面。最后一个页面可能不足页帧大小。将每一个页面分配到不同的页帧中,就是非连续分配。页表:页表用来保存逻辑页面和页帧的对应关系,页表的每一项叫做叶表项,叶表项由页号和块号(页帧号)组成。比如1号页面保存在6号页帧中,2号页面好存在8号页帧中。页面

2021-09-12 22:47:32 1919

转载 操作系统-内存管理1(概述)

计算机硬件的组成计算机是由CPU、内存、I/O设备、其他外设、总线等组成。CPU又包括运算器、控制器、寄存器、缓存、存储管理单元(MMU)等几部分组成。操作系统对内存管理要提供哪些功能抽象,逻辑地址空间。使应用程序不用考虑程序或者指令存在内存或者硬盘的具体位置,只需要知道一个逻辑地址即可。对应的物理地址由操作系统去查找。保护,独立的地址空间。程序在内存中运行在各自的独立内存中。共享,访问共享内存。各个程序都可以访问共享空间虚拟化,更多的地址空间。在内存不足时,可以将硬盘的一部分虚拟成内存,

2021-09-11 21:06:19 92

转载 操作系统-内存管理2(连续内存分配)

内存分配分为连续内存分配和非连续内存分配。连续内存分配是指为进程分配的内存空间必须是一个连续的区间。一、连续内存分配连续内存分配分为单一连续分配、固定分区分配和动态分区分配。前两种分配方式会产生内部碎片,后一种会产生外部碎片。内部碎片:进程所属内存区域内产生的碎片外部碎片:内存中某些空闲区域太小而难以利用1.1 单已连续分配:同一时刻,用户区内存中只有一个进程,只支持单道程序。无外部碎片,有内部碎片(应为此时整个用户区都属于该进程)1.2 固定分区分匹配:支持多道进程,内存分为若干个大小

2021-09-11 21:04:06 705

转载 用亦或逻辑处理交换方法

交换函数如下图的交换方法实现,使用亦或运算实现,原理如下。void swap(int a, int b){ a = a ^ b; b = a ^ b; a = a ^ b;}异或运算对于二进制来说,相同位运算等于0,相异位运算等于1。0^1=1;1^0=1;0^0=0;1^1=0;所以有如下性质性质一:任何数亦或0等于其本身,任何相同的数亦或等于0;即a^0=a;a^a=0;性质二:满足交换律a^b= b^a; a^ b ^c=a ^ (b ^ c)

2021-09-04 22:29:52 515

原创 操作系统的启动

操作系统的启动过程:机器上电,首先执行固化在内存硬件中的一段程序BIOS(大小512字节),BIOS主要负责上电自检,也就是检测显卡、鼠标、键盘、硬盘等硬件是否可用。如果可用,BIOS开始加载bootloader;bootloader是位于系统盘的第一块存储区域,主要用于将OS加载到内存。然后将CPU的控制权交给OS(也就是跳到OS的起始地址去执行)中断、异常和系统调用操作系统接管CPU后,可以执行一系列的功能,包括运行用户程序、响应外设等。这些操作都依赖于中断、异常或者系统调用。中断来自

2021-09-04 21:37:24 115

原创 常见算法-回溯算法

回溯算法回溯算法是一步步的向前试探,对每一步的情况进行分析,再决定是否继续。核心思想当出现非法情况时,回退到之前的场景,可以返回一步或者多步。再去尝试别的路径和办法。回溯算法必须保证每次都有一种或多种尝试的可能。模板f(n)是回溯方法1)判断当前输入是否合法,不合法就返回2)判断递归是否应当结束(一般是一种可能的解)3)遍历所有可能出现的情况,尝试下一步的可能性4)调用递归5)回溯到上一步(取消前部进行的尝试)例:给定一个无重复元素的正整数数组 candidates 和一个正

2021-08-22 15:52:30 114

原创 常见排序算法

排序算法冒泡排序将数组中的元素两两交换比较,每一轮交换都可以将未排序序列中的最大值找出来,放在已排序的序列末尾。该排序算法的时间复杂度稳定为O(n^2),空间复杂度为O(1)(直接在本数组上操作,不需要额外的存储空间)。一种改进型的方法是判断某一轮循环中是否发生了元素交换,如果没有那么就表明排序已完成,不必在进行后续的排序。void sort(int[] nums){ boolean hasChange = true; for(int i=0; i <

2021-08-15 23:22:36 80

转载 Kafka消费者rebalanced异常分析

异常org.apache.kafka.clients.consumer.CommitFailedException: Commit cannot be completed since the group has already rebalanced and assigned the partitions to another member. This means that the time between subsequent calls to poll() was longer than the

2021-07-11 22:08:11 620

转载 tomcat架构组成

tomcat架构组成tomcat有一个server,控制着整个tomcat的生命周期一个server可以包含一个或者多个service,service对外提供服务一个service由一个container和一个或者多个connectorconnector用于接收外部请求,并将请求封装成request,将响应封装成response。多个connector可以处理多种协议。container用于管理servlet,servlet用于处理request请求tomcat结构图如下:tomcat

2021-07-10 00:01:56 357

转载 webservice与websocket

webservice与websocketwebsocket:http的一个缺点是是能由客户端往服务端发请求,不能反向。websocket技术使得服务端可以往客户端推送消息。websocket与http的区别相同点都是一样基于TCP的,都是可靠性传输协议。都是应用层协议不同点websocket是双向的,http是单向的websocket是需要进行握手链接的联系WebSocket在建立握手时,数据是通过HTTP传输的。但是建立之后,在真正传输时候是不需要HTTP协议的。webs

2021-07-09 22:06:33 3247

转载 MySQL两阶段提交

MySQL两阶段提交redo log与binlog的区别redo log是innoDb引擎独有的,大小固定,也是磁盘上的一块存储,但是顺序读写I/O性能高。写完之后会重新从头写,会覆盖之前的记录。用于预存储修改,记录的事那个表上的哪个值被修改。binlog是mysql server所有,所有引擎都有,用于追加记录会发生写操作(statement或者row模式)。一般用户主从复制,server崩溃回复数据。两阶段提交第一阶段:一个update操作,先将更新写入redo log,将redo log

2021-07-09 20:33:45 184

转载 Mysql索引

MySql索引1、磁盘存取原理通过磁头转动移动到不同的盘片和磁道上,读取不同的信息。每次读取至少一个扇区的大小(4K)到内存。磁盘I/O是一个机械运动的过程,所以相对于内存或者缓存操作要慢得多,所以一般对于I/O操作要单独开启一个线程,因为比较耗时,串行易阻塞。2、二叉树、红黑树、B树做索引的缺点2.1 二叉树优点:查找速度快,log2n缺点:树的高度比较高,单个节点只存一个数据,当节点分散在多个扇区时,取药多次I/O查找,效率不高二叉树在某些情况下回编程链表,查找效率编程0(n)

2020-06-24 01:21:43 131

原创 Java8新特性

概述java8主要增加了函数式接口(@FunctionalInterface)、lambda表达式、流(stream)。函数式接口什么样的接口是函数式接口1、被注解@FunctionalInterface修饰的,并且只有一个抽象方法的接口叫函数式接口。2、没有被@FunctionalInterface注解修饰,但是也只有一个抽象方法的接口,也会被编译器认为是函数式接口3、java8中规...

2020-01-05 20:24:03 80

原创 k8s-存储

k8s存储类型configMap给我们提供了想容器中注入配置信息的机制,configMap可以保存单个属性,也可以保存这个配置文件或者json二进制大对象。一般可以中座配置中心。Secret保存一些加密配置volumePV(持久卷)创建configMap从文件创建(config-map目录下的所有文件)kubectl create configMap game-config...

2019-12-22 17:34:34 228

原创 K8S-service

概念k8s的service也叫服务,通过label识别一组pod,并提供访问这些pod的策略。service能够提供4层的负载均衡能力。对于7层(通过域名访问)的访问,需要借助ingress来实现。Service的类型1)clusterIp:默认类型,自动为该service分配一个clusterIp,只能够供内部访问,不能将Service暴露给外部。2)Nodepoint:在Clus...

2019-12-22 16:09:43 161

转载 nignx简介

1、nignx是什么nignx是一个高性能的HTTP和反向代理 web服务器。其特点是占有内存少,并发能力强,在同类型的网页服务器中表现较好。2、nignx能做什么1)反向代理请求不会直接到达真正的服务器(比如tomcat),而是先经过nignx服务器,在由nignx服务器转发到正真的tomcat服务器上。2)负载均衡为减少单个服务器访问压力,往往设置多个服务器,nignx恶意根据一定...

2019-09-20 21:57:42 1415

原创 多线程并发

多线程并发主要有3个方面:1、同步器主要有synchronized,ReentrantLock(),信号量,门栓(CountDownLatch),障栅(CyclicBarrier),交换器。2、同步容器:主要包括:映射、集、队列映射:ConcurrentHashMap,ConcurrentSkipListMap(有序,要求键实现Comparable)集:ConcurrentSkipLi...

2019-09-09 21:53:29 96

原创 java方法重载与方法重写

静态解析与动态链接要了解重载与重写,首先需要了解java的动态链接与静态解析。静态解析:有些符号引用在类加载阶段或者第一次使用时,就会转换为直接引用(内存中的地址),这种转换叫做静态解析。动态链接:还有一些符号引用则是在每一次运行期间转换为直接引用,这种转换叫做动态链接(java多态的体现)。在java虚拟机中一共有5个方法调用字节码指令:invokestatic:调用静态方法。inv...

2019-09-01 21:29:13 130

原创 .class文件结构分析

1、class文件的结构字节码文件的结构包括:魔数、版本号、常量池、访问标志、类索引以及父类索引或者接口索引信息(集合)、字段(类变量和成员变量)信息(集合)、方法信息(集合)1)魔数:4个字节,java的标志,值为CAFEBABE2)版本号:紧跟魔数之后的4个字节,前两个字节是minor version(次版本号),后两个字节是major version(主版本号)。3)常量池(cons...

2019-09-01 11:02:10 90

原创 JVM的组成

JVM由类加载器、运行时数据区、执行引擎、本地方法接口、垃圾回收系统五部分组成。一、类加载器用来将二进制.class文件加载到内存中,经过加载、链接(校验、准备、解析)、初始化,并在内存中创建一个class类对象,保存着该类在内存中的数据结构。(注意这个class类对象和堆内存中new出来的实例不是一个东西,这个class类对象只有一个,jvm并没有规定这个class类对象在内存中的位置,h...

2019-08-28 22:37:56 592

转载 Class.forName()源码分析

1、class.forName()源码:以JDBC驱动加载为例:1)通过Reflection.getCallerClass()获取调用该方法的类2)获取调用者的类加载器,并使用调用者的类加载器去加载JDBC驱动,并初始化驱动类,在初始化驱动类之前,先初始化DriverManager。3)初始化DriverManager,执行静态块,遍历META-INF/services目录下描述的所有驱动...

2019-08-28 00:19:34 1114

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除