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

Java SE 学习笔记(十九)—— XML、设计模式

目录

  • 1 XML
    • 1.1 XML 概述
    • 1.2 XML 语法规则
    • 1.3 XML 文档约束(了解)
      • 1.3.1 DTD 约束
      • 1.3.2 schema 约束
  • 2 XML 解析
    • 2.1 XML 解析概述
    • 2.2 Dom4J 解析 XML 文件
    • 2.3 XML 解析案例
  • 3 XML 检索
  • 4 设计模式
    • 4.1 工厂模式
    • 4.2 装饰模式

1 XML


在有些业务场景下,存储数据或者传输数据给别人的时候需要满足一定的规范进行组织

1.1 XML 概述


XML 的全称为(EXtensible Markup Language),是一种 可扩展标记语言,是一种数据表示格式,可以用于自定义数据格式,可以描述非常复杂的数据结构,常用于传输和存储数据。

例如:

<?xml version="1.0" encoding="UTF-8"?>
<data><sender> 张三 </sender><receiver> 李四 </receiver><src><addr> 北京 </addr><date>2022-11-11 11:11:11</date></src><current> 武汉 </current><dest> 广州 </dest>
</data>

XML 的几个特点和使用场景

  • 一是纯文本,默认使用 UTF-8 编码;二是可嵌套;
  • 如果把 XML 内容存为文件,那么它就是一个 XML 文件。
  • XML 内容经常被 当成消息进行网络传输,或者 作为配置文件用于存储系统的信息

1.2 XML 语法规则


  1. XML 的创建

就是创建一个 XML 类型的文件,要求文件的后缀名必须使用 xml,如:helloworld.xml

  1. XML 文件的文档声明

XML 文件的文档声明必须在第一行

<?xml version="1.0" encoding="UTF-8" ?>

version : XML 默认的版本号码、该属性是必须存在的
encoding :本 XML 文件的编码

  1. XML 的标签 ( 元素 ) 规则
  • 标签由一对尖括号和合法标识符组成:<name></name>,必须存在一个根标签,有且只能有一个
  • 标签必须成对出现,有开始,有结束 : <name></name>
  • 特殊的标签可以不成对,但是必须有结束标记,如 :<br/>
  • 标签中可以定义属性,属性和标签名空格隔开 ,属性值必须用引号引起来 <student id = “1”></name>
  • 标签需要正确的嵌套
  • XML 文件中可以定义注释信息: <!-- 注释内容 -->
  • XML 文件中可以存在以下特殊字符
    • &lt;< 小于
    • &gt;> 大于
    • &amp;& 和号
    • &apos;' 单引号
    • &quot;" 引号
  • XML 文件可以存在 CDATA 区 (IDEA中输入CD再回车)

示例代码

<?xml version="1.0" encoding="UTF-8" ?>
<student><msg>age &gt; 18 &amp;&amp; age &lt;24<![CDATA[age>18 && age<24]]></msg>
</student>

1.3 XML 文档约束(了解)


问题:由于 XML 文件可以自定义标签,导致 XML 文件可以随意定义,程序在解析的时候可能出现问题。

文档约束是用来限定 XML 文件中的标签以及属性应该怎么写,以此强制约束程序员必须按照文档约束的规定来编写 XML 文件中

文档约束可以分为:DTD和 schema 两种

1.3.1 DTD 约束


需求:利用 DTD 文档约束,约束一个 XML 文件的编写。

分析:

  • 编写 DTD 约束文档,后缀必须是 .dtd
  • 在需要编写的 XML 文件中导入该 DTD 约束文档
  • 按照约束的规定编写 XML 文件的内容

示例代码

在这里插入图片描述

XML 的文档约束 -DTD 的作用和问题?

  • 可以约束 XML 文件的编写。
  • 不能约束具体的数据类型。

1.3.2 schema 约束


schema 可以约束具体的数据类型,约束能力上更强大,但由于其本身也是一个 XML 文件,也受到其他约束文件的要求,所以编写地更严谨

需求:利用 schema 文档约束,约束一个 XML 文件的编写。

分析:

  • 编写 schema 约束文档,后缀必须是 .xsd
  • 在需要编写的 XML 文件中导入该 schema 约束文档
  • 按照约束内容编写 XML 文件的标签。

示例代码

在这里插入图片描述

2 XML 解析

2.1 XML 解析概述


