自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

转载 微服务01(Eureka、Nacos)

该笔记基于黑马程序员的SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式,史上最全面的springcloud微服务SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式,史上最全面的springcloud微服务技术栈课程|黑马程序员Java微服务_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1LQ4y127n4?p=41.1.单体架构单体架构:将业务的所有功能集中在一个项目中开发,打成一个包部

2022-02-24 15:26:05 356

转载 设计模式(1)

第一章 基础概念 软件设计模式(Software Design Pattern),又称设计模式,是一套被反复使用、多数人知晓 的、经过分类编目的、代码设计经验的总结。它描述了在软件设计过程中的一些不断重复发生的问题, 以及该问题的解决方案。也就是说,它是解决特定问题的一系列套路,是前辈们的代码设计经验的总 结,具有一定的普遍性,可以反复使用 设计模式的本质是面向对象设计原则的实际运用,是对类的封装性、继承性和多态性以及类的关联关系 和组合关系的充分理解。 正确使用设计模式具有以下优..

2022-02-18 11:56:21 131

转载 手写一个Spring(第三章 第四章 第五章)

第三章 对象实例化策略在刚才的代码里已经实现了实例化对象容器管理,但还有一个关键的问题。实例对象并非是全部都是无参构造函数,在面对有参的构造函数,刚才的代码就不行了。newInstance(); 实例化方式并没有考虑构造函数的入参,所以这个章节需要解决的就是这个问题。参考 Spring Bean 容器源码的实现方式,在 BeanFactory 中添加 Object getBean(String name, Object... args) 接口,这样就可以在获取 Bean 时把构造函数的入参

2022-01-28 11:15:00 194 1

原创 Java 反射

1.什么是反射  反射就是把Java类中的各个成分映射成一个个的Java对象。即在运行状态中,对于任意一个类,都能够知道这个类的所以属性和方法;对于任意一个对象,都能调用它的任意一个方法和属性。 当类加载完后,在堆内存的方法区中就产生了一个Class类型的对象(一个类只能有一个Class对象),这个对象就包含了完整的类的结构信息,我们可以通过这个对象看到类的结构。这个对象就像透过一面镜子一样,透过照镜子来看类的结构一样,所以形象的称之为反射。  1.1反射机制的功能  Java...

2021-10-13 16:51:25 112

原创 Java Socket学习

1.网络1.1网络概述 计算机网络:把分布在不同地域的计算机与专门的外部设备用通信线路互联成一个规模大功能强的网络系统。 网络编程的目的:直接或间接的通过网络协议与其他计算机实现数据交换,进行通讯。 网络编程中有两个主要问题: 如何准确地定位网络上一台或多台主机:定位主机上的特定的应用。 找到主机琥如何可靠高效地进行数据传输1.2如何实现网络中的主机通信通信双方的地址:IP、端口号一定的规则(网络通信协议...

2021-10-10 15:32:19 97

转载 Mysql必知必会(2)

第十五章 联结表 创建连接-- 利用where进行联结查询SELECT v.vend_name, p.prod_name, p.prod_price FROM vendors v, products p WHERE v.vend_id = p.vend_id ORDER BY p.prod_name内部连接-- 内部连接SELECT v.vend_name, p.prod_name, p.pr...

2021-09-22 21:51:29 158

转载 Mysql必知必会(1)

第四章 检索数据知识点 select语句使用 DISTINCT去重,limit返回限定行数-- --检索单个列select prod.prod_name from products prod;-- 检索多个列select prod.prod_id,prod.prod_name,prod.prod_price,prod.prod_desc from products prod;-- 检索所有列SELECT * FROM products ;-- 利用DISTINCT关键字去除重

2021-09-21 14:04:47 145

原创 数据结构与算法 分治算法

分治算法介绍分治法是一种很重要的算法。字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。这个技巧是很多高效算法的基础,如排序算法(快速排序,归并排序),傅立叶变换(快速傅立叶变换)……分治算法可以求解的一些经典问题二分搜索 大整数乘法 棋盘覆盖 合并排序 快速排序 线性时间选择 最接近点对问题 循环赛日程表 汉诺塔分治算法的基本步骤...

2021-09-14 15:29:07 72

转载 数据结构与算法学习 多路查找树

二叉树的问题分析 二叉树的操作效率较高,但是也存在问题, 请看下面的二叉树 1) 二叉树需要加载到内存的,如果二叉树的节点少,没有什么问题,但是如果二叉树的节点很多(比如 1 亿), 就存在如下问题: 2) 问题 1:在构建二叉树时,需要多次进行 i/o 操作(海量数据存在数据库或文件中),节点海量,构建二叉树时,速度有影响 3) 问题 2:节点海量,也会造成二叉树的高度很大,会降低操作速度. 多叉树 1) 在二叉树中,每个节点有数据项,最多有两个...

