自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

白蝶的博客

但愿人长久,千里共婵娟

  • 博客(35)
  • 收藏
  • 关注

原创 JVM 内存结构 详细学习笔记

程序计数器是一块较小的内存空间,可以看作是当前线程所执行的字节码的行号指示器。字节码解释器工作时通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等功能都需要依赖这个计数器来完成。总而言之,它是帮助线程记录下一条jvm指令的执行地址行号,如果没有程序计数器,那么jvm都不知道下一条该执行什么指令此外,为了线程切换后能恢复到正确的执行位置,每条线程都需要有一个独立的程序计数器,各线程之间计数器互不影响,独立存储,我们称这类内存区域为“线程私有”的内存。所以程序计数器

2022-07-05 23:00:05 232

原创 快进来看看,一篇入门Redis(大概)

Redis (官网)全称 Remote Dictionary Server(即远程字典服务),它是一个基于内存实现的键值型非关系(NoSQL)数据库Redis 用来缓存一些经常被访问的热点数据、或者需要耗费大量资源的内容,通过把这些内容放到 Redis 中,可以让应用程序快速地读取它们。例如,网站的首页需要经常被访问,并且在创建首页的过程中会消耗的较多的资源,此时就可以使用 Redis 将整个首页缓存起来,从而降低网站的压力,减少页面访问的延迟时间。1.Redis最常用来做缓存,是实现分布式缓存的首先中间件

2022-05-19 21:14:48 243

原创 POJ-3279 Fliptile (二进制枚举)详细题解

题目传送门:POJ-3279 Fliptile大致题意:有个N*M的矩阵,每个坐标点不是1就是0,我们需要通过翻转坐标点让这个矩阵全部为0,(翻转某一个点的话,这个点包括这个点的上下左右都会翻转);我们要尽可能使翻转次数更少,并且有多解时输出最小的那个解(就是指最后那个解转化为字符串的话也尽可能小)思路:先分析第一行,能够使第一行改变的只有本行和下一行,而我们需要将所有点都变为0,我们改变第二行时,第一行也会随之改变,所以我们要做的就是改变第二行的同时将第一行全部变为0,而第二行就交给第三行处理…

2020-12-09 22:40:24 254

原创 蓝桥杯 全球变暖 简单写法 详细易懂

@蓝桥杯 全球变暖 简单写法 超详细题目链接:全球变暖思路: **这道的大致写法就是用dfs将各个岛屿先编号(vis值)作为t, 编完号之后将上下左右有' . '这个字符的' # '的vis值改为0, 之后遍历整个字符数组,查找还剩几个vis数不为0,作为 h(当然不能重复计算) 再用t-h+1(为什么要加1?因为有些vis值一开始就是0) 那么下面就是具体代码,具体请看注释**#include<bits/stdc++.h>using namespace std;cons

2020-10-05 21:36:00 329

原创 设计模式_工厂模式学习笔记

上面的代码就是简单工厂模式,但是如果我们想要增加一个ProductC的话,需要改动Factory类的create方法,这样不符合设计模式的开闭原则,我们可以使用来解决这个问题。

2022-07-28 20:19:42 307 1

原创 设计模式_单例模式学习笔记

单例模式,是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中,使用单例模式的类只有一个对象实例。

2022-07-28 17:42:40 263

原创 并发编程 volatile关键字详解

第一颗CPU修改了x的数据,还没有刷回主存,此时第二颗CPU,从主存中读取了未修改的缓存行,而此时第一颗CPU修改的数据刷回主存,这时就出现,第二颗CPU读取的数据和主存不一致的情况。,线程对所有变量的操作都是先对变量进行拷贝,然后在工作内存中进行,不能直接操作主内存中的变量;,实际上并不存在,描述的是一组规则或规范,通过这组规范定义了程序中各个变量(包括实例字段,静态字段和构成数组对象的元素)的访问方式。,而a=1这条语句还没有被执行的时候,线程other先执行了y=a这条语句,这个时候a还是a=0;..

2022-07-22 16:43:13 623 1

原创 JUC并发编程 wait notify详解

