DOM【JavaScript】

在JavaScript中,DOM (Document Object Model:文档对象模型) 是web页面的编程接口,用于表示和操作 HTML 和 XML 文档。它将文档结构化为一个树形结构,允许开发者通过 JavaScript 访问和修改网页的内容、结构和样式。以下是一些关于DOM的关键概念:

1. 结构

DOM树结构是以节点为单位组织的。常见的节点类型包括:

文档节点(Document)整个HTML或XML文档。
元素节点(Element)HTML标签,如<div><p>等。
文本节点(Text)元素中的文本内容。
属性节点(Attribute)元素的属性,如classid

1.1 节点对象的重要属性

在 DOM 中,节点对象有几个重要的属性,以下是三个常用且重要的属性:

1.1.1 nodeName
const element = document.getElementById('myElement');
console.log(element.nodeName); // 输出:DIV
  • 描述节点的名称。
  • 对于元素节点,返回标签名称(例如,"DIV"、"P");对于文本节点,返回 "#text"。
1.1.2 nodeType
const element = document.getElementById('myElement');
console.log(element.nodeType); // 输出:1(如果是元素节点)
  • 返回节点的类型,值为数字。
  • 常用的节点类型:
    • 1:元素节点
    • 2:属性节点
    • 3:文本节点
    • 8:注释节点
    • 9:文档节点
1.1.3 parentNode
const element = document.getElementById('myElement');
console.log(element.parentNode); // 输出:父节点对象
  • 返回节点的父节点。如果节点没有父节点,则返回 null
  • 该属性常用于导航 DOM 结构。
示例代码
<div id="myElement">Hello LuQian</div><script>const element = document.getElementById('myElement');console.log('节点名称:', element.nodeName); // 输出节点名称console.log('节点类型:', element.nodeType); // 输出节点类型console.log('父节点:', element.parentNode); // 输出父节点
</script>

1.2 节点对象的其他常用属性

1.2.1 childNodes
  • 返回一个 NodeList,包含指定节点的所有子节点(包括元素节点、文本节点等)。
  • 通过索引可以访问特定的子节点。
const element = document.getElementById('myElement');
const children = element.childNodes;
console.log(children); // 输出所有子节点

1.2.2 firstChild / lastChild
  • firstChild 返回节点的第一个子节点,lastChild 返回最后一个子节点。如果没有子节点,则返回 null
const element = document.getElementById('myElement');
console.log(element.firstChild); // 输出第一个子节点
console.log(element.lastChild);  // 输出最后一个子节点

1.2.3 nextSibling / previousSibling
  • nextSibling 返回当前节点的下一个兄弟节点,previousSibling 返回上一个兄弟节点。如果没有相应的兄弟节点,则返回 null
const element = document.getElementById('myElement');
console.log(element.nextSibling); // 输出下一个兄弟节点
console.log(element.previousSibling); // 输出上一个兄弟节点

1.2.4 textContent
  • 获取或设置节点的文本内容。对于元素节点,它会返回该节点及其所有子节点的文本内容。
const element = document.getElementById('myElement');
console.log(element.textContent); // 输出节点的文本内容
element.textContent = '新的文本内容'; // 设置新的文本内容

1.2.5 innerHTML
  • 获取或设置节点的 HTML 内容。对于元素节点,它会返回该节点内部的 HTML 代码。
const element = document.getElementById('myElement');
console.log(element.innerHTML); // 输出节点的 HTML 内容
element.innerHTML = '<span>新的 HTML 内容</span>'; // 设置新的 HTML 内容

1.2.6 attributes
  • 返回一个 NamedNodeMap,包含元素的所有属性,可以通过属性名称或索引访问。
const element = document.getElementById('myElement');
const attrs = element.attributes;
console.log(attrs); // 输出所有属性
console.log(attrs[0].name); // 输出第一个属性的名称