XML 的数据的作用是什么,最终需要怎么处理?

  • 存储数据、做配置信息、进行数据传输。
  • 最终需要被程序进行读取,解析里面的信息。

主要有两种解析方式: SAX 解析、DOM 解析

Dom 常见的解析工具

在这里插入图片描述

DOM 解析解析文档对象模型

在这里插入图片描述

Document 对象:整个 xml 文档
Node 对象

  • Element 对象:标签
  • Attribute 对象:属性
  • Text 对象:文本内容

2.2 Dom4J 解析 XML 文件


需求:使用 Dom4J 把一个 XML 文件的数据进行解析

分析:

  • 下载 Dom4j 框架,官网下载。
  • 在项目中创建一个文件夹: lib
  • 将 dom4j-2.1.1.jar 文件复制到 lib 文件夹
  • 在 jar 文件上点右键,选择 Add as Library -> 点击 OK
  • 在类中导包使用

Dom4j 解析 XML- 得到 Document 对象

SAXReader类

在这里插入图片描述

Document 类

在这里插入图片描述

Dom4j 解析 XML 的元素、属性、文本

在这里插入图片描述

示例代码

XML文件

<?xml version="1.0" encoding="UTF-8"?>
<contactList><contact id="1" vip="true">哈哈哈<name>   潘金莲  </name><gender></gender><email>panpan@it.cn</email></contact><contact id="2" vip="false"><name>武松</name><gender></gender><email>wusong@it.cn</email></contact><contact id="3" vip="false"><name>武大狼</name><gender></gender><email>wuda@it.cn</email></contact><user></user>
</contactList>

解析XML文件