首先,wait(),notify(),notifyAll()都不属于Thread类,而是属于Object基础类,也就是每个对象都有wait(),notify(),notifyAll()的功能,因为每个对象都有锁,锁是每个对象的基础,当然操作锁的方法也是最基础了。wait()方法的作用是释放该对象的锁,进入WaitSet等待区,从而让其他线程就机会获取对象的锁。无限制等待,直到notify()为止;如下图所示,wait()方法会使得运行状态的线程状态改变为等待状态,而wait(long)则是转变为。.....

2022-07-20 15:50:33 362

原创 JUC_synchronized关键字详解

从而这个锁的状态变成normal,这是因为偏向锁的对象MarkWord中存储了线程的id,这个线程id在操作系统层面是占用54位的,如果你调用了该对象的hashcode,那么此时hashcode会被赋值并且需要存储到markword,而且hashcode是占31位,如果不撤销偏向状态(会把偏向锁存储的线程id给清除),那么这个对象的hashcode将不能存放到该对象的markword中;如果锁的对象不相同那么锁对象它们关联的monitor就不是同一个,就不会有阻塞线程的效果);......

2022-07-18 20:26:52 165

原创 线程-interrupt方法详解

会让此线程产生一个InterruptedException异常,结束线程的运行。但如果该异常被线程捕获住,该线程依然可以自行决定后续处理(终止运行,继续运行,做一些善后工作等等),而且这个打断阻塞中的线程是会重置标状态为。这里不建议是使用stop方法,使用stop方法虽然可以强行终止正在运行或挂起的线程,但使用stop方法是很危险的。,线程会不时地检测这个中断标示位,以判断线程是否应该被中断(中断状态是否为true)我们如何在一个线程中暂停另一个线程的运行?...

2022-07-15 11:20:54 2608 1

原创 Java 反射学习笔记

反射,指在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法,对任意一个对象,都能调用它的任意一个方法。这种动态获取信息,以及动态调用对象方法的功能,叫做java语言的反射机制;简而言之,反射就是获取Class类对象及其内部信息(方法,属性,构造函数)以及反向控制实例对象的能力class对象的获取一般有三种运行结果:打印结果打印结果打印结果这里介绍一下Spring的IOC原理1、Spring 在项目启动的时间通过读取xml中配置的bean的路径,2、然后通过Class.forName

2022-07-13 17:41:58 397

原创 Java深拷贝和浅拷贝

下面我写了一个样例解释深拷贝和浅拷贝:这个样例中有两个类,一个Person类,一个Address类,Person类中有一个内部对象Address首先是浅拷贝输出的结果为:false true我们比较person的内部对象的引用address和克隆出来的person1的内部对象的引用address时,它们竟然是相等的,说明它们指向堆中的同一对象;那么说明我们修改person中的address时,person1的address也会被修改输出结果为:上海 ; 说明person2也被修改了下面是浅拷

2022-07-13 11:47:26 139

原创 JVM 类加载机制 详细学习笔记

类文件结构详解比起看类文件结构,我们可以通过对.class文件进行反编译查看javap -v 类名.class (对class文件进行反编译)下面可以通过一个个简单的demo了解方法执行流程下面是所展示的信息常量池载入运行时常量池(属于方法区)字节码放入方法区注意:当数的大小超过short类型的最大值时,它会存储在常量池中下面局部变量大小为4,操作数栈大小为2下面开始执行方法区......

2022-07-12 17:09:51 247

原创 JVM 垃圾回收 详细学习笔记

给对象中添加一个引用计数器,每当有一个地方引用它,计数器就加 1;当引用失效,计数器就减 1;任何时候计数器为 0 的对象就是不可能再被使用的。这个方法实现简单,效率高,但是目前主流的虚拟机中并没有选择这个算法来管理内存,其最主要的原因是它很难解决对象之间相互循环引用的问题。如下面代码所示:除了对象 objA 和 objB 相互引用着对方之外,这两个对象之间再无任何引用。但是他们因为互相引用对方,导致它们的引用计数器都不为 0,于是引用计数算法无法通知 GC 回收器回收他们。这个算法的基本思想就是通过一系

2022-07-06 17:32:35 170

