09 2022 档案
摘要:应用实例 马踏棋盘算法也被称为骑士周游问题 将马随机放在国际象棋的8×8棋盘Board[0~7][0~7]的某个方格中,马按走棋规则(马走日字)进行移动。要求每个方格只进入一次,走遍棋盘上全部64个方格 骑士周游问题的解决步骤和思路 1. 创建棋盘 chessBoard , 是一个二维数组 2. 将
阅读全文
摘要:简介 和Dijkstra算法一样,弗洛伊德(Floyd)算法也是一种用于寻找给定的加权图中顶点间最短路径的算法。 该算法名称以创始人之一、1978年图灵奖获得者、斯坦福大学计算机科学系教授罗伯特·弗洛伊德命名 弗洛伊德算法(Floyd)计算图中各个顶点之间的最短路径 迪杰斯特拉算法用于计算图中某一个
阅读全文
摘要:应用实例 有7个村庄(A, B, C, D, E, F, G) ,现在有六个邮差,从G点出发,需要分别把邮件分别送到 A, B, C , D, E, F 六个村庄 各个村庄的距离用边线表示(权) ,比如 A – B 距离 5公里 如何计算出G村庄到 其它各个村庄的最短距离? 如果从其它点出发到各个点
阅读全文
摘要:应用场景 某城市新增7个站点(A, B, C, D, E, F, G) ,现在需要修路把7个站点连通 各个站点的距离用边线表示(权) ,比如 A – B 距离 12公里 问:如何修路保证各个站点都能连通,并且总的修建公路总里程最短? 简介 克鲁斯卡尔(Kruskal)算法,是用来求加权连通图的最小生
阅读全文
摘要:应用场景 现有7个村庄(A, B, C, D, E, F, G) ,现在需要修路把7个村庄连通 各个村庄的距离用边线表示(权) ,比如 A – B 距离 5公里 如何修路保证各个村庄都能连通,并且总的修建公路总里程最短? 最小生成树 修路问题本质就是就是最小生成树问题, 先介绍一下最小生成树(Min
阅读全文
摘要:应用实例 假设存在如下表的需要付费的广播台,以及广播台信号可以覆盖的地区。 如何选择最少的广播台,让所有的地区都可以接收到信号 思路分析 目前并没有算法可以快速计算得到准备的值, 使用贪婪算法,则可以得到非常接近的解,并且效率高。选择策略上,因为需要覆盖全部地区的最小集合: 遍历所有的广播电台, 找
阅读全文
摘要:设置时间 控制面板
阅读全文
摘要:应用实例 暴力匹配算法 代码实现 public class ViolenceMatch { public static void main(String[] args) { //测试暴力匹配算法 String str1 = "硅硅谷 尚硅谷你尚硅 尚硅谷你尚硅谷你尚硅你好"; String str2
阅读全文
摘要:应用实例 有一个背包,容量为4磅,现在将如下商品装入背包,要求装入的背包的总价值最大,并且重量不超出,且物品不能重复 # 当前为01背包 # 如果为完全背包则放入物品可重复 简介 思路分析 每次遍历到的第i个物品,根据w[i]和v[i]来确定是否需要将该物品放入背包中。 即对于给定的n个物品,设v[
阅读全文
摘要:简介 把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。 这个技巧是很多高效算法的基础,如排序算法(快速排序,归并排序),傅立叶变换(快速傅立叶变换)…… # 解决的问题 二分搜索 大整数乘法 棋盘覆盖
阅读全文
摘要:简介 二分查找法的运行时间为对数时间O(㏒₂n) ,即查找到需要的目标位置最多只需要㏒₂n步,假设从[0,99]的队列(100个数,即n=100)中寻到目标数30,则需要查找步数为㏒₂100 , 即最多需要查找7次( 2^6 < 100 < 2^7) 代码实现 public class Binary
阅读全文
摘要:简介 图是一种数据结构,其中结点可以具有零个或多个相邻元素。两个结点之间的连接称为边。 结点也可以称为顶点 无向图: 顶点之间的连接没有方向,比如A-B, 即可以是 A-> B 也可以 B->A 路径: 比如从 D -> C 的路径有 1) D->B->C 2) D->A->B->C 有向图 带权图
阅读全文
摘要:二叉树存在的问题 二叉树需要加载到内存的,如果二叉树的节点少,没有什么问题,但是如果二叉树的节点很多(比如1亿) 问题1:在构建二叉树时,需要多次进行i/o操作(海量数据存在数据库或文件中),节点海量,构建二叉树时,速度有影响 问题2:节点海量,也会造成二叉树的高度很大,会降低操作速度 多叉树 在二
阅读全文
摘要:二叉排序树所存在的问题 一个数列{1,2,3,4,5,6},要求创建一颗二叉排序树(BST) 左子树全部为空,从形式上看,更像一个单链表. 插入速度没有影响 查询速度明显降低(因为需要依次比较), 不能发挥BST的优势,因为每次还需要比较左子树,其查询速度比单链表还慢 解决方案-平衡二叉树(AV
阅读全文
摘要:分3种情况 代码实现 public class BinarySortTreeDemo { public static void main(String[] args) { int[] arr = {7, 3, 10, 12, 5, 1, 9, 2}; BinarySortTree binarySor
阅读全文
摘要:应用实例 一个数列 (7, 3, 10, 12, 5, 1, 9),要求能够高效的完成对数据的查询和添加 数组未排序, 优点:直接在数组尾添加,速度快。 缺点:查找速度慢. 数组排序,优点:可以使用二分查找,查找速度快,缺点:为了保证数组有序,在添加新数据时,找到插入位置后,后面的数据需整体移动,速
阅读全文
摘要:应用实例 代码实现,转为赫夫曼树 public class HuffmanCode { public static void main(String[] args) { String content = "i like like like java do you like a java"; byte
阅读全文
摘要:定长编码 变长编码 统计不同字符出现的次数 字符所对应的编码 以上的编码在解码时,会存在多义性,所以不是前缀编码 赫夫曼编码 注意点
阅读全文
摘要:简介 给定n个权值作为n个叶子结点,构造一棵二叉树,若该树的带权路径长度(wpl)达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree), 还有的书翻译为霍夫曼树。 赫夫曼树是带权路径长度最短的树,权值较大的结点离根较近 路径和路径长度:在一棵树中,从一个结点往下可以达到的
阅读全文
摘要:简介 堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序,它的最坏,最好,平均时间复杂度均为O(nlogn),它也是不稳定排序。 堆是具有以下性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆, 注意 : 没有要求结点的左孩子的值和右孩子的值的大小关系。 每个
阅读全文
摘要:将数列 {1, 3, 6, 8, 10, 14 } 构建成一颗二叉树 问题分析 当我们对上面的二叉树进行中序遍历时,数列为 {8, 3, 10, 1, 6, 14 } 但是 6, 8, 10, 14 这几个节点的左右指针,并没有完全的利用上. 如果我们希望充分的利用各个节点的左右指针,让各个节点可以
阅读全文
摘要:简介 从数据存储来看,数组存储方式和树的存储方式可以相互转换,即数组可以转换成树,树也可以转换成数组 特点 顺序二叉树通常只考虑完全二叉树 第n个元素的左子节点为 2 * n + 1 第n个元素的右子节点为 2 * n + 2 第n个元素的父节点为 (n-1) / 2 应用实例 遍历数组 arr时,
阅读全文
摘要:应用实例 代码实现 public class BinaryTreeDemo { public static void main(String[] args) { //先需要创建一颗二叉树 BinaryTree binaryTree = new BinaryTree(); //创建需要的结点 Hero
阅读全文
摘要:数组存储方式的分析 优点:通过下标方式访问元素,速度快。对于有序数组,还可使用二分查找提高检索速度。 缺点:如果要检索具体某个值,或者插入值(按一定顺序)会整体移动,效率较低 链式存储方式的分析 优点:在一定程度上对数组存储方式有优化(比如:插入一个数值节点,只需要将插入节点,链接到链表中即可, 删
阅读全文
摘要:简介 散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。 这个映射函数叫做散列函数,存放记录的数组叫做散列表 应用实例 有一个公司,当有新的员工来报道时,要求将该员工的信
阅读全文
摘要:斐波那契也称黄金分割法,通过黄金分割点找到mid值,即mid=low+F(k-1)-1(F代表斐波那契数列) 对F(k-1)-1的理解 由斐波那契数列 F[k]=F[k-1]+F[k-2] 的性质,可以得到 (F[k]-1)=(F[k-1]-1)+(F[k-2]-1)+1 。 该式说明:只要顺序表
阅读全文
摘要:简介 插值查找算法类似于二分查找,不同的是插值查找每次从自适应mid处开始查找。 将折半查找中的求mid 索引的公式 , low 表示左边索引left, high表示右边索引right.key 就是前面我们讲的 findVal int mid = low + (high - low) * (key
阅读全文
摘要:简介 只能对有序数组进行查找 代码实现 public class BinarySearch { public static void main(String[] args) { // 查找单个数据 int arr[] = { 1, 8, 10, 89, 1000, 1234 }; int resIn
阅读全文
摘要:排序算法时间复杂度比较 稳定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面; 不稳定:如果a原本在b的前面,而a=b,排序之后a可能会出现在b的后面; 内排序:所有排序操作都在内存中完成; 外排序:由于数据太大,因此把数据放在磁盘中,而排序通过磁盘和内存的数据传输才能进行; 时间复杂度:
阅读全文
摘要:简介 基数排序(radix sort)属于“分配式排序”(distribution sort),又称“桶子法”(bucket sort)或bin sort,顾名思义,它是通过键值的各个位的值, 将要排序的元素分配至某些“桶”中,达到排序的作用 基数排序法是属于稳定性的排序,基数排序法的是效率高的稳定
阅读全文
摘要:简介 归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题分(divide)成一些小的问题然后递归求解, 而治(conquer)的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之) 在治阶段,我们需要将两
阅读全文
摘要:简介 快速排序(Quicksort)是对冒泡排序的一种改进。基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小, 然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列 根据2边的索引找到中间索引
阅读全文
摘要:插入排序存在的问题 数组 arr = {2,3,4,5,6,1} 这时需要插入的数 1(最小), 这样的过程是: {2,3,4,5,6,6} {2,3,4,5,5,6} {2,3,4,4,5,6} {2,3,3,4,5,6} {2,2,3,4,5,6} {1,2,3,4,5,6} 结论: 当需要插入
阅读全文
摘要:简介 插入式排序属于内部排序法,是对于欲排序的元素以插入的方式找寻该元素的适当位置,以达到排序的目的 插入排序(Insertion Sorting)的基本思想是:把n个待排序的元素看成为一个有序表和一个无序表,开始时有序表中只包含一个元素,无序表中包含有n-1个元素, 排序过程中每次从无序表中取出第
阅读全文
摘要:简介 选择式排序也属于内部排序法,是从欲排序的数据中,按指定的规则选出某一元素,再依规定交换位置后达到排序的目的 代码实现 public class SelectSort { public static void main(String[] args) { int [] arr = {101, 34
阅读全文
摘要:简介 代码实现 public class BubbleSort { public static void main(String[] args) { int arr[] = {3, 9, -1, 10, 20}; // 第1趟 int temp = 0; // 临时变量 for (int j = 0
阅读全文
摘要:度量1个算法的执行时间 时间频度 忽略常数项 忽略低次项 忽略系数 时间复杂度 常见时间复杂度 常数阶O(1) 对数阶 线性阶 线性对数阶 平方阶 平均时间复杂度 最坏时间复杂度 空间复杂度
阅读全文
摘要:思路分析 代码实现 public class Queue8 { //定义一个max表示共有多少个皇后 int max = 8; //定义数组array, 保存皇后放置位置的结果,比如 arr = {0 , 4, 7, 5, 2, 6, 1, 3} int[] array = new int[max]
阅读全文
摘要:简介 递归需遵守的规则 应用实例 代码实现 public class MiGong { public static void main(String[] args) { // 先创建一个二维数组,模拟迷宫 // 地图 int[][] map = new int[8][7]; // 使用1 表示墙 /
阅读全文
摘要:代码实现 package com.atguigu.stack; import java.util.ArrayList; import java.util.List; import java.util.Stack; public class PolandNotation { public static
阅读全文
摘要:前缀表达式(波兰表达式) 中缀表达式 后缀表达式(逆波兰表达式) 使用栈实现逆波兰表达式 public class PolandNotation { public static void main(String[] args) { //先定义给逆波兰表达式 //(30+4)×5-6 => 30 4
阅读全文
摘要:代码实现 public class Calculator { public static void main(String[] args) { //根据前面老师思路,完成表达式的运算 String expression = "7*2*2-5+1-5+3-4"; // 15//如何处理多位数的问题?
阅读全文
摘要:简介 栈的英文为(stack) 栈是一个先入后出(FILO-First In Last Out)的有序列表。 栈(stack)是限制线性表中元素的插入和删除只能在线性表的同一端进行的一种特殊线性表。允许插入和删除的一端,为变化的一端,称为栈顶(Top),另一端为固定的一端,称为栈底(Bottom)。
阅读全文
摘要:代码实现 // 根据用户的输入,计算出小孩出圈的顺序 /** * * @param startNo * 表示从第几个小孩开始数数 * @param countNum * 表示数几下 * @param nums * 表示最初有多少小孩在圈中 */ public void countBoy(int st
阅读全文
摘要:简介 设编号为 1,2,… n 的 n 个人围坐一圈,约定编号为 k(1<=k<=n)的人从 1 开始报数,数到 m 的那个人出列,它的下一位又从 1 开始报数,数到 m 的那个人又出列,依次类推,直到所有人出列为止,由此产生一个出队编号的序列 # 解决思路 用一个不带头结点的循环链表来处理 Jos
阅读全文
摘要:简介 单向链表,查找的方向只能是一个方向,而双向链表可以向前或者向后查找。 单向链表不能自我删除,需要靠辅助节点 ,而双向链表,则可以自我删除,所以前面我们单链表删除时节点,总是找到 temp,temp 是待删除节点的前一个节点 代码实现 public class DoubleLinkedListD
阅读全文
摘要:获取单链表中有效节点的个数 //方法:获取到单链表的节点的个数(如果是带头结点的链表,需求不统计头节点) /** * @param head 链表的头节点 * @return 返回的就是有效节点的个数 */ public static int getLength(HeroNode head) { i
阅读全文
摘要:方式2:在添加英雄时,根据排名将英雄插入到指定位置(如果有这个排名,则添加失败,并给出提示) 代码实现 import java.util.Stack; public class SingleLinkedListDemo { public static void main(String[] args)
阅读全文
摘要:简介 链表是有序的列表 链表是以节点的方式来存储,是链式存储 每个节点包含 data 域, next 域:指向下一个节点. 发现链表的各个节点不一定是连续存储. 链表分带头节点的链表和没有头节点的链表,根据实际的需求来确定 应用实例 使用带 head 头的单向链表实现 水浒英雄排行榜管理完成对英雄人
阅读全文
摘要:简介 对前面的数组模拟队列的优化,充分利用数组. 因此将数组看做是一个环形的。(通过取模的方式来实现即可) 代码实现 import java.util.Scanner; public class CircleArrayQueueDemo { public static void main(Strin
阅读全文
摘要:简介 队列是一个有序列表,可以用数组或是链表来实现。 遵循先入先出的原则。即:先存入队列的数据,要先取出。后存入的要后取出 队列本身是有序列表,若使用数组的结构来存储队列的数据,则队列数组的声明如下图, 其中 maxSize 是该队列的最大容量。 因为队列的输出、输入是分别从前后端来处理,因此需要两
阅读全文
摘要:参考 github新建1条token github新建1个私有的空仓库 进入gitlab的项目 填写内容 # github地址 https://github.com/chniny/test.git # 需要填写的 Git repository URL https://用户名@github.com/c
阅读全文
摘要:起步 数据结构和算法的关系 数据data结构(structure)是一门研究组织数据方式的学科,有了编程语言也就有了数据结构. 学好数据结构可以编写出更加漂亮,更加有效率的代码。 程序 = 数据结构 + 算法 数据结构是算法的基础 线性结构和非线性结构 # 线性结构 线性结构作为最常用的数据结构,其
阅读全文
摘要:官网 参考 常用搜索方式 | 语法 | 语义| 示例 | 语义| | : : | : : | : : | : : | | >n | 大于 | java stars:>1000 | 包含java且星标超过1000 | | >=n | 大于等于 | java topics:>=3 | 包含java且超过
阅读全文
摘要:创建项目 选择合适的模板 在项目下创建仓库 上传文件 也可以克隆到本地后推送代码 git clone https://e.coding.net/goudan/project-name/storehouse-name.git 推送时输入用户名和密码 打开控制面板,查看凭证
阅读全文
摘要:传统项目与互联网项目的区别 传统项目所遇到的jvm问题 # 当单个接口响应特别慢时 先考虑是否有sql慢查询,定位慢查询的⽅法⼀般是⽤explain查看sql的执⾏计划 FullGC与MinorGC的区别 Minor GC触发条件:当Eden区满时,触发Minor GC FullGC触发条件 1、调
阅读全文
摘要:简介 VisualVM是⼀个集成命令⾏JDK⼯具和轻量级分析功能的可视化⼯具 idea安装插件 File-> Setting-> Plugins -> Browers Repositrories 搜索VisualVM Launcher -> 安装并重启IDEA 点击配置VisualVM execut
阅读全文
摘要:简介 JConsole (Java Monitoring and Management Console)是⼀种基于 JMX 的可视化监视、管理⼯具, 它管理部分的功能是针对 JMXMBean 进⾏管理,由于 MBean 可以使⽤代码、中间件服务器的管理控制台或者所有符合 JMX 规范的软件进⾏访问
阅读全文
摘要:简介 Jstack (Stack Trace for Java)命令⽤于⽣成虚拟机当前时刻的线程快照(-般称为threaddump 或者 javacore ⽂件) 线程快照就是当前虚拟机内每⼀条线程正在执⾏的⽅法堆栈的集合,⽣成线程快照的主要⽬的是定位线程出现⻓时间停顿的原因, 如线程间死锁、死循环
阅读全文
摘要:简介 Sun JDK 提供 jhat (JVM Heap Analysis Tool)命令常与 jmap 搭配使⽤,来分析 jmap ⽣成的堆 转储快照。 jhat内置了⼀个微型的HTTP/HTML服务器,⽣成dump⽂件的分析结果后,可以在浏览器中查看 特点 jhat分析⼯作是⼀个耗时⽽且消耗硬件
阅读全文
摘要:标记清除算法 ⾸先标记出所有需要回收的对象,在标记完成后统⼀回收所有被标记的对象 图解 黑色部分为待回收的垃圾 蓝色部分为不需要回收的内存 白色部分为未使用的内存 不足 ⼀个是效率问题,标记和清除两个过程的效率都不⾼; 另⼀个是空间问题,标记清除之后会产⽣⼤量不连续的内存碎⽚,空间碎⽚太多可能会导致
阅读全文
摘要:jstat Jstat (JVM Statistics Monitoring Tool)是⽤于监视虚拟机各种运⾏状态信息的命令⾏⼯具。 它可以显示本地或者远程-虚拟机进程中的类装载、内存、垃圾收集、JIT 编译等运⾏数据, 在没有 GU 图形界⾯,只提供了纯⽂本控制台环境的服务器上,它将是运⾏期定位
阅读全文
摘要:虚拟机工具 给⼀个系统定位问题的时候,知识、经验是关键基础,数据是依据,⼯具是运⽤知识处理数据的⼿段 数据包括:运⾏⽇志、异常堆栈、GC ⽇志、线程快照( threaddump/javacore⽂件)、堆转储快照( heapdump/hprof⽂件)等。 使⽤适当的虚拟机监控和分析的⼯具可以加快我们
阅读全文
摘要:逃逸分析 逃逸分析的基本⾏为就是分析对象动态作⽤域:当⼀个对象在⽅法中被定义后,它可能被外部⽅法所引⽤,称为⽅法逃逸。 甚⾄还有可能被外部线程访问到,譬如赋值给类变量或可以在其他线程中访问的实例变量,称为线程逃逸 栈上分配 栈上分配就是把⽅法中的变量和对象分配到栈上,⽅法执⾏完后⾃动销毁,⽽不需要垃
阅读全文
摘要:简介 所谓的⼤对象是指,需要⼤量连续内存空间的 Java 对象,最典型的⼤对象就是那种很⻓的字符串以及数组 虚拟机提供了⼀个-XX: PretenureSizeThreshold 参数,令⼤于这个设置值的对象直接在⽼年代分配。即操作指定内存时,直接分配到老年代 这样做的⽬的是避免在 Eden 区及两
阅读全文
摘要:java堆分布图 分配规则 对象主要分配在新⽣代的 Eden 区上 如果启动了本地线程分配缓冲,将按线程优先在 TLAB 上分配 少数情况下也可能会直接分配在⽼年代中 测试代码 配置打印垃圾回收 控制台打印 自定义垃圾收集器 控制台打印 GC参数指定垃圾回收 -Xms20 M、-Xmx20 M、-X
阅读全文
摘要:图解 简介 G1是⼀款⾯向服务端应⽤的垃圾收集器 特点 G1 中每个 Region 都有⼀个与之对应的 Remembered Set,当进⾏内存回收时,在 GC 根节点的枚举范围中加⼊ Remembered Set 即可保证不对全堆扫描也不会有遗漏 检查Reference引⽤的对象是否处于不同的Re
阅读全文
摘要:图解 简介 CMS (Concurrent Mark Sweep)收集器是-种以获取最短回收停顿时间为⽬标的收集器。 ⽬前很⼤⼀部分的Java应⽤集中在互联⽹站或者B/S系统的服务端上,这类应⽤尤其重 视服务的响应速度,希望系统停顿时间最短,以给⽤户带来较好的体验。 CMS 收集器是基于“标记-清除
阅读全文
摘要:Parallel Scavenge收集器 Parallel Scavenge 收集器是⼀个新⽣代收集器,它也是使⽤复制算法的收集器,⼜是并⾏的多线程收集器 由于与吞吐量关系密切,Parallel Scavenge 收集器也经常称为“吞吐量优先”收集器 吞吐量是什么?CPU⽤于运⾏⽤户代码的时间与CP
阅读全文
摘要:serial垃圾收集器 Serial是⼀个单线程的垃圾收集器 特点 “Stop The World”,它进⾏垃圾收集时,必须暂停其他所有的⼯作线程,直到它收集结束。在⽤户不可⻅的情况下把⽤户正常⼯作的线程全部停掉 使⽤场景:多⽤于桌⾯应⽤,Client端的垃圾回收器 桌⾯应⽤内存⼩,进⾏垃圾回收的时
阅读全文
摘要:标记整理算法 复制收集算法在对象存活率较⾼时就要进⾏较多的复制操作,效率将会变低。更关键的是,如果不想浪费 50%的空间,就需要有额外的空间进⾏分配担保, 以应对被使⽤的内存中所有对象都 100%存活的极端情况,所以在⽼年代⼀般不能直接选⽤这种算法 根据⽼年代的特点,有⼈提出了另外⼀种“标记-整理(
阅读全文
摘要:简介 Jmap (Memory Map for Java)命令⽤于⽣成堆转储快照。如果不使⽤ jmap 命令,要想获取 Java 堆转储快照,还有⼀些⽐较“暴⼒”的⼿段: -XX: +HeapDumpOnOutOfMemoryError参数,可以让虚拟机在 OOM 异常出现之后⾃动⽣成 dump ⽂
阅读全文
摘要:图解 从reference出发,指向堆中的1个对象,该对象又指向另一个对象,这就是引用链 没有被reference指向的,或没有被其他对象指向的会被标记为待回收,标记达到指定次数时,则触发垃圾回收机制 可达性分析算法的概念(⼜叫跟搜索法) 根搜索算法是从离散数学中的图论引⼊的,程序把所有的引⽤关系看
阅读全文
摘要:垃圾回收机制 Java语⾔中⼀个显著的特点就是引⼊了垃圾回收机制,使c++程序员最头疼的内存管理的问题迎刃⽽解。由于有个垃圾回收机制,Java中的对象不再有“作⽤域”的概念,只有对象的引⽤才有“作⽤域”。 垃圾回收可以有效的防⽌内存泄露,有效的使⽤空闲的内存 引用计数器 堆中每个对象实例都有⼀个引⽤
阅读全文
摘要:java对象内存布局 对象头⽤于存储对象的元数据信息: Mark Word 部分数据的⻓度在32位和64位虚拟机(未开启压缩指针)中分别为32bit和64bit,存储对象⾃身的运⾏时数据如哈希值等。Mark Word⼀般被设计为⾮固定的数据结构,以便存储更多的数据信息和复⽤⾃⼰的存储空间。 类型指针
阅读全文
摘要:图示 虚拟机遇到⼀条new指令时,⾸先检查这个对应的类能否在常量池中定位到⼀个类的符号引⽤ 判断这个类是否已被加载、解析和初始化 为这个新⽣对象在Java堆中分配内存空间,其中Java堆分配内存空间的⽅式主要有以下两种 指针碰撞 分配内存空间包括开辟⼀块内存和移动指针两个步骤 ⾮原⼦步骤可能出现并发
阅读全文
摘要:本地方法栈 简介 ⽤于作⽤域本地⽅法执⾏的⼀块Java内存区域 本地方法就是native方法 import java.util.concurrent.atomic.AtomicInteger; public class A { public native static void c(); publi
阅读全文
摘要:简介 ⽤于作⽤于⽅法执⾏的⼀块Java内存区域 作用 每个⽅法在执⾏的同时都会创建⼀个栈帧(Stack Framel)⽤于存储局部变量表、操作数栈、动态链接、⽅法出⼝等信息。 每⼀个⽅法从调⽤直⾄执⾏完成的过程,就对应着⼀个栈帧在虚拟机栈中⼊栈到出栈的过程 代码案例 import java.util
阅读全文
摘要:简介 线程共享数据区:⽅法区、堆 线程隔离数据区:虚拟机栈、本地⽅法栈、堆、程序计数器 图解 程序计算器 程序计数器是⼀块较⼩的内存空间,它可以看作是当前线程所执⾏的字节码的⾏号指示器 线程是⼀个独⽴的执⾏单元,是由CPU控制执⾏的 字节码解释器⼯作时就是通过改变这个计数器的值来选取下⼀条需要执⾏的
阅读全文
摘要:新建1个css文件引入到main.js中测试 vite天生就支持对css文件的直接处理 1. vite在读取到main.js中引用到了Index.css 2. 直接去使用fs模块去读取index.css中文件内容 3. 直接创建一个style标签, 将index.css中文件内容直接copy进sty
阅读全文
摘要:vite官网 使用vite构建1个vue项目,启动后查看控制台,虽然该vue文件中的代码被编译为js脚本,但浏览是如何识别vue后缀结尾的文件的 新建1个node项目,编写1个js脚本 编写代码作为服务端,访问根路径时返回text/html类型的页面,访问的文件是以js结尾的按text/javasc
阅读全文
摘要:在上一篇博客的基础上开发 环境变量处理 vite内置了dotenv这个第三方库 dotenv会自动读取.env文件, 并解析这个文件中的对应环境变量 并将其注入到process对象下(但是vite考虑到和其他配置的一些冲突问题, 他不会直接注入到process对象下) vite给我们提供了一些补偿措
阅读全文
摘要:npm # 初始化,方式1 npm init # 初始化,方式2 npm init -y # 安装依赖 npm install [package] # 安装项目所有依赖 npm install # 强制下载安装 npm installnpm install --force # 升级 npm upda
阅读全文
摘要:使用vite,在vscode中没有语法提示时 在vite.config.js中配置如下 方式1 在前端项目中编写注释后,例如指定返回值类型为String,则显示的方法全是String 方式2 vite官网推荐写法,可能由于vscode存在bug,不会有提示 配置不同的环境 新建vite.base.c
阅读全文
摘要:vite在生产和开发环境打包的不同 yarn dev > 开发(每次依赖预构建所重新构建的相对路径都是正确的) vite会全权交给一个叫做rollup的库去完成生产环境的打包 在上1篇博客中,提到vite不会帮我们自动引入绝对路径和非绝对路径的依赖 # 这是因为,如果引入1个如下的依赖 import
阅读全文
摘要:简介 开箱即用(out of box): 你不需要做任何额外的配置就可以使用vite来帮你处理构建工作 在默认情况下, 我们的esmodule去导入资源的时候, 要么是绝对路径, 要么是相对路径 新建1个文件夹demo01 编写counter.js export const count = 0; 编
阅读全文
摘要:npm 从5.2版开始,增加了 npx 命令 如果不能用,就要手动安装一下 npm install -g npx 创建项目 // 创建项目 npx create-nuxt-app <项目名> // 项目名称 Project name: (nuxt01) // 程序设计语言 Programming l
阅读全文
摘要:什么是构建工具 浏览器他只认识html, css, js 如果遇到ts文件我们需要使用tsc将typescript代码转换为js代码 有一个东西能够帮你把tsc, react-compiler, less, babel, uglifyjs全部集成到一起,我们只需要关心我们写的代码就好了 构建工具他让
阅读全文
摘要:gitee # 新建1个文件夹 # 初始化 git init # 关联 git remote add gitee https://gitee.com/用户名/仓库名.git # 切换分支 git branch -M main # 拉取 git pull --rebase gitee main # 输
阅读全文
摘要:windows安装chocolatey过程中报错 警告: An existing Chocolatey installation was detected. Installation will not continue. For security reasons, this script will
阅读全文
摘要:vite1构建项目 cnpm i create-vite-app # 安装vite npm init vite-app demo01 # 使用vite创建vue项目 cd demo01 npm install npm run dev vite2构建项目 npm init @vitejs/app cd
阅读全文
摘要:初始化项目 npm init @vitejs/app cd md-demo01 npm install npm run dev 参考 # 安装依赖 npm i @kangc/v-md-editor@next -S # main.js import { creatApp } from 'vue'; i
阅读全文
摘要:初始化项目 cnpm i create-vite-app # 安装vite npm init vite-app vue03 # 使用vite创建vue项目 cd vue03 npm install npm run dev 整合element-plus 官网 安装 npm install elemen
阅读全文
摘要:初始化项目 npm init @vitejs/app cd vue02 npm install npm run dev 安装less、less-loader npm install less npm install less-loader@5.0.0 嵌套 // 根组件中template标签中编写h
阅读全文
摘要:vite1 + vant 初始化项目 npm init vite-app vant01 cd vant01 npm install npm run dev 安装vant yarn add vant@3.1.4 -D 入口文件main.js中引入vant并注册为vue实例的属性 import { cr
阅读全文
摘要:使用vite构建项目报错 C:\Users\ychen\work>npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-cac
阅读全文
摘要:HelloWorld.vue <template> <div> <h1>你好!vue</h1> <p>{{msg}}</p><br> <span>传值:{{counter}}</span> <button @click='btnClick'>你点击了{{count}}次</button> </div
阅读全文
摘要:优化1 // store import { createStore } from 'vuex' export default createStore({ state: { count: 0 }, mutations: { sub(state) { state.count--; } }, action
阅读全文
摘要:getters用于封装store中的共享数据 // store import { createStore } from 'vuex' export default createStore({ state: { count: 0 }, mutations: { }, actions: { }, get
阅读全文
摘要:在store的mutations函数中不能执行异步操作,例如不能使用setTimeout()方法 只有mutations才能操作state中的数据,只有actions才能操作mutations中的方法 actions操作mutations中的函数,方式1 // store import { crea
阅读全文
摘要:Mutation用于变更Store中的数据 方式1 // 例如在store中写一个操作data的方法add,传入的参数为要操作的数据state import { createStore } from 'vuex' export default createStore({ state: { count
阅读全文
摘要:使用vue-cli构建1个vue项目 安装vuex npm install vuex --save src目录下新建store文件夹,新建index.js import { createStore } from 'vuex' export default createStore({ state: {
阅读全文
摘要:案例1:命名视图 # app.js var routes = [ { path: '/users', components: { sidebar: { template: ` <div> <ul> <li>用户管理</li> <li>权限管理</li> </ul> </div> ` }, conte
阅读全文
摘要:案例1:子路由 # app.js var routes = [ { path: '/user/:name', name: 'user', component: { template: ` <div> <h3>我叫:{{$route.params.name}}</h3> <h3>我今年:{{$rout
阅读全文
摘要:案例1 # app.js var routes = [ { path: '/', component: { template: ` <div><h3>首页</h3></div> ` } }, { path: '/about', component: { template: ` <div><h3>关于
阅读全文
摘要:代码案例 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" conten
阅读全文
摘要:代码案例 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" conten
阅读全文
摘要:简介 axios是前端Ajax请求库 在浏览器中发送Ajax请求到远程服务器,在nodejs中发送http请求到服务 支持promise 使用方式:npm或yarn安装、引入在线cnd npm install axios yarn add axios https://cdn.bootcdn.net/
阅读全文
摘要:安装环境 新建虚拟电脑 内存 磁盘 设置,存储,选择镜像 设置启动顺序 点击启动 中文 配置如下 打开网络 最小安装 开始安装 重启 配置网络 连接wifi时查看宿主机 C:\Users\ychen λ ipconfig Windows IP 配置 以太网适配器 以太网: 媒体状态 . . . .
阅读全文
摘要:Shiro提供了一套JSP标签库来实现页面级的授权控制 在使用Shiro标签库前,首先需要在JSP引入shiro标签 <%@ taglib prefix="shiro" uri="http://shiro.apache.org/tags" %> 标签 | 标签 | 说明 | | | | | < sh
阅读全文
摘要:简介 点击查看详情 登录相关 | Subject 登录相关方法 | 描述 | | | | | isAuthenticated() | 返回true 表示已经登录,否则返回false。 | 角色相关 | Subject 角色相关方法 | 描述 | | | | | hasRole(String role
阅读全文
摘要:构建1个web的meven项目 将DefinitionRealm、SecurityService、SecurityServiceImpl、EncodesUtil、DigestsUtil复制到项目中 导入依赖 点击查看详情 <dependencies> <dependency> <groupId>co
阅读全文
摘要:简介 1、首先调用Subject.isPermitted/hasRole接口,其会委托给SecurityManager 2、SecurityManager接着会委托给内部组件Authorizer 3、Authorizer再将其请求委托给我们的Realm去做;Realm才是真正干活的 4、Realm将
阅读全文
摘要:模拟根据用户名查询到的用户信息 public interface SecurityService { /** * @Description 查找用户密码 * @param loginName 用户名称 * @return 密码 */ Map<String,String> findPasswordBy
阅读全文
摘要:Shiro提供了base64和16进制字符串编码/解码的API支持,方便一些编码解码操作 Shiro内部的一些数据的【存储/表示】都使用了base64和16进制字符串 散列算法一般用于生成数据的摘要信息,是一种不可逆的算法,一般适合存储密码之类的数据,常见的散列算法如MD5、SHA等。一般进行散列时
阅读全文
摘要:创建1个maven工程,导入依赖 <dependencies> <dependency> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> <version>1.1.3</version> </de
阅读全文
摘要:编写1个maven工程 导入pom.xml <dependencies> <dependency> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> <version>1.1.3</version>
阅读全文
摘要:简介 Shiro是apache旗下一个开源框架,它将软件系统的安全认证相关的功能抽取出来,实现用户身份认证,权限授权、加密、会话管理等功能,组成了一个通用的安全认证框架 特点 Shiro 是一个强大而灵活的开源安全框架,能够非常清晰的处理认证、授权、管理会话以及密码加密。如下是它所具有的特点: 易于
阅读全文
摘要:权限管理,一般指根据系统设置的安全策略或者安全规则,用户可以访问而且只能访问自己被授权的资源,不多不少。权限管理几乎出现在任何系统里面,只要有用户和密码的系统 访问权限:一般表示你能做什么样的操作,或者能够访问那些资源。例如:给张三赋予“店铺主管”角色,“店铺主管”具有“查询员工”、“添加员工”、“
阅读全文
摘要:SpringMVC-HandlerExecutionChain 类就使用到职责链模式 public class DispatcherServlet extends FrameworkServlet { protected void doDispatch(HttpServletRequest requ
阅读全文
摘要:问题描述 编写程序完成学校OA系统的采购审批项目 • 采购员采购教学器材 • 如果金额 小于等于5000, 由教学主任审批 • 如果金额 小于等于10000, 由院长审批 • 如果金额 小于等于30000, 由副校长审批 • 如果金额 超过30000以上,有校长审批 方案类图 代码实现 packag
阅读全文
摘要:问题描述 1) 采购员采购教学器材 2) 如果金额 小于等于5000, 由教学主任审批 (0<=x<=5000) 3) 如果金额 小于等于10000, 由院长审批 (5000<x<=10000) 4) 如果金额 小于等于30000, 由副校长审批 (10000<x<=30000) 5) 如果金额 超
阅读全文
摘要:JDK的 Arrays 的Comparator就使用了策略模式 public class Strategy { public static void main(String[] args) { Integer[] data = { 9,1,2,8,4,3 }; // 实现升序排序,返回-1放左边,1
阅读全文
摘要:简介 1) 策略模式(Strategy Pattern)中,定义算法族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户 2) 这算法体现了几个设计原则,第一、把变化的代码从不变的代码中分离出来;第二、针对接口编程而不是具体类(定义了策略接口);第三、多用组合/聚合, 少
阅读全文
摘要:问题描述 1) 有各种鸭子(比如 野鸭、北京鸭、水鸭等, 鸭子有各种行为,比如 叫、飞行等) 2) 显示鸭子的信息 问题类图 代码实现 package com.atguigu.strategy; public abstract class Duck { public Duck() { } publi
阅读全文
摘要:借贷平台的订单,有审核-发布-抢单 等等 步骤,随着操作的不同,会改变订单的状态, 项目中的这个模块实现就会使用到状态模式 通过if/else判断订单的状态,从而实现不同的逻辑 if(审核){ //审核逻辑 }elseif(发布){ //发布逻辑 }elseif(接单){ //接单逻辑 } 这类代码
阅读全文
摘要:实现方案 定义出一个接口叫状态接口,每个状态都实现它 接口有扣除积分方法、抽奖方法、发放奖品方法 实现类图 实现代码 package com.atguigu.state; /** * 状态抽象类 */ public abstract class State { // 扣除积分 - 50 public
阅读全文
摘要:APP抽奖问题 1) 假如每参加一次这个活动要扣除用户50积分,中奖概率是10% 2) 奖品数量固定,抽完就不能抽奖 3) 活动有四个状态: 可以抽奖、不能抽奖、发放奖品和奖品领完 4) 活动的四个状态转换关系图 状态模式简介 1) 状态模式(State Pattern):它主要用来解决对象在多种状
阅读全文
摘要:Spring框架中SpelExpressionParser使用到了解释器模式 public class Interpreter { public static void main(String[] args) { SpelExpressionParser parser = new SpelExpre
阅读全文
摘要:案例类图 代码实现 package com.atguigu.interpreter; import java.util.HashMap; /** * 抽象类表达式,通过HashMap 键值对, 可以获取到变量的值 */ public abstract class Expression { // a
阅读全文
摘要:通过解释器模式来实现四则运算,如计算a+b-c的值 1) 先输入表达式的形式,比如 a+b+c-d+e, 要求表达式的字母不能重复 2) 在分别输入a ,b, c, d, e 的值 3) 最后求出结果 传统方案解决四则运算问题 1) 编写一个方法,接收表达式的形式,然后根据用户输入的数值进行解析,得
阅读全文
摘要:问题需求 游戏角色有攻击力和防御力,在大战Boss前保存自身的状态(攻击力和防御力),当大战Boss后攻击力和防御力下降,从备忘录对象恢复到大战前的状态 代码实现 package com.atguigu.memento.game; public class Memento { //攻击力 priva
阅读全文
摘要:游戏角色状态恢复问题 游戏角色有攻击力和防御力,在大战Boss前保存自身的状态(攻击力和防御力),当大战Boss后攻击力和防御力下降,从备忘录对象恢复到大战前的状态 传统解决方案:1个游侠角色对应1个状态 方案分析 1) 一个对象,就对应一个保存对象状态的对象, 这样当我们游戏的对象很多时,不利于管
阅读全文
摘要:方案类图 代码实现 package com.atguigu.mediator.smarthouse; //同事抽象类 public abstract class Colleague { private Mediator mediator; public String name; public Col
阅读全文
摘要:智能家电问题 1) 智能家庭包括各种设备,闹钟、咖啡机、电视机、窗帘 等 2) 主人要看电视时,各个设备可以协同工作,自动完成看电视的准备工作,比如流程为:闹铃响起->咖啡机开始做咖啡->窗帘自动落下->电视机开始播放 传统解决方案 闹钟通知TV和咖啡机 咖啡机通知电视机和窗帘 各种设备相互通知 传
阅读全文
摘要:查看 @Deprecated(since="9") public class Observable { private boolean changed = false; private Vector<Observer> obs; // 集合 # 查看接口 @Deprecated(since="9")
阅读全文
摘要:简介 观察者模式类似订牛奶业务 1) 奶站/气象局:Subject 2) 用户/第三方网站:Observer Subject:登记注册、移除和通知 1) registerObserver 注册 2) removeObserver 移除 3) notifyObservers() 通知所有的注册的用户,
阅读全文
摘要:天气预报问题 1) 气象站可以将每天测量到的温度,湿度,气压等等以公告的形式发布出去(比如发布到自己的网站或第三方)。 2) 需要设计开放型API,便于其他第三方也能接入气象站获取数据。 3) 提供温度、气压和湿度的接口 4) 测量数据更新时,要能实时的通知给第三方 传统方案 0) 设计出一个Wea
阅读全文
摘要:JDK的ArrayList 集合中就使用了迭代器模式 public class IteratorPattern { @SuppressWarnings("rawtypes") public static void main(String[] args) { // TODO Auto-generate
阅读全文
摘要:案例说明 要在一个页面中展示出学校的院系组成,一个学校有多个学院,一个学院有多个系 设计类图 代码实现 package com.atguigu.iterator; public class Department { private String name; private String desc;
阅读全文
摘要:学校院系结构展示问题 要在一个页面中展示出学校的院系组成,一个学校有多个学院,一个学院有多个系 传统方式解决 计算机学院 系=> 数组中 信息工程学院 系=> 集合 传统方式利弊 1) 将学院看做是学校的子类,系是学院的子类,这样实际上是站在组织大小来进行分层次的 2) 实际上我们的要求是 :在一个
阅读全文