当前位置: 首页 > news >正文

【UCB CS 61B SP24】Lecture 4 - Lists 2: SLLists学习笔记

本文内容为重写上一节课中的单链表,将其重构成更易于用户使用的链表,实现多种操作链表的方法。

1. 重构单链表SLList

在上一节课中编写的 IntList 类是裸露递归的形式,在 Java 中一般不会这么定义,因为这样用户可能需要非常了解引用,并且能够递归地思考,才能使用这个类。

因此我们需要实现一个更容易使用的单链表(Singly Linked List),首先我们定义节点类 IntNode

package CS61B.Lecture4;public class IntNode {public int val;public IntNode next;public IntNode(int val, IntNode next) {this.val = val;this.next = next;}
}

现在就可以创建单链表类 SLList

package CS61B.Lecture4;public class SLList {private IntNode head;public SLList(int val) {this.head = new IntNode(val, null);}public static void main(String[] args) {SLList L = new SLList(5);}
}

之前用户使用单链表需要这样定义:IntList L = new IntList(5, null);,他需要有递归考虑的思想,必须指定所指向的下一个链表的空值。

由于 IntNode 类只有在 SLList 类中使用才有意义,且用户一般不会单独去使用 IntNode 类,因此可以将其作为嵌套类放入 SLList 中,并且可以使用 private 关键字控制其权限:

package CS61B.Lecture4;public class SLList {private static class IntNode {public int val;public IntNode next;public IntNode(int val, IntNode next) {this.val = val;this.next = next;}}private IntNode head;public SLList(int val) {this.head = new IntNode(val, null);}public static void main(String[] args) {SLList L = new SLList(5);}
}

注意到我们还将 IntNode 类定义为静态的,静态嵌套类与外部类的实例无关,它更像是一个独立的类,但逻辑上仍然属于外部类的范畴,静态嵌套类可以直接访问外部类的静态字段和方法,但不能直接访问外部类的实例字段和方法(除非通过外部类的实例),因此静态嵌套类通常用于逻辑上与外部类相关,但不需要依赖外部类实例的场景。

2. 实现操作链表的方法

现在我们实现操作链表的几种方法:

package CS61B.Lecture4;public class SLList {private static class IntNode {public int val;public IntNode next;public IntNode(int val, IntNode next) {this.val = val;this.next = next;}}private IntNode head;public SLList(int val) {this.head = new IntNode(val, null);}// 获取首部节点值public int getFirst() {return this.head.val;}// 在首部添加节点public void addFirst(int val) {this.head = new IntNode(val, this.head);}// 删除首部节点并返回其值public int removeFirst() {if (this.head == null) {System.out.println("Already Empty!");return 0;}int val = this.head.val;this.head = this.head.next;return val;}// 获取尾部节点值public int getLast() {IntNode p = this.head;while (p.next != null) p = p.next;return p.val;}// 在尾部添加节点public void addLast(int val) {IntNode p = this.head;while (p.next != null) p = p.next;p.next = new IntNode(val, null);}// 删除尾部节点并返回其值public int removeLast() {if (this.head == null) {System.out.println("Already Empty!");return 0;}int val;if (this.head.next == null) {val = this.head.val;this.head = null;} else {IntNode p = this.head;while (p.next.next != null) p = p.next;val = p.next.val;p.next = null;}return val;}// 获取链表长度public int size() {return this.size(this.head);  // 无法在该方法中直接实现递归,需要一个额外的辅助方法}// size()递归辅助方法private int size(IntNode p) {if (p.next == null) return 1;return 1 + size(p.next);}// 重写输出SLList对象的信息@Overridepublic String toString() {if (this.head == null) return "[]";StringBuilder res = new StringBuilder("SLList: [");IntNode p = this.head;while (p != null) {res.append(p.val);if (p.next != null) res.append(", ");else res.append("]");p = p.next;}return res.toString();}public static void main(String[] args) {SLList L = new SLList(5);L.addFirst(10);System.out.println(L.getFirst());  // 10L.addLast(15);System.out.println(L.getLast());  // 15System.out.println(L.size());  // 3System.out.println(L);  // SLList: [10, 5, 15]System.out.println(L.removeFirst());  // 10System.out.println(L.removeLast());  // 15System.out.println(L.size());  // 1System.out.println(L);  // SLList: [5]}
}