import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.junit.Test;
import java.io.InputStream;public class Dom4jDemo {@Testpublic void parseXML() throws Exception{// 1. 创建一个Dom4j解析器对象,代表了整个Dom4j框架SAXReader saxReader = new SAXReader();// 2. 把XML文件加载到内存中称为一个Document对象
//        Document document = saxReader.read("xml\\src\\Contacts.xml");
//        Document document = saxReader.read(new File("xml\\src\\Contacts.xml"));
//        Document document = saxReader.read(new FileInputStream("xml\\src\\Contacts.xml"));// getResourceAsStream 中的/是直接去src下寻找文件InputStream is = Dom4jDemo.class.getResourceAsStream("/Contacts.xml");Document document = saxReader.read(is);// 3. 获取根元素对象Element rootElement = document.getRootElement();System.out.println(rootElement.getName()); // contactList// 4. 获取子元素// 4.1 获取根元素下所有的子元素(一级)
//        List<Element> elements = rootElement.elements();
//        for (Element element : elements) {
//            System.out.println(element.getName());
//        }// 4.2 获取某个子元素(若同名,默认提取第一个子元素对象)Element contact = rootElement.element("contact");System.out.println(contact.getName()); // contact// 4.3 获取当前元素的文本System.out.println(contact.getText());// 去掉前后空格System.out.println(contact.getTextTrim()); // 哈哈哈// 4.4 获取子元素文本System.out.println(contact.elementText("name"));// 去掉前后空格System.out.println(contact.elementTextTrim("name")); // 潘金莲// 4.5 根据元素获取属性值Attribute id = contact.attribute("id");// 打印属性名和属性值System.out.println(id.getName()+":"+id.getValue());// 4.6 直接获取属性值System.out.println(contact.attributeValue("id")); // 1System.out.println(contact.attributeValue("vip")); // true}
}

2.3 XML 解析案例


需求 : 利用 Dom4J 的知识,将 Contact.xml 文件中的联系人数据封装成 List 集合,其中每个元素是实体类 Contact 。打印输出 List 中的每个元素。

案例用到的 XML 文件见上文

创建 Contact 类

public class Contact {private String name;private int id;private boolean vip;private char gender;private String email;public Contact() {}public Contact(String name, int id, boolean vip, char gender, String email) {this.name = name;this.id = id;this.vip = vip;this.gender = gender;this.email = email;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getId() {return id;}public void setId(int id) {this.id = id;}public boolean isVip() {return vip;}public void setVip(boolean vip) {this.vip = vip;}public char getGender() {return gender;}public void setGender(char gender) {this.gender = gender;}public String getEmail() {return email;}public void setEmail(String email) {this.email = email;}@Overridepublic String toString() {return "Contact{" +"name='" + name + '\'' +", id=" + id +", vip=" + vip +", gender=" + gender +", email='" + email + '\'' +'}';}
}

解析XML

import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.junit.Test;import java.lang.invoke.StringConcatException;
import java.util.ArrayList;
import java.util.List;public class TestDemo {@Testpublic void parseToList() throws Exception {// 1. 创建saxReader对象SAXReader saxReader = new SAXReader();// 2. 加载XML文件成为Document对象Document document = saxReader.read(TestDemo.class.getResourceAsStream("/Contacts.xml"));// 3. 先获取根元素Element rootElement = document.getRootElement();// 4. 获取所有的contact子元素List<Element> contactEles = rootElement.elements("contact");// 5. 准备一个ArrayList集合封装联系人信息ArrayList<Contact> contactsList = new ArrayList<>();// 6. 遍历每一个contact子元素for (Element contactEle : contactEles) {// 7. 每一个contact子元素都是一个联系人对象Contact contact = new Contact();// 8. 提取信息并给对象赋值contact.setId(Integer.valueOf(contactEle.attributeValue("id")));contact.setVip(Boolean.valueOf(contactEle.attributeValue("vip")));contact.setName(contactEle.elementTextTrim("name"));contact.setGender(contactEle.elementTextTrim("gender").charAt(0));contact.setEmail(contactEle.elementTextTrim("email"));// 9.把联系人对象放入List集合contactsList.add(contact);}// 10. 遍历集合for (Contact contact : contactsList) {System.out.println(contact);}}
}

输出结果

在这里插入图片描述

总结

  • Dom4J 解析 XML 文件的核心思想
    • 得到文档对象 Document ,从中获取元素对象和内容。
  • Dom4J 的解析后的数据形式。
    • 通常数据会封装成 Java 的对象,如单个对象,或者集合对象形
      式。

3 XML 检索


如果需要从 XML 文件中检索需要的某个信息(如 name )怎么解决?

  • Dom4j 需要进行文件的全部解析,然后再寻找数据。
  • Xpath 技术更加适合做信息检索。

XPath 在解析 XML 文档方面提供了一独树一帜的路径思想,更加优雅,高效。XPath 使用路径表达式来定位 XML 文档中的元素节点或属性节点。

使用 Xpath 检索出 XML 文件

需求:使用 Dom4J 把一个 XML 文件的数据进行解析

分析:

  • 导入 jar 包 (dom4j 和 jaxen-1.1.2.jar) , Xpath 技术依赖 Dom4j 技术
  • 通过 dom4j 的 SAXReader 获取 Document 对象
  • 利用 XPath 提供的 API, 结合 XPath 的语法完成选取 XML 文档元素节点进行解析操作。

Document 中与 Xpath 相关的 API

在这里插入图片描述

Xpath 的四大检索方案

  1. 绝对路径:采用绝对路径获取从根节点开始逐层的查找 /contactList/contact/name 节点列表并打印信息

在这里插入图片描述

  1. 相对路径:先得到根节点 contactList,再采用相对路径获取下一级 contact 节点的 name 子节点并打印信息

在这里插入图片描述

  1. 全文检索:直接全文搜索所有的 name 元素并打印

在这里插入图片描述

  1. 属性查找:在全文中搜索属性,或者带属性的元素

在这里插入图片描述

示例代码

XML文件

<?xml version="1.0" encoding="UTF-8"?>
<contactList><contact id="1" vip="true"><name>   潘金莲  </name><gender></gender><email>panpan@itcast.cn</email></contact><contact id="2" vip="false"><name>武松</name><gender></gender><email>wusong@itcast.cn</email></contact><contact id="3" vip="false"><name>武大狼</name><gender></gender><email>wuda@itcast.cn</email></contact><user><contact><info><name id="666">西门庆</name></info></contact></user>
</contactList>

检索XML

import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;
import org.junit.Test;import java.util.List;public class XPathDemo {// 1. 绝对路径@Testpublic void parse01() throws Exception {// 创建解析器对象SAXReader saxReader = new SAXReader();// 将XML文件加载成Document对象Document document = saxReader.read(XPathDemo.class.getResourceAsStream("/Contacts2.xml"));// 检索全部名称:name值List<Node> nodes = document.selectNodes("/contactList/contact/name");for (Node node : nodes) {Element nameEle = (Element) node;System.out.println(nameEle.getTextTrim());}}// 2. 相对路径@Testpublic void parse02() throws Exception {// 创建解析器对象SAXReader saxReader = new SAXReader();// 将XML文件加载成Document对象Document document = saxReader.read(XPathDemo.class.getResourceAsStream("/Contacts2.xml"));Element rootElement = document.getRootElement();// 检索全部名称:name值List<Node> nodes = rootElement.selectNodes("./contact/name");for (Node node : nodes) {Element nameEle = (Element) node;System.out.println(nameEle.getTextTrim());}}// 3. 全文搜素@Testpublic void parse03() throws Exception {// 创建解析器对象SAXReader saxReader = new SAXReader();// 将XML文件加载成Document对象Document document = saxReader.read(XPathDemo.class.getResourceAsStream("/Contacts2.xml"));// 检索数据
//        List<Node> nodes = document.selectNodes("//name");// 会找"西门庆"
//        List<Node> nodes = document.selectNodes("//contact/name");// 不会找"西门庆"List<Node> nodes = document.selectNodes("//contact//name");// 会找"西门庆"for (Node node : nodes) {Element nameEle = (Element) node;System.out.println(nameEle.getTextTrim());}}// 4. 属性查找@Testpublic void parse04() throws Exception {// 创建解析器对象SAXReader saxReader = new SAXReader();// 将XML文件加载成Document对象Document document = saxReader.read(XPathDemo.class.getResourceAsStream("/Contacts2.xml"));// 检索数据// 在全文中检索属性对象List<Node> nodes = document.selectNodes("//@id");for (Node node : nodes) {Attribute attr = (Attribute) node;System.out.println(attr.getName()+":"+attr.getValue());}// 在全文中检索包含该属性的元素对象(若有多个只返回第一个)// 查询name元素(包含id属性的)
//        Node node = document.selectSingleNode("//name[@id]");// 在全文中检索属性对象且属性值为该值的元素对象Node node = document.selectSingleNode("//name[@id=666]");Element ele = (Element) node;System.out.println(ele.getTextTrim());}
}

Element和继承Node

4 设计模式

4.1 工厂模式


之前我们创建类对象时,都是使用 new 对象的形式创建,在很多业务场景下也提供了不直接 new 的方式 。

工厂模式( Factory Pattern )是 Java 中最常用的设计模式之一, 这种类型的设计模式属于创建型模式,它提供了一种获取对象的方式。

工厂设计模式的作用:

  • 工厂的方法可以封装对象的创建细节,比如:为该对象进行加工和数据注入。
  • 可以实现类与类之间的解耦操作(核心思想)

4.2 装饰模式


装饰设计模式:创建一个新类,包装原始类,从而在新类中提升原来类的功能。

装饰设计模式的作用:

  • 装饰模式指的是在不改变原类的基础上 ,动态地扩展一个类的功能

相关文章:

Java SE 学习笔记(十九)—— XML、设计模式

目录 1 XML1.1 XML 概述1.2 XML 语法规则1.3 XML 文档约束&#xff08;了解&#xff09;1.3.1 DTD 约束1.3.2 schema 约束 2 XML 解析2.1 XML 解析概述2.2 Dom4J 解析 XML 文件2.3 XML 解析案例 3 XML 检索4 设计模式4.1 工厂模式4.2 装饰模式 1 XML 在有些业务场景下&#xff…...

grafana InfluxDB returned error: error reading influxDB 400错误解决

问题&#xff1a; 如图提示错误解决 确认自己的docker容器是否配置了以下3个字段 DOCKER_INFLUXDB_INIT_USERNAMExxx DOCKER_INFLUXDB_INIT_PASSWORDyyy DOCKER_INFLUXDB_INIT_ADMIN_TOKENzzz 如果有&#xff0c;在grafana中需要添加header配置Header: Authorization , Value…...

【LeetCode:150. 逆波兰表达式求值 | 栈】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…...

什么是神经网络,它的原理是啥?(2)

参考&#xff1a;https://www.youtube.com/watch?vmlk0rddP3L4&listPLuhqtP7jdD8CftMk831qdE8BlIteSaNzD 视频3&#xff1a;什么是激活函数&#xff1f;为什么我们需要激活函数&#xff1f;它的类型有哪些&#xff1f; 为什么需要激活函数&#xff1f;如果没有激活函数&…...

leetcode做题笔记206. 反转链表

给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[5,4,3,2,1]示例 2&#xff1a; 输入&#xff1a;head [1,2] 输出&#xff1a;[2,1]示例 3&#xff1a; 输入&am…...

2023/10/31 JAVA学习

idea一般会自动帮我们导包 new string创建出的字符串是空的,可以对其进行新赋值 s[i]在Java字符串中是没有这个东西的,想要遍历字符串只能用下面这种方式 但是可以把字符串,转换为字符数组然后那样输出 java中是无法s1 s2这样比较字符串的,因为这样比较的是地址,如果是new创建…...

SurfaceFliger绘制流程

前景提要&#xff1a; 当HWComposer接收到Vsync信号时&#xff0c;唤醒DisSync线程&#xff0c;在其中唤醒EventThread线程&#xff0c;调用DisplayEventReceiver的sendObjects像BitTub发送消息&#xff0c;由于在SurfaceFlinger的init过程中创建了EventThread线程&#xff0c…...

系统架构设计师-第14章-云原生架构设计理论与实践-

云原生架构产生背景 云原生与商业场景的深度融合 ( 1 )从为企业带来的价值来看&#xff0c;云原生架构有着以下优势通过对多元算力的支持&#xff0c;满足不同应用场景的个性化算力需求&#xff0c;井基于软硬协同架构&#xff0c;为应用提供极致性能的云原生算力 (2) 通过最…...

conda 实践

1. 环境部署 1.1. 下载 anaconda 安装包 下面这个网址查找自己需要的版本 https://repo.anaconda.com/archive/ 或者手动下载。 wget https://repo.anaconda.com/archive/Anaconda3-5.3.0-Linux-x86_64.sh 1.2. 执行安装程序 #安装依赖&#xff1a; sudo yum install bzip2…...

行业追踪,2023-10-31

自动复盘 2023-10-31 凡所有相&#xff0c;皆是虚妄。若见诸相非相&#xff0c;即见如来。 k 线图是最好的老师&#xff0c;每天持续发布板块的rps排名&#xff0c;追踪板块&#xff0c;板块来开仓&#xff0c;板块去清仓&#xff0c;丢弃自以为是的想法&#xff0c;板块去留让…...

springboot 配置多个Redis数据源详解

实现原理 需要配置好两个数据源&#xff0c;创建两个RedisTemplate在配置类中注入两个RedisConnectionFactory&#xff0c;分别创建对应的RedisTemplate进行操作 详解 配置数据源 我这里是在之前已有一个配置下面另外加了一个 spring&#xff1a;redis:# 地址host: localh…...

【数据结构】排序算法总结

⭐ 作者&#xff1a;小胡_不糊涂 &#x1f331; 作者主页&#xff1a;小胡_不糊涂的个人主页 &#x1f4c0; 收录专栏&#xff1a;浅谈数据结构 &#x1f496; 持续更文&#xff0c;关注博主少走弯路&#xff0c;谢谢大家支持 &#x1f496; 总结 1. 归并排序2. 计数排序3. 排序…...

作为20年老程序员,我如何使用GPT4来帮我写代码

如果你还在用google寻找解决代码bug的方案&#xff0c;那你真的out了&#xff0c;试试gpt4, save my life. 不是小编危言耸听&#xff0c;最近用gpt4来写代码极大地提高了代码生产力和运行效率&#xff0c;今天特地跟大家分享一下。 https://www.promptspower.comhttps://www.…...

【机器学习合集】模型设计之残差网络 ->(个人学习记录笔记)

文章目录 模型设计之残差网络1. 什么是残差结构1.1 网络加深遇到的优化问题1.2 short connect技术 2. 残差网络及有效性理解2.1 残差网络 3. 残差网络的发展3.1 密集残差网络3.2 更宽的残差网络(wide resnet)3.3 分组残差网络3.4 Dual Path Network3.5 加权残差网络3.6 预激活残…...

GoLong的学习之路(十六)基础工具之Gin框架

Gin框架介绍及使用&#xff0c;这张不用看内容就知道非常重要&#xff0c;重要到什么地步呢&#xff1f;重要到开发java不会Spring全家桶这种概念。 上几篇文章写的是如何构建骨架&#xff0c;经脉。这一章是将血肉注入。 文章目录 Gin框架RESTful API Gin渲染HTML渲染静态文件…...

VMware打开centos黑屏解决方法汇总

VMware打开centos黑屏解决方法汇总 前言&#xff1a;一. VMware打开centos黑屏解决方法汇总一 .情况情况一&#xff1a;情况二情况三 二. 解决方法最简单的方法&#xff1a;一. 以管理员权限在命令行执行1. 管理员身份运行cmd2. 输入“netsh winsock reset”,回车3. 重启电脑即…...

5G物联网关相较有线网关有哪些独特优势

5G为产业物联网应用带来了质的飞跃&#xff0c;5G技术实现更高速率、更低延迟和更大带宽&#xff0c;使得物联网能够接入更多数量的设备&#xff0c;实现更稳定、高效的连接和数据传输&#xff0c;在提高生产效率的同时&#xff0c;也进一步促进了物联网的应用发展和升级。 针对…...

【数据结构】顺序表的学习

前言:在之前我们学习了C语言的各种各样的语法&#xff0c;因此我们今天开始学习数据结构这一个模块&#xff0c;因此我们就从第一个部分来开始学习"顺序表"。 &#x1f496; 博主CSDN主页:卫卫卫的个人主页 &#x1f49e; &#x1f449; 专栏分类:C程序设计谭浩强版本…...

在NISQ小型计算机上执行大型并行量子计算的可能性

简介 Steve White提出了密度矩阵重整化群&#xff08;DMRG&#xff09;的基本思想&#xff0c;即纠缠是一种有价值的资源&#xff0c;可以用来精确或近似地描述大量子系统。后来&#xff0c;这一思想被理解为优化矩阵积状态&#xff08;MPS&#xff09;的算法&#xff0c;支持…...

考虑时空相关性的风电功率预测误差MATLAB代码

微❤关注“电气仔推送”获得资料&#xff08;专享优惠&#xff09; 风电功率预测置信区间误差分析拟合 1.风电功率预测误差--时空相关性 展示第一一个时间段的风电功率预测与实际风电功率值的比较。填充区域表示预测的不确定性&#xff0c;显示了95%置信区间内预测可能的范围…...

Debian系统简介

目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版&#xff…...

Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)

概述 在 Swift 开发语言中&#xff0c;各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过&#xff0c;在涉及到多个子类派生于基类进行多态模拟的场景下&#xff0c;…...

c#开发AI模型对话

AI模型 前面已经介绍了一般AI模型本地部署&#xff0c;直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型&#xff0c;但是目前国内可能使用不多&#xff0c;至少实践例子很少看见。开发训练模型就不介绍了&am…...

优选算法第十二讲:队列 + 宽搜 优先级队列

优选算法第十二讲&#xff1a;队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...

JVM虚拟机:内存结构、垃圾回收、性能优化

1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...

比较数据迁移后MySQL数据库和OceanBase数据仓库中的表

设计一个MySQL数据库和OceanBase数据仓库的表数据比较的详细程序流程,两张表是相同的结构,都有整型主键id字段,需要每次从数据库分批取得2000条数据,用于比较,比较操作的同时可以再取2000条数据,等上一次比较完成之后,开始比较,直到比较完所有的数据。比较操作需要比较…...

STM32---外部32.768K晶振(LSE)无法起振问题

晶振是否起振主要就检查两个1、晶振与MCU是否兼容&#xff1b;2、晶振的负载电容是否匹配 目录 一、判断晶振与MCU是否兼容 二、判断负载电容是否匹配 1. 晶振负载电容&#xff08;CL&#xff09;与匹配电容&#xff08;CL1、CL2&#xff09;的关系 2. 如何选择 CL1 和 CL…...

MySQL 主从同步异常处理

阅读原文&#xff1a;https://www.xiaozaoshu.top/articles/mysql-m-s-update-pk MySQL 做双主&#xff0c;遇到的这个错误&#xff1a; Could not execute Update_rows event on table ... Error_code: 1032是 MySQL 主从复制时的经典错误之一&#xff0c;通常表示&#xff…...

云原生安全实战:API网关Envoy的鉴权与限流详解

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关 作为微服务架构的统一入口&#xff0c;负责路由转发、安全控制、流量管理等核心功能。 2. Envoy 由Lyft开源的高性能云原生…...

npm安装electron下载太慢,导致报错

npm安装electron下载太慢&#xff0c;导致报错 背景 想学习electron框架做个桌面应用&#xff0c;卡在了安装依赖&#xff08;无语了&#xff09;。。。一开始以为node版本或者npm版本太低问题&#xff0c;调整版本后还是报错。偶尔执行install命令后&#xff0c;可以开始下载…...