【Qt】Item Widgets 多元素控件
Qt中提供的多元素控件有:
- QListWidget
- QListView
- QTableWidget
- QTableView
- QTreeWidget
- QTreeView
上述控件分为Widget和View,其区别如下:
以QTableWidget和QTableView为例
- QTableView是基于MVC(Model-View-Controller)设计的控件。QTableView自身不持有数据,只是实现界面效果。使用QTableView需要用户创建一个Model对象(比如QStandarModel),并且把Model和QTableView关联起来,后续修改Model中的恶数据就会影响QTableView的显示;修改QTableView也会影响Model中的数据(双向绑定)
- QTableWidget则是QTableView的子类,对Model进行了封装,不需要我们手动创建Model对象,直接往QTableWidget中添加数据即可
目录
QListWidget
QListWidgetItem
QTableWidget
QTableWidgetItem
QTreeWidget
QTreeWidgetItem
QListWidget
QListWidget类是用于显示条目列表的控件。每个条目可以包含文本和可选的图标

核心属性
| 属性 | 说明 |
| currentRow | 当前被选中的是第几行,下标从0开始 |
| count | 当前有多少行条目 |
| sortingEnabled | 是否允许排序 |
| isWrapping | 是否允许换行 |
| itemAlignment | 元素的对齐方式 |
| selectRectVisible | 被选中的元素矩形是否可见 |
| spacing | 元素之间的间隔 |
核心方法
| 方法 | 说明 |
| addItem(const QString &label) addItem(QListWidgetItem *item) | 在列表末尾添加元素 |
| currentItem() | 获取当前选中的条目,返回值是QListWidgetItem* |
| setCurrentItem(QListWidgetItem *item) | 设置选中哪个元素 |
| setCurrentRow(int row) | 设置选中第几行的条目 |
| insertItem(const QString& label, int row) insertItem(QListWidgetItem *item, int row) | 指定行插入元素,插入的元素顶替原先的位置 例如row = 0,那么新插入的元素下标将会为0 |
| item(int row) | 获取第row行的条目,返回值为QListWidgetItem * |
| takeItem(int row) | 删除指定行的条目,返回值为QListWidgetItem *,被删除的条目 |
核心信号
| 信号 | 说明 |
| currentItemChanged(QListWidgetItem *current, QListWidgetItem *old) | 选中不同元素时会触发,参数是当前选中的元素和之前的元素 注意:在QListWidget最开始展示时就会触发该信号,但此时没有old,所以编写相应的槽函数需要对指针判空 |
| currentRowChanged(int) | 选中不同元素时触发,参数是当前选中的行数 |
| itemClicked(QListWidgetItem *item) | 点击某个元素时触发 |
| itemDoubleClicked(QListWidgetItem *item) | 双击某个元素时触发 |
| itemActivated(QListWidgetItem *item) | 某个元素被激活,点击和双击都会触发该信号 |
| itemEntered(QListWidgetItem *item) | 鼠标进入元素时触发 |
| itemChanged(QListWidgetItem *item) | 条目的内容被改变时触发 |
QListWidgetItem
XXItem是用于显示界面中单个条目的类,包含了条目的数据和显示设置,比如文本、图标等
这些Item本身并不是Model,更类似于View或是对Model数据的一种显示
核心方法
| 方法 | 说明 |
| setFont | 设置字体 |
| setIcon | 设置图标 |
| setHidden | 设置隐藏 |
| setSizeHint | 设置尺寸 |
| setSelected | 设置是否选中 |
| setText | 设置文本 |
| setTextAlignment | 设置文本对齐方式 |
代码示例:使用QListWidget展示语言,QLineEdit输入新增语言,一个新增按钮和删除按钮
1. 使用Qt Designer添加所需控件