需要重点思考的是如何用递归的方式求解链表的长度,我们使用的是构造一个辅助方法 size(IntNode p) 使得用户可以通过 size() 方法直接获取链表长度。

3. 优化效率

我们现在关注 size() 方法,发现每次用户需要查看链表长度时都需要遍历一次链表,因此我们可以用一个变量实时记录链表的长度,也就是用空间换时间,这样每次查询只需要 O ( 1 ) O(1) O(1) 的时间复杂度,这也是上一节课中直接裸露递归的类 IntList 所无法实现的:

package CS61B.Lecture4;public class SLList {private static class IntNode {public int val;public IntNode next;public IntNode(int val, IntNode next) {this.val = val;this.next = next;}}private IntNode head;private int size;public SLList(int val) {this.head = new IntNode(val, null);this.size = 1;}// 获取首部节点值public int getFirst() {return this.head.val;}// 在首部添加节点public void addFirst(int val) {this.head = new IntNode(val, this.head);this.size++;}// 删除首部节点并返回其值public int removeFirst() {if (this.head == null) {System.out.println("Already Empty!");return 0;}int val = this.head.val;this.head = this.head.next;this.size--;return val;}// 获取尾部节点值public int getLast() {IntNode p = this.head;while (p.next != null) p = p.next;return p.val;}// 在尾部添加节点public void addLast(int val) {IntNode p = this.head;while (p.next != null) p = p.next;p.next = new IntNode(val, null);this.size++;}// 删除尾部节点并返回其值public int removeLast() {if (this.head == null) {System.out.println("Already Empty!");return 0;}int val;if (this.head.next == null) {val = this.head.val;this.head = null;} else {IntNode p = this.head;while (p.next.next != null) p = p.next;val = p.next.val;p.next = null;}this.size--;return val;}// 获取链表长度public int size() {return this.size;}// 重写输出SLList对象的信息@Overridepublic String toString() {if (this.head == null) return "[]";StringBuilder res = new StringBuilder("SLList: [");IntNode p = this.head;while (p != null) {res.append(p.val);if (p.next != null) res.append(", ");else res.append("]");p = p.next;}return res.toString();}public static void main(String[] args) {SLList L = new SLList(5);L.addFirst(10);System.out.println(L.getFirst());  // 10L.addLast(15);System.out.println(L.getLast());  // 15System.out.println(L.size());  // 3System.out.println(L);  // SLList: [10, 5, 15]System.out.println(L.removeFirst());  // 10System.out.println(L.removeLast());  // 15System.out.println(L.size());  // 1System.out.println(L);  // SLList: [5]}
}

4. 修复addLast()

首先我们写一个无参的构造方法,这样用户能够创建一个空链表:

public SLList() {this.head = null;this.size = 0;
}

现在我们尝试创建空链表,并用 addLast() 方法添加节点:

SLList L = new SLList();
L.addLast(10);
System.out.println(L);

会发现程序报错了,因为空链表的 this.head 就为 null,在执行 while (p.next != null) 时无法获取 p.next,因此我们可以这样修改 addLast() 方法:

// 在尾部添加节点
public void addLast(int val) {if (this.head == null) this.head = new IntNode(val, null);else {IntNode p = this.head;while (p.next != null) p = p.next;p.next = new IntNode(val, null);}this.size++;
}

5. 虚拟头节点

现在观察代码会发现有些方法里做了形如 if (this.head == null) 的特判,当工程代码量变大时如果习惯这么写会导致代码冗余复杂。