示例代码
<div id="myElement"><p>这是一个段落。</p><span>这是一个 span。</span>
</div><script>const element = document.getElementById('myElement');// childNodesconsole.log('所有子节点:', element.childNodes);// firstChild 和 lastChildconsole.log('第一个子节点:', element.firstChild);console.log('最后一个子节点:', element.lastChild);// nextSibling 和 previousSiblingconsole.log('下一个兄弟节点:', element.nextSibling);console.log('上一个兄弟节点:', element.previousSibling);// textContentconsole.log('文本内容:', element.textContent);// innerHTMLconsole.log('HTML 内容:', element.innerHTML);// attributesconsole.log('所有属性:', element.attributes);
</script>

1.3 动态操作节点的方法

动态操作节点的方法有很多,以下是一些常用的 DOM 操作方法,帮助你在网页中添加、删除和修改节点。

1.3.1 创建节点
  • document.createElement(tagName):创建一个指定标签名的元素节点。
const newDiv = document.createElement('div');
newDiv.textContent = '这是一个新创建的 div';

1.3.2 添加节点
  • parentNode.appendChild(childNode):将一个节点添加到指定父节点的子节点列表的末尾。
const container = document.getElementById('container');
container.appendChild(newDiv);

  • parentNode.insertBefore(newNode, referenceNode):在指定的参考节点之前插入一个新节点。
const referenceNode = container.firstChild;
container.insertBefore(newDiv, referenceNode);

1.3.3 删除节点

parentNode.removeChild(childNode):从父节点中删除指定的子节点。

container.removeChild(newDiv); // 删除刚才添加的新 div

1.3.4 替换节点
  • parentNode.replaceChild(newNode, oldNode):用新节点替换指定的旧节点。
const replacementDiv = document.createElement('div');
replacementDiv.textContent = '这是替换后的 div';
container.replaceChild(replacementDiv, newDiv);

1.3.5 克隆节点
  • node.cloneNode(deep):克隆一个节点,可以选择是否克隆其子节点。
const clonedDiv = newDiv.cloneNode(true); // deep 为 true 时克隆子节点
container.appendChild(clonedDiv);

1.3.6 修改节点属性
  • element.setAttribute(name, value):设置指定元素的属性值。
newDiv.setAttribute('class', 'my-class');

  • element.removeAttribute(name):移除指定元素的属性。
newDiv.removeAttribute('class');

示例代码
<div id="container"></div><script>// 创建一个新的 divconst newDiv = document.createElement('div');newDiv.textContent = '这是一个新创建的 div';// 将新 div 添加到容器中const container = document.getElementById('container');container.appendChild(newDiv);// 替换新 divconst replacementDiv = document.createElement('div');replacementDiv.textContent = '这是替换后的 div';container.replaceChild(replacementDiv, newDiv);// 克隆替换后的 divconst clonedDiv = replacementDiv.cloneNode(true);container.appendChild(clonedDiv);// 修改克隆 div 的属性clonedDiv.setAttribute('class', 'my-class');
</script>

2. 常用操作

通过JavaScript,开发者可以进行各种DOM操作:

  • 选择元素:使用document.getElementById()document.querySelector()等方法选择元素。
  • 创建元素:使用document.createElement()方法创建新元素。
  • 添加/删除元素:使用appendChild()removeChild()等方法进行元素的添加和删除。
  • 修改属性和内容:可以通过setAttribute()innerHTML等修改元素的属性和内容。
  • 事件处理:使用addEventListener()方法为元素添加事件监听器。

2.1 选择元素

获取元素节点对象的方式有几种常用的方法,主要使用 JavaScript 提供的 DOM API。以下是一些常见的方法:

2.1.1 getElementById

根据元素的 ID 获取元素节点。

<div id="myElement">Hello LuQian</div>
<script>const element = document.getElementById('myElement');console.log(element); // 输出:<div id="myElement">Hello LuQian</div>
</script>

 

2.1.2 getElementsByClassName

根据元素的类名获取元素节点集合。