2. 编写widget.cpp,在构造函数中添加初始元素
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//初始化添加几个元素ui->listWidget->addItem("C++");ui->listWidget->addItem("Java");ui->listWidget->addItem("Python");//设置提示词ui->lineEdit->setPlaceholderText("请输入要添加的元素");
}
3. 编写按钮的槽函数
//增加条目
void Widget::on_pushButton_add_clicked()
{//获取输入框的文本const QString &text = ui->lineEdit->text();if(text == nullptr) return;//获取当前选中的下标int row = ui->listWidget->currentRow();//将新条目插入到选中条目之后,若没选中,index = 0,为头插ui->listWidget->insertItem(row, text);
}
//删除条目
void Widget::on_pushButton_delete_clicked()
{//另一种获取选中元素的方法auto *item = ui->listWidget->currentItem();if(item == nullptr) return;int row = ui->listWidget->row(item);ui->listWidget->takeItem(row);
}
QTableWidget
QTableWidget类用于显示二维表格数据

核心方法
| 方法 | 说明 |
| item(int row, int column) | 通过指定行列获取元素,返回值为QTableWidgetItem * |
| setItem(int row, int column, QTableWidget *item) | 通过指定行列,设置表格中的元素 |
| currentItem() | 返回被选中的元素,返回值为QTableWidgetItem * |
| currentRow() | 返回被选中元素的行号,从0开始 |
| currentColumn() | 返回被选中元素的列号,从0开始 |
| row(QTableWidgetItem *item) | 获取指定 item 的行号 |
| column(QTableWidgetItem *item) | 获取指定 item 的列号 |
| rowCount() | 获取当前列表有几行 |
| columnCount() | 获取当前列表有几列 |
| insertRow(int row) | 在第 row 行插入新行 若 insertRow(0),则新插入的行为第0行 |
| insertColumn(int column) | 在第 column 列插入新列 |
| removeRow(int row) | 删除第 row 行 |
| removeColumn(int column) | 删除第 column 列 |
| setHorizontalHeaderItem(int column, QTableWidgetItem *item) | 设置指定列的表头,即列属性 |
| setVerticalHeader(int row, QTableWidgetItem *item) | 设置指定行的表头,即行属性 |
| setHorizontalHeaderLabels(QStringList &labels) | 通过QStringList快速设置列属性 |
| setVerticalHeaderLabels(QStringList &labels) | 通过QStringList快速设置行属性 |
核心信号
| 信号 | 说明 |
| cellClicked(int row, int column) | 点击单元格时触发,参数是行号和列号 |
| cellDoubleClicked(int row, int column) | 双击单元格时触发,参数是行号和列号 |
| cellEntered(int row, int column) | 鼠标进入单元格时触发,参数是行号和列号 |
| currentCellChanged(int row, int column, int previousRow, int previousColumn) | 选中的单元格切换时触发,前两个参数是现在选中单元格的行列号,后两个参数是先前选中的单元格的行列号 |
QTableWidgetItem
QTableWidgetItem是二维单元格中表示和管理单元格数据的类,允许开发者在表格中操作和显示文本、图标和其他数据
核心方法
方法大致与QListWidgetItem相同,多了行列相关的方法
| 方法 | 说明 |
| row() | 获取该元素的行号 |
| column() | 获取该元素的列号 |
| setText(const QString &) | 设置文本 |
| setTextAlignment(int) | 设置文本对齐方式 |
| setIcon(const QIcon &) | 设置图标 |
| setSelected(bool) | 设置被选中 |
| setSizeHints(cinst QSize &) | 设置尺寸 |
| setFont(const QFont &) | 设置字体 |
代码示例:简易学生成绩表
1. 使用Qt Designer添加所需控件