我们可以添加一个虚拟头节点,这样就不会存在头节点为空的情况,这种虚拟头节点也称哨兵节点,并且修改 remove 方法使其不返回节点值,因为可以通过 get 方法获取节点值。最后本节课的完整实现代码如下:

package CS61B.Lecture4;public class SLList {private static class IntNode {public int val;public IntNode next;public IntNode(int val, IntNode next) {this.val = val;this.next = next;}}private IntNode sentinel;  // 第一个节点在sentinel.next上private int size;public SLList() {this.sentinel = new IntNode(0, null);this.size = 0;}public SLList(int val) {this.sentinel = new IntNode(0, new IntNode(val, null));this.size = 1;}// 获取首部节点值public int getFirst() {IntNode p = this.sentinel;if (p.next != null) p = p.next;return p.val;}// 在首部添加节点public void addFirst(int val) {this.sentinel.next = new IntNode(val, this.sentinel.next);this.size++;}// 删除首部节点public void removeFirst() {if (this.sentinel.next == null) return;this.sentinel.next = this.sentinel.next.next;this.size--;}// 获取尾部节点值public int getLast() {IntNode p = this.sentinel;while (p.next != null) p = p.next;return p.val;}// 在尾部添加节点public void addLast(int val) {IntNode p = this.sentinel;while (p.next != null) p = p.next;p.next = new IntNode(val, null);this.size++;}// 删除尾部节点public void removeLast() {if (this.sentinel.next == null) return;IntNode p = this.sentinel;while (p.next.next != null) p = p.next;p.next = null;this.size--;}// 获取链表长度public int size() {return this.size;}// 重写输出SLList对象的信息@Overridepublic String toString() {StringBuilder res = new StringBuilder("SLList: [");IntNode p = this.sentinel;while (p.next != null) {res.append(p.next.val);p = p.next;if (p.next != null) res.append(", ");}res.append("]");return res.toString();}public static void main(String[] args) {SLList L = new SLList();System.out.println(L.size());  // 0System.out.println(L);  // SLList: []L.addLast(15);System.out.println(L.getLast());  // 15L.addFirst(10);System.out.println(L.getFirst());  // 10System.out.println(L.size());  // 2System.out.println(L);  // SLList: [10, 15]L.removeLast();L.removeFirst();L.removeLast();L.removeFirst();System.out.println(L.size());  // 0System.out.println(L);  // SLList: []}
}

相关文章:

【UCB CS 61B SP24】Lecture 4 - Lists 2: SLLists学习笔记

本文内容为重写上一节课中的单链表,将其重构成更易于用户使用的链表,实现多种操作链表的方法。 1. 重构单链表SLList 在上一节课中编写的 IntList 类是裸露递归的形式,在 Java 中一般不会这么定义,因为这样用户可能需要非常了解…...

记录一个ES分词器不生效的解决过程

问题背景 商城项目,其中商品查询检索使用的是ES, 但存在某些商品查询不到的问题 例如:某商品名包含AA_BBB这样的关键词,但是搜索"AA"不能查询到该商品,但是将商品名修改为AA BBB后就能查询到了. 怀疑是分词的问题,但看代码,在创建ES索引时在对应字段上也定义了分词器…...

Jeecg+vue3去掉JInput组件默认模糊查询的配置方式

遇见的问题:input查询带**号 情况1、使用schemas配置的表单项 添加type""属性,默认type为like,去掉模糊则配置为空 文档链接 jeecg文档说明JInput 2、直接调用组件则在属性上直接添加type""属性...

Could not initialize class io.netty.util.internal.Platfor...

异常信息: Exception in thread "main" java.lang.NoClassDefFoundError: Could not initialize class io.netty.util.internal.PlatformDependent0 Caused by: java.lang.ExceptionInInitializerError: Exception java.lang.reflect.InaccessibleObjec…...

什么是业务流程分类框架

业务流程分类框架是一个用于组织和系统化地分类业务流程的结构化方法。它旨在帮助企业理解、管理、分析和改进其运营流程。 可以把它想象成一个图书馆的图书分类系统,帮助快速找到和理解不同类型的书籍。对于业务流程来说,分类框架帮助快速了解不同类型的…...