2021-09-12 22:28:07 126

原创 数据结构与算法学习 AVL平衡二叉树

定义平衡二叉树,又称AVL树,它是一种特殊的二叉排序树。AVL树或者是一棵空树,或者是具有以下性质的二叉树:(1)左子树和右子树都是平衡二叉树;(2)左子树和右子树的深度(高度)之差的绝对值不超过1。如果一个{1,2,3,4,5,6}的二叉排序树,它的左子树为空,每个节点都堆积在右子树上。看起来更像一个单链表。它的插入速度虽然没有影响,但是查询速度明显降低(因为需要依次比较),不能发挥B...

2021-09-12 14:37:47 94

原创 数据结构与算法 赫夫曼与BST二叉排序树

赫夫曼基本介绍 1) 给定 n 个权值作为 n 个叶子结点,构造一棵二叉树,若该树的带权路径长度(wpl)达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree), 还有的书翻译为霍夫曼树。 2) 赫夫曼树是带权路径长度最短的树,权值较大的结点离根较近赫夫曼树几个重要概念和举例说明 1) 路径和路径长度:在一棵树中,从一个结点往下可以达到的孩子或孙子结点之间的通路,称为路径。通路中分支的数目称为路径长度。若规定根结点的层数为 1,则从根结点到第 L 层结点的路径长度

2021-09-11 22:24:04 242

原创 JUC学习第八章 J.U.C 可重入原理

可重入原理static final class NonfairSync extends Sync { // ... // Sync 继承过来的方法, 方便阅读, 放在此处 final boolean nonfairTryAcquire(int acquires) { final Thread current = Thread.currentThread(); int c = getState(); if ...

2021-09-10 13:29:12 99

原创 数据结构与算法 堆

堆堆排序基本介绍 1) 堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序,它的最坏,最好,平均时间复杂度均为 O(nlogn),它也是不稳定排序。 2) 堆是具有以下性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆, 注意 : 没有要求结点的左孩子的值和右孩子的值的大小关系。 3) 每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆 4) 大顶堆举例说明 5) 小顶堆举例说明一般升序采用大顶堆,降序采用小顶堆堆排序.

2021-09-08 22:54:42 62

原创 数据结构与算法 二叉树