原创 Leetcode刷题记录(数组)组合总和、组合总和 II、组合总数III、组合总和 Ⅳ

一、组合总和这道题是个典型的DFS,通过选和不选两种状态进行深搜,由于一个数可以不限次数的选取,所以在递归中,下标无需加一二、组合总和 II这道题比上题多加了个限制,就是每一个数只能用一次,并且不能包含重复的集合1、每一个数用一次:这个只需要在每次递归时让index++就能解决,选取了当前数,就不能在选这个数了2、不能包含重复的集合:这个我们可以先将数组排好序,在每一层循环中只能选择一种数,例如:1 1 1 2 2 这组数,在第一层循环中如果选择了第一个1,那么就不能选择第二个1,下次选择满足条件

2022-07-04 20:16:56 321

原创 Spring-Cloud-Nacos简介与简单配置

简单来说,Nacos = Eureka + Config + Busnacos主要功能是服务发现和微服务的配置集中管理下面是各服务注册中心的对比nacos下载链接:nacos1.新建模块:cloudalibaba-provider-payment90012.添加依赖父依赖:本模块依赖3.application.yml配置文件4.启动类5.业务类6.结果7.为下文的负载均衡演示,再同上配置一个90021.新建模块cloudalibaba-consumer-nacos-order832.同

2022-06-21 16:25:25 776

原创 SpringCloud-Config服务配置中心简介与简单配置

SpringCloud Config分为服务端和客户端两部分。服务端也称为分布式配置中心,它是一个独立的微服务应用,用来连接配置服务器并为客户端提供获取配置信息,加密/解密信息等访问接口客户端则是通过指定的配置中心来管理应用资源,以及与业务相关的配置内容,并在启动的时候从配置中心获取和加载配置信息配置服务器默认采用git来存储配置信息,这样就有助于对环境配置进行版本管理,并且可以通过git客户端工具来方便的管理和访问配置内容。Gitee上的配置文件1.pom依赖2.application.yml配置文件

2022-06-20 22:45:02 271

原创 SpringCloud-gateway网关简介与简单配置

该博客仅为作者记录springcloud学习过程,作者水平有限,如有错误敬请提出SpringCloud Gateway 是 Spring Cloud 的一个全新项目,基于 Spring 5.0+Spring Boot 2.0 和 Project Reactor 等技术开发的网关,它旨在为微服务架构提供一种简单有效的统一的 API 路由管理方式。网关是所有微服务的门户,路由转发仅仅是最基本的功能,除此之外还有其他的一些功能,比如:认证、鉴权、熔断、限流、日志监控等等…gateway主要由三个部分组成,分别是

2022-06-20 21:10:21 1300

原创 SpringCloud-Hystrix服务降级与熔断简介与简单配置

Hystrix包括服务降级与熔断1)新建模块,导入依赖2)修改appliction.yml配置文件,这里设置为单机Eureka,方便模拟测试3)在启动类上添加注释@EnableEurekaClient,注册服务4)创建两个service类,里面包含两个方法,其中一个进行线程等待5)创建controller类,调用service方法6)开启Jmeter,设置两万次请求并启动7)我们手动访问http://localhost:8001/payment/hystrix/ok/1,此时会发现这个测试路

2022-06-17 11:29:05 1093

原创 SpringCloud-OpenFeign服务调用简化器简介与简单配置

点我看:SpringCloud-Eureka服务注册中心点我看:SpringCloud-Ribbon负载均衡Feign是一个声明式WebService客户端。使用Feign能让编写Web Service客户端更加简单Feign旨在使编写Java Http客户端变得更容易。使用Ribbon+RestTemplate时,利用RestTemplate对http请求的封装处理,形成了一套模版化的调用方法。但是在实际开发中,由于对服务依赖的调用可能不止一处,往往一个接口会被多处调用,所以通常都会针对每个微服务自行

2022-06-16 15:17:53 375

原创 SpringCloud-Ribbon负载均衡简介与简单配置

