Note

学习笔记

设计模式

创建模式(5种)

  • 工厂模式:分为简单工厂模式,工厂方法模式,抽象工厂模式
  • 单例模式:确保一个类最多只有一个实例,并提供一个全局访问点,分为预加载和懒加载
    简单的保证预加载时候的线程安全的方法比如synchronized和volatile关键字(JAVA)、双重检查锁定(C++)
  • 生成式模式:当创建一个复杂对象的时候,可以拆分成组件分别进行创造。分为Product(要创建的对象), Builder(定义不同对象的相同创造过程), Director(具体定义对象的创造), ConcreteBuilder(具体不同对象的创造器)四种不同的类
  • 原型模式:本质就是clone,通过复制现有实例来创建新的实例,无需知道相应类的信息

结构模式(7种)

  • 适配器模式:适配器模式将某个类的接口转换成客户端期望的另一个接口表示,目的是消除由于接口不匹配所造成的类的兼容性问题。分为类适配器,对象适配器,接口适配器,第一个适配器类型应该少用
  • 装饰者模式:动态的将新功能附加到对象上。在对象功能扩展方面,它比继承更有弹性(例子:奶茶店点一杯奶茶,基础奶茶是绿茶,可以选择加珍珠,奶盖,芋泥,啵啵等,新增的调料就是装饰者,绿茶就是被装饰者)
    被装饰者和装饰者必须继承自同一个类
  • 代理模式:代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用。(中介)分为三类:1. 静态代理 2. 动态代理 3. CGLIB代理
  • 外观模式:隐藏了系统的复杂性,并向客户端提供了一个可以访问系统的接口。分为门面角色,客户角色,子系统角色
    门面角色封装子系统角色,客户角色负责调用门面角色
  • 桥接模式:将抽象部分与它的实现部分分离,使它们都可以独立地变化。
  • 组合模式:
  • 享元模式:

关系模式(11种)