<div class="myClass">Item 1</div>
<div class="myClass">Item 2</div>
<script>const elements = document.getElementsByClassName('myClass');console.log(elements); // 输出:HTMLCollection(2) [div.myClass, div.myClass]
</script>

 

2.1.3 getElementsByTagName

根据元素的标签名获取元素节点集合。

<p>Paragraph 1</p>
<p>Paragraph 2</p>
<script>const elements = document.getElementsByTagName('p');console.log(elements); // 输出:HTMLCollection(2) [p, p]
</script>

 

2.1.4 querySelector

使用 CSS 选择器获取第一个匹配的元素节点。

<div class="myClass">Hello LuQian</div>
<script>const element = document.querySelector('.myClass');console.log(element); // 输出:<div class="myClass">Hello LuQian</div>
</script>

 

2.1.5 querySelectorAll

使用 CSS 选择器获取所有匹配的元素节点集合。

<div class="myClass">Item 1</div>
<div class="myClass">Item 2</div>
<script>const elements = document.querySelectorAll('.myClass');console.log(elements); // 输出:NodeList(2) [div.myClass, div.myClass]
</script>

 

2.2 创建元素

使用 document.createElement() 方法创建新元素。

// 创建一个新元素
const newDiv = document.createElement('div');
newDiv.textContent = '这是一个新创建的元素'; // 设置新元素的文本内容

 

2.3 添加/删除元素

使用 appendChild() 和 removeChild() 方法进行元素的添加和删除。

2.3.1 appendChild()

appendChild() 方法用于将一个节点添加到指定父节点的子节点列表的末尾。语法如下:

parentNode.appendChild(newChild);
示例:
<div id="container"></div><script>const container = document.getElementById('container');const newElement = document.createElement('p');newElement.textContent = '这是一个新添加的段落。';container.appendChild(newElement);
</script>

2.3.2 removeChild()

removeChild() 方法用于从父节点中删除指定的子节点。语法如下:

parentNode.removeChild(childNode);
示例:
<div id="container"><p id="toRemove">这个段落将被删除。</p>
</div><script>const container = document.getElementById('container');const elementToRemove = document.getElementById('toRemove');container.removeChild(elementToRemove);
</script>

 

综合示例:

下面是一个综合示例,展示了如何添加和删除元素:

<!DOCTYPE html>
<html lang="zh"><head><meta charset="UTF-8"><title>DOM 示例</title></head><body><div id="container"></div><button id="addButton">添加段落</button><button id="removeButton">删除段落</button><script>const container = document.getElementById('container');const addButton = document.getElementById('addButton');const removeButton = document.getElementById('removeButton');addButton.addEventListener('click', () => {const newElement = document.createElement('p');newElement.textContent = '这是一个新添加的段落。';container.appendChild(newElement);});removeButton.addEventListener('click', () => {const lastChild = container.lastChild;if (lastChild) {container.removeChild(lastChild);}});</script></body>
</html>

在这个示例中,点击“添加段落”按钮会在容器中添加一个新的段落,而点击“删除段落”按钮会删除最后添加的段落。

2.4 修改属性和内容

使用 setAttribute() 和 innerHTML 修改元素的属性和内容。

2.4.1 setAttribute() 

setAttribute()方法用于设置元素的属性值。语法如下:

element.setAttribute(name, value);

这里,name 是你要设置的属性的名称,value 是该属性的值。

示例:
<div id="myElement"></div><script>const element = document.getElementById('myElement');// 为元素添加 "href" 属性,值为 "https://www.example.com"element.setAttribute('href', 'https://www.example.com');// 为元素添加 "class" 属性,值为 "myClass"element.setAttribute('class', 'myClass');
</script>

 

2.4.2 innerHTML

innerHTML 属性用于设置元素内部的内容(HTML 标记)。语法如下:

element.innerHTML = html;

这里,html 是你想要设置的内容的 HTML 字符串。

