尚硅谷2019版Java集合和泛型
第十一章 Java集合框架
集合框架全景图
mindmaproot((Java集合))Collection单列List有序可重复ArrayListLinkedListVectorSet无序唯一HashSetLinkedHashSetTreeSetMap双列HashMapLinkedHashMapTreeMapHashtablePropertiesToolsCollectionsArrays
三大核心接口对比
特性 | List | Set | Map |
---|---|---|---|
元素顺序 | 插入顺序 | 无顺序 | Key唯一无序 |
元素重复性 | 允许重复 | 不允许重复 | Key唯一,Value可重复 |
常用实现类 | ArrayList/LinkedList | HashSet/TreeSet | HashMap/TreeMap |
线程安全实现 | CopyOnWriteArrayList | ConcurrentSkipListSet | ConcurrentHashMap |
ArrayList vs LinkedList
特性 | ArrayList | LinkedList |
---|---|---|
底层结构 | 动态数组 | 双向链表 |
随机访问速度 | O(1) | O(n) |
头尾操作效率 | 尾部快,头部慢 | 头尾都快 |
内存占用 | 连续空间,节省 | 节点存储,占用更多 |
扩容机制 | 1.5倍扩容 | 无扩容概念 |
HashMap深度解析
JDK1.8+ 存储结构
graph LRA[数组] --> B[链表]A --> C[红黑树]B -->|长度>8 & 数组长度≥64| C
核心参数
static final int DEFAULT_INITIAL_CAPACITY = 16; // 初始容量
static final float DEFAULT_LOAD_FACTOR = 0.75f; // 负载因子
static final int TREEIFY_THRESHOLD = 8; // 树化阈值
static final int UNTREEIFY_THRESHOLD = 6; // 链化阈值
哈希冲突解决
// 经典扰动函数(JDK1.8)
static final int hash(Object key) {int h;return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}
集合线程安全解决方案
实现方式 | 示例 | 特点 |
---|---|---|
同步包装 | Collections.synchronizedList | 方法级synchronized锁 |
CopyOnWrite | CopyOnWriteArrayList | 写时复制,读无锁 |
CAS机制 | ConcurrentHashMap | 分段锁/Node+CAS |
并发队列 | LinkedBlockingQueue | 双锁设计,put/take分开 |
集合工具类妙用
Collections魔法方法
// 创建不可变集合
List<String> unmodifiableList = Collections.unmodifiableList(list);// 排序+二分查找
Collections.sort(list);
int index = Collections.binarySearch(list, "key");// 频率统计
int count = Collections.frequency(list, "element");
性能提升技巧
// 预设集合容量(避免扩容)
ArrayList<String> list = new ArrayList<>(1000); // 使用批量添加
list.addAll(Arrays.asList(data)); // 优先迭代器遍历
for(Iterator it = list.iterator(); it.hasNext();){System.out.println(it.next());
}
高频面试题精解
-
HashMap工作原理
- 通过hashcode计算存储位置
- JDK1.8采用数组+链表+红黑树
- 扩容时重新计算位置(2次幂扩展)
-
ConcurrentHashMap实现
- JDK1.7:分段锁(Segment)
- JDK1.8:Node+CAS+synchronized
-
ArrayList扩容机制
// 扩容核心代码(JDK1.8) int newCapacity = oldCapacity + (oldCapacity >> 1); // 1.5倍
-
Iterator快速失败机制
- modCount记录修改次数
- 遍历时检测modCount变化
📘 实战建议
- 根据场景选择集合:查询多用ArrayList,增删多用LinkedList
- 预估数据量时显式指定初始容量(特别对HashMap)
- 多线程环境优先使用JUC并发集合
- 复杂对象作为Map键时,必须正确重写hashCode和equals
- 遍历时优先使用增强for循环或迭代器,避免用fori遍历链表结构
第十二章 Java泛型
泛型基础概念
泛型本质
泛型优势
特性 | 非泛型 | 泛型 |
---|---|---|
类型安全 | 运行时可能ClassCastException | 编译时类型检查 |
代码简洁度 | 需要显式类型转换 | 自动类型推断 |
代码复用性 | 针对特定类型编写 | 一套代码处理多种类型 |
集合元素操作 | 只能存储Object | 可存储指定类型 |
泛型使用场景
集合框架中的泛型
// 传统方式
List list = new ArrayList();
list.add("hello");
String str = (String) list.get(0); // 需要强制转换// 泛型方式
List<String> list = new ArrayList<>();
list.add("hello");
String str = list.get(0); // 自动类型推断
自定义泛型类
public class Box<T> {private T item;public void setItem(T item) {this.item = item;}public T getItem() {return item;}
}// 使用
Box<String> stringBox = new Box<>();
stringBox.setItem("Hello");
String str = stringBox.getItem();
泛型高级特性
泛型继承关系
通配符使用
// 上界通配符
public static double sum(List<? extends Number> list) {double sum = 0;for (Number n : list) {sum += n.doubleValue();}return sum;
}// 下界通配符
public static void addNumbers(List<? super Integer> list) {for (int i = 1; i <= 10; i++) {list.add(i);}
}
泛型方法
定义与使用
// 泛型方法定义
public static <T> void printArray(T[] array) {for (T element : array) {System.out.println(element);}
}// 使用示例
Integer[] intArray = {1, 2, 3};
printArray(intArray);String[] strArray = {"A", "B", "C"};
printArray(strArray);
类型推断
// 显式指定类型
Collections.<String>emptyList();// 自动类型推断
List<String> list = Collections.emptyList();
泛型限制与注意事项
使用限制
常见问题
- 类型擦除:泛型信息在编译后被擦除
// 编译前
List<String> list = new ArrayList<>();// 编译后(类型擦除)
List list = new ArrayList();
- 泛型数组:不能直接创建
// 错误示例
// List<String>[] array = new List<String>[10];// 正确方式
List<?>[] array = new List<?>[10];
- 泛型异常:不能捕获泛型异常
// 错误示例
// try { ... } catch (T e) { ... }
最佳实践建议
-
命名规范:使用单个大写字母作为类型参数
-
E:Element(集合元素)
-
K:Key(键)
-
V:Value(值)
-
T:Type(类型)
-
-
边界控制:合理使用上下界通配符
-
生产者使用
<? extends T>
-
消费者使用
<? super T>
-
-
类型安全:优先使用泛型集合
// 推荐
List<String> list = new ArrayList<>();// 不推荐
List list = new ArrayList();
- 代码复用:善用泛型方法
public static <T> T getFirst(List<T> list) {return list.get(0);
}
Java泛型实验
实验1:集合中使用泛型
实验目标
- 掌握在集合中使用泛型的方法
- 理解Comparable和Comparator接口的使用
- 实现自定义对象的排序
实验步骤
- 定义Employee类
public class Employee implements Comparable<Employee> {private String name;private int age;private MyDate birthday;// 构造器、getter、setter省略@Overridepublic int compareTo(Employee o) {return this.name.compareTo(o.name);}@Overridepublic String toString() {return "Employee{" +"name='" + name + '\'' +", age=" + age +", birthday=" + birthday +'}';}
}
- 定义MyDate类
public class MyDate {private int year;private int month;private int day;// 构造器、getter、setter省略
}
- 实现排序
// 按姓名排序(自然排序)
TreeSet<Employee> set1 = new TreeSet<>();
set1.add(new Employee("Alice", 25, new MyDate(1998, 5, 12)));
// 添加其他Employee对象// 按生日排序(定制排序)
TreeSet<Employee> set2 = new TreeSet<>(new Comparator<Employee>() {@Overridepublic int compare(Employee o1, Employee o2) {// 实现日期比较逻辑}
});
实验结果
- 成功创建Employee对象并存入TreeSet
- 实现按姓名和生日的两种排序方式
- 正确遍历输出排序结果
实验2:自定义泛型类的使用
实验目标
- 掌握自定义泛型类的定义和使用
- 理解泛型在数据访问层(DAO)中的应用
- 使用JUnit进行单元测试
实验步骤
- 定义泛型DAO类
public class DAO<T> {private Map<String, T> map = new HashMap<>();public void save(String id, T entity) {map.put(id, entity);}public T get(String id) {return map.get(id);}public void update(String id, T entity) {map.put(id, entity);}public List<T> list() {return new ArrayList<>(map.values());}public void delete(String id) {map.remove(id);}
}
- 定义User类
public class User {private int id;private int age;private String name;// 构造器、getter、setter省略
}
- 编写测试类
public class DAOTest {@Testpublic void testDAO() {DAO<User> dao = new DAO<>();User u1 = new User(1, 25, "Alice");dao.save("001", u1);assertEquals(u1, dao.get("001"));User u2 = new User(2, 30, "Bob");dao.update("001", u2);assertEquals(1, dao.list().size());dao.delete("001");assertNull(dao.get("001"));}
}
实验结果
- 成功实现泛型DAO类
- 完成对User对象的CRUD操作
- 通过JUnit测试验证功能正确性
实验总结
关键知识点
-
泛型集合
- 类型安全
- 自动类型转换
- 减少代码重复
-
排序实现
- Comparable接口:自然排序
- Comparator接口:定制排序
-
泛型类设计
- 类型参数化
- 提高代码复用性
- 增强类型安全性
-
单元测试
- 使用JUnit验证功能
- 保证代码质量
- 支持重构
常见问题
-
类型擦除的影响
- 运行时无法获取泛型类型信息
- 解决方案:通过Class对象传递类型信息
-
泛型数组创建
- 不能直接创建泛型数组
- 解决方案:使用Object数组转换
-
通配符使用
- 上界通配符:
<? extends T>
- 下界通配符:
<? super T>
- 无界通配符:
<?>
- 上界通配符:
Java泛型与集合练习题
泛型类设计
题目1:开发泛型Apple类
要求:
- 设计一个泛型Apple类,包含重量属性weight
- 实例化三个对象:
- a1:weight为String类型,值为"500克"
- a2:weight为Integer类型,值为500
- a3:weight为Double类型,值为500.0
- 输出各对象的weight值
- 思考:为什么a2和a3需要使用包装类Integer和Double?
实现:
public class Apple<T> {private T weight;public Apple(T weight) {this.weight = weight;}public T getWeight() {return weight;}public static void main(String[] args) {Apple<String> a1 = new Apple<>("500克");Apple<Integer> a2 = new Apple<>(500);Apple<Double> a3 = new Apple<>(500.0);System.out.println("a1 weight: " + a1.getWeight());System.out.println("a2 weight: " + a2.getWeight());System.out.println("a3 weight: " + a3.getWeight());}
}
思考:
-
泛型类型参数必须是引用类型,不能是基本类型(如int、double)
-
因此需要使用包装类Integer和Double
集合操作
题目2:新闻类与ArrayList集合
要求:
-
封装新闻类News,包含标题、作者、内容、类型属性
-
重写toString方法,输出格式为"标题;类型;作者"
-
重写equals和hashCode方法,标题相同即为同一条新闻
-
创建ArrayList集合,添加三条新闻
-
遍历集合,打印新闻标题,截取标题到10个汉字长度
实现:
public class News {private String title;private String author;private String content;private String type;// 构造器、getter、setter省略@Overridepublic String toString() {return title + ";" + type + ";" + author;}@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;News news = (News) o;return title.equals(news.title);}@Overridepublic int hashCode() {return title.hashCode();}
}public class NewsTest {public static void main(String[] args) {List<News> newsList = new ArrayList<>();newsList.add(new News("标题1", "作者1", "内容1", "类型1"));newsList.add(new News("标题2", "作者2", "内容2", "类型2"));newsList.add(new News("标题3", "作者3", "内容3", "类型3"));for (News news : newsList) {String title = news.getTitle();System.out.println(title.length() > 10 ? title.substring(0, 10) : title);}}
}
Map集合操作
题目3:HashMap操作
要求:
-
使用HashMap存储员工姓名和工资
-
更新张三的工资为2600元
-
为所有员工加薪100元
-
遍历所有员工
-
遍历所有工资
实现:
public class EmployeeSalary {public static void main(String[] args) {Map<String, Integer> salaryMap = new HashMap<>();salaryMap.put("张三", 800);salaryMap.put("李四", 1500);salaryMap.put("王五", 3000);// 更新张三工资salaryMap.put("张三", 2600);// 所有员工加薪100元salaryMap.replaceAll((k, v) -> v + 100);// 遍历所有员工System.out.println("员工列表:");for (String name : salaryMap.keySet()) {System.out.println(name);}// 遍历所有工资System.out.println("工资列表:");for (Integer salary : salaryMap.values()) {System.out.println(salary);}}
}
相关文章:
尚硅谷2019版Java集合和泛型
第十一章 Java集合框架 集合框架全景图 mindmaproot((Java集合))Collection单列List有序可重复ArrayListLinkedListVectorSet无序唯一HashSetLinkedHashSetTreeSetMap双列HashMapLinkedHashMapTreeMapHashtablePropertiesToolsCollectionsArrays三大核心接口对比 特性ListSe…...
车载诊断架构 --- 整车重启先后顺序带来的思考
我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 周末洗了一个澡,换了一身衣服,出了门却不知道去哪儿,不知道去找谁,漫无目的走着,大概这就是成年人最深的孤独吧! 旧人不知我近况,新人不知我过…...
华为eNSP:实验 配置单区域集成ISIS
单区域集成ISIS是一种基于中间系统到中间系统(IS-IS)协议的网络架构优化方案,主要用于简化网络设计并提升数据传输效率。其核心特点包括: 单一区域部署 ISIS协议在单一逻辑区域内运行,消除多区域间的分层复杂性&am…...
常见框架漏洞(五)----中间件IIS6
一、【PUT漏洞】 漏洞描述:IIS Server 在 Web 服务扩展中开启了 WebDAV ,配置了可以写⼊的权限,造成任意⽂件上传。 版本:IIS 6.0 1. 环境 fofa搜素环境:"IIS-6.0" 或者环境搭建:本地搭建2003…...
leetcode221.最大正方形
class Solution {public int maximalSquare(char[][] matrix) {int result 0; // 记录正方形边长int m matrix.length, n matrix[0].length;int[][] dp new int[m 1][n 1];// 动态规划for (int i 1; i < m; i) {for (int j 1; j < n; j) {if (matrix[i - 1][j - …...
C++实现AVL树
一 AVL树的概念 上上节我们学习了二叉搜索树,他的理想查找的时间复杂度是o(log n),但是如果是下面这种情况,那么它的时间复杂度就会变成o(n). 这种情况就是出现一边高的那种,它的个数和它的高度相差不大。 那么这样就会把二叉搜索…...
Linux系统安全及应用
目录 一.账号安全措施 1.1系统账号清理 1.1.1将非登录用户的shell设为无法登录 1.1.2删除无用用户 userdel 1.1.3锁定账号文件 1.1.4锁定长期不使用的账号 1.2密码安全控制 1.2.1 对新建用户 1.2.2对已有用户 1.3命令历史限制 1.3.1临时清除历史命令 1.3.2限制命令…...
JAVA反序列化深入学习(十三):Spring2
让我们回到Spring Spring2 在 Spring1 的触发链上有所变换: 替换了 spring-beans 的 ObjectFactoryDelegatingInvocationHandler使用了 spring-aop 的 JdkDynamicAopProxy ,并完成了后续触发 TemplatesImpl 的流程 简而言之,换了一个chain&am…...
迭代器运算详解(四十二)
1. 迭代器的随机访问运算 对于 vector 和 string 这样的容器,它们的迭代器支持以下随机访问运算符: 运算符说明iter n返回一个新的迭代器,该迭代器比原来的迭代器 iter 向前移动了 n 个位置(即指向后面的第 n 个元素࿰…...
Linux中Squid服务常用操作
在 Linux 中 Squid 服务常用操作介绍 1. Squid 基础操作 启动 Squid # 前台启动(调试用) squid -N -d 1# 后台启动(-s 表示将日志输出到 syslog) squid -s停止 Squid # 安全停止(需配置 pid_file) squid…...
Linux操作系统--进程的概念
目录 1.了解进程前的前景知识 冯诺依曼体系结构 操作系统(OS) 2.进程 2.1进程的概念 2.2描述进程-PCB 2.2.1task_struct 2.3查看进程 2.4通过系统调用获取进程的标识符 2.5认识fork()--创建进程 该专栏会持续更新 更新时间一周一更。下周更新内容进程状态 1.了解进程前…...
C++假期练习
思维导图 牛客练习...
HTML零基础入门笔记:狂神版
前言 本笔记是学习狂神的java教程,建议配合视频,学习体验更佳。 【狂神说Java】HTML5完整教学通俗易懂_哔哩哔哩_bilibili 第1-2章:Java零基础入门笔记:(1-2)入门(简介、基础知识)-CSDN博客 第3章&…...
算法竞赛备赛——【图论】链式前向星
图论 图的存储方式: 通用的三种:邻接矩阵、邻接表、边集数组 有向图:十字链表 无向图:多重邻接表 刷题常用:邻接矩阵、链式前向星(邻接表变形) 链式前向星 算法题常用: 邻接矩阵、二维vector模…...
JAVA_类和对象
目录 1.面向对象的初步认知 1.1.什么是面向对象 1.2.面向对象与面向过程 2.类的定义和使用 2.1.简单认识类 2.2类的定义格式 2.3.练习 学生类 动物类(可爱猫猫🐱) 3.类的实例化 3.1.什么是实例化 3.2.类和对象的说明 4.this引用…...
高频面试题(含笔试高频算法整理)基本总结回顾65
干货分享,感谢您的阅读! (暂存篇---后续会删除,完整版和持续更新见高频面试题基本总结回顾(含笔试高频算法整理)) 备注:引用请标注出处,同时存在的问题请在相关博客留言…...
数据库系统-数据库控制
并发控制 事务的ACID特性: 原子性(Atomicity):事务包含的所有操作要么全部成功(commit提交),要么全部失败(rollback回滚)一致性(Consistency)&a…...
Python Cookbook-5.3 根据对象的属性将对象列表排序
任务 需要根据各个对象的某个属性来完成对整个对象列表的排序。 解决方案 DSU方法仍然一如既往地有效: def sort_by_attr(sed,attr):intermed [ (getattr(x,attr),i,x) for i,x in enumerate(seg)]intermed.sort()return [ x[-1] for x in intermed def sort_by_attr_inpl…...
Java MCP SDK 开发笔记(一)
MCP 简介 AI 大模型诞生之初,其高度模拟人的对话之能力惊为天人。但我们肯定不希望止步于此—— 工具化就是我们希望 AI 能够完成的目标,由此可以从单纯的对话发展为代替繁复人力的“干活”。这条道路上毋庸置疑 AI 大模型任重道远。而 MCP(Model Contr…...
AF3 OpenFoldDataLoader类_prep_batch_properties_probs方法解读
AlphaFold3 data_modules 模块的 OpenFoldDataLoader 类的 _prep_batch_properties_probs 方法是为每个批次数据准备 recycling 维度 的概率分布。它将根据配置文件中的设定为每个批次数据生成 recycling 轮次的概率分布,并存储到 prop_probs_tensor 中,用于后续抽样选择特定…...
寻找字符串数组中的最长共同前缀字符串
问题描述:给定一个字符串数组 strs,编写一个函数来找到这些字符串的最长公共前缀字符串,如果没有则返回空字符串"" 算法思路 横向扫描法: 从数组的第一个字符串开始,逐个和后面的字符串比较,逐…...
leetcode_数组 56. 合并区间
56. 合并区间 以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。 示例 1: 输入:int…...
Jenkins学习(B站教程)
文章目录 1.持续集成CI2.持续交付CD3.持续部署4.持续集成的操作流程5.jenkins简介6.后续安装部署,见视频 bilibili视频 Jenkins是一个开源的、提供友好操作界面的持续集成(CI)工具,起源于Hudson(Hudson是商用的),主要用…...
学习笔记—C++—类和对象(一)
目录 类和对象 类的定义 类定义格式 访问限定符 类域 实例化 实例化概念 对象的大小 this指针 C和C语言实现Stack对比 类和对象 类的定义 类定义格式 ● class为定义类的关键字,Stack为类的名字,{}中为类的主体,注意类定义结束时后…...
PyTorch 深度学习 || 6. Transformer | Ch6.3 Transformer 简单案例
1. 简单案例 这个代码是一个简单的 Transformer 模型的实现,这个例子展示了一个基本的序列到序列(seq2seq)任务,比如将一个数字序列转换为另一个数字序列。可以用于学习和理解 Transformer 的基本结构和工作原理。 import torch import torch.nn as nn import math# 位置…...
体育风暴篮球足球体育球员综合资讯网站模板
源码名称:篮球足球体育球员综合资讯网站模板 开发环境:帝国cms7.5 空间支持:phpmysql 带软件采集,可以挂着自动采集发布,无需人工操作! 演示地址:https://www.52muban.com/shop/184016.html …...
Visual Studio Code SSH 连接超时对策( keep SSH alive)
文章目录 问题解决方法一:配置服务端关于ClientAliveInterval和ClientAliveCountMax1、打开终端,打开SSH配置文件:输入以下命令:2、打开配置文件后,添加以下内容:3、添加后,Esc按 <Enter>…...
Docker容器中的ubuntu apt update报错 解决办法
问题现象 # apt update Get:1 http://archive.ubuntu.com/ubuntu noble InRelease [256 kB] Get:2 http://security.ubuntu.com/ubuntu noble-security InRelease [126 kB] Err:2 http://security.ubuntu.com/ubuntu noble-security InRelease At least one invalid signa…...
CV - 目标检测
物体检测 目标检测和图片分类的区别: 图像分类(Image Classification) 目的:图像分类的目的是识别出图像中主要物体的类别。它试图回答“图像是什么?”的问题。 输出:通常输出是一个标签或一组概率值&am…...
linux提权 corn 提权
corn提权 corn的基本使用方法 corn的作用就是可以定时的完成一下任务(如备份一下log 或者清除一下日志文件 这些就是运维人员用的) 先找一下定时任务的工作表 cat /bin/corntab 这个是普通用户 我们直接看都看不了 说明什么说明这个 是root高权限执…...
1Panel安装失败 国内docker安装失败
本文仅针对学习交流,只为了帮助计算机相关专业大学生个人技能实操而记录 非学习目的严禁学习!!!否则后果自负 1、离线安装1Panel(不需要手动安装docker,离线安装包里包括了docker) 离线包下载地…...
Excel + VBA 实现“准实时“数据的方法
Excel 本身是静态数据处理工具,但结合 VBA(Visual Basic for Applications) 可以实现 准实时数据更新,不过严格意义上的 实时数据(如毫秒级刷新)仍然受限。以下是详细分析: 1. Excel + VBA 实现“准实时”数据的方法 (1) 定时刷新(Timer 或 Application.OnTime) Appl…...
请问你怎么看待测试,指导哪些测试的类型,有用过哪些测试方法?
作为深耕测试领域多年的博主,我始终认为测试是软件质量的守护者,更是推动研发流程优化的催化剂。以下从测试认知、分类体系到实战方法论,结合具体案例为你系统拆解: 一、测试的本质认知 测试≠找 Bug,而是通过系统性验证回答三个核心问题: 软件是否符合用户需求?系统在…...
详解 Redis repl_backlog_buffer(如何判断增量同步)
一、repl_backlog_buffer 复制积压缓冲区(Replication Backlog Buffer) 是一个环形内存区域(Ring Buffer),用于临时保存主节点最近写入的写命令,以支持从节点断线重连后的增量同步。 1.1 三个复制偏移量 …...
工业操作系统国产化替代的战略路径与挑战分析
一、政策背景与战略意义 工信部提出的 2027 年替换 80 万套工业操作系统计划,是中国制造业向智能化转型的核心举措。该政策旨在通过国产化替代,解决工业领域 “缺芯少魂” 的问题,构建自主可控的工业软件生态体系。当前,中国工业操…...
JMeter接口性能测试从入门到精通
前言: 本文主要介绍了如何利用jmter进行接口的性能测试 1.在测试计划中添加线程组 1.1.线程组界面中元素含义 如果点击循环次数为永远: 2.添加HTTP取样器 2.1.填写登录接口的各个参数 2.2.在线程组下面增加查看结果树 请求成功的情况: 请求…...
WinForm真入门(9)——RichTextBox控件详解
WinForm中RichTextBox控件详解:从基础到高级应用 上一文中笔者重点介绍了TextBox控件的详细用法,忘记的 请点击WinForm真入门(8)——TextBox控件详解,那么本文中的RichTextBox与TextBox有什么区别吗,光看名字的话,多了…...
Linux : 内核中的信号捕捉
目录 一 前言 二 信号捕捉的方法 1.sigaction()编辑 2. sigaction() 使用 三 可重入函数 四 volatile 关键字 一 前言 如果信号的处理动作是用户自定义函数,在信号递达时就调用这个函数,这称为捕捉信号。在Linux: 进程信号初识-CSDN博客 这一篇中已经学习到了一种信号…...
Linux 字符串截取#与%
在Linux的Shell脚本中,#和%用于字符串截取,通过通配符模式匹配删除部分内容 批量修改文件名技巧:Linux下#、##、%、%%符号操作详解-CSDN博客 从左截取(# 和 ##) #:删除最短匹配左侧内容。 ##:…...
Android学习总结之自定义View实战篇
场景一:自定义进度条 在很多应用中,我们会看到一些独特样式的进度条,接下来就实现一个简单的圆形进度条。 实现思路 继承 View 类。重写 onDraw 方法,在该方法里使用 Canvas 和 Paint 来绘制圆形进度条。提供更新进度的方法。 …...
C++ STL 详解 ——list 的深度解析与实践指南
在 C 的标准模板库(STL)中,list作为一种重要的序列式容器,以其独特的双向链表结构和丰富的操作功能,在许多编程场景下发挥着关键作用。深入理解list的特性与使用方法,能帮助开发者编写出更高效、灵活的代码…...
open函数的概念和使用案例
open 是 Linux/Unix 系统中用于打开或创建文件的系统调用,返回一个文件描述符(File Descriptor),后续可通过该描述符进行文件读写等操作。以下是其核心概念和使用案例的详细说明: 1. 核心概念 作用:打开或…...
整理一些大模型部署相关的知识
不一定有什么用, 不经常用还会忘掉. 之前被人问到一次,脑子卡壳回答不出要点, 非常尴尬! 在此记录一下使用心得, 偶尔回来翻看! 一 并行方式 1.1 数据并行 (Data Parallelism) 主要用于模型训练阶段, 即将多个完整的模型副本分布到多个gpu上, 每个gpu运行一部分数据数据, 每个…...
算法刷题记录——LeetCode篇(2.10) [第191~200题](持续更新)
更新时间:2025-04-04 算法题解目录汇总:算法刷题记录——题解目录汇总技术博客总目录:计算机技术系列博客——目录页 优先整理热门100及面试150,不定期持续更新,欢迎关注! 198. 打家劫舍 你是一个专业的…...
蓝桥杯备赛 Day 19 加练dfs
是否需要回溯? 输入参数有哪几个(当前dfs和下一个dfs什么会变?)? 是否需要返回值? 一.1158: 八皇后 P1158 - 八皇后 - New Online Judge (ecustacm.cn) 学习: 1.dfs输入为层数,即行号i,因为是每行只放一个,下一个dfs就是i1 2…...
蓝桥杯-卡java排序
问题描述 本题是一道针对 Java 中 Arrays.sort 的题目,因此只有一个数据,该数据可以把 int 类型的数组在使用 Arrays.sort 后卡成 O(n2)O(n2)。 给定一个有 nn 个正整数的序列 aa,你需要将其升序排序后输出。 输入格式 第一行输入一个正整…...
内存管理模块
在 Linux 内核中,内存管理是一个复杂而关键的组成部分。内核空间的虚拟地址被划分为多个区域,每个区域有其特定的用途和映射机制。本文将详细介绍 直接映射区(Direct Mapping Area)、vmalloc 区、永久内核映射区(Perma…...
Spring RestTemplate修仙指南:从HTTP萌新到请求大能的终极奥义
各位在Spring生态摸爬滚打的道友们!今天要解锁的是Spring官方御用HTTP法宝——RestTemplate!这货堪称Java界的"御剑飞行术",虽然官方已推荐WebClient接棒,但江湖上仍有80%项目在用这员老将!准备好一键起飞了…...
cpp经典数论问题
题目如下 思路 代码如下...
Redis 线程模型:单线程也能快如闪电?
目录 一、核心思想:快刀斩乱麻的“单线程”高手 🦸♂️二、为什么是“单线程”?🤔三、单线程如何做到高性能?✨ “I/O 多路复用”是关键!四、真的一直都只有“一个线程”吗?并不完全是&#x…...