笔试题目记录

  1. enum大小一般与整数类型相同,int4字节或8字节,空类的大小是1个字节,虚函数表指针占8个字节,char 1个字节,int,float 4个字节,double 8个字节
  2. union的大小取决于最大的那个元素,同时要注意内存对齐问题
  3. 同一个进程中的线程不共享的部分是 栈空间
  4. 关于系统调用的描述,正确:系统调用把应用程序的请求传输给系统内核执行,利用系统调用能够得到操作系统提供的多种服务,是操作系统提供给编程人员的接口,系统调用给用户屏蔽了设备访问的细节,系统调用保护了一些只能在内核模式执行的操作指令。错误的:系统调用中被调用的过程运行在”用户态”中,应该在内核态
  5. 互联网五层结构(从低到高):物理层->数据链路层->网络层->传输层->应用层
    VPN隧道协议主要有4种:点到点隧道协议PPTP、第二层隧道协议L2TP、网络层隧道协议IPSec以及SOCKS v5协议。其中,PPTP和L2TP工作在数据链路层,IPSec工作在网络层,SOCK v5工作在会话层
    数据链路层:Ethernet, PPP, ATM, HDLC
    网络层:IP, ICMP, ARP
    传输层:TCP, UDP,
    应用层:HTTP, FTP, SMTP
    TCP传输控制协议:三次握手,四次挥手,提供面向连接的服务。在传送数据之前必须先建立连接,数据传送结束后要释放连接。
    UDP用户数据报协议:在传送数据之前不需要先建立连接,远程主机在收到 UDP 报文后,不需要给出任何确认,不提供可靠交付
  6. 最大堆的构建方法!
  7. 哈夫曼树的构建方法!
  8. 注意以下问题:生产者消费者问题,哲学家用餐问题,读者写者问题
  9. 进程 是运行时程序的封装,是系统进行资源调度和分配的基本单位,实现了操作系统的并发
    进程间通信可以使用:管道(pipeline)、系统IPC(消息队列、信号量Semaphore、信号、共享内存)以及套接字socket
  10. 线程 是进程的子任务,是CPU调度和分派的基本单位,用于保证程序的实时性,实现进程内部的并发;线程是操作系统可识别的最小执行和调度单位。每个线程都独占一个虚拟处理器:独自的寄存器组,指令计数器和处理器状态。每个线程共享同一地址空间,打开的文件队列和其他内核资源。
    线程间通信的方式有临界区,互斥量Synchronized/Lock,信号量semaphore,事件(信号)wait/notify
  11. 进程与线程的区别:
    • 进程是资源分配的最小单位,线程是CPU调度的最小单位
    • 进程在执行过程中拥有独立的内存单元,而多个线程共享进程的内存
    • 一个线程只能属于一个进程,而一个进程可以有多个线程;
    • 系统开销:进程切换的开销也远大于线程切换的开销
  12. 虚拟内存:让程序拥有超过系统物理内存大小的可用内存空间。虚拟内存为每一个进程提供了一个一致的、私有的地址空间,它让每个进程产生了一种自己在独享储存的错觉(每个内存拥有一片连续完整的内存空间),定义了一个连续的虚拟地址空间,并把内存扩展到硬盘空间
  13. 程序编译过程:
  • 预处理:删除所有注释信息,展开宏定义,删除include
  • 编译:词法分析、语法分析、语义分析并优化后生成相对应的汇编文件
  • 汇编:转为机械指令,生成目标文件
  • 链接:分为静态与动态
  1. 静态链接:优点:执行速度快;缺点:浪费空间,更新困难,需要重新编译
    动态链接:优点:更新方便,没有多个库的副本;缺点:运行时后进行链接,损失性能
  2. HTTP的方法:HTTP的工作方式是客户端与服务器之间的请求-应答协议
    • GET: 从指定的资源==请求数据==
    • POST:向指定的资源==提交==要被处理的数据
    • HEAD
    • PUT
    • DELETE
    • CONNECT
    • OPTIONS
  3. 封装,继承,多态(编译时候的多态:函数重载 || 运行时候的多态:继承,虚函数有关)
  4. python regex
    • 通过import re导入正则表达式库
      .: 匹配任意单个字符(除了换行符 \n)
      ^: 匹配字符串的开头
      $: 匹配字符串的结尾
      []: 匹配括号内的任意一个字符
      |: 或操作,匹配左右任意一个表达式
      \: 转义字符,用于匹配特殊字符(如匹配反斜杠 \,就写成str1 = r”\“, 即为匹配字符 \ )
      *: 匹配前一个字符的0次或多次。(str1 = r”\d星号”, 匹配0个或者多个数字)
      +: 匹配前一个字符的1次或多次。
      ?: 匹配前一个字符的0次或1次。
      {}: 自定义匹配次数。
      {m,n}: 匹配前一个字符至少m次,至多n次。
    • 特殊字符:
      \d: 匹配任意数字字符。
      \D: 匹配任意非数字字符。
      \w: 匹配任意字母、数字、下划线字符。
      \W: 匹配任意非字母、数字、下划线字符。
      \s: 匹配任意空白字符(空格、制表符、换行符等)。
      \S: 匹配任意非空白字符。
      1
      2
      3
      4
      num1 = "-1+-1i"
      matches = re.findall(r'[-+]?\d+', num1)
      real, imaginary = map(int, matches)
      # 使用正则表达式匹配提取复数的实部和虚部
  5. WebSocket特性:
    • 全双工通信:客户端与服务器可以同时发送和接收数据
    • 低延迟:可以降低通信延迟,建立连接后,可以通过已建立的连接进行数据传输
    • 轻量级:头部信息较小,数据传输效率高,
    • 持久连接:与HTTP请求-响应模式不同,可以保持客户端与服务器之间长久的通信
    • 跨域通信/安全性
  6. 稳定和原地排序算法不是一个概念,稳定:对于相等元素,排序后相对次序不对,而原地排序指不需要额外的空间,操作在原始数据上进行
  7. [^A-Z]表示匹配任意一个除了A-Z大写字母外, ^[A-Z]匹配A-Z大写字母开头的
  8. Shell语言
    • 变量分为:用户自定义变量,环境变量,预定义变量
    • 变量名大写,等号无空格:NUM=10
    • 使用$调用,如echo $NUM, echo打印变量值
    • $0: 脚本文件名,$1-9:第1-9个命令行参数名,$#:命令行参数个数,$*和$@:所有命令行参数,$$:执行的进程ID,$?:前一个命令的退出状态,可以获取函数返回值
    • 环境变量:HOME:用户主目录;PATH:系统环境变量 PATH;TERM:当前终端;UID:当前用户 ID;PWD:当前工作目录,绝对路径
    • if, for, while语句
  9. VPN维护用户身份验证和访问控制的手段:1. 用户名密码认证,或验证码,生物特征等认证 2. 证书认证 3. 令牌认证 4. 访问控制列表(ACL): VPN 服务器可以配置访问控制列表,限制用户连接到特定的网络资源或服务。管理员可以根据用户的身份、所在位置等因素配置不同的访问控制策略 5. 审计日志
  10. 可用于返回指定字符串中指定子字符串出现的起始位置的函数是:Charindex(),SubString()求子串,Stuff()删除指定长度的字符,并在删除的位置插入新的字符,Soundex()返回指定字符串的SOUNDEX值
  11. SQL中检测日期:datediff(dd, RDATE, getdate())=0
  12. SQL中,!= 无法检测null值,即无法比较 ‘a_name’ != null, 要使用 NAME IS NULL
  13. SQL语言的组成部分有:数据定义语言、数据处理语言、数据控制语言、数据库事务。数据字典是关于数据库中数据的描述,是元数据,而不是数据本身。
  14. 协程
    • 可以被称为用户态线程,本质就是函数和函数运行状态的组合
    • yield:协程执行到一半可以使用yield进行退出,交还CPU执行权
    • resume:重新恢复运行
    • 在单线程下,一个协程的yield,一定会有另一个协程的resume。协程的运行和调度都要通过应用程序来完成
    • 对称协程,协程可以不受限制地将控制权交给任何其他协程。任何⼀个协程都是相互独⽴且平等的,调度权可以在任意协程之间转移
    • ⾮对称协程,是指协程之间存在类似堆栈的调⽤⽅-被调⽤⽅关系