2. 编写widget.cpp,在构造函数中初始化相关元素
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//设置提示词ui->lineEdit->setPlaceholderText("请输入新增列名");//插入4行3列for(int i = 0; i < 4; ++i)//4行ui->tableWidget->insertRow(i);for(int i = 0; i < 3; ++i)//3列ui->tableWidget->insertColumn(i);//设置列名QStringList colName = {"学号", "姓名", "成绩"};ui->tableWidget->setHorizontalHeaderLabels(colName);//初始数据ui->tableWidget->setItem(0, 0, new QTableWidgetItem("1001"));ui->tableWidget->setItem(0, 1, new QTableWidgetItem("张三"));ui->tableWidget->setItem(0, 2, new QTableWidgetItem("83"));ui->tableWidget->setItem(1, 0, new QTableWidgetItem("1002"));ui->tableWidget->setItem(1, 1, new QTableWidgetItem("小明"));ui->tableWidget->setItem(1, 2, new QTableWidgetItem("95"));ui->tableWidget->setItem(2, 0, new QTableWidgetItem("1003"));ui->tableWidget->setItem(2, 1, new QTableWidgetItem("小华"));ui->tableWidget->setItem(2, 2, new QTableWidgetItem("79"));
}
3. 编写按钮的槽函数
//新增一行
void Widget::on_pushButton_clicked()
{//尾插int row = ui->tableWidget->rowCount();ui->tableWidget->insertRow(row);
}
//新增一列,同时设置列名
void Widget::on_pushButton_2_clicked()
{const QString &text = ui->lineEdit->text();if(text == nullptr) return;//尾插一列并设置列名int col = ui->tableWidget->columnCount();ui->tableWidget->insertColumn(col);ui->tableWidget->setHorizontalHeaderItem(col, new QTableWidgetItem(text));
}
//删除一行
void Widget::on_pushButton_3_clicked()
{int row = ui->tableWidget->currentRow();ui->tableWidget->removeRow(row);
}
//删除一列
void Widget::on_pushButton_4_clicked()
{int col = ui->tableWidget->currentColumn();ui->tableWidget->removeColumn(col);
}
程序效果如下:

默认情况下,单元格的内容可以直接编辑。如果不想让用户编辑,可以设置
ui->tableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers);
QTreeWidget
QTreeWidget类用于显示树形结构,集成了数据模型和视图的功能

QTreeWidget不同于往常的多叉树,Qt隐藏了该多叉树的根节点,我们只能访问从根节点以下的节点。
根节点以下第一层是 topLevelItem ,通过QTreeWidget添加;再往下的节点t通过 QTreeWidgetItem 的child指针连接
核心方法
| 方法 | 说明 |
| clear() | 清空所有子节点 |
| addTopLevelItem(QTreeWidgetItem *item) | 新增顶层节点 |
| topLevelItem(int index) | 获取指定下标的顶层节点,返回值是 QTreeWidgetItem * |
| topLevelItemCount() | 获取顶层节点的个数 |
| indexOfTopLevelItem(QTreeWidgetItem *item) | 查询指定节点在顶层节点中的下标 |
| takeTopLevelItem(int index) | 通过下标删除顶层节点,返回值是 QTreeWidgetItem * 表示被删除的节点 |
| currentItem() | 获取当前选中的节点,返回值是 QTreeWidgetItem * |
| setCurrentItem(QTreeWidgetItem *item) | 设置选中的节点 |
| setExpanded(bool) | 展开/关闭节点 true为展开,false为关闭 |
| setHeaderLabel(const QString &text) | 设置QTreeWidget的header名称,如上述样例的"动物" |
核心信号
| 信号 | 说明 |
| currentItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *old) | 切换选中元素时触发 |
| itemClicked(QTreeWidgetItem *item, int col) | 点击元素时触发 |
| itemDoubleClicked(QTreeWidgetItem *item, int col) | 双击元素时触发 |
| itemEntered(QTreeWidgetItem *item, int col) | 鼠标进入时触发 |
| itemExpanded(QTreeWidgetItem *item) | 元素被展开时触发 |
| itemCollapsend(QTreeWidgetItem *item) | 元素被折叠时触发 |
QTreeWidgetItem
QTreeWidgetItem类用于表示树状结构中的每个节点,可显示文本和图标等元素
在QTreeWidget中顶层元素和子元素其实都是QTreeWidgetItem,只是调用的接口不同,顶层元素通过QTreeWidget添加、删除、管理,子元素由顶层元素管理。
核心属性
| 属性 | 说明 |
| text | 持有的文本 |
| textAlignment | 文本对齐方式 |
| icon | 持有的图标 |
| font | 文本字体 |
| hidden | 是否隐藏 |
| disabled | 是否禁用 |
| expand | 是否展开 |
| sizeHint | 尺寸大小 |
| selected | 是否选中 |
| parent | 父亲节点 |
核心方法
| 方法 | 说明 |
| addChild(QTreeWidgetItem *child) | 新增子节点 |
| childCount() | 子节点的个数 |
| child(int index) | 获取指定下标的子节点,返回值是QTreeWidgetItem * |
| takeChild(int index) | 通过下标删除对应子节点 |
| removeChild(QTreeWidgetItem *child) | 通过指针删除对应子节点 |
| parent() | 获取父节点,返回值是QTreeWidgetItem * |
代码示例:使用QTreeWidget 展示动物种类
1. 通过Qt Designer添加所需控件