树为什么需要树这种数据结构 1) 数组存储方式的分析 优点:通过下标方式访问元素,速度快。对于有序数组,还可使用二分查找提高检索速度。 缺点:如果要检索具体某个值,或者插入值(按一定顺序)会整体移动,效率较低 [示意图] 画出操作示意图: ArrayList源码创建一个默认长度为10的数组一旦空间不够了立马创建一个更大的新数组来存储2) 链式存储方式的分析 优点:在一定程度上对数组存储方式有优化(比如:插入一个数值节点,只需要将插入节点,.

2021-09-08 21:02:12 66

原创 JUC学习第八章 J.U.C

J.U.CAQS 原理概述:全称是 AbstractQueuedSynchronizer,是阻塞式锁和相关的同步器工具的框架 特点: 用 state 属性来表示资源的状态(分独占模式和共享模式),子类需要定义如何维护这个状态,控制如何获取锁和释放锁 getState - 获取 state 状态 setState - 设置 state 状态 compareAndSetState - cas 机制设置 state 状态 独占模式是只有一个线程能够访问资源,而...

2021-09-07 21:02:15 96

原创 数据结构与算法 HASH表

散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。给定表M,存在函数f(key),对任意给定的关键字值key,代入函数后若能得到包含该关键字的记录在表中的地址,则称表M为哈希(Hash)表,函数f(key)为哈希(Hash) 函数。...

2021-09-07 14:41:25 71

原创 JUC学习第八章02 ThreadPoolExecutor

ThreadPoolExecutor线程池状态ThreadPoolExecutor 使用 int 的高 3 位来表示线程池状态,低 29 位表示线程数量从数字上比较,TERMINATED > TIDYING > STOP > SHUTDOWN > RUNNING 为什么不用两个变量来存储线程池状态和线程数量呢?为了保证能对线程池状态和线程数量进行一次原子性的操作,所以把它存储在一个变量上。...

2021-09-06 22:19:02 93

原创 数据结构与算法 查找算法

二分查找请对一个有序数组进行二分查找 {1,8, 10, 89, 1000, 1234} ,输入一个数看看该数组是否存在此数,并且求出下标,如果没有就提示"没有这个数"。 /** * * @param arr 数组 * @param left 左边的索引 * @param right 右边的索引 * @param findVal 要查找的值 * @return 找到就返回下标 没找到返回-1 */ public.

2021-09-06 15:25:02 82

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

时间复杂度和空间复杂度 时间复杂度

2021-09-06 14:28:06 131

原创 JUC学习第八章01 线程池

线程池为了减少线程频繁的上下文切换。不在任务来了时才创建新的线程。而是充分利用已有线程的潜力,可以得到重复的利用。减少内存占用,线程数量,上下文切换,可以使用线程池来解决自定义线程池 这个架构类似一个生产者消费者模式,中间的BQ是为了平衡线程池和main主线程的速度不一致,存储任务。代码实现: 任务阻塞队列Blocking Queue://队列class BlockingQueue<T>...

2021-09-05 20:07:53 90

原创 数据结构与算法学习 递归

递归递归的概念 简单的说: 递归就是方法自己调用自己,每次调用时传入不同的变量.递归有助于编程者解决复杂的问题,同时可以让代码变得简洁。 基线条件和递归条件每个递归函数都有两部分:基线条件(base case)和递归条件(recursive case)。递归条件指的是函数调用自己,而基线条件则指的是函数不再调用自己,从而避免形成无限循环。递归能解决什么样的问题 递归用于解决什么样的问题 1) 各种数学问题如: 8 皇后问题...

2021-09-04 16:35:58 380

原创 数据结构与算法学习 栈

、栈的介绍 栈的英文为(stack) 栈是一个先入后出(FILO-First In Last Out)的有序列表。 栈(stack)是限制线性表中元素的插入和删除只能在线性表的同一端进行的一种特殊线性表。允许插入和删除的 一端,为变化的一端,称为栈顶(Top),另一端为固定的一端,称为栈底(Bottom)。 根据栈的定义可知,最先放入栈中元素在栈底,最后放入的元素在栈顶,而删除元素刚好相反,最后放入的元 素最先删除,最先放入的元素最后删除 ...

2021-09-04 15:28:11 65

原创 数据结构与算法 双向链表