向量的点乘的几何意义

源自AI 向量的点乘(Dot Product)在几何和图形学中有重要的意义。它不仅是数学运算,还可以用来描述向量之间的关系。以下是点乘的几何意义及其应用: 1. 点乘的定义 对于两个向量 a 和 b,它们的点乘定义为:…...

达梦数据库应用开发_JDBC接口介绍_yxy

达梦数据库应用开发_JDBC接口介绍 1 JDBC是什么?2 JDBC主要类或接口介绍2.1 建立与 DM 数据库的连接2.2 转接发送 SQL 语句到数据库2.3 处理并返回语句执行结果 3 JDBC基本使用3.1 前期准备3.2 增删改查代码示例3.3 绑定变量操作示例3.4 大字段操作示例 1 JDBC是什么…...

在ubuntu上用Python的openpyxl模块操作Excel的案例

文章目录 安装模块读取Excel数据库取数匹配数据和更新Excel数据 在Ubuntu系统的环境下基本职能借助Python的openpyxl模块实现对Excel数据的操作。 安装模块 本次需要用到的模块需要提前安装(如果没有的话) pip3 install openpyxl pip3 install pymysql在操作前,需…...

RabbitMQ介绍以及基本使用

文章目录 一、什么是消息队列? 二、消息队列的作用(优点) 1、解耦 2、流量削峰 3、异步 4、顺序性 三、RabbitMQ基本结构 四、RabbitMQ队列模式 1、简单队列模式 2、工作队列模式 3、发布/订阅模式 4、路由模式 5、主题模式 6、…...

搭建 Hadoop 3.3.6 伪分布式

搭建 Hadoop 3.3.6 伪分布式 IP 192.168.157.132 初始化操作 更改yum源 # 1_1.安装Wget yum install wget# 1_2.备份CentOS-Base.repo文件 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo_bak# 2.下载阿里yum源配置 wget -O /etc/yum.repos.d/Cen…...

进程控制(靠原语实现)

什么是进程控制? 进程控制的主要功能是:对系统中的所有进程实施有效管理,它具有创建新进程、撤销已有进程、实现进程状态转换等功能。 简化理解:进程控制就是要实现进程状态转换。 知识一览: 如何实现进程控制&#…...

linux5-多任务--进程fork()

一.多任务:让系统具备同时处理多个任务的能力 1.如何实现多任务 1.1进程:操作系统上正在运行的程序,需要消耗内存和CPU 1.1.1 进程的生存周期:创建、调度、消亡 1.1.1.1进程的创建:每个进程被创建时,操作…...

【蓝桥】二分法

1、简介 1.1 定义: 通过将问题的搜索范围一分为二,迭代地缩小搜索范围,直到找到目标或确定目标不存在 1.2 适用: 有序数据集合,且每次迭代可以将搜索范围缩小一半 1.3 本质: 枚举:利用数据结构…...

linux查看程序占用的本地端口

ss是Socket Statistics的缩写,用来替代旧的netstat工具,功能更强大,执行更快。它用于查看系统的网络连接情况,包括TCP、UDP等协议的信息。 一. 命令解析: sudo ss -tulwnpss (Socket Statistics):替代 ne…...

统计函数运行时间的python脚本

这是一个统计函数运行时间的实用脚本,其中用到了函数的嵌套、链式传输参数,以及修饰器。 import time# 定义一个装饰器timer,用于计算被装饰函数的运行时间 def timer(func):print("执行了timer")def wrapper(*args, **kwargs):st…...

百度搜索和文心智能体接入DeepSeek满血版——AI搜索的新纪元

在当今数字化时代,搜索引擎作为互联网信息获取的核心工具,正经历着前所未有的变革。据悉,2025年2月16日,百度搜索和文心智能体平台宣布全面接入DeepSeek和文心大模型的最新深度搜索功能,搜索用户可免费使用DeepSeek和文…...

