DOM浏览器渲染界面的过程就像盖房子先请求服务器得到HTML文件,HTML相当于网页框架结构,但是一开始拿到的是字节构成的HTML文件,于是先把字节转换为字符(人能看懂,也就是HTML),字符再转化为机器能看懂的语言Token:可以简单理解为符号标签,比如遇到起始就转换为起始标签,遇到结尾转换为结束标签,这样字符被Token化,然后进行升华,把Token转换为节点对象,对象可以进行编程操作,因为对象有自己的属性方法,相当于把Token盘活了,然后把这些节点对象连在一起,形成文本对象模型,也就是DOM,DOM就是浏览器自己的语言,每个节点对象相连,形成父子关系,这样后面对于某个节点对象进行操作对浏览器来说就很友好了上面就是盖房子的结构
CSSOM你在制作房子框架的时候也会去给你的房子做“装修”,比如给房子上色一般会把CSS样式作为外链加入到link标签里面<link rel = "stylesheet" type="text/css" href="index.css">CSS相当于网页的“装饰”,浏览器在构建DOM ...
装饰模式是一种结构型设计模式,它允许向一个现有的对象添加新的功能,同时又不改变其结构。这种模式就像是给对象穿衣服,可以动态地添加和移除功能,而无需修改对象的代码。装饰模式的结构:
抽象组件: 定义了对象的基本功能。
具体组件: 实现抽象组件定义的功能。
装饰器: 负责为具体组件添加新的功能。
装饰具体组件: 将装饰器和具体组件组合在一起,形成新的对象。
装饰模式的优点:
灵活性: 可以动态地添加和移除功能,无需修改对象的代码。
可扩展性: 可以方便地添加新的装饰器,扩展对象的的功能。
代码复用: 可以将通用的功能抽取到装饰器中,避免代码重复。
把类中的装饰功能从类中搬移去除,这样可以简化原有的类。有效地把类的核心职责和装饰功能区分开了。而且可以去除相关类中重复的装饰逻辑(比如先打八折再满300返100和先满300返100再打八折这种需要在策略模式中写两个类但是代码十分重复的情况)装饰模式的应用场景:
需要在不改变原有代码的情况下扩展对象功能的场景。
需要动态地添加和移除对象功能的场景。
需要对对象功能进行分层控制的场景。
当系统需要新功能的时候,是向旧的类中添加新的代码。这 ...
在浏览器输入URL回车之后发生了什么?
首先输入URL输入url后浏览器事实上不会做出什么响应,我们需要通过DNS(算是一种数据库)转换为对应的ip地址,接下来拿到ip地址
然后就是TCP三次握手虽然我们手里拿着具体的ip地址,但是在正式发送数据之前还需要建立TCP连接,为什么呢?就比如你去医院就诊,医生不在或者医生房间里有人,我们无法就诊。建立TCP连接就是要在发送数据之前建立通道,客户端和服务端之间建立通道就可以在这通道里发送数据了(我们和医生可以进行交流了),大家都在这个通道发送数据,数据就不容易发生错乱,于是就出现了建立通道前的三次握手
客户端发送SYN数据包来表示请求连接(敲医生的门,请求进入他的房间)
服务器响应SYN和ACK的数据包来表示同意建立连接(医生在里面说同意你进来问诊了)
客户端再发送ACK数据来表示成功连接 (你进门了,表示可以开始就诊了)
发送HTTP请求和医生说出你的治病请求
1234请求行:到医院获得治疗请求头:名字:B1n_空行请求数据:感觉身体被掏空
那么当我们和服务器建立连接后,浏览器发送HTTP请求报文给服务器,报文的格式就是上面的元素组 ...
依赖倒转原则详解定义:依赖倒转原则(Dependency Inversion Principle,简称 DIP)是面向对象设计(OOP)中的一项重要原则,其核心思想是:高层模块不应该依赖于低层模块,二者都应该依赖于抽象。抽象不应该依赖于细节,细节应该依赖于抽象。
理解:
高层模块: 通常是指业务逻辑层或应用层,负责处理业务逻辑。(Service层)
低层模块: 通常是指数据访问层或基础设施层,负责提供数据访问或基础设施服务。(DAO层)
抽象: 指的是接口或抽象类,定义了模块之间的依赖关系。
细节: 指的是具体的实现类,实现了抽象所定义的功能。
依赖倒转的实现:依赖倒转原则可以通过使用 接口 或 抽象类 来实现。
高层模块和低层模块都依赖于抽象,而不是具体的实现类。
抽象定义了模块之间的依赖关系,具体实现类实现了抽象所定义的功能。
依赖倒转的优点:
提高代码的灵活性和可维护性: 依赖倒转使得代码更加模块化,易于修改和扩展。
降低耦合度: 依赖倒转使得高层模块和低层模块之间耦合度降低,提高了代码的可重用性。
提高代码的测试性: 依赖倒转使得代码更容易测试,因为可以很容易地 ...
LeetCode643子数组平均最大数123456789101112131415161718public double findMaxAverage(int[] nums, int k) { int len = nums.length; int sum = 0; if (k > len || len < 1 || k < 1) { return 0; } // 先求出第一个窗口的和 for (int i = 0; i < k; i++) { sum += nums[i]; } int res = sum; for (int right = k; right < len; right++) { // 不可以只用sum一个变量,这样会累加 例如:0,4,0,3,2 res ...
阅读前提醒⚠️⚠️⚠️本文适合于有一定的SQL基础再进行阅读,并不适合新手入门,本文更多是基本特性的简短介绍,更加注重让读者更好的巩固SQL知识。
SELECT
SELECT 语句的正确语义应是 FROM table_name SELECT columns_list,即:从某个表检索某几列数据。MySQL 解析 SELECT 语句的时候,会首先评估 FROM 子句,再评估 SELECT 子句。
一个结果 SELECT 语句被称为结果集,因为它是一组行从查询结果。
你可能要问, **SELECT *** 与 SELECT column_name 有什么区别呢?就一般而言,两者的性能差不多。就区别而言,有如下不同:
写出明确的字段,更容易理解你的 SQL 的查询意图
某些大字段不适合直接查询出来,因为直接查询会占用更多的开销?
**SELECT *** 更适合在命令行或者测试场景下使用
SELECT 后面可以直接跟表达式,这种情况下可以省略 FROM。
dual 表是一个虚拟表,可以让没有 FROM 的语句满足 SELECT … FROM 语句的结构。
AND
如果两个操 ...
堆的概念与特征堆是将一组数据按照完全二叉树的存储顺序,将数据存储在一个一维数组中的结构。堆有两种结构:
大根堆(大顶堆):任意节点的值均大于等于它的左右孩子,并且最大的值位于堆顶,即根节点处。有些地方也叫大根堆或者最大堆,都是一个意思
小根堆(小顶堆):任意节点的值均小于它的左右孩子,并且最小的值位于堆顶,即根节点处。
大和小的特征等都是类似的,只是比较的时候是按照大还是小来定
既然是将一组数据按照树的结构存储在一维数组中,而且还是完全二叉树,那么父子之间关系的建立就很重要了。有个概念需要着重注意⚠️,我们在做题时经常会看到有些地方叫堆,有些地方叫优先级队列,那么两者的关系是什么呢?:::info优先级队列:说到底还是一种队列,他的工作就是 poll() / peek()出队列中最大/最小的那个元素,所以叫带有优先级的队列。能够实现优先功能的策略不一定只有堆,例如二项堆,平衡树、弦断树、C++里会用二进制分组的vertor来实现一个优先队列。:::
堆:堆是一个很大的概念,他并不一定是完全二叉树。我们之前用完全二叉树是因为这个很容易被数组存储,但是除了这种二叉堆之外 ...
数字在计算机中的表示
真值真值因为机器数第一位是符号位,所以机器数的形式值不等于真正的数值。例如上面的有符号数1000 0011,其最高位1代表负,其真正数值是-3而不是形式值131(1000 0011转换为十进制等于131)。所以将带符号位的机器数对应的真正数值称为机器数的真值。例:0000 0001的真值 = +000 0001 = +1,1000 0001的真值 = -000 0001 = -1
原码原码就是符号位加上真值的绝对值,即用第一位表示符号,其余位表示值,比如如果是8位二进制:
12[+1]原 = 0000 0001[-1]原 = 1000 0001
第一位是符号位,因为第一位是符号位,所以8位二进制数的取值范围就是:[1111 1111,0111 1111],也即[-127,127]
反码反码的表示方式是:正数的反码是其本身,而负数的反码是在其原码基础上,符号位不变,其余各个位取反。例如:
12[+1]原 = [0000 0001] 原 = [00000001]反[-1]原 = [1000 0001] 原 = [1111111 ...