在单链表的基础上加上一个pre节点,用来保存上一个节点[pre-Data-next] 看起来这种感觉qwq下面是代码实现public class DoubleLinkedList { public NewHeroNode getNewHeroNode() { return newHeroNode; } //拿这个做头结点啦 private final NewHeroNode newHeroNode = new NewHeroNode(null,

2021-09-04 14:28:00 64

原创 JUC学习第七章 共享模型之不可变

日期转换的问题问题提出,下面的代码在运行时,由于 SimpleDateFormat 不是线程安全的,有很大几率出现 java.lang.NumberFormatException 或者出现不正确的日期解析结果。解决方式: public static void main(String[] args) { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); for (int i...

2021-09-03 22:56:17 84

转载 JUC学习第六章 共享模型之无锁01

本章内容 CAS 与 volatile 原子整数 原子引用 原子累加器 Unsafe共享模型之无锁管程即monitor是阻塞式的悲观锁实现并发控制,这章我们将通过非阻塞式的乐观锁的来实现并发控制public class Test01 { public static void main(String[] args) { Account.demo(new AccountUnsafe(10000)); }}class Acco...

2021-09-03 19:58:34 98

原创 数据结构与算法 单链表

概念为了表示每个数据元素a(i)与它下一个元素a(i+1)之间的逻辑关系,对数据元素a(i)来说除了储存储本身的信息之外,还需存储一个表示它下一个元素的信息。这两部分信息组成数据元素a(i)的存储映像,称为节点,它包括两个域:存本身信息的叫数据域,存直接后继位置的叫指针域。n个节点链接成一个链表,即为线性表(a1,a2,a3.....an)的链式存储结构。由于每个节点中只存在一个指针域所以我们称之为单链表或线性链表。2.特点1)顺序存取2)储存数据元素的...

2021-09-03 18:38:14 113

转载 数组模拟队列

队列类似于排队,其遵循先入先出的规律,队列需要头索引(front)与尾索引(rear),在不同的实现思路里头尾索引初始值不同,每添加一个数据尾索引向后一位,每取出一个数据头索引向后一位。是一个有序列表,可以用数组或链表为核心存储介质实现。数组模拟建立队列的思路队列本身是有序列表,若使用数组的结构来存储队列的数据,则队列数组的声明如下图, 其中 maxSize 是该队 列的最大容量。 因为队列的输出、输入是分别从前后端来处理,因此需要...

2021-09-03 12:28:01 55

转载 JUC学习 第五章 共享模型之内存

本章内容 上一章讲解的 Monitor 主要关注的是访问共享变量时,保证临界区代码的原子性这一章我们进一步深入学习共享变量在多线程间的【可见性】问题与多条指令执行时的【有序性】问题 5.1 Java 内存模型 JMM 即 Java Memory Model,它定义了主存、工作内存抽象概念,底层对应着 CPU 寄存器、缓存、硬件内存、CPU 指令优化等。 JMM 体现在以下几个方面 原子性 - 保证指令不会受到线程上下文切换的影响 可见性 - 保证指令不会受 cpu 缓存的影响..

2021-09-01 21:07:08 208

转载 JUC学习 共享模型 04