快速入门Springboot+vue——MybatisPlus快速上手

学习自哔哩哔哩上的“刘老师教编程”,具体学习的网站为:6.MybatisPlus快速上手_哔哩哔哩_bilibili,以下是看课后做的笔记,仅供参考。 第一节 ORM介绍 ORM对象关系映射,为了解决面向对象与关系数据库存在的互补匹配现象…...

在C#中动态访问对象属性时,用表达式树可以获得高效性能

在C#中如何用表达式树动态访问对象属性的问题。用户可能已经知道反射的基本用法,但想用表达式树来提高性能,因为表达式树编译后的委托执行速度比反射快。 首先,表达式树的基本概念。表达式树允许在运行时构建代码,并编译成可执行的…...

性能:React 实战优化技巧 之 函数闭包

子组件使用了 React.memo ,为什么 “prop 值未发生改变”,子组件依然被重新渲染了? 🚧 示例:点击子组件中按钮,获取 input 数据进行提交(常见于表单) index.tsx import Author f…...

蓝桥杯学习大纲

(致酷德与热爱算法、编程的小伙伴们) 在查阅了相当多的资料后,发现没有那篇博客、文章很符合我们备战蓝桥杯的学习路径。所以,干脆自己整理一篇,欢迎大家补充! 一、蓝桥必备高频考点 我们以此为重点学习…...

Windows11切换回Windows10风格右键菜单

参考文章:Win11新版右键菜单用不惯?一键切换回Win10经典版!-CSDN博客 以管理员权限运行命令行cmd 切换为经典旧版右键菜单,执行 reg.exe add “HKCU\Software\Classes\CLSID\{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}\InprocServe…...

Python 爬虫selenium

1.selenium自动化 selenium可以操作浏览器,在浏览器页面上实现:点击、输入、滑动 等操作。 不同于selenium自动化,逆向本质是: 分析请求,例如:请求方法、请求参数、加密方式等。用代码模拟请求去实现同等…...

Linux常用操作

软件安装 CentOS系统使用: yum [install remove search] [-y] 软件名称 install 安装 remove 卸载 search 搜索 -y,自动确认 Ubuntu系统使用 apt [install remove search] [-y] 软件名称 install 安装 remove 卸载 search 搜索 -y,自动确认 yum 和 apt 均需要root权限 syste…...

Note25022001_Excel表格如何在文字的中间或者后边插入当前日期

Excel表格如何在文字的中间或者后边插入当前日期 关键字: EXCEL;当前日期;文字中间 如图所示: 其中一种实现方法如下: 打开表格,在某一个表格中输入: "项目计划管理表(厂内&…...

Django5 实用指南(四)URL路由与视图函数

