- 博客(33)
- 收藏
- 关注
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 数据结构-红黑树和2-3树
一. 红黑树的定义1.每个节点或者是红色的,或者是黑色的2.根节点是黑色的(一棵空树也是红黑树)。3.每个叶子节点(最后的空节点)是黑色的,定义空节点都是黑色的。4.如果一个节点是红色的,那么他的孩子节点都是黑色的。5.从任意一个节点到叶子节点,经过的黑色节点是一样的。学习红黑树之前,必须先学2-3树二. 2-3树学习2-3树,不仅对于理解红黑树有帮助,对于B树的数据结构也有帮...
2020-04-11 14:52:41
284
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 数据结构-AVL(自平衡二叉查找树)插入和删除的实现
一. AVL的作用为什么使用AVL?在使用二分搜索树的时候,在极端的情况下,会退化成链表。如下图二. AVL的特点对于任意一个节点,左子树和右子树的高度差不能超过1。高度和节点数量之间的关系也是O(logn)的。加入/删除节点后,沿着节点维护平衡性。三. 如何维护AVL的平衡1. 添加 如何维护平衡(4种情景)情景1 : 左子树的左节点上(LL): 右旋转。右旋转伪代...
2020-04-10 16:39:21
222
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 数据结构-堆和优先队列
一. 堆1. 堆的特点:是一棵完全二叉树 : 把元素顺序排列成树的形状。二叉堆有两种:最大堆和最小堆。最大堆:父结点的键值总是大于或等于任何一个子节点的键值;最小堆:父结点的键值总是小于或等于任何一个子节点的键值;作用: 用来查找最大值(最大堆),最小值(最小堆)父节点和左右子节点索引之间的关系:parent(i) = ( i - 1 ) / 2left child(i) ...
2020-04-08 12:56:40
196
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 数据结构-二分搜索树
一. 特点:二分搜索树是二叉树。二分搜索树的每个节点的值: 大于其左子树的所有节点的值,小于其右子树的所有节点的值。每一棵子树也是二分搜索树。存储的元素必须有比较性。我们的二分搜索树不包含重复元素。如果想包含重复元素的话,只需要定义:左子树小于等于节点;或者右子树大于等于节点。注意:之前的数组和链表,可以有重复元素。二分搜索树添加元素的非递归算法,和链表很像。二分搜索树关注递...
2020-04-07 12:22:35
161
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 数据结构-单链表
一.单链表的特点单链表节点: 由一个数据,和指向下一个节点的指针组成。内存空间不连续,查找需要一个一个遍历查找。二. 单链表的增加与删除 总结:从上面来看,添加节点 ,删除节点 都很容易,但是找到节点却不容易。因为链表是内存空间不连续的,我们不能直接查找到某个节点。需要从头节点一个一个查找,所以删除和添加的操作的时间复杂度都为O(n).三.单链表时间复杂度分析新增节点:...
2020-04-03 12:52:13
329
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 数据结构-队列
一. 队列的定义队列是一种特殊的线性表,仅能在两端进行操作,队头可以进行取数据操作,队尾进行插入数据操作。队列的特性是先进先出(FIFO)。队列一般只关注队首元素。入队enqueue(E) O(1),出队 dequeue(),O(n)队首移动,后面的向前移动。...
2020-04-01 21:03:35
130
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 数据结构-数组
一.数组的概念数组(Array)是一种线性表数据结构。它用一组连续的内存空间,来存储一组具有相同类型的数据。如下图所示:二.数组的特点1.数组根据下标随机访问,时间复杂度为O(1)。2.数据的插入和删除和低效。如果插入/删除数组末尾的数据,最好情况时间复杂度为 O(1)如果插入/删除开头的数据,则最坏情况时间复杂度为 O(n)平均情况时间复杂度也为 O(n)。三.什么时候使用...
2020-03-30 22:42:24
255
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 JVM——Java内存模型 (JDK1.8)
一. 程序计数器1.什么是程序计数器 程序计数器(Program Counter Register)是一块较小的内存空间,它可以看作是当前线程所执行的字节码行号 的指示器。2.程序计数器的作用字节码解释器工作通过改变程序计数器的值来选取下一条需要执行的字节码指令。如:分支、循环、跳转、异常处理、线程恢复等基础功能。多线程情况下,程序计数器表示当前线程执行的位置,从而...
2019-02-21 16:47:18
2097
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 深入理解JVM(五)——JVM之垃圾收集器
垃圾收集器 如果说收集算法是内存回收的方法论,那么垃圾收集器则是内存回收的具体实现。Java虚拟机规范中对垃圾收集器应该如何实现没有任何规定。这里讨论的收集器是基于JDK1.7 Update 14 之后的HotSpot虚拟机。这个虚拟机包括的收集器如下图1.1: ...
2018-05-25 09:55:49
198
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 深入理解JVM(一)——JVM之内存模型(JMM)JDK1.7
声明: 本文章说明的是JDK1.7的JVM内存模型JVM内存模型分为5个部分,分别为程序计数器,Java虚拟机栈,本地方法栈,堆,方法区。 一.程序计数器 1.什么是程序计数器? 程序计数器(Program Counter Register)是一块较小的内存空间,它可以看作是当前线程所执行的字节码行号的指示器。 2.程序计数器的作用 ...
2018-05-22 22:54:59
1096
3
原创 记一次生产BUG - Kafka
spring.kafka.consumer.auto-offset-reset=earliest 引发的惨案
2022-07-20 16:47:39
373
1
原创 多线程之深入理解线程池执行器ThreadPoolExecutor
一. 为什么使用线程池?a.线程创建所需时间为T1,线程执行任务时间为T2,线程销毁时间为T3,而往往T1+T3>T2。所以频繁创建线程会损坏而外的时间。b.如果有任务来了,再去创建线程的话效率比较低。c.线程池可以管理控制线程,线程是稀缺资源,如果无休止的创建会消耗系统资源,还会降低系统稳定性。使用线程池可以进行统一分配,方便调优和监控,重复利用。d.线程池提供队列,存放缓冲等待执行任务。二. 有多少种线程池?Java通过Executors提供四种线程池,分别为:newCache
2020-06-23 17:42:08
513
原创 创建线程的三种方式-继承Thread,实现Runnable以及实现Callable
创建线程的三种方式实现Runnable接口继承Thread类实现Callable接口Runnable接口,其实就是提供一个run()方法,让实现它的类覆盖这个run()方法。@FunctionalInterfacepublic interface Runnable { /** * 当使用实现接口Runnable的对象创建线程时,启动该线程将导致在该单独执行的线程中调用对象的run方法。 * run方法的一般约定是,它可以采取任何操作 * *
2020-06-11 01:47:47
935
原创 Java基础——代理(静态代理、JDK动态代理、Cglib动态代理)
代理模式 为其他对象提供一个代理以控制对某个对象的访问。代理类主要负责为委托了(真实对象)预处理消息、过滤消息、传递消息给委托类,代理类不现实具体服务,而是利用委托类来完成服务,并将执行结果封装处理。 其实就是代理类为被代理类预处理消息、过滤消息并在此之后将消息转发给被代理类,之后还能进行消息的后置处理。代理类和被代理类通常会存在关联关系(即上面提到的持有的被带离对象的引用),代理类本身不实现服务,而是通过调用被代理类中的方法来提供服务。静态代理&nb
2020-05-26 18:39:56
301
原创 Java基础——反射
一. 反射1. 什么是反射? 要想理解反射的原理,首先要了解什么是类型信息。Java让我们在运行时识别对象和类的信息, 主要有2种方式:一种是传统的RTTI,它假定我们在编译时已经知道了所有的类型信息;另一种是反射机制,它允许我们在运行时发现和使用类的信息。 反射机制:在运行状态中,对于任意一个类。都能都知道这个类的所有属性和方法,对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调
2020-05-26 11:30:06
139
原创 数据结构-线段树 初始化、区间查询和区间更新(待完善)
一. 线段树的特点平衡二叉树:最大的深度 和最小的深度 差最大为1。一种二叉搜索树。它将一段区间划分为若干单位区间,每一个节点都储存着一个区间。它功能强大,支持区间求和,区间最大值,区间修改,单点修改等操作。处理问题: 区间查询 ,区间更新线段树 是以空间换时间的处理,开启4N的空间如果区间有n个元素,数组表示需要有多少节点? 4n的空间,我们的线段树不考虑添加元素,即空间固...
2020-04-09 19:47:24
398
转载 JDK源码分析——HashMap(JDK1.8)
1. 概述本篇文章我们来聊聊大家日常开发中常用的一个集合类 - HashMap。HashMap 最早出现在 JDK 1.2中,底层基于散列算法实现。HashMap 允许 null 键和 null 值,在计算哈键的哈希值时,null 键哈希值为 0。HashMap 并不保证键值对的顺序,这意味着在进行某些操作后,键值对的顺序可能会发生变化。另外,需要注意的是,HashMap 是非线程安全类,在多...
2019-01-22 15:32:41
248
原创 JDK源码分析——Queue接口
##Queue源码分析#Queue源码package java.util;/** * Queue队列 接口 */public interface Queue<E> extends Collection<E> { /** * 将指定的元素插入到此队列中,如果可以立即执行此操作,而不会违反容量限制, true在成功后返回 * Ille...
2019-01-21 16:29:08
236
原创 JDK源码分析——Stack类(栈)
##Stack源码分析#Stack源码package java.util;/** * Stack栈 FILO */publicclass Stack<E> extends Vector<E> { /** * 创建一个空栈 */ public Stack() { } /** * push 新增一...
2019-01-21 16:26:52
633
原创 JDK源码分析——Vector(线程安全的队列)
##Vector 源码分析#Vector源码(只分析了大部分方法)/* * Vector是同步的。 如果不需要线程安全的实现,建议使用ArrayList代替Vector * 几乎所有的方法都是synchronized方法修饰的。 */package java.util;import java.io.IOException;import java.io.ObjectInput...
2019-01-21 16:24:53
362
原创 JDK源码分析——LinkedList(双端链表)
Java集合框架----LinkedList###LinkedList源码:package java.util; import ...
2019-01-18 16:59:56
291
原创 JDK源码分析——Iterator接口、Collection接口、ArrayList类
##集合框架从类图结构可以了解 java.util包下的2个大类:1、Collecton:可以理解为主要存放的是单个对象2、Map:可以理解为主要存储key-value类型的对象##Iterator接口分析package java.lang;import java.util.Iterator;import java.util.Objects;import java.util.S...
2019-01-18 14:55:26
223
原创 JDK源码分析——Integer
##Integer源码分析#Integer源码如下: (目前只关注一些重点方法解析)package java.lang;import java.lang.annotation.Native;public final class Integer extends Number implements Comparable<Integer> { /** * @N...
2019-01-17 13:43:52
428
原创 JDK源码分析——不可变的String类
##String 源码分析在研究String源码之前,因为String类是用final修改的,所以必须先了解一下final,如果对final非常了解的话,可以跳过,直接看String的源码分析。##关键字 final(此处参考: 原文链接: Javarevisited 翻译: ImportNew.com - 唐小娟 译文链接: http://www.importnew.com/7553.htm...
2019-01-16 15:45:02
273
原创 JDK源码分析——Object
##Object 源码分析#Object源码package java.lang;/** * Class {@code Object} is the root of the class hierarchy. * @author unascribed * @see java.lang.Class 默认是所有类的父类 * @since JDK1.0 Object类是类层...
2019-01-16 14:03:14
169
转载 深入理解JVM(七)——JVM之类加载机制详解
本文转载自:https://blog.csdn.net/zhangliangzi/article/details/51319033 首先Throws(抛出)几个自己学习过程中一直疑惑的问题:1、什么是类加载?什么时候进行类加载?2、什么是类初始化?什么时候进行类初始化?3、什么时候会为变量分配内存?4、什么时候会为变量赋默认初值?什么时候会为变量赋程序设定的初值?5、类加载器是什么?6、如...
2018-05-28 15:03:08
173
转载 从并发编程到分布式系统-如何处理海量数据(上)
从并发编程到分布式系统-如何处理海量数据(上) 本文转载自:https://juejin.im/post/5b0a587651882538b304c280?from=timeline&isappinstalled=0面试互联网公司不得不说的高并发!在这里想写写自己在学习并发处理的学习思路,也会聊聊自己遇到的那些坑,以此为记,希望鞭策自己不断学习、永不放弃!具体笔者认为大体可分为分两部...
2018-05-28 13:10:46
230
转载 深入理解JVM(六)——JVM之内存分配和回收策略
本文转自:https://www.cnblogs.com/xiaoxi/p/6557473.html前言 对象的内存分配,往大的方向上讲,就是在堆上分配,少数情况下也可能会直接分配在老年代中,分配的规则并不是百分之百固定的,其细节决定于当前使用的是哪种垃圾收集器组合,当然还有虚拟机中与内存相关的参数。垃圾收集器组合一般就是Serial+Serial Ol...
2018-05-25 10:04:07
626
转载 深入理解JVM(四)——JVM之垃圾回收算法
在JVM规范中并没有明确GC的运作方式,各个厂商可以采用不同的方式去实现垃圾回收器。这里讨论几种常见的GC算法。 本文转载来自:https://www.cnblogs.com/cielosun/p/6674431.html2.1. 标记-清除算法(Mark-Sweep)最基础的垃圾回收算法,分为两个阶段,标注和清除。标记阶段标记出所有需要回收的对象,清除阶段回收被标记的对象所占用的空间。如图:...
2018-05-23 17:06:09
229
转载 深入理解JVM(三)——JVM之判断对象是否存活(引用计数算法、可达性分析算法,最终判定),Eclipse设置GC日志输出,引用
本文转载自https://blog.csdn.net/ochangwen/article/details/51406779本文是基于周志明的《深入理解Java虚拟机》 堆中几乎存放着Java世界中所有的对象实例,垃圾收集器在对堆回收之前,第一件事情就是要确定这些对象哪些还“存活”着,哪些对象已经“死去”(即不可能再被任何途径使用的对象)1、引用计数算法(Reference Counting)...
2018-05-23 16:54:57
365
转载 深入理解JVM(二)——JVM之对象的创建、对象的内存布局、对象的访问定位
本文转载来自: https://blog.csdn.net/u011080472/article/details/51321769对象的创建一个简单的创建对象语句Clazz instance = new Clazz();包含的主要过程包括了类加载检查、对象分配内存、并发处理、内存空间初始化、对象设置、执行ini方法等。主要流程如下:1. 类加载检查JVM遇到一条new指令时,首...
2018-05-23 09:49:55
310
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人