自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(70)
  • 问答 (2)
  • 收藏
  • 关注

原创 Go语言实现分布式缓存(二) —— 单机并发缓存

这篇文章会使用互斥锁:**Mutex** 来保证缓存并发读写时的安全性,然后在此基础上实现单机的缓存。

2022-11-14 00:44:23 184

原创 Go语言实现分布式缓存(一) ——lru淘汰策略和超时过期

lru淘汰策略,超时过期策略

2022-11-13 01:08:28 696

原创 Go语言并发编程——原子操作

而互斥锁实现的操作,当前执行Goroutine是会被其它Goroutine抢占的,但是其它的Goroutine在未获取锁的情况并不能顺利执行,从而保证了并发的安全性。同样的,在未使用原子写时,可能写到一半的数据被读到,所以要保证并发的安全性,要同时保证读和写的原子性,或者使用互斥锁保证读和写之间互斥,写和写之间也互斥。在非原子读时,可能会造成:读到一半Goroutine被中断,当Goroutine再次被调度时,数据已被修改,那么最终读出来的就是一个奇怪的值。原子操作能够使用的场景很少,是有很大局限性的。

2022-09-30 16:27:29 934

原创 Go语言高并发编程——互斥锁、条件变量

A成功抢到了互斥锁,但是当A在执行任务时发现不满足执行任务的资源条件,那么就可以让goroutineA加入条件变量的消息等待队列,并且将锁释放掉。这时B拿到了锁,通过B的执行改变了资源条件,B执行完之后会通知A,收到通知的A就会重新获取锁,执行任务代码。当多个goroutine同时遇到被同一个互斥锁保护的代码块,它们之间就会产生锁竞争,只有抢到锁的goroutine才能去执行代码。但是当二者同时使用时,在写锁被持有的时候不能获取读锁,同样的,在读锁被持有的时候不能获取写锁。读写锁是读 / 写互斥锁的简称。

2022-09-29 11:15:58 244

原创 Go语言并发编程——Channel

Channel是用来实现goroutine之间通信的数据类型,该类型是go自带的唯一一个处理高并发十分安全的一个类型。

2022-09-29 11:10:36 465 1

原创 SpringMVC处理请求的流程

前端控制器,不需要工程师开发,由框架提供作用:统一处理请求和响应,整个流程控制的中心,由它调用其它组件处理用户的请求:处理器映射器,不需要工程师开发,由框架提供作用:根据请求的url、method等信息查找Handler,即控制器方法Handler:处理器,需要工程师开发作用:在DispatcherServlet的控制下Handler对具体的用户请求进行处理:处理器适配器,不需要工程师开发,由框架提供作用:通过HandlerAdapter对处理器(控制器方法)进行执行。

2022-09-05 16:40:45 126 2

原创 浅谈Spring中的IOC和DI

谁控制谁?spring容器控制对象的创建和初始化以及生命周期。如何反转?原先依赖对象控制被依赖对象的创建,现在由spring容器控制被依赖对象的创建。谁依赖谁?spring容器管理的对象依赖xml配置文件中的属性。谁注入谁?xml配置的属性注入spring容器管理的对象当中。

2022-09-02 19:57:05 188

原创 秒杀系统高并发优化

通俗来讲,高并发是指在同一个时间点,有很多用户同时的访问同一 API 接口或者 url 地址。它经常会发生在有大活跃用户量,用户高聚集的业务场景中。在秒杀系统中,当秒杀开始时,就会产生大量的用户聚集,此时就会给后端服务器带来很大的压力。尤其是在出现热点商品时,大量用户同时对同一个商品进行秒杀操作,这样就会带来更大的网络延迟(后面会具体说明)。...

2022-09-01 15:20:28 463 1

原创 jQuery使用的简单总结

expires表示cookie存活日期,以天为单位,path表式允许访问该cookie的顶级路径,也就是说只有path以及path的子路径可以访问该cookie。jQuery为我们提供了操作cookie的插件,我们可以下载插件,也可以使用CDN,这里不做说明。domain:允许访问的域名,默认值为创建 cookie 的网页所拥有的域名。上面例子中的function为回调方法,表示当事件完成后执行的方法。:当请求成功时运行的函数,其中result为请求方法执行后的返回值。:预期的服务器响应的数据类型。...

2022-08-30 15:36:34 65

原创 ArrayList源码分析