4.1 Django5的URL路由系统 Django 的 URL 路由系统是其核心组件之一,它负责将用户的 HTTP 请求(即 URL)映射到相应的视图函数上。每当用户在浏览器中访问某个 URL 时,Django 会根据项目的 URL 配置文件(urls.py&#…...

Unity3D 基于 GPU 动画和 Compute Shader 的大批量动画渲染详解

引言 在现代游戏开发中,渲染大量动画角色是一个常见的需求,尤其是在大规模战斗场景、开放世界游戏或 VR/AR 应用中。传统的 CPU 动画计算和渲染方式在面对大批量角色时,往往会遇到性能瓶颈。为了优化性能,开发者可以利用 GPU 的强…...

遥感影像目标检测:从CNN(Faster-RCNN)到Transformer(DETR)

我国高分辨率对地观测系统重大专项已全面启动,高空间、高光谱、高时间分辨率和宽地面覆盖于一体的全球天空地一体化立体对地观测网逐步形成,将成为保障国家安全的基础性和战略性资源。未来10年全球每天获取的观测数据将超过10PB,遥感大数据时…...

什么是DeFi (去中心化金融)

DeFi (去中心化金融) 概述 💰 1. DeFi 基础概念 1.1 什么是 DeFi? DeFi 是建立在区块链上的金融服务生态系统,它: 无需中心化中介开放且透明无需许可即可参与代码即法律 1.2 DeFi 的优势 开放性:任何人都可以参与…...

深入解析 sudo -l 命令的输出内容

在 Linux 系统中,sudo 命令允许普通用户以超级用户(root)权限执行命令。sudo -l 命令用于查看当前用户在 sudoers 配置文件中的权限,以及与 sudo 相关的安全策略。本文将详细解析 sudo -l 输出的各个部分,包括 用户权限…...

DeepSeek 助力 Vue 开发:打造丝滑的瀑布流布局(Masonry Layout)

前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏关注哦 💕 目录 Deep…...

linux学习【7】Sourc Insight 4.0设置+操作

目录 1.Source Insight是什么?2.需要哪些配置?3.怎么新建项目4.一些问题的解决1.中文乱码问题 按照这个设置就可以了,下面的设置会标明设置理由。 1.Source Insight是什么? 阅读源码,编辑源码,不能编译&am…...

OpenCV形态学操作

1.1. 形态学操作介绍 初识: 形态学操作是一种基于图像形状的处理方法,主要用于分析和处理图像中的几何结构。其核心是通过结构元素(卷积核)对图像进行扫描和操作,从而改变图像的形状和特征。例如: 腐蚀&…...

使用Python中的`gensim`库构建LDA(Latent Dirichlet Allocation)模型来分析收集到的评论

下面为你详细介绍如何使用Python中的gensim库构建LDA(Latent Dirichlet Allocation)模型来分析收集到的评论。LDA是一种主题模型,它可以将文档集合中的文本按照主题进行分类。 步骤概述 数据预处理:对收集到的评论进行清洗、分词…...

【STM32】外部时钟|红外反射光电开关

1.外部时钟 单片机如何对外部触发进行计数?先看一下内部时钟,内部时钟是接在APB1和APB2时钟线上的,APB1,APB2来自stm32单片机内部的脉冲信号,也叫内部时钟。我们用来定时。同样我们可以把外部的信号接入单片机,来对其…...

Visual Studio Code 集成 Baidu Comate

文章目录 安装Baidu Comate插件 安装Baidu Comate插件 从左主侧栏中 点击 【扩展】这个图标,然后在上方输入栏中输入 baidu comate —>选中列出的Bai Comate —>点击 【安装】按钮,等待安装完毕…...

数据结构者

数据(data):可被计算机接受处理的符号总称 数据元素(data element):数据的基本单位,常作为一个整体进行考虑和处理 一个数据元素可以由若干个数据项(data item)组成 数…...

论文阅读 DOES END-TO-END AUTONOMOUS DRIVING REALLY NEED PERCEPTION TASKS?

端到端的强势来袭,好久了~~~ 简单翻译:端到端真的需要感知任务嘛? code https://github.com/PeidongLi/SSR. https://arxiv.org/pdf/2409.18341 1. 摘要 端到端自动驾驶(E2EAD)方法通常依赖于监督式感知任务来提取显…...

总结UML类图几种关系画法

最近在公司需要画类图,有些遗忘,于是重新学习并并总结了一下: 继承:实线空心三角箭头。A继承B,A指向B。A是一种B。实现:虚线空心三角箭头。A实现B,A指向B。A实现B接口。关联:实线普…...

python-leetcode 40.二叉树的层序遍历

题目: 给定二叉树的根节点root,返回其节点值得层序遍历(即逐层从左到右访问所有节点) 方法:广度优先搜索 # Definition for a binary tree node. # class TreeNode(object): # def __init__(self, val0, leftNone, rightNon…...

安利:外文文献翻译插件

沉浸式翻译 好用吹爆!!!!!!!! 任务 2.谷歌学术 复制外文的标题搜索 3.进入文献所在,登录对应机构 4.可以看到都翻译好了 5.然后复制到文档,改改格式巴…...

Python——生成AIGC图像

文章目录 一、背景介绍 二、效果图展示 三、完整代码 四、分步解释 五、实用建议 1)提示词技巧 2)性能优化 3)常见问题处理 4)扩展功能建议 六、注意事项 1. 硬件要求 2. 法律合规 3. 模型安全 一、背景介绍 AIGC&a…...