如果已经引入了spring-cloud-starter-netflix-eureka-client 依赖则不需要再次引入Ribbon依赖,因为 eureka-client 已经包括Ribbon了2.简单使用可以看作者上篇博客(Ribbon默认负载均衡方式为轮询方式)点这里->SpringCloud-Eureak服务注册中心3.替换负载均衡方式1)创建配置类官方文档明确给出了警告:这个自定义配置类不能放在@...

2022-06-15 23:37:32 236

原创 SpringCloud-Eureka服务注册中心简介与简单配置

Eureka是一个服务注册中心,主要功能包括服务注册和服务发现Eureka配置主要分为两个部分:1.导入eureka-server依赖2、修改application.yml配置文件3、启动类添加注释:@EnableEurekaServer4.结果1.导入eureka-client依赖2.修改application.yml配置文件3.启动类添加注解@EnableEurekaServer4.结果在配置文件中的name决定服务的名称1、同样导入依赖2、修改application.yml配置文件

2022-06-15 22:28:22 1917

原创 MySql数据库-事务-学习笔记

`事务的性质有四个,分别是原子性、一致性、隔离性、持久性原子性(A):事务是不可分割的最小操作单位,要么全部成功,要么全部失败一致性(C):事务将数据库从一种状态转变为另一种一致的状态。在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏。隔离性(I):数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行持久性(D):事务一旦提交或回滚,它对数据库中的数据的改变就是永久的为了解决并发事务所引发的问题,在数据库中引入了事务隔离级别。主要有以下几种:实现原子性的关键,是当事务

2022-06-09 21:30:58 261

原创 Mysql数据库-锁-学习笔记

锁是计算机协调多个进程或线程并发访问某一资源的机制,用于管理对共享资源的并发访问表级锁,每次操作锁住整张表。锁定粒度大,发生锁冲突的概率最高,并发度最低。应用在MyISAM、 InnoDB等存储引擎中读锁:写锁:meta data lock , 元数据锁,简写MDL。MDL锁主要作用是维 护表元数据的数据一致性,在表上有事务时,不能对表结构进行修改。为了避免DML与DDL冲突,保证了读写的正确性为了避免DML在执行时,加的行锁与表锁的冲突,在InnoDB中引入了意向锁,使得表锁不用检查每行数据是否

2022-06-06 19:01:20 691 1

原创 MySql数据库-索引-学习笔记

作者最近在学习数据库索引,故想通过写博客的方式记录学习情况,如有错误,敬请指出。索引是一个单独的、存储在磁盘上的数据库结构,包含着对数据表里所有记录的引用指针。使用索引可以快速找出在某个或多个列中有一特定值的行,所有MySQL列类型都可以被索引,对相关列使用索引是提高查询操作速度的最佳途径。优势:劣势:聚集索引选取规则:1.创建索引:2.删除索引:3.查看索引:3.2 判断索引是否生效可以使用EXPLAIN语句查看索引是否正在使用。explain select * from 表名 where 条

2022-06-02 16:41:58 372

原创 入门Nginx反向代理服务器

Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器;其特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。Nginx配置文件server{ } 其实是包含在 http{ } 内部的。每一个 server{ } 是一个虚拟主机(站点)。上面代码块的意思是:当一个请求叫做localhost:8080请求nginx服务器时,该请求就会被匹配进该代码块的 server{ } 中执

2022-05-27 15:58:37 2220 1

原创 一篇搞懂hashcode, ==,equals的关系

首先,==对于基本数据类型,对比的是值;如果是两个引用数据类型,对比的是引用对象的地址(判断两个引用是否指向同一对象)那么我们如何比较两个引用数据类型是否相等?这里我们可以用到equals方法,下图是equals的源码可以看到,equals的源码也是==,这不一样了吗?还怎么比较?所以我们可以重写equals方法例如:String类型就重写了equals方法,所以我们可以直接用equals方法比较两个字符串是否相等包装类型也同样重写了equals方法,但我们用其比较时,要注意我们比较的另一个数是不是同

2022-05-20 18:18:15 323

原创 Java 中的参数传递是值传递呢?还是引用传递?

首先说结论:Java 中的参数传递是值传递:看下面第一个例子:我们将a(基本数据类型int)当作参数可以看到:实参并没有改变因为基本数据类型是存在在栈中的,在传参时,会将数据创建一个副本同样放入栈中,这个副本改变了,而我们的实参并没有改变,这符合值传递再看第二个例子:这里我没有重写tostring方法,结果如下,可以看到, 形参和实参是一样的那么可能有小伙伴质疑java不是值传递,我们看下图:对象的引用存放在栈中,而我们的对象存放在堆中在传参过程中,同例子1一样,会在f方法中创建一个副本,这

2022-05-20 17:32:33 673

原创 Leetcode刷题记录(数组)两数之和、三数之和、四数之和

该文仅作为作者记录学习的笔记,如有错误,敬请指出该题主要思路:先通过循环遍历第一个数,再利用containsKet方法找到另一个数然后以的形式存入HashMap中为什么不一开始将所有数以这种方式存入HashMap?因为,这道题每一个数只能选一遍,这样做是为了防止一个数被选两遍代码:二、三数之和这里借鉴LeetCode的思路(几乎都是“借鉴”)要想不重复,我们就可以先排序,保证三个数是:a...

2022-05-16 15:19:13 86

原创 从零创建SpringBoot简单模板后台:增删改查与分页

本文记录如果从零开始创建一个包含增删改查的简单入门SpringBoot例子,如有错误,敬请指正(学习来自某SpringBoot视频)1.创建SpringBoot项目,选择JDK1.82.Java Version选择83.选择创建模板4.设置项目名称和项目路径由于父类声明了版本,这里就不用设置版本1.SQL语句如下创建完成后就是这个样子SpringBoot默认.properties类型,我们把它改成.yml文件内容具体如下五、创建配置类1.MyBatis-Plus分页插件配置类

2022-05-11 23:34:29 882 2

原创 Git,Git的简单命令,在IDEA中的简单用法

最近博主在学习Git,仅想通过编写博客加强自己对Git的认识,这也是博主的第一篇博客,如有不善之处,敬请指正(博主是个蒟蒻)Git是一个开源的分布式版本控制系统,可以有效、高速地处理从很小到非常大的项目版本管理。(转自百度)版本控制是一种记录文件内容变化,以便将来查阅特定版本修订情况的系统。 版本控制其实最重要的是可以记录文件修改历史记录,从而让用户能够查看历史版本, 方便版本切换。试想一下,如果没有一个高效的版本控制系统,而是手动的进行版本更新(如下图);你不知道你的下一版代码是否有bug,或是不如上一

2022-05-11 18:29:57 2718

原创 归并排序详解

public class SortTest{ public static void mergesort(int[] a,int l,int r) { int[] temp = new int[r-l+1]; sort(a, l, r,temp); } public static void sort(int[] a,int l,int r,int[] temp) { if(l==r) return; int mid=l+(r-l)/2; sort(a, l, mid,temp)

2021-09-15 17:15:26 78

原创 JAVA只有增删改查的简易单向链表

class Node<T>{//节点类 public T data; public Node<T> next; public Node() {} public Node(T data) { this.data = data; }}public class MyList<T> {//链表类 private Node<T> head = new Node<T>(); public int nodeSize() {//链表大小

2021-09-08 20:52:10 130 1

原创 几钟的排序算法:冒泡,插入,快速

一.冒泡排序package project1;import java.util.Scanner;public class BbbleSort { public static void main(String[] args) { int[] sum = new int[10]; Scanner in = new Scanner(System.in); for(int i=0;i<10;i++) { sum[i] = in.nextInt(); } for(int i

2021-09-08 19:09:39 104

原创 蓝桥杯 幸运数 简单 详细 题解(作者是菜鸡 勿喷)

题目:幸运数主要思路:运用递归和循环语句维护a数组,也就是用a[i]数组储存最终答案最后遍历a数组输出答案。具体的细节可以看注释代码:#include<bits/stdc++.h>using namespace std;const int maxn=1e6+5;int m,n,ans,a[maxn];void Change(int p){ int q=p; if(a[p]>n) return;//如果这里的数大于n,也就是题目要求的最大的数,就可以退出了 f

2020-10-09 23:41:47 273

空空如也

空空如也

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

TA关注的人

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