.ArrayList实现了三个接口,这三个接口都是标志性接口(接口中没有任何方法)。表示可以随机访问,Collections工具类中许多通用的算法,它们就会通过判断是否实现了该接口来选择不同的实现方式。表示可克隆的,只有实现了该接口才可以调用Object类中的clone()方法,ArrayList对clone方法进行了重写,但是它仍然需要调用Object中的方法clone()。:表示可序列化的,只有实现了该接口的类,它的对象才能被序列化(通过ObjectOutputStream将对象写入文件)...

2022-08-04 16:20:29 68 1

原创 mybatis中的多表查询

级联查询,分步查询,collection,association

2022-07-26 23:11:31 3317 2

原创 Java设计模式之装饰器模式

一般情况下想要扩展一个类的功能需要使用继承来实现,比如说HashSet有保证元素不重复的特点,但是它是无序存储,即存的顺序和取出的顺序不一致,为了让他在不修改原来对象的情况下实现有序存储,Java类库里面实现了一个继承HashSet类的子类LinkedHashSet。这是我第一次接触Java中的设计模式,刚开始看的时候感觉很难理解,当自己动手去模拟实现这个过程的时候,才慢慢体会到这种设计模式的巧妙,所以编程语言的学习还是多多动手,下面是我学习过程中参考的资料。,下面是他们的部分源代码,加上了我的注释。...

2022-07-22 15:43:20 315 1

原创 JavaWeb——Cooike详解