同步模式之顺序控制 固定运行顺序public static final Object lock = new Object(); public static void main(String[] args) { Thread thread1 = new Thread(()->{ while (true){ synchronized (lock){ ...

2021-08-31 21:25:57 60

转载 JUC学习 共享模型03

Park和UnPark 基本使用LockSupport类是Java6(JSR166-JUC)引入的一个类,提供了基本的线程同步原语。LockSupport提供的两个主要方法就是park和unpark。park译为“停车”,官方文档意为:许可。为了方便理解,在这里我们可以理解为阻塞,等待,挂起,而unpark我们理解为唤醒,恢复。LockSupport同步线程和wait/notify不一样,LockSupport...

2021-08-31 20:44:13 70

转载 算法图解笔记 第三章

递归假设你要在一个盒子里找一把钥匙。这个盒子里有多个盒子(盒子堆),这个盒子堆里的盒子里又有盒子。钥匙就在某个盒子里,为找到钥匙,你将是用什么算法?基线条件和递归条件每个递归函数都有两部分:基线条件(base case)和递归条件(recursive case)。递归条件指的是函数调用自己,而基线条件则指的是函数不再调用自己,从而避免形成无限循环。 public static void print(int i){ System.out.println(i); //逻辑代码

2021-08-31 17:45:22 69

转载 算法图解笔记第二章

选择排序内容提要:学习数组和链表,选择排序。内存的工作原理将数据存储在一个一个的内存单元里。当需要存储多项数据时,可以使用数组和链表。数组和链表假设你要编写一个管理待办事项的应用程序,为此需要将待办事项存锤在内存里。应该使用数组还是链表呢?使用数组就意味着所有的待办事项在内存里都是相连的。也意味着会浪费很多内存空间(因为要开辟很多空间,哪怕不用也要开辟)。链表链表可以存储在内存中任何地方,链表的每个元素都存储了自己下一个元素的内存地址,通过这种方式相连。链表的优势:插入删

2021-08-31 16:48:55 74

转载 算法图解笔记第一章

二分查找法public static void main(String[] args) { int[] nums = new int[100]; for (int i = 1; i < 100; i++) { nums[i] = i; } System.out.println(binarySearch(nums,5)); } public static int binary...

2021-08-31 16:17:44 83

转载 JUC学习03 共享模型02

wait使用场景 当Owner线程发现条件不满足,就会进入wait状态,进入Monitor中的WaitSet变成WATING状态。在WATING的县城和BLOCKED一样都是阻塞状态,不会占有CPU的时间片。但BLOCKED状态的线程会在Owner线程释放锁时唤醒。而WAITING线程会在Owner调用notify或notifyAll时唤醒,唤醒后也不意味着马上就会获得锁,而是重新进入EntryList进行竞争。wait/notifywait():使调用...

2021-08-29 22:53:21 85

转载 JUC学习03 锁

锁的优化从JDK5引入了现代操作系统新增加的CAS原子操作(JDK5中并没有对synchronized关键字做优化,而是体现在J.U.C中,所以在该版本concurrent包有更好的性能),从JDK6开始,就对synchronized的实现机制进行了较大调整,包括使用JDK5引进的CAS自旋之外,还增加了自适应的CAS自旋、锁消除、锁粗化、偏向锁、轻量级锁这些优化策略。由于此关键字的优化使得性能极大提高,同时语义清晰、操作简单、无需手动关闭,所以推荐在允许的情况下...

2021-08-29 12:33:21 66

转载 synchronize原理分析

记得开始学习Java的时候,一遇到多线程情况就使用synchronized,相对于当时的我们来说synchronized是这么的神奇而又强大,那个时候我们赋予它一个名字“同步”,也成为了我们解决多线程情况的百试不爽的良药。但是,随着学习的进行我们知道在JDK1.5之前synchronized是一个重量级锁,相对于j.u.c.Lock,它会显得那么笨重,以至于我们认为它不是那么的高效而慢慢摒弃它。不过,随着Javs SE 1.6对synchronized进行的各种优化后,synchronized并不会显得

2021-08-28 21:41:17 329

转载 JUC学习03 共享模型(01)

共享模型 线程安全问题的Java体现 /** * 线程安全问题的Java体现 */ //如果两个线程做自增自减500次,那结果会是0吗 static class JavaThreadSecurity{ static int num = 0; public static void main(String[] args) throws InterruptedException { ...

2021-08-28 21:36:35 130

转载 JUC学习02 Java线程

线程 守护线程用户线程:用户自己创建的线程(新建Thread线程的操作) * 守护线程: 运行在后台,比如垃圾回收(GC)//创建用户线程和守护线程 public static void main(String[] args) { Thread t1 = new Thread(()->{ System.out.println(Thread.currentThread().getName()+"::"+Thread.cu...

2021-08-24 12:28:17 53

转载 JUC学习01

1.进程与线程进程 程序由指令和数据组成,但这些指令要运行,数据要读写,就必须将指令加载至 CPU,数据加载至内存。在 指令运行过程中还需要用到磁盘、网络等设备。进程就是用来加载指令、管理内存、管理 IO 的 当一个程序被运行,从磁盘加载这个程序的代码至内存,这时就开启了一个进程。 进程就可以视为程序的一个实例。大部分程序可以同时运行多个实例进程(例如记事本、画图、浏览器 等),也有的程序只能启动一个实例进程(例如网易云音乐、360 安全卫士等) 线程 一个进程之内可以分为..

2021-08-23 23:41:59 49

空空如也

空空如也

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

TA关注的人

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