OpenGL(2)基于Qt做OpenGL开发

文章目录 一、基于Qt做OpenGL开发1、环境准备2、创建OpenGL窗口3、绘制基本图形 一、基于Qt做OpenGL开发 1、环境准备 确保你已经安装了 Qt 开发环境(包含 Qt Creator),并且支持 OpenGL 开发。在创建 Qt 项目时,选择 “Qt Widget…...

【Windows软件 - HeidiSQL】导出数据库

HeidSQL导出数据库 软件信息 具体操作 示例文件 选项分析 选项(1) 结果(1) -- -------------------------------------------------------- -- 主机: 127.0.0.1 -- 服务器版本: …...

用deepseek学大模型04-模型可视化与数据可视化

deepseek.com: pytorch可视化工具 生成神经网络图 在 PyTorch 中,可视化神经网络结构的常用工具和方法有以下几种,以下将详细介绍它们的用法: 1. TensorBoard (PyTorch 官方集成) PyTorch 通过 torch.utils.tensorboard 支持 TensorBoard&a…...

rust笔记8-Deref与隐式解引用强制转换

Rust 的智能指针和 Deref Trait 是 Rust 中非常重要的概念,它们使得 Rust 的引用和指针操作更加灵活和安全。下面我们将深入介绍 Deref Trait、Deref 与 &、* 运算符的关系,以及 Rust 的隐式解引用强制转换(Deref Coercion)。 1. 智能指针与 Deref Trait 智能指针(如…...

Debian软件包重构

Explore projects GitLab 1. apt-get build-dep <pkg> ## 安装编译依赖包 2. apt source <pkg> ## 下载 <pkg> 包的源码 3. 创建 git &#xff0c;打补丁 4. dpkg-buildpackage -b -uc -us -d ## 重新打包编译 # 解压出包中的文件到 extract 目…...

学习 `@PreDestroy`:Java EE/Jakarta EE 生命周期回调

学习 PreDestroy&#xff1a;Java EE/Jakarta EE 生命周期回调 前言1. 什么是 PreDestroy&#xff1f;2. PreDestroy 的用途3. 使用 PreDestroy 的条件4. 代码示例运行结果&#xff1a; 5. PreDestroy 的调用时机6. 注意事项7. 实际应用场景场景 1&#xff1a;数据库连接管理场…...

JDK最详细安装教程,零基础入门到精通,收藏这篇就够了

目录 一、下载与安装二、配置环境三、验证是否配置成功 一、下载与安装 1、下载地址 http://www.oracle.com/technetwork/java/javase/downloads/index.html 2、选择自己想要的版本下载&#xff0c;并且选择自己电脑对应的版本下载 3、下载完成之后&#xff0c;双击打开然后…...

解决DeepSeek服务器繁忙问题的实用指南

目录 简述 1. 关于服务器繁忙 1.1 服务器负载与资源限制 1.2 会话管理与连接机制 1.3 客户端配置与网络问题 2. 关于DeepSeek服务的备用选项 2.1 纳米AI搜索 2.2 硅基流动 2.3 秘塔AI搜索 2.4 字节跳动火山引擎 2.5 百度云千帆 2.6 英伟达NIM 2.7 Groq 2.8 Firew…...

【一个人的第一年】成都Java日志7

#海纳百川&#xff0c;有容乃大# 1.互联网 互联网是一个服务我的工具而不是绑架任何人的场所&#xff0c;网络不是现实&#xff0c;现实才是生活。 现在越来越多的声音出现在互联网&#xff0c;能轻易地挑起群体情绪。对其他的任何事可以有不同的立场和观点&#xff0c;而不是…...