Cookie并不是它的原意“甜饼”的意思,而是一个保存在客户机中的简单的文本文件,这个文件与特定的Web文档关联`在一起,保存了该客户机访问这个Web文档时的信息,当客户机再次访问这个Web文档时这些信息可供该文档使用。由于“Cookie”具有可以保存在客户机上的神奇特性,因此它可以帮助我们实现记录用户个人信息的功能,而这一切都不必使用复杂的CGI等程序。举例来说,一个Web站点可能会为每一个访问者产生一个唯一的ID,然后以Cookie文件的形式保存在每个用户的机器上。......

2022-07-20 10:58:57 132

原创 JavaWeb——Servlet详解

Servlet(ServerApplet)是JavaServlet的简称,称为小服务程序或服务连接器,用Java编写的服务器端程序,具有独立于平台和协议的特性,主要功能在于交互式地浏览和生成数据,生成动态Web内容。狭义的Servlet是指Java语言实现的一个接口,广义的Servlet是指任何实现了这个Servlet接口的类,一般情况下,人们将Servlet理解为后者。Servlet运行于支持Java的应用服务器中。...............

2022-07-15 01:51:35 1135 2

原创 JDBC —— 数据库连接

JDBC全称为,直译过来就是Java数据库连接。它由一组用Java语言编写的类和接口组成。各种不同类型的数据库都有相应的实现。我们要连接数据库,就要去相应的数据库官网下载驱动,驱动都是以jar包的形式存在,jar包当中有很多.class文件,这些class文件就是JDBC接口的实现。本文针对MySQL数据库的连接实现。数据库连接完整代码如下:在注册驱动时,我们现在并不会这样写,因为com.mysql.cj.jdbc.Driver类的源码中有如下静态代码块:我们在这里简单的利用数据库实现一个账号的登录。

2022-06-24 16:28:25 146 1

原创 第298场力扣周赛个人题解

力扣:5242.兼具大小写的最好英文字母力扣:5218.个位数字为K的整数之和力扣:6099.小于K的最长二进制子序列力扣:5254卖木头块

2022-06-19 17:42:30 1468 2

原创 Mysql——事务详解(Transaction)

事务:是一个完整的业务逻辑单元,不可再分,和事务相关的语句只有DML语句(insert,update,delete)。注意:rollback和commit之后事务自动结束。自动提交的开启和关闭开启和关闭自动提交如下:4.事务的隔离级别4.1事务存在的常见问题隔离级别分类:查看隔离级别查看会话级当前的隔离级别:select @@session.transaction_isolation;查看全局级当前的隔离级别:select @@global.transaction_isolation;设置隔离级别

2022-06-15 16:18:05 148 9

原创 Java数据结构——平衡二叉树(AVL树)

AVL树的引入搜索二叉树有着极高的搜索效率,但是搜索二叉树会出现以下极端情况:这样的二叉树搜索效率甚至比链表还低。在搜索二叉树基础上出现的平衡二叉树(AVL树)就解决了这样的问题。当平衡二叉树(AVL树)的某个节点左右子树高度差的绝对值大于1时,就会通过旋转操作减小它们的高度差。基本概念AVL树本质上还是一棵二叉搜索树,它的特点是:本身首先是一棵二叉搜索树。每个结点的左右子树的高度之差的绝对值(平衡因子)最多为1。也就是说,AVL树,本质上是带了平衡功能的二叉查找树(二叉排序树,二叉搜索树)

2022-05-31 18:08:47 1682 10

原创 java反射机制

文章目录反射的概述获取Class对象的三种方式通过反射机制获取类的属性通过反射机制访问Java对象的属性反射机制与属性配置文件的配合使用资源绑定器配合使用样例通过反射机制获取类中方法通过反射机制调用Java对象的方法通过反射机制获取类中的构造方法通过反射机制创建对象(调用构造方法)通过反射机制获取一个类的父类和父接口反射的概述JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能

2022-05-28 22:11:49 78 1

原创 Java数据结构——排序二叉树

排序二叉树概念二叉排序树(Binary Sort Tree),又称二叉查找树(Binary Search Tree),亦称二叉搜索树。是数据结构中的一类。对于二叉排序树的任何一个非叶子节点, 要求左子节点的值比当前节点的值小,右子节点的值比当前节点的值大。对二叉排序树进行中序遍历,结果就是按从小到大排序的。排序二叉树类的定义public class binarySortTree { class Node{ int value; Node left;

2022-05-25 20:07:27 359 1

原创 Java-lambda表达式

lambda表达式的语法语法如下:(参数) ->{表达式}注意:没有参数时,( ) 不能省略,就像无参构造那样。当可以推断出表达式的参数类型,可以将参数类型省略。当只有一个参数,且参数类型可以推断出,那么可以将 ( ) 省略。无需指定lambda表达式的返回类型,返回类型总是可以根据上下文推导而出。当表达式只有一个语句,并且没有返回值,可以省略 { }。labdam表达式的使用只有一个抽象方法的接口称为函数式接口,当我们需要这样的接口对象时,我们就可以用lambda表达式来代

2022-05-23 22:06:24 140 1

原创 Java多线程

Java线程状态Java中有如下6种状态New(新创建)Runnable(可运行)Blocked(阻塞)Waiting(等待)Timed waiting(计时等待)Terminated(被终止)新建状态 :使用new关键字创建一个thread对象,刚刚创建出的这个线程就处于新建状态。在这个状态的线程没有与操作系真正的线程产生关联,仅仅是一个java对象。可运行:正在进行运行的线程,只有处于可运行状态的线程才会得到cpu资源。可运行状态可以分为两类理解:就绪状态和运行状态:

2022-05-23 20:44:54 182 1

原创 Java数据结构——哈希表

文章目录哈希表概念哈希函数的构造平均数取中法折叠法保留余数法哈希冲突问题以及解决方法开放地址法再哈希函数法公共溢出区法链式地址法哈希表的填充因子代码实现哈希函数添加数据删除数据判断哈希表是否为空遍历哈希表获得哈希表已存键值对个数哈希表概念散列表,又称为哈希表(Hash table),采用散列技术将记录存储在一块连续的存储空间中。在散列表中,我们通过某个函数f,使得存储位置 = f(关键字),这样我们可以不需要比较关键字就可获得需要的记录的存储位置。散列技术的记录之间不存在什么逻辑关系,它

2022-05-22 17:50:09 389 4

原创 中缀和后缀表达式的求值,以及相互转换

文章目录中缀表达式中缀表达式的计算利用双栈来实现中缀表达式的计算利用单栈实现中缀表达式计算后缀表达式后缀表达式的计算中缀表达式转后缀表达式中缀表达式中缀表达式(或中缀记法)是一个通用的算术或逻辑公式表示方法, 操作符是中缀形式处于操作数的中间(例:3 + 4,3 + 5 * 4 - 2),中缀表达式是人们常用的算术表示方法。如何编写一个程序,直接指向计算中缀表达式呢?下面我提供两种方法。中缀表达式的计算利用双栈来实现中缀表达式的计算中缀表达式以字符串的显示给出,例:“30 - 2 * 22 -

2022-05-13 22:22:13 207 1

原创 Java实现链表

之前拿C语言实现了链表操作,这篇博客拿Java实现,以备自己复习。public class LinkedList<E> { class Node<E>{ //所存储元素 E e; //指向下一个节点的引用 Node<E> next; Node(E e,Node<E> next){ this.e = e; this.ne

2022-05-10 21:35:44 345 3

原创 数组实现环形队列(Java)

实现思路:front 表示指向队列第一个元素,初始化为0。rear 表示指向队列最后一个元素的后一个位置,初始化为0。数组实现环形队列需要预留一个空位置(不放元素)。当队列已满时,满足:(rear + 1) % capacity == front当队列为空时,满足:(rear + capacity - front) % capacity == 0当出队列时,front变化满足front = (front + 1) % capacity队列元素个数等于(rear +

2022-05-09 21:58:00 289 1

原创 Java中的泛型

文章目录为什么要使用泛型程序定义泛型类定义泛型方法类型变量的限定为什么要使用泛型程序使用泛型前:public class GenericTest01 { public static void main(String[] args) { List l = new ArrayList(); l.add("abcd"); l.add(100); for(Object obj : l){ String s = (S

2022-05-08 21:38:40 340 2

原创 Java中容器学习(一) —— Collection和Map

文章目录🌲1.集合的继承结构图🥦1.1Collection接口的继承结构图🌿1.2Map接口的继承结构图🌵2.Collection接口中常用方法🌳2.1contains()方法详解🍀2.2 remove()方法详解🌾3.集合的遍历——迭代器🥬3.1迭代器中的常用方法🍏迭代器的原理🌲1.集合的继承结构图🥦1.1Collection接口的继承结构图🌿1.2Map接口的继承结构图🌵2.Collection接口中常用方法🌳2.1contains()方法详解contains()方法的用法很简单,如下

2022-05-04 18:05:46 926 3

原创 Java中的异常处理

1.🍧异常的基本概念🍰Java中异常是以类的形式存在,每一个异常都可以创建异常对象现实中的例子:火灾(异常类)2008年1月1日,小明家着火了。(异常类对象)2008年1月2日,小亮家着火了。(异常类对象)2008年1月3日,小红家着火了。(异常类对象)public class ExceptionTest01 { public static void main(String[] args) { ArithmeticException x = new Ari

2022-04-23 20:04:40 945 12

原创 数据结构 —— 线索二叉树

线索二叉树的意义对于一个有n个节点的二叉树,每个节点有指向左右孩子的指针域。其中会出现n+ 1个空指针域,这些空间不储存任何事物,浪费着内存的资源。对于一些需要频繁进行二叉树遍历操作的场合,二叉树的非递归遍历操作过程相对比较复杂,递归遍历虽然简单明了,但是会有额外的开销,对于操作的时间和空间都比较浪费。我们可以考虑利用这些空地址,存放指向节点在某种遍历次序下的前驱和后继节点的地址。通过这些前驱和后继节点的地址可以知道,从当前位置下一步应该走向哪里。线索二叉树的定义指向前驱和后继的指针称为线索

2022-04-16 15:16:08 918 1

原创 Java中的八种包装类

文章目录为什么需要包装类?Java提供的八种包装类装箱和拆箱整数型常量池Integer中的常用方法int 、Integer、String之间的相互转换为什么需要包装类?读以下程序:public class IntegerTest01 { public static void dosome(Object obj){ System.out.println(obj); } public static void main(String[] args) { }

2022-04-11 20:53:35 1502 1

原创 数据结构——排序算法

插入排序直接插入排序堆排序概念堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序。堆的两个特性结构性:堆是用数组表示的完全二叉树,我们可以用数组下标来表示父子结点的关系。这里随便给出一个数组:将数组以完全二叉树的形式表示出来:我们可以推出父子结点与二叉树的关系: LeftChild = Parent* 2 - 1 RightChild = Parent* 2 - 2 Parent = (Chird - 1) / 2有序性:任意一个结点的值都大于或者等于左

2022-03-27 19:04:46 1933 1

原创 Java——String类以及StringBuffer、StringBuilder

文章目录String类基本概念String字符串的存储原理String类的常用构造方法String类中常用方法StringBuffer类StringBuilder类String类基本概念String类属于引用数据类型,不属于基本数据类型。在Java中只要是" "(双引号)中的,都是String对象。java中规定,双引号中的字符串是不可变的,也就是说"abc"自出生到死亡都不可能变成"abcd",也不能变成"ab"。在JDK中双引号括起来的字符串都是存储在方法区的字符串常量池当中的。(因为在实际

2022-03-20 18:23:58 199

原创 Object类中的方法

equals方法源代码: public boolean equals(Object obj) { return (this == obj); }SUN公司设计equals方法目的?equals方法的设计初衷是判断两个对象是否相等,但是源代码中通过“ == ” 来判断是明显不行的,通过 “ = = ”来判断的仅仅是二者的内存地址。例如以下代码:public class Test { public static void main(String[] args) {

2022-03-20 14:03:04 228

原创 数据结构 —— 二叉树

二叉树分类满二叉树除最后一层无任何子节点外,每一层上的所有结点都有两个子结点的二叉树。也可以理解为每一层的结点数都达到最大值的二叉树。完全二叉树一棵深度为k的有n个结点的二叉树,对树中的结点按从上至下、从左到右的顺序进行编号,如果编号为i(1≤i≤n)的结点与满二叉树中编号为i的结点在二叉树中的位置相同,则这棵二叉树称为完全二叉树。简单的说,完全二叉树就是最后一层可以有缺失的满二叉树(完全二叉树是一种特殊的满二叉树),并且是从右往左的缺失。二叉树性质若规定根节点的层数为1,则一棵树非空二

2022-03-17 21:39:58 657

原创 Java中的抽象类和接口

抽象类什么是抽象类?类和类之间有共同特征,将这些共同特征提取出来进一步抽象,就形成了抽象类。由于类是不存在的,所以抽象类无法创建对象。抽象类属于什么类型?抽象类也属于引用数据类型。抽象类怎么定义?[修饰符列表] abstract class 类名{ 类体;}抽象类是干什么的?抽象类无法实例化,无法创建对象,所以抽象类是用来被子类继承的,抽象类中构造方法可以供子类使用。final与abstract是对立的两个关键字,不能联合使用。什么是抽象方法?抽象方法表示没有实现的方法,没有方

2022-02-26 02:00:44 352 2

原创 Java中super关键字详解

(1)super()表示通过子类的构造方法调用父类的构造方法。模拟现实中这种场景:想要有儿子,必须先有父亲。(2)当一个构造方法第一行:既没有this(),又没有super()的话,会默认会有一个super();表示通过当前子类构造方法调用父类的无参数构造方法。所以必须保证父类的无参数构造方法是存在的。(3)this()和super()不能共存,都是只能出现在构造方法第一行。(4)父类的构造方法是一定会执行的。(5)在Java语言中,无论new什么对象,Object类中的无参构造一

2022-02-23 22:41:32 2721 1

原创 Java多态总结

多态指的是:向上转型:子 === >父(upcasting)又被称为自动类型转换。父类型引用指向子类型对象。包括编译阶段和运行阶段:编译阶段:绑定父类的方法——静态绑定运行阶段:动态绑定子类型对象方法——动态绑定向下转型:父= = => 子(downcasting)又被称为强制类型转换。向下转型必须要进行“强制类型转换”。什么时候向下转型?当想要访问的方法是子类中特有的方法时,必须要进行向下转型。创建下面这些类和方法:class Animal{ public vo

2022-02-22 00:39:40 426 2

原创 Java中static详解和JVM内存分配

目录变量分类静态变量与实例变量静态方法和实例方法静态代码块与实例代码块JVM的内存结构变量分类局部变量:在方法体里面定义的变量,该变量会在程序执行到方法体时被初始化,存储在栈( stack)内存中。成员变量:类体之内,方法体之外定义的变量,它又分为实例变量和静态变量。实例变量:没有被static修饰的成员变量,实例变量是对象所拥有的,在创建对象时被初始化,存 储在堆内存中。静态变量:被static修饰的成员变量,静态变量是被所有对象共享的,在类加载时会..

2022-01-16 08:00:00 1631 3

原创 算法每日一题——第八天——最长上升子序列

原题链接: 力扣 895. 最长上升子序列 - AcWing题库这是一道动态规划问题 ,首先我们建立一个dp数组,来记录上升序列的长度。dp[ i ]表示以第 i 个数结尾的上升序列序列长度,最后dp数组中的最大值就是最长上升序列的长度,状态转移方程如下:dp[ i ] = max(dp[ j ] ) + 1,其中0 ≤ j < i且num[ j ] < num[ i ]因为最短的序列长度都是1,所以我们...

2022-01-05 20:28:09 55 3

空空如也

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

TA关注的人

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