示例:
<div id="contentDiv"></div><script>const contentDiv = document.getElementById('contentDiv');// 设置 div 内容为一个简单的字符串contentDiv.innerHTML = '这是新的内容。';// 设置 div 内容为一个复杂的 HTML 字符串contentDiv.innerHTML = '<div><p>这是嵌套的内容。</p></div>';
</script>

注意:innerHTML 属性会将你指定的 HTML 字符串完全替换掉原来的内容,意味着如果你有多个子元素,使用 innerHTML 将会把整个内容替换成一个新的大段 HTML 代码。如果你的内容仅限于文本,那么使用 textContent 或 innerText 属性可能是更好的选择。

2.5 事件处理

使用addEventListener() 方法用于为指定的元素添加事件监听器。这允许你对特定事件(如点击、鼠标移动、键盘输入等)做出反应。语法如下:

element.addEventListener(event, function, useCapture);
  • event:要监听的事件类型(如 'click''mouseover' 等)。
  • function:当事件发生时调用的函数(事件处理程序)。
  • useCapture(可选):布尔值,指示是否在捕获阶段执行事件处理程序,默认为 false
2.5.1 为按钮添加点击事件监听器

下面是一个简单的示例,展示如何为按钮添加点击事件监听器:

<button id="myButton">点击我</button><script>const button = document.getElementById('myButton');// 添加点击事件监听器button.addEventListener('click', () => {alert('按钮被点击了!');});
</script>

 

2.5.2 监听多个事件

你也可以为同一个元素添加多个事件监听器:

<button id="myButton">点击我</button><script>const button = document.getElementById('myButton');// 点击事件button.addEventListener('click', () => {alert('按钮被点击了!');});// 鼠标悬停事件button.addEventListener('mouseover', () => {button.style.backgroundColor = 'lightblue';});// 鼠标离开事件button.addEventListener('mouseout', () => {button.style.backgroundColor = '';});
</script>

在这个示例中,当鼠标悬停在按钮上时,按钮的背景颜色会改变,离开时颜色会恢复,点击按钮时会弹出提示框。

2.5.3 移除事件监听器

如果你需要在某个时刻移除事件监听器,可以使用 removeEventListener() 方法。记得使用相同的函数引用来移除监听器。

function handleClick() {alert('按钮被点击了!');
}// 添加事件监听器
button.addEventListener('click', handleClick);// 移除事件监听器
button.removeEventListener('click', handleClick);

2.5.4 鼠标移入和移出事件

当鼠标移入或移出某个元素时触发的事件。

<!DOCTYPE html>
<html lang="zh">
<head><meta charset="UTF-8"><title>鼠标事件示例</title><style>#hoverDiv {width: 200px;height: 100px;background-color: lightblue;text-align: center;line-height: 100px;}</style>
</head>
<body><div id="hoverDiv">将鼠标移入我</div><p id="hoverMessage"></p><script>const hoverDiv = document.getElementById('hoverDiv');const hoverMessage = document.getElementById('hoverMessage');hoverDiv.addEventListener('mouseenter', () => {hoverMessage.textContent = '鼠标已移入!';});hoverDiv.addEventListener('mouseleave', () => {hoverMessage.textContent = '鼠标已移出!';});</script>
</body>
</html>

2.5.5 键盘事件

当用户在键盘上按下或松开某个键时触发的事件。

<!DOCTYPE html>
<html lang="zh">
<head><meta charset="UTF-8"><title>键盘事件示例</title>
</head>
<body><input type="text" id="textInput" placeholder="输入内容" /><p id="keyMessage"></p><script>const input = document.getElementById('textInput');const keyMessage = document.getElementById('keyMessage');input.addEventListener('keyup', (event) => {keyMessage.textContent = `你输入了:${event.key}`;});</script>
</body>
</html>

2.5.6 表单事件

处理表单提交事件。