2. 编写widget.cpp,通过构造函数初始化相关控件
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);ui->lineEdit->setPlaceholderText("请输入要添加的元素");//设置根节点名称ui->treeWidget->setHeaderLabel("动物");//添加顶层元素QTreeWidgetItem *item_cat = new QTreeWidgetItem(ui->treeWidget);item_cat->setText(0, "猫");ui->treeWidget->addTopLevelItem(item_cat);QTreeWidgetItem *item_dog = new QTreeWidgetItem(ui->treeWidget);item_dog->setText(0, "狗");ui->treeWidget->addTopLevelItem(item_dog);QTreeWidgetItem *item_bird = new QTreeWidgetItem(ui->treeWidget);item_bird->setText(0, "鸟");ui->treeWidget->addTopLevelItem(item_bird);
}
3. 编写按钮的槽函数
//添加顶层节点
void Widget::on_pushButton_clicked()
{const QString &text = ui->lineEdit->text();if(text.isEmpty()) return;//构造新节点并链入QTreeWidgetQTreeWidgetItem *newColumn = new QTreeWidgetItem(ui->treeWidget);newColumn->setText(0, text);ui->treeWidget->addTopLevelItem(newColumn);
}
//添加非顶层节点
void Widget::on_pushButton_2_clicked()
{const QString &text = ui->lineEdit->text();if(text.isEmpty()) return;//获取父亲节点QTreeWidgetItem *parent = ui->treeWidget->currentItem();if(parent == nullptr) return;//构造新节点并链入parentQTreeWidgetItem *newColumn = new QTreeWidgetItem(parent);newColumn->setText(0, text);parent->addChild(newColumn);//添加完后直接展开parent->setExpanded(true);
}
//删除子项
void Widget::on_pushButton_3_clicked()
{QTreeWidgetItem *curItem = ui->treeWidget->currentItem();QTreeWidgetItem *parent = curItem->parent();if(parent == nullptr){//顶层元素int index = ui->treeWidget->indexOfTopLevelItem(curItem);ui->treeWidget->takeTopLevelItem(index);}elseparent->removeChild(curItem);//非顶层元素
}
结束语
感谢你的阅读,如果觉得本篇文章对你有所帮助的话,不妨点个赞支持一下博主,拜托啦,这对我真的很重要

相关文章:
【Qt】Item Widgets 多元素控件
Qt中提供的多元素控件有: QListWidgetQListViewQTableWidgetQTableViewQTreeWidgetQTreeView 上述控件分为Widget和View,其区别如下: 以QTableWidget和QTableView为例 QTableView是基于MVC(Model-View-Controller)设计的控件。QTableView自身…...
sharded_inference_engine:MLXDynamicShardInferenceEngine;step
目录 sharded_inference_engine:MLXDynamicShardInferenceEngine 类属性 方法 __init__(self) async def infer_prompt(self, shard: Shard, prompt: str, inference_state: Optional[str] = None) -> (np.ndarray, str, bool) async def infer_tensor(self, shard: …...
JAVA开发学习-day21
JAVA开发学习-day21 1. 删除表单数据 根据ElementUI的官方组件指南,为表单每列的数据添加删除按钮 <el-table :data"tableData" style"width: 100%"><el-table-column prop"id" label"ID" width"180"…...
Python的安装环境以及应用
1.环境python2,Python 最新安装3.12可以使用源码安装 查看安装包 [rootpython001 ~]# yum list installed | grep epel 3[rootpython001 ~]# yum list installed | grep python [rootpython001 ~]# yum -y install python3 安装python3 查看版本 [root…...
TabLayout使用以及自定义tab标签
<?xml version"1.0" encoding"utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android"http://schemas.android.com/apk/res/android"xmlns:app"http://schemas.android.com/apk/res-auto"xmlns:tool…...
第二十节、有限状态机和抽象类多态
一、抽象类 挂载到动画器上的就是继承抽象类代码 1、使用onenable周期函数启用 2、在每一个周期函数中对抽象类进行调用 3、隐藏公开的变量...
SQL注入实例(sqli-labs/less-23)
0、初始网页 1、闭合方式判断 闭合符号为单引号,通过测试发现过滤了注释,所以直接闭合 2、确定查询表的列数 确定查询表的列数为3列 ?id1 order by 3 3、确定回显位置 回显位置为第二列和第三列 ?id-1 union select 1,2,3 4、查看当前登录和数据…...
3.Redis数据类型(二)
LIST List 是一个简单的双向链表,支持从两端进行插入和删除操作。 常用命令: lpush/rpush/lrange lpush 插入一个或多个元素到列表的左端。 rpush 插入一个或多个元素到列表的右端。 lrange key start stop 获取元素(前闭后闭࿰…...
JavaWeb系列十一: Web 开发会话技术Session
Web 开发会话技术Session Session有什么用session基本原理session原理示意图session可以做什么如何理解Session Session常用方法Session底层实现机制原理分析图应用实例session实现原理动画 Session生命周期Session生命周期说明Session生命周期实例 作业布置 Session有什么用 …...
k8s中yaml文件的编写
目录 1.编写pod.yaml 2.编写deploment.yaml 3.编写service.yaml关联创建的pod 4.总结获取K8S资源配置清单文件模板方法 5.补充 1.编写pod.yaml vim demo1-pod.yaml apiVersion: v1 kind: Pod metadata:name: scj-podnamespace: xy101labels:app: nginxmylove: tangjunmyc…...
打卡第37天------动态规划
加油!不要放弃,那些冲进清北复交的高材生的水平真不是盖的,名不虚传,有实力的全能选手。我在刷题的过程中不得不表达一下对他们的钦佩。 这里在遍历顺序上可就有说法了。 如果求组合数就是外层for循环遍历物品,内层for遍历背包。如果求排列数就是外层for遍历背包,内层for…...
openfeign本地试用
目的:在本地搭建一个简单的openfeign使用场景,测试查询、新增等功能 平台:win10 技术栈:Springboot, SpringCloud, Nacos, Mybatis, MySql, Logback 框架作用说明: Nacos用于服务注册,将provider应用注…...
数据库|SQLServer数据库:查询函数(SUM、COUNT、MAX、MIN、AVG)的使用
哈喽,你好啊,我是雷工! 日拱一卒,进一寸有进一寸的欢喜,本节学习数据库查询函数的使用。 以下为学习笔记。 01 求和 SUM:对某一字段列进行求和运算; 示例: 对账号表Account的文章…...
简单Qt贪吃蛇项目
目录 先看效果 项目介绍 界面一:游戏大厅界面 界面二:关卡选择界面编辑 界面三:游戏界面 游戏大厅页面 游戏关卡选择页面 游戏房间页面 封装贪吃蛇数据结构 初始化游戏房间界面 设置窗口大小、标题、图标等 蛇的移动 初始化贪…...
画菱形(曼哈顿距离)
输入一个奇数 nn,输出一个由 * 构成的 nn 阶实心菱形。 输入格式 一个奇数 nn。 输出格式 输出一个由 * 构成的 nn 阶实心菱形。 具体格式参照输出样例。 数据范围 1≤n≤991≤n≤99 输入样例: 5输出样例: * *** ******** * #i…...
CSP初赛知识点讲解(六)
CSP初赛知识点讲解(六) 运算表达式中缀变后缀表达式求值前缀表达式 例题训练(八) 运算表达式 运算表达式有三种,前缀表达式,中缀表达式,后缀表达式,我们常用的是中缀表达式…...
linux rocky 9.2系统安装mysql-wsrep-8.4.2-26.20-linux-x86_64.tar.gz二进制包
1.环境准备, ①装好Rocky linux9.2系统,设置好IP nmcli con mod ens160 ipv4.addresses 192.168.0.106/24 nmcli con mod ens160 ipv4.gateway 192.168.0.2 nmcli con mod ens160 ipv4.dns 114.114.114.114 nmcli con up ens160 nmcli con mod ens…...
QT实现上传服务器功能
代码如下所示: void UploadZipFileToServer(const QString& strPath) {m_pFile new QFile(strPath);// 创建HTTP多部份请求QHttpMultiPart *multiPart new QHttpMultiPart(QHttpMultiPart::FormDataType);QHttpPart keyPart;keyPart.setHeader(QNetworkReques…...
元岳食堂采购供应链系统-智慧食堂数据化解决方案
随着社会的发展和科技的进步,在数字化浪潮的推动下,智慧食堂供应链系统逐渐成为食堂管理的重要工具。在此背景下,元岳食堂采购供应链系统应运而生,该系统通过其独特的数字化和自动化功能,能够对食堂的采购、储存、配送…...
基于Java+SpringBoot+Vue的影城管理系统
基于JavaSpringBootVue的影城管理系统 前言 ✌全网粉丝20W,csdn特邀作者、博客专家、CSDN[新星计划]导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取项目下载方式🍅 哈喽…...
CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型
CVPR 2025 | MIMO:支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题:MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者:Yanyuan Chen, Dexuan Xu, Yu Hu…...
多场景 OkHttpClient 管理器 - Android 网络通信解决方案
下面是一个完整的 Android 实现,展示如何创建和管理多个 OkHttpClient 实例,分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...
自然语言处理——Transformer
自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效,它能挖掘数据中的时序信息以及语义信息,但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN,但是…...
【JavaWeb】Docker项目部署
引言 之前学习了Linux操作系统的常见命令,在Linux上安装软件,以及如何在Linux上部署一个单体项目,大多数同学都会有相同的感受,那就是麻烦。 核心体现在三点: 命令太多了,记不住 软件安装包名字复杂&…...
学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”
2025年#高考 将在近日拉开帷幕,#AI 监考一度冲上热搜。当AI深度融入高考,#时间同步 不再是辅助功能,而是决定AI监考系统成败的“生命线”。 AI亮相2025高考,40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕,江西、…...
Springboot社区养老保险系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,社区养老保险系统小程序被用户普遍使用,为方…...
Linux nano命令的基本使用
参考资料 GNU nanoを使いこなすnano基础 目录 一. 简介二. 文件打开2.1 普通方式打开文件2.2 只读方式打开文件 三. 文件查看3.1 打开文件时,显示行号3.2 翻页查看 四. 文件编辑4.1 Ctrl K 复制 和 Ctrl U 粘贴4.2 Alt/Esc U 撤回 五. 文件保存与退出5.1 Ctrl …...
海云安高敏捷信创白盒SCAP入选《中国网络安全细分领域产品名录》
近日,嘶吼安全产业研究院发布《中国网络安全细分领域产品名录》,海云安高敏捷信创白盒(SCAP)成功入选软件供应链安全领域产品名录。 在数字化转型加速的今天,网络安全已成为企业生存与发展的核心基石,为了解…...
轻量级Docker管理工具Docker Switchboard
简介 什么是 Docker Switchboard ? Docker Switchboard 是一个轻量级的 Web 应用程序,用于管理 Docker 容器。它提供了一个干净、用户友好的界面来启动、停止和监控主机上运行的容器,使其成为本地开发、家庭实验室或小型服务器设置的理想选择…...
Java中HashMap底层原理深度解析:从数据结构到红黑树优化
一、HashMap概述与核心特性 HashMap作为Java集合框架中最常用的数据结构之一,是基于哈希表的Map接口非同步实现。它允许使用null键和null值(但只能有一个null键),并且不保证映射顺序的恒久不变。与Hashtable相比,Hash…...
