【UCB CS 61B SP24】Lecture 5 - Lists 3: DLLists and Arrays学习笔记
本文内容为构建双向循环链表、使用 Java 的泛型将其优化为通用类型的链表以及数组的基本语法介绍。
1. 双向链表
回顾上一节课写的代码,当执行 addLast()
与 getLast()
方法时需要遍历链表,效率不高,因此可以添加一个指向链表末尾的索引,这样 addLast()
与 getLast()
方法的时间复杂度就为 O ( 1 ) O(1) O(1)。
但是我们再考虑一下 removeLast()
方法,如下图所示:
即使我们有了指向链表末尾的指针 last
,但是当我们要移除最后一个节点时,需要的不是最后一个节点“50”的信息,而是倒数第二个节点“9”,我们需要将“9”的 next
置为 null
,并将 last
指向“9”:
那么我们想要定位到这个节点“9”的唯一方法还是需要从头遍历一遍链表,同理如果你想将 last
指向链表的倒数第二个节点,认为这样就能快速定位,那么就会有新的问题:当节点“50”被删除后,如何更新 last
指向节点“3”?显然又需要从头遍历链表。
有什么办法能快速定位到这个节点呢?我们可以让每个节点不仅指向后一个节点,还能指向前一个节点,这就是双向链表(Doubly Linked List):
但是此时又会出现棘手的问题,那就是 last
指针在链表为空时会指向哨兵节点,在链表不为空时又会指向最后一个实值节点:
有什么办法能统一起来呢?能想到的第一个方案就是同样给尾部设定一个哨兵节点,就和之前的表头哨兵节点类似:
此外还有更完美的解决方案,那就是构建循环链表,这样只需要一个哨兵节点,无需指向链表末尾的指针,当链表为空时,哨兵的前一个节点和后一个节点都是指向自己,当链表不为空时哨兵的前一个结点为末尾节点,末尾节点的后一个节点为哨兵:
实现代码如下:
package CS61B.Lecture5;public class DLList {private static class IntNode {public int val;public IntNode next;public IntNode prev;public IntNode(int val, IntNode next, IntNode prev) {this.val = val;this.next = next;this.prev = prev;}}private IntNode sentinel = new IntNode(0, null, null);private int size;public DLList() {this.sentinel.next = this.sentinel.prev = sentinel;this.size = 0;}public DLList(int val) {IntNode p = new IntNode(val, this.sentinel, this.sentinel);this.sentinel.next = this.sentinel.prev = p;this.size = 1;}public int size() {return this.size;}public int getFirst() {return this.sentinel.next.val;}public void addFirst(int val) {IntNode p = new IntNode(val, this.sentinel.next, this.sentinel);this.sentinel.next.prev = p;this.sentinel.next = p;this.size++;}public void removeFirst() {if (this.size == 0) return;this.sentinel.next.next.prev = this.sentinel;this.sentinel.next = this.sentinel.next.next;this.size--;}public int getLast() {return this.sentinel.prev.val;}public void addLast(int val) {IntNode p = new IntNode(val, this.sentinel, this.sentinel.prev);this.sentinel.prev.next = p;this.sentinel.prev = p;this.size++;}public void removeLast() {if (this.size == 0) return;this.sentinel.prev.prev.next = this.sentinel;this.sentinel.prev = this.sentinel.prev.prev;this.size--;}@Overridepublic String toString() {StringBuilder res = new StringBuilder("DLList: [");IntNode p = this.sentinel;while (p.next != this.sentinel) {res.append(p.next.val);p = p.next;if (p.next != this.sentinel) res.append(", ");}res.append("]");return res.toString();}public static void main(String[] args) {DLList L = new DLList();L.addFirst(5);L.addFirst(10);System.out.println(L.getFirst()); // 10System.out.println(L); // DLList: [10, 5]L.removeFirst();System.out.println(L); // DLList: [5]System.out.println(L.size()); // 1L.addLast(20);System.out.println(L.getLast()); // 20System.out.println(L); // DLList: [5, 20]L.removeFirst();L.removeLast();System.out.println(L); // DLList: []}
}
2. 通用类型双向链表
现在我们的链表只能存放整数,如果想存放其他数据类型例如字符串,那么需要拷贝一份代码将其中的 int
修改为 String
,显然这样很冗余。
如果想实现一个通用类型的数据结构,就需要引入 Java 的泛型概念,我们可以将 DLList
定义为泛型类,这样能够编写出类型安全的、可重用的代码,同时避免类型转换的繁琐操作和潜在的运行时错误。
通过在 <>
中添加类型参数用来表示泛型,类型参数通常使用单个大写字母表示,常见的命名约定如下:
T
:Type(类型)E
:Element(元素)K
:Key(键)V
:Value(值)N
:Number(数字)
需要注意:
- 泛型类型参数必须是引用类型,不能是基本数据类型(如
int
、double
等)。如果需要使用基本数据类型,可以使用其对应的包装类(如Integer
、Double
)。 - 泛型类型参数不能是
final
修饰的类,因为它们不能被继承。
package CS61B.Lecture5;public class DLList<T> {private class IntNode {public T val;public IntNode next;public IntNode prev;public IntNode(T val, IntNode next, IntNode prev) {this.val = val;this.next = next;this.prev = prev;}}private IntNode sentinel = new IntNode(null, null, null);private int size;public DLList() {this.sentinel.next = this.sentinel.prev = sentinel;this.size = 0;}public DLList(T val) {IntNode p = new IntNode(val, this.sentinel, this.sentinel);this.sentinel.next = this.sentinel.prev = p;this.size = 1;}public int size() {return this.size;}public T getFirst() {return this.sentinel.next.val;}public void addFirst(T val) {IntNode p = new IntNode(val, this.sentinel.next, this.sentinel);this.sentinel.next.prev = p;this.sentinel.next = p;this.size++;}public void removeFirst() {if (this.size == 0) return;this.sentinel.next.next.prev = this.sentinel;this.sentinel.next = this.sentinel.next.next;this.size--;}public T getLast() {return this.sentinel.prev.val;}public void addLast(T val) {IntNode p = new IntNode(val, this.sentinel, this.sentinel.prev);this.sentinel.prev.next = p;this.sentinel.prev = p;this.size++;}public void removeLast() {if (this.size == 0) return;this.sentinel.prev.prev.next = this.sentinel;this.sentinel.prev = this.sentinel.prev.prev;this.size--;}@Overridepublic String toString() {StringBuilder res = new StringBuilder("DLList: [");IntNode p = this.sentinel;while (p.next != this.sentinel) {res.append(p.next.val);p = p.next;if (p.next != this.sentinel) res.append(", ");}res.append("]");return res.toString();}public static void main(String[] args) {DLList<String> L = new DLList<>(); // new DLList<String>()中的String可以省略,Java会自动判断L.addFirst("World");L.addFirst("Hello");System.out.println(L.getFirst()); // HelloSystem.out.println(L); // DLList: [Hello, World]L.removeFirst();System.out.println(L); // DLList: [World]System.out.println(L.size()); // 1L.addLast("Algorithm");System.out.println(L.getLast()); // AlgorithmSystem.out.println(L); // DLList: [World, Algorithm]L.removeFirst();L.removeLast();System.out.println(L); // DLList: []}
}
注意 IntNode
类需要改为非静态的,泛型类型变量不能直接在静态方法或静态上下文中使用,因为泛型类型变量是与类的实例相关联的,而静态上下文与类的实例无关。
3. 数组
数组的大小在创建时必须指定,并且一旦创建,其大小不能改变。如果需要更大的数组,必须创建一个新的数组并复制数据。但数组通过索引直接访问元素,时间复杂度为 O ( 1 ) O(1) O(1),适合频繁读取的场景。
3.1 数组基本语法
建议每次创建数组时都使用关键字 new
,因为数组也是一个 Object
,在声明了数组中的变量后也可以省略 new
关键字:
package CS61B.Lecture5;import java.util.Arrays;public class ArraySyntax {public static void main(String[] args) {int[] a = new int[3];int[] b = new int[]{1, 2, 3};int[] c = {1, 2, 3};Arrays.stream(a).forEach(x -> System.out.print(x + " ")); // 0 0 0System.out.println();Arrays.stream(b).forEach(x -> System.out.print(x + " ")); // 1 2 3System.out.println();Arrays.stream(c).forEach(x -> System.out.print(x + " ")); // 1 2 3}
}
现在再来看下面这段代码:
package CS61B.Lecture5;public class ArrayBasics {public static void main(String[] args) {int[] a = null;int[] b, c;b = new int[]{1, 2, 3, 4, 5};c = b;b = new int[]{-1, 2, 5, 4, 99};c = new int[3];a = new int[0];int b_length = b.length;String[] s = new String[6];s[4] = "ketchup";s[b[3] - b[1]] = "muffins";int[] x = {9, 10, 11};System.arraycopy(x, 0, b, 3, 2);}
}
首先声明了一个名为 a
的数组引用,但是并没有调用 new
关键字,此时 Java 并没有创建空间,只是创建了用于存放数组引用的整数空间。同样 b
和 c
只是声明了一个整数数组的引用,未存放实际的数组。
之后通过初始化了一个长度为5的数组,new
关键字使得 Java 在内存中挖掘5个连续的位置用来存放这个数组的内容,并将其地址返回给变量 b
。当执行 c = b
时是将数组的引用赋值给 c
,因此实际上这时候 b
和 c
指向了同一个数组,如下图所示:
接下来执行的 b = new int[]{-1, 2, 5, 4, 99};
语句使用 new
关键字重新创建了一个数组,这时候新数组返回了一个新的内存地址,此时 b
和 c
便指向了不同数组:
再看下一步的 c = new int[3];
改变了 c
使其指向一个新的长度为3的数组:
此时最早创建的数组 {1, 2, 3, 4, 5}
消失了,因为已经没有任何引用能找到这个数组的地址了,垃圾收集器会将其清理掉永远无法再访问这个数组。
再看下一行创建了一个长度为0的数组,虽然这样几乎没什么意义,但是只是想说明一下可以这么做:
b.length
能够获取 b
所指向的数组的长度,但是从之前的图上我们没看到任何其他变量能够记录数组的长度,因此事实证明数组有一个隐秘的实例变量记录长度,通过 Java Visualizer 无法查看这个值在哪。
String
是引用数据类型,因此如果创建了数组并不能将字符串的值直接存放在数组的那个位置上,而是在其他某个位置创建一个字符串对象后再将其引用存放在数组的某个位置上。
最后一行的 System.arraycopy()
方法是将 x
数组从0开始索引取2个值(也就是 [9, 10]
)复制到 b
数组从3开始索引的对应位置上:
3.2 二维数组
我们创建一个4行的二维数组:
package CS61B.Lecture5;public class Array2D {public static void main(String[] args) {int[][] a = new int[4][];a[0] = new int[]{1};a[1] = new int[]{1, 1};a[2] = new int[]{1, 2, 1};a[3] = new int[]{1, 3, 3, 1};}
}
此时我们实际上是在内存中创建了5个数组,a
指向了一个长度为4的数组,这个数组中的每个位置又存放了一个指向某个一维数组的引用,如下图所示:
相关文章:
【UCB CS 61B SP24】Lecture 5 - Lists 3: DLLists and Arrays学习笔记
本文内容为构建双向循环链表、使用 Java 的泛型将其优化为通用类型的链表以及数组的基本语法介绍。 1. 双向链表 回顾上一节课写的代码,当执行 addLast() 与 getLast() 方法时需要遍历链表,效率不高,因此可以添加一个指向链表末尾的索引&am…...
Unity Excel导表工具转Lua文件
思路介绍 借助EPPlus读取Excel文件中的配置数据,根据指定的不同类型的数据配置规则来解析成对应的代码文本,将解析出的字符串内容写入到XXX.lua.txt文件中即可 EPPlus常用API //命名空间 using OfficeOpenXml;//Excel文件路径 var fileExcel new File…...
kafka消费能力压测:使用官方工具
背景 在之前的业务场景中,我们发现Kafka的实际消费能力远低于预期。尽管我们使用了kafka-go组件并进行了相关测试,测试情况见《kafka-go:性能测试》这篇文章。但并未能准确找出消费能力低下的原因。 我们曾怀疑这可能是由我的电脑网络带宽问题或Kafka部…...
算法题(74):Pow(x,n)
审题: 需要我们计算出x(double类型)的n次幂,并返回 思路: 方法一:递归 (1)首先我们的n分为正和负,对于负的我们需要将n转为正的进行运算后,用1.0除以运算结果…...
windwos与linux环境下Iperf3带宽测试工具的安装、使用
目录 一、前言 二、windows 2.1下载 2.2安装 2.3使用 2.3.1服务端 2.3.2客户端 2.3.3输出内容 1.客户端 2.服务端 2.4.相关命令 三、linux 3.1安装 3.2使用 1.服务端 2.客户端 3.输出内容 1.客户端 2.服务端 一、前言 在数字化浪潮下,网络性能…...
GCC编译器(含预处理/编译/汇编/链接四阶段详解)
GCC编译器(含预处理/编译/汇编/链接四阶段详解) 1. 预处理阶段(生成 .i 文件)2. 编译阶段(生成 .s 文件)3. 汇编阶段(生成 .o 文件)4. 链接阶段(生成可执行文件ÿ…...
20250221 NLP
1.向量和嵌入 https://zhuanlan.zhihu.com/p/634237861 encoder的输入就是向量,提前嵌入为向量 二.多模态文本嵌入向量过程 1.文本预处理 文本tokenizer之前需要预处理吗? 是的,文本tokenizer之前通常需要对文本进行预处理。预处理步骤可…...
Mac M3/M4 本地部署Deepseek并集成vscode
Mac 部署 使用傻瓜集成平台ollama,ollama平台依赖于docker,Mac的M3/M4 因doesn’t have VT-X/AMD-v enabled 所以VB,VM无法使用,导致docker无法启动,需要使用docker的替代品podman, 它完全兼容docker brew install p…...
flink使用demo
1、添加不同数据源 package com.baidu.keyue.deepsight.memory.test;import com.baidu.keyue.deepsight.memory.WordCount; import com.baidu.keyue.deepsight.memory.WordCountData; import org.apache.flink.api.common.RuntimeExecutionMode; import org.apache.flink.api.…...
目标检测中单阶段检测模型与双阶段检测模型详细对比与说明
《------往期经典推荐------》 一、AI应用软件开发实战专栏【链接】 项目名称项目名称1.【人脸识别与管理系统开发】2.【车牌识别与自动收费管理系统开发】3.【手势识别系统开发】4.【人脸面部活体检测系统开发】5.【图片风格快速迁移软件开发】6.【人脸表表情识别系统】7.【…...
简识Spring创建Bean方式和设计模式
一、理论解释: Spring在创建Bean时主要有四种方式,这些方式分别涉及到了不同的设计模式。以下是具体的创建方式及对应的设计模式: 通过反射调用构造方法创建Bean: 方式:在Spring的配置文件中,使用<bean…...
空字符串““、空白字符串“ “和 null 三者的区别
空字符串、空白字符串和 null 三者的区别表格: 类型定义示例长度是否有值空字符串字符串长度为 0,但不是 null,即存在一个有效的空字符串对象。""0有值(空值)空白字符串字符串包含空格、制表符等空白字符&a…...
agent和android怎么结合:健康助手,旅游助手,学习助手
agent和android怎么结合:健康助手,旅游助手,学习助手 创新点 智能交互创新:提出全新的agent - Android交互模式,如基于手势、语音、眼动等多模态融合的交互方式。例如让agent能够同时理解用户的语音指令和手势动作,在Android设备上提供更加自然和高效的交互体验,比如在…...
1.16作业
1 进注册界面,第一次以为抓包选把isadmin ture了就好 第二次尝试,勾选is admin,有需要invitecode(经典) 2 p r**5 r**4 - r**3 r**2 - r 2023 q r**5 - r**4 r**3 - r**2 r 2023 n 25066797992811602609904…...
上帝之眼——nmap
nmap介绍 Nmap(网络映射器)是一款广受欢迎的网络探测和安全评估工具,被誉为“上帝之眼”。它以其强大的扫描功能和广泛的应用场景,成为系统管理员和安全专家手中的得力助手。本文将对Nmap进行详细介绍,包括其优点、基本…...
6.日常英语笔记
It’s a pity that my English hasn’t improved much, and I’m not able to chat with you freely. lung 肺 pulmonary 医学中的肺部相关的 pulmonary disease 肺部疾病 pneumonia 肺炎 pulmonary inflammation 肺炎 stick on the wall 贴到墙上 paste on the wall faint w…...
工业路由器和工业交换机,打造高效稳定的工业网络?
工业路由器和工业交换机各有千秋,但如何将它们完美结合,构建稳定高效的工业网络?答案就在这里! 工业物联网(IIoT)是高效、稳定的工业网络成为智慧工厂、工业自动化和远程监控等场景的基础支撑。工业路由器…...
[c++]--类和对象
目录 前言 一、类的定义 1.类定义格式 2.访问限定符 3.类域 二、实例化 1.实例化概念 2.对象大小 三、this指针 四、C和C语言实现Stack对比 五、类的默认成员函数 1.构造函数 2.析构函数 3.拷贝构造函数 4.赋值运算符重载 4.1.运算符重载 4.2.赋值运算符重载 5.取地址运算符重载…...
图论 之 迪斯科特拉算法求解最短路径
文章目录 题目743.网络延迟时间3341.到达最后一个房间的最少时间I 求解最短路径的问题,分为使用BFS和使用迪斯科特拉算法,这两种算法求解的范围是有区别的 BFS适合求解,边的权值都是1的图中的最短路径的问题 图论 之 BFS迪斯科特拉算法适合求…...
Linux中[root@localhost ~]#
root :当前登录用户 :分隔符 localhost :主机名。当前电脑的名字 ~:当前用户所在的位置 #:命令提示符,从这个位置开始可以输入命令 另一个提示符是$ 如果是 root ,则提示# 如果是普…...
DuodooBMS源码解读之 sale_delivery模块
发货通知单下载功能操作手册 一、功能概述 该代码实现了发货通知单的下载功能,用户可以选择要下载的发货通知单,系统将生成包含发货通知单详细信息的 Excel 文件供用户下载。 二、文件结构及说明 sale_delivery/controllers/download.py 定义了一个 …...
uniapp引入uview组件库(可以引用多个组件)
第一步安装 npm install uview-ui2.0.31 第二步更新uview npm update uview-ui 第三步在main.js中引入uview组件库 第四步在uni.scss中引入import "uview-ui/theme.scss"样式 第五步在文件中使用组件...
SpringCloud-Eureka初步使用
什么是REST是一组用于规范资源在网络中转移的表现形式软件架构设计风格.简单来说就是客户端和服务器之间的一种交互形式 什么是RESTful,满足了REST风格的接口或者程序,RESTful API是其中的接口,spring中提供了RestTemplate这个类,他强制执行了REST的规范,包括使用HTTP协议的状…...
【gitlab】认识 持续集成与部署
持续集成(CI)与持续部署(CD) 1. 什么是持续集成(CI)? 持续集成(Continuous Integration,CI)是一种软件开发实践,强调开发人员频繁地将代码提交到…...
机器学习,我们主要学习什么?
机器学习的发展历程 机器学习的发展历程,大致分为以下几个阶段: 1. 起源与早期探索(20世纪40年代-60年代) 1949年:Hebb提出了基于神经心理学的学习机制,开启了机器学习的先河1950年代:机器学习的…...
React 高阶组件的优缺点
React 高阶组件的优缺点 优点 1. 代码复用性高 公共逻辑封装:当多个组件需要实现相同的功能或逻辑时,高阶组件可以将这些逻辑封装起来,避免代码重复。例如,多个组件都需要在挂载时进行数据获取操作,就可以创建一个数…...
算法1-4 数楼梯
题目描述 楼梯有 N 阶,上楼可以一步上一阶,也可以一步上二阶。 编一个程序,计算共有多少种不同的走法。 输入格式 一个数字,楼梯数。 输出格式 输出走的方式总数。 输入输出样例 输入 #1 4 输出 #1 5 说明/提示 对于…...
我的世界1.20.1forge开发教程(6)——自定义燃料,熔炼规则、配方
配方篇 在Minecraft中,配方代码是用于定义合成配方的一种数据格式。在开发者的角度,配方代码通常以JSON格式编写,包含了合成所需的原料、合成产物以及合成方式等信息。 在1.12版本之前,开发者需要通过修改游戏的源代码来添加自定义配方。这通常需要对游戏的Java代码进行修…...
推荐几款SpringBoot项目手脚架
作为程序员、一般需要搭建项目手脚架时、都会去Gitee或Github上去找、但是由于Github在国内并不稳定、所以就只能去Gitee去上查找。 不同语言检索方式不一样、但是也类似。 Gitee WEB应用开发 / 后台管理框架 芋道源码 ELADMIN 后台管理系统 一个基于 Spring Boot 2.7.1…...
01 1个路由器+两个子网
前言 这是最近一个朋友的 ensp 相关的问题, 这里来大致了解一下 ensp, 计算机网络拓扑 相关基础知识 这里一系列文章, 主要是参照了这位博主的 ensp 专栏 这里 我只是做了一个记录, 自己实际操作了一遍, 增强了一些 自己的理解 当然 这里仅仅是一个 简单的示例, 实际场景…...
buu-[OGeek2019]babyrop-好久不见41
打开 /dev/urandom 设备文件,读取4个字节到 buf 中。 将 buf 传递给 sub_804871F() 函数,该函数似乎对输入进行某种处理并返回一个值 v2。 最后,将 v2 传递给 sub_80487D0() 函数。 这个函数首先将 a1 转换为字符串 s。 然后从标准输入读…...
PV和UV的区别
文章目录 1. UV(Unique Visitor / 独立访客):多少人来过2. PV(Page View / 页面浏览量):访问了多少次3. 对比 UV 和 PV4. 示例场景5. 扩展指标 UV 侧重用户规模,反映“多少人来过”。PV 侧重访问…...
DeepSeek掘金——调用DeepSeek API接口 实现智能数据挖掘与分析
调用DeepSeek API接口:实现智能数据挖掘与分析 在当今数据驱动的时代,企业和开发者越来越依赖高效的数据挖掘与分析工具来获取有价值的洞察。DeepSeek作为一款先进的智能数据挖掘平台,提供了强大的API接口,帮助用户轻松集成其功能到自己的应用中。本文将详细介绍如何调用D…...
JavaScript变量的作用域介绍
JavaScript变量的作用域介绍 JavaScript 变量的作用域决定了变量在代码中的可访问性。 var 是 JavaScript 中最早用于声明变量的关键字,它函数作用域或全局作用域。 let 关键字,具有块级作用域、全局作用域。 const关键字,具有块级作用域…...
ollama如何安全卸载,解决Ollama unins000.msg is missing
春节后在本地电脑安装了Ollama的客户端,每次开机自启,影响开机速度,而且本地的模型不如联网的回答效果好,果断选择了卸载,但是今天卸载发现提示下方的错误。根据此文章可以解决当前的问题。 根据此文章可以解决当前的…...
2.5GE 超千兆SFP光模块型号(常用光模块收发光功率范围)
SFP 2.5GE超千兆光模,参考表格: 型号类型工作波长 (nm)发光功率 (dBm)光功率灵敏度 (dBm)传输距离 (m)SFP-25G-SR多模光纤850-10.0 to -3.0-18.0300 (OM3) / 400 (OM4)SFP-25G-LR单模光纤1310-5.0 to 1.0-24.010,000SFP-25G-ER单模光纤1550-1.0 to 4.0…...
Ubuntu24.04安装不同版本的pip
目录 1.安装pip 2. 为不同的Python版本安装pip 3. 安装python库 1.安装pip 一般情况下,Ubuntu系统默认提供Python 3,但可能没有安装pip。可以通过以下命令安装pip sudo apt update sudo apt install python3-pip 安装完成后,可以通过以下…...
fastadmin实现海报批量生成、邮件批量发送
记录一个海报批量生成、邮件批量发送功能开发,业务场景如下: 国外客户做观展预登记,工作人员通过后台,批量给这些观众生成入场证件并发送到观众登记的邮箱,以方便观众入场时快速进场。证件信息包含入场二维码、姓名&a…...
拆解微软CEO纳德拉战略蓝图:AI、量子计算、游戏革命如何改写未来规则!
2025年2月19日 知名博主Dwarkesh Patel对话微软CEO萨蒂亚纳德拉 在最新访谈释放重磅信号:AI将掀起工业革命级增长,量子计算突破引爆材料科学革命,游戏引擎进化为世界模拟器。 整个视频梳理出几大核心观点,揭示科技巨头的未来十年…...
深度学习(2)-深度学习关键网络架构
关键网络架构 深度学习有4种类型的网络架构:密集连接网络、卷积神经网络、循环神经网络和Transformer。每种类型的模型都是针对特定的输入模式,网络架构包含了关于数据结构的假设,即模型搜索的假设空间。某种架构能否解决某个问题࿰…...
MyBatis中的日志和映射器说明
1.MyBatis中的日志 1.1 什么是日志 在我们编写应用的时候,有一些信息需要及时查看,查看的时候有时需要输出到控制台,有时需要输出到文件。MyBatis也需要日志,一般情况下,使用log4j进行日志管理。 1.2 在MyBatis中…...
pip下载速度变快可以用清华镜像源
pip下载速度变快可以用清华镜像源 https://pypi.tuna.tsinghua.edu.cn/simplepip install numpy -i https://pypi.tuna.tsinghua.edu.cn/simple参考清华镜像源地址(国内下载python包必备地址)_清华源镜像地址-CSDN博客...
骶骨神经
骶骨肿瘤手术后遗症是什么_39健康网_癌症 [健康之路]匠心仁术(七) 勇闯禁区 骶骨肿瘤切除术...
LeetCode刷题---二分查找---441
排列硬币 441. 排列硬币 - 力扣(LeetCode) 题目 你总共有 n 枚硬币,并计划将它们按阶梯状排列。对于一个由 k 行组成的阶梯,其第 i 行必须正好有 i 枚硬币。阶梯的最后一行 可能 是不完整的。 给你一个数字 n ,计算…...
DeepSeek 提示词:定义、作用、分类与设计原则
🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,精通Java编…...
最短路的方案数+打印路径
这个题目整合了我们最短路用到的很多技能 如何统计最短路径的方案数呢,这就需要我们另外开一个全局数组 如何打印路径呢,还是开一个全局的数组,记录前一个是啥就行 简单的来说,要增加啥新的功能,直接多开全局变量就行…...
Python爬虫系列教程之第十三篇:构建高可用爬虫系统 —— 混合架构与自动化监控
大家好,欢迎继续关注本系列爬虫教程!随着爬虫项目规模的不断扩大和业务需求的提升,单一技术方案往往难以满足实际应用中对高可用性、稳定性和自动化监控的要求。如何构建一个既能应对多种反爬策略,又能在异常情况下自动恢复、实时…...
Python学习心得浅拷贝与深拷贝
一、变量的赋值、浅拷贝以及深拷贝的定义: 1.变量的赋值:只是形成两个变量,实际上还是指向同一个对象 2.浅拷贝:拷贝时,对象包含的子对象内容不拷贝,因此,源对象与拷贝对象会引用同一个子对象…...
cs106x-lecture13(Autumn 2017)-SPL实现
打卡cs106x(Autumn 2017)-lecture13 (以下皆使用SPL实现,非STL库,后续课程结束会使用STL实现) 1、v1v2p1p2 The following code C uses pointers and produces two lines of output. What is the output? int v1 10; int v2 25; int* p1 &v1…...
3D模型在线转换工具:轻松实现3DM转OBJ
3D模型在线转换是一款功能强大的在线工具,支持多种3D模型格式的在线预览和互转。无论是工业设计、建筑设计,还是数字艺术领域,这款工具都能满足您的需求。 3DM与OBJ格式简介 3DM格式:3DM是一种广泛应用于三维建模的文件格式&…...