<!DOCTYPE html>
<html lang="zh">
<head><meta charset="UTF-8"><title>表单事件示例</title>
</head>
<body><form id="myForm"><input type="text" id="nameInput" placeholder="输入你的名字" required /><button type="submit">提交</button></form><p id="formMessage"></p><script>const form = document.getElementById('myForm');const formMessage = document.getElementById('formMessage');form.addEventListener('submit', (event) => {event.preventDefault(); // 防止表单默认提交const name = document.getElementById('nameInput').value;formMessage.textContent = `你好,${name}!`;});</script>
</body>
</html>

2.5.7 窗口加载事件

窗口加载事件通常用于在网页完全加载后执行特定的JavaScript代码。这个事件可以确保所有的HTML元素、样式表和图像都已经加载完毕。

常用的加载事件有 window.onload 和 DOMContentLoaded

如果你只关心DOM结构,并希望在DOM构建完成后立即执行代码,使用 DOMContentLoaded 更合适.
如果你需要确保所有资源都已加载(例如,图像),则使用 window.onload
2.5.7.1 window.onload

window.onload 事件在整个页面,包括所有依赖的资源(如图像、样式等)都加载完成后触发。

window.onload = function() {console.log('页面完全加载!');// 这里可以放置其他代码
};

2.5.7.2 DOMContentLoaded

DOMContentLoaded 事件在文档的初始 HTML 被完全加载和解析后触发,不需要等待样式表、图像等其他资源加载完成。这使得它通常更快,适用于需要在文档加载后立即执行的代码。

document.addEventListener('DOMContentLoaded', function() {console.log('DOM内容已加载!');// 这里可以放置其他代码
});

示例:

下面是一个完整的示例,展示如何使用这两个事件:

<!DOCTYPE html>
<html lang="zh">
<head><meta charset="UTF-8"><title>窗口加载事件示例</title>
</head>
<body><h1>欢迎来到我的网页</h1><script>// 使用 window.onloadwindow.onload = function() {console.log('整个页面(包括所有资源)已加载!');};// 使用 DOMContentLoadeddocument.addEventListener('DOMContentLoaded', function() {console.log('DOM内容已加载!');});</script>
</body>
</html>

2.6 动态操作样式

2.6.1 直接操作样式

通过 element.style 直接修改样式属性,适合需要精确控制单个样式的场景。

<!DOCTYPE html>
<html lang="zh"><head><meta charset="UTF-8"><title>直接操作样式</title><style>#myElement {width: 100px;height: 100px;background-color: lightblue;transition: all 0.5s ease;/* 添加过渡效果 */}</style></head><body><div id="myElement">直接修改样式</div><button id="changeStyleBtn">改变样式</button><script>const element = document.getElementById('myElement');const button = document.getElementById('changeStyleBtn');button.addEventListener('click', () => {// 直接修改样式属性element.style.backgroundColor = 'coral';element.style.width = '200px';element.style.height = '200px';});</script></body>
</html>

2.6.2 通过类名控制样式

通过添加或移除 CSS 类来改变样式,更加优雅且易于管理,尤其是在需要复用样式时。

<!DOCTYPE html>
<html lang="zh">
<head><meta charset="UTF-8"><title>DOM 类名控制样式示例</title><style>.highlight {background-color: yellow; /* 高亮背景 */color: red; /* 字体颜色为红色 */font-weight: bold; /* 加粗字体 */}</style>
</head>
<body><div id="myElement">Hello LuQian</div><button id="toggleButton">切换样式</button><script>const element = document.getElementById('myElement');const button = document.getElementById('toggleButton');// 为按钮添加点击事件button.addEventListener('click', () => {// 切换类名element.classList.toggle('highlight');});</script>
</body>
</html>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/147535.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

基于单片机的智能校园照明系统

由于校园用电量较大&#xff0c;本设计可以根据实际环境情况的改变&#xff0c;实现实时照明的控制。本设计以单片机芯片为控制芯片&#xff0c;热释电传感器采集教室中学生出入的信息&#xff0c;并把信息传递给单片机芯片&#xff0c;单片机芯片根据传感器传递过来的信息来控…

【软件测试】Bug 篇

哈喽&#xff0c;哈喽&#xff0c;大家好~ 我是你们的老朋友&#xff1a;保护小周ღ 今天给大家带来的是 【软件测试】Bug 篇&#xff0c;首先了解, 什么是Bug, 如何定义一个Bug, 如何描述一个 Bug, Bug的级别, 和 Bug 的生命周期, 以及测试人员跟开发人员产生争执如何处理,…

【MYSQL】聚合查询、分组查询、联合查询

目录 聚合查询聚合函数count()sum()avg()max()和min()总结 分组查询group by 子句having 子句 联合查询笛卡尔积内连接外连接自连接子查询单行子查询多行子查询from子句使用子查询 合并查询 聚合查询 聚合查询就是针对表中行与行之间的查询。 聚合函数 count() count(列名)&a…

个人随想-代码生成工具v0+claude+cursor

cursor出来已经有一段时间了&#xff0c;不知道大家用了感觉怎么样。今天就以我个人为例&#xff0c;给大家介绍一下我是如何使用cursor搭建原型。 首先&#xff0c;我并不觉得cursor对于后端程序员带来了革命性改进&#xff0c;我们与很多团队沟&#xff0c;使用cursor80%以上…

spring中的容器接口的实现类和功能

容器实现 BeanFactory 实现 这里我们就来一步步实现BeanFactory的功能。 首先创建我们需要的类 Configuration static class Config{Beanpublic Bean1 bean1(){return new Bean1();}Beanpublic Bean2 bean2(){return new Bean2();}}static class Bean1{private static fina…

【Linux】Shell 编程规范及检查工具推荐

本文内容均来自个人笔记并重新梳理&#xff0c;如有错误欢迎指正&#xff01; 如果对您有帮助&#xff0c;烦请点赞、关注、转发、订阅专栏&#xff01; 专栏订阅入口 | 精选文章 | Kubernetes | Docker | Linux | 羊毛资源 | 工具推荐 | 往期精彩文章 【Docker】&#xff08;全…

【RH124】解释Linux文件系统权限

RH124教材中控制对文件的访问一章中有一道解释Linux文件系统权限的测验题&#xff0c;可以一起来看看&#xff1a; 一、权限解释 这是通过 ls -l 命令查看的结果。它显示了文件或目录的权限、拥有者、所属组等信息。 1、长列表的第一个字符表示文件类型&#xff1a; -是常…

【C语言零基础入门篇 - 16】:栈和队列

文章目录 栈和队列栈栈功能的实现源代码 队列队列功能的实现源代码 栈和队列 栈 什么是栈&#xff1a;功能受限的线性数据结构 栈的特点&#xff1a;先进后出 。例如&#xff1a;仓库进货、出货。 栈只有一个开口&#xff0c;先进去的数据在栈底&#xff08;bottom&#xf…

STM32篇:STM32CubeMX的安装

一.介绍与安装 1.作用 通过界面的方式&#xff0c;快速生成工程文件。 2.下载 官网 https://www.st.com/zh/development-tools/stm32cubemx.html#overview 3.安装 一路下一步&#xff0c;建议不要安装在C盘 4.配置 更新固件包位置&#xff08;比较大&#xff0c;默认在…

LeetCode 257. 二叉树的所有路径(回溯详解)

文章目录 LeetCode 257. 二叉树的所有路径思路递归版本一:非常明确的回溯代码版本二&#xff1a;精简的回溯代码 LeetCode 257. 二叉树的所有路径 LeetCode 257. 二叉树的所有路径 给定一个二叉树&#xff0c;返回所有从根节点到叶子节点的路径。 说明: 叶子节点是指没有子节…

全网最适合入门的面向对象编程教程:51 Python函数方法与接口-使用Zope实现接口

全网最适合入门的面向对象编程教程&#xff1a;51 Python 函数方法与接口-使用 Zope 实现接口 摘要&#xff1a; 在 Python 中&#xff0c;Zope 提供了一种机制来定义和实现接口。Zope 的接口模块通常用于创建可重用的组件&#xff0c;并确保组件遵循特定的接口规范。 原文链…

力扣 209.长度最小的子数组

一、长度最小的子数组 二、解题思路 采用滑动窗口的思路&#xff0c;详细见代码。 三、代码 class Solution {public int minSubArrayLen(int target, int[] nums) {int n nums.length, left 0, right 0, sum 0;int ans n 1; for (right 0; right < n; right ) { …

【二等奖论文】2024年华为杯研赛D题成品论文(后续会更新)

您的点赞收藏是我继续更新的最大动力&#xff01; 一定要点击如下的卡片&#xff0c;那是获取资料的入口&#xff01; 点击链接获取【2024华为杯研赛资料汇总】&#xff1a; https://qm.qq.com/q/jTIeGzwkSchttps://qm.qq.com/q/jTIeGzwkSc 题 目&#xff1a; 大数据驱动的…

一劳永逸:用脚本实现夸克网盘内容自动更新

系统环境&#xff1a;debian/ubuntu 、 安装了python3 原作者项目&#xff1a;https://github.com/Cp0204/quark-auto-save 感谢 缘起 我喜欢看电影追剧&#xff0c;会经常转存一些资源到夸克网盘&#xff0c;电影还好&#xff0c;如果是电视剧&#xff0c;麻烦就来了。 对于一…

深度学习-卷积神经网络(CNN)

文章目录 一、网络构造1. 卷积层&#xff08;Convolutional Layer&#xff09;&#xff08;1&#xff09;卷积&#xff08;2&#xff09;特征图计算公式&#xff08;3&#xff09;三通道卷积 2. 激活函数&#xff08;Activation Function&#xff09;3. 池化层&#xff08;Pool…

【JUC并发编程系列】深入理解Java并发机制:线程局部变量的奥秘与最佳实践(五、ThreadLocal原理、对象之间的引用)

文章目录 【JUC并发编程系列】深入理解Java并发机制&#xff1a;线程局部变量的奥秘与最佳实践(五、ThreadLocal原理、对象之间的引用)1. 基本 API 介绍2. 简单用法3. 应用场景4. Threadlocal与Synchronized区别5. 内存溢出和内存泄漏5.2 内存溢出 (Memory Overflow)5.2 内存泄…

全栈项目小组【算法赛】题目及解题

题目&#xff1a;全栈项目小组【算法赛】 题目&#xff1a; 解题思路 1.遍历简历信息&#xff1a;我们需要读取所有简历&#xff0c;根据期望薪资和岗位类型进行分类和统计。 2.分类统计&#xff1a;使用哈希表来存储每个薪资下的前端&#xff08;F&#xff09;和后端&#…

【线程】线程的同步

本文重点&#xff1a;理解条件变量和生产者消费者模型 同步是在保证数据安全的情况下&#xff0c;让我们的线程访问资源具有一定的顺序性 条件变量cond 当一个线程互斥地访问某个变量时&#xff0c;它可能发现在其它线程改变状态之前&#xff0c;它什么也做不了&#xff0c;…

window系统DockerDesktop 部署windows容器

目录 参考文献1、安装Docker Desktop1.1 下载安装包1.2 安装教程1.3 异常解决 2、安装windows容器2.1 先启动DockerDesktop 软件界面2.2 检查docker版本2.3 拉取windows镜像 参考文献 windows容器docker中文官网 Docker: windows下跑windows镜像 1、安装Docker Desktop 1.1 …

SSM框架VUE电影售票管理系统开发mysql数据库redis设计java编程计算机网页源码maven项目

一、源码特点 smm VUE电影售票管理系统是一套完善的完整信息管理类型系统&#xff0c;结合SSM框架和VUE、redis完成本系统&#xff0c;对理解vue java编程开发语言有帮助系统采用ssm框架&#xff08;MVC模式开发&#xff09;&#xff0c;系 统具有完整的源代码和数据库&#…