ES6中的map和set
Set
ES6 提供了新的数据结构 Set。它类似于数组,但是成员的值都是唯一的,没有重复的值。
Set
本身是一个构造函数,用来生成 Set 数据结构。
以下代码
const s = new Set();[2, 3, 5, 4, 5, 2, 2].forEach(x => s.add(x));for (let i of s) {console.log(i);
}
// 2 3 5 4
结果表明 Set 结构不会添加重复的值。
向Set中加入值不会发生类型转换,所以5
和"5"
是两个不同的值。
前面说到set结构不会添加重复的值意味着set内部会对值进行判断,使用的判断算法叫“Same-value-zero equality”,类似于精确相等符(===),但主要的区别是向Set加入值时认为NaN等于自身,而精确相等符认为NaN不等于自身
Object.is(NaN, NaN)
返回true
表明使用Object.is
或者说Set
内部使用的 “same-value-zero” 算法时,NaN
是等于自身的。
所以下面例子中Set里面只有一个NaN
let set = new Set();
let a = NaN;
let b = NaN;
set.add(a);
set.add(b);
set // Set {NaN}
另外两个对象总是不相等的
Array.from()
方法可以将Set结构转为数组
所以去重(数组或者字符串)成员可以使用set
[...new Set(array)] [...new Set('ababbc')].join('') Array.from(new Set(array));
Set的方法
Set方法 | 说明 |
---|---|
add | 添加某个值,但会Set结构本身 |
delete | 删除某个值,返回一个布尔值,表示是否成功 |
has | 返回一个布尔值,表示该值是否为Set 的成员。 |
clear | 清除所有成员,没有返回值。 |
WeakSet
虽然也是不重复值的集合,但是跟Set有两个区别
- WeakSet的成员只能是对象和symbol值,而不能是其他类型的值
- WeakSet中的对象都是弱引用,也就是说垃圾回收机制不考虑WeakSet 对该对象的引用,也就是说,如果其他对象都不再引用该对象,那么垃圾回收机制会自动回收该对象所占用的内存,不考虑该对象还存在于 WeakSet 之中。
- 因此WeakSet适合临时存放一组对象,以及存放跟对象绑定的信息。只要这些对象在外部消失,它在WeakSet里面的引用就会自动消失
- 不能获取
WeakSet
的大小(即包含多少个元素)。
由于 WeakSet 内部有多少个成员,取决于垃圾回收机制有没有运行,运行前后很可能成员个数是不一样的,而垃圾回收机制何时运行是不可预测的,因此 ES6 规定 WeakSet 不可遍历。
WeakSet结构的方法
- add()
- delete()
- has()
WeakSet 的一个用处,是储存 DOM 节点,而不用担心这些节点从文档移除时,会引发内存泄漏。
如果不使用 WeakSet
来存储 DOM 节点,而使用普通的集合(如 Array
或 Set
)或者其他对象来保存对这些节点的引用,可能会在比如以下几种情况下引发内存泄漏:
- 未移除的事件监听器
当为一个 DOM 节点添加了事件监听器,并且该节点从文档中移除后,如果你没有显式地移除这些事件监听器,那么即使该节点已经不在文档中,浏览器仍然会保持对该节点及其事件监听器的引用。这会导致该节点无法被垃圾回收,从而占用不必要的内存。
示例:
const elements = [];
const button = document.createElement('button');// 添加事件监听器
button.addEventListener('click', () => {console.log('Button clicked');
});// 将节点存储在一个普通数组中
elements.push(button);// 从文档中移除节点
document.body.removeChild(button);
// 如果不移除事件监听器,按钮不会被垃圾回收
- 长时间存在的缓存
如果你在应用中使用了某种形式的缓存来存储 DOM 节点或与它们相关联的数据,并且这些缓存没有适当的清理机制,那么当 DOM 节点从文档中移除时,这些缓存仍然会持有对节点的引用,导致它们无法被垃圾回收。
示例:
const cache = new Map();function cacheElement(element) {cache.set(element, { data: 'some data' });
}const div = document.createElement('div');
cacheElement(div);// 从文档中移除节点
document.body.removeChild(div);// 缓存仍然持有对 div 的引用
console.log(cache.has(div)); // true
- 全局变量或闭包中的引用
如果你将 DOM 节点存储在全局变量中,或者通过闭包等方式间接持有对节点的引用,那么即使这些节点已经从文档中移除,它们也不会被垃圾回收,因为它们仍然可以通过这些全局变量或闭包访问到。
示例:
javascript深色版本
let globalNode;function createAndCacheNode() {const node = document.createElement('div');globalNode = node; // 全局变量持有对节点的引用return node;
}const node = createAndCacheNode();
document.body.appendChild(node);// 从文档中移除节点
document.body.removeChild(node);// 全局变量仍然持有对节点的引用
console.log(globalNode === node); // true
Map
JS的数据对象(Obejct),本质上是键值对的集合(Hash结构),但是传统上只能用字符串当作键(一定程度上对其的使用有限制)
比如下面代码
const data = {}
const element = document.getElementById('myDiv')data[element] = 'metaData'
data['[object HTMLDivElement]'] // "metadata"
上面代码原意是将一个 DOM 节点作为对象data
的键,但是由于对象只接受字符串作为键名,所以element
被自动转为字符串[object HTMLDivElement]
。
“键”的范围不限于字符串,各种类型的值(包括对象)都可以当作键。(Object 结构提供了“字符串—值”的对应,Map 结构提供了“值—值”的对应,是一种更完善的 Hash 结构实现。)
如果需要“键值对”的数据结构,Map 构造函数比 Object 更合适。
具有极快的查找速度
在n中有很长的数据,但是利用Map则查找十分迅速:
const m=new map(['Kris',21],['Bob',19],['Lily',25],['Jack',27]);
m.get('Kris'); // 21
m.get('Lily'); // 25
初始化Map需要一个二维数组,或者直接初始化一个空Map,
let m=new Map();
//-----------------------
const m=new map(['Kris',21],['Bob',19],['Lily',25],['Jack',27]);
m.get('Kris'); // 21
m.get('Lily'); // 25
Map构造函数接受数组作为参数,实际执行的是以下算法
const items = [['name', '张三'], ['title', 'Author']]
const map = new Map()items.forEach(([key, value]) => map.set(key, value)
)
在ES6中有使用map对象和set对象,当作Map构造函数的参数,结果都生成了新的Map对象
任何具有 Iterator 接口、且每个成员都是一个双元素的数组的数据结构(详见《Iterator》一章)都可以当作Map
构造函数的参数。这就是说,Set
和Map
都可以用来生成新的 Map。
例如
const set = Set([['foo', 1], ['bar', 2]])
const m1 = new Map(set)
m1.get('foo') // 1const m2 = new Map([['baz', 3]]);
const m3 = new Map(m2);
m3.get('baz') // 3
这里或许有疑问就是Map不是只接受值吗,为什么这里使用了键值对形式却能接受并生成set
原因:
- 虽然Set通常用于存储唯一的值,但是也可以存储任何类型的数据结构,包括键值对(即每个成员是一个双元素数组)
Map
构造函数会遍历传入的可迭代对象,并假设每个成员是一个[key, value]
形式的数组。- 如果将一个
Set
传递给Map
构造函数,并且Set
中的每个成员都是一个双元素数组,那么Map
会将这些数组解释为键值对,并创建相应的Map
。- 如果
Set
中的每个成员都是一个双元素数组,那么Map
构造函数会将这些数组解释为键值对,并创建相应的Map
。
Map易错点
const map = new Map();map.set(['a'], 555);
map.get(['a']) // undefined
上面代码的set
和get
方法,表面是针对同一个键,但实际上这是两个不同的数组实例,内存地址是不一样的,因此get
方法无法读取该键,返回undefined
。
注意这里的[‘a’]是两个不同的数组实例,内存地址不一样
,Map 的键实际上是跟内存地址绑定的,只要内存地址不一样,就视为两个键。这就解决了同名属性碰撞(clash)的问题,我们扩展别人的库的时候,如果使用对象作为键名,就不用担心自己的属性与原作者的属性同名。
如果 Map 的键是一个简单类型的值(数字、字符串、布尔值),则只要两个值严格相等,Map 将其视为一个键,比如0
和-0
就是一个键,布尔值true
和字符串true
则是两个不同的键。另外,undefined
和null
也是两个不同的键。虽然NaN
不严格相等于自身,但 Map 将其视为同一个键。
Map的方法
Map方法 | 说明 |
---|---|
set(key, val): | 向Map中添加新元素 |
get(key): | 通过键值查找特定的数值并返回 |
has(key): | 判断Map对象中是否有Key所对应的值,有返回true,否则返回false |
delete(key): | 通过键值从Map中移除对应的数据 |
clear(): | 将这个Map中的所有元素删除 |
一个key只能对应一个value,所以多次对一个key放入value,后面的值会把前面的值冲掉
Map的使用场景
- 需要动态键的数据存储
当需要存储的数据键不是静态的字符串或符号时,Map
是一个更好的选择。Map
允许任何类型的值作为键,包括对象、函数、甚至其他 Map
或 Set
。
示例:
const map = new Map();
const keyObj = { id: 1 };
const keyFunc = () => "hello";map.set(keyObj, "value associated with keyObj");
map.set(keyFunc, "value associated with keyFunc");console.log(map.get(keyObj)); // "value associated with keyObj"
console.log(map.get(keyFunc)); // "value associated with keyFunc"
- 频繁的增删操作
Map
在增删操作上的性能通常优于普通对象。对于频繁的插入和删除操作,Map
提供了更高效的方法,如 .set()
, .delete()
, 和 .clear()
。
示例:
const map = new Map();
map.set('key1', 'value1');
map.set('key2', 'value2');// 删除一个键值对
map.delete('key1');// 清空整个 Map
map.clear();
- 保持插入顺序
Map
会按照插入的顺序迭代其元素,这对于需要维护键值对顺序的场景非常有用。相比之下,普通对象的属性顺序在某些情况下是不确定的。
示例:
const map = new Map([['first', 'value1'],['second', 'value2'],['third', 'value3']
]);for (let [key, value] of map) {console.log(`${key}: ${value}`);
}
// 输出:
// first: value1
// second: value2
// third: value3
- 计数器或频率统计
Map
可以用于统计某个值出现的次数,特别适合处理数组中的重复项或其他形式的频率统计。
示例:
const words = ['apple', 'banana', 'apple', 'orange', 'banana', 'apple'];const wordCounts = new Map();
for (const word of words) {wordCounts.set(word, (wordCounts.get(word) || 0) + 1);
}console.log(wordCounts); // Map(3) { 'apple' => 3, 'banana' => 2, 'orange' => 1 }
- 缓存机制
Map
可以用于实现简单的缓存机制,特别是在需要根据键来快速查找和更新数据的情况下。你可以使用 Map
来存储计算结果,避免重复计算。
示例:
const cache = new Map();function fibonacci(n) {if (cache.has(n)) {return cache.get(n);}let result;if (n <= 1) {result = n;} else {result = fibonacci(n - 1) + fibonacci(n - 2);}cache.set(n, result);return result;
}console.log(fibonacci(10)); // 55
console.log(cache); // Map(11) { 0 => 0, 1 => 1, 2 => 1, 3 => 2, 4 => 3, 5 => 5, 6 => 8, 7 => 13, 8 => 21, 9 => 34, 10 => 55 }
- 关联复杂对象
Map
可以用于将复杂对象(如 DOM 节点、函数等)与元数据关联起来,而不会修改这些对象本身。这在处理事件监听器、组件状态等场景中非常有用。
示例:
const elements = document.querySelectorAll('button');
const elementData = new Map();elements.forEach(element => {elementData.set(element, { clicks: 0 });element.addEventListener('click', () => {const data = elementData.get(element);data.clicks++;console.log(`Button clicked ${data.clicks} times`);});
});
- 替代普通对象
在某些情况下,Map
可以替代普通对象,尤其是在你需要动态添加或删除属性,或者需要更高效的性能时。Map
提供了更多的内置方法和更好的性能特性。
示例:
const userPreferences = new Map([['theme', 'dark'],['language', 'en']
]);userPreferences.set('timezone', 'UTC+8');console.log(userPreferences.get('theme')); // 'dark'
console.log(userPreferences.size); // 3
- 处理大型数据集
Map
在处理大型数据集时表现出色,特别是当数据集包含大量键值对时。Map
的迭代、查找和更新操作都比普通对象更高效。
示例:
const largeDataSet = new Map();
for (let i = 0; i < 1000000; i++) {largeDataSet.set(i, `value${i}`);
}console.log(largeDataSet.get(500000)); // 'value500000'
- 多线程环境下的共享数据
在 Web Workers 或 Node.js 的多线程环境中,Map
可以用于在不同线程之间共享数据,因为它提供了更安全和高效的并发访问方式。
示例:
// 主线程
const worker = new Worker('worker.js');
const sharedData = new Map();worker.postMessage(sharedData);// worker.js
self.onmessage = function(e) {const map = e.data;console.log(map.get('key'));
};
- 避免原型链污染
普通对象的属性查找会沿着原型链进行,这可能导致意外的行为或冲突。Map
不依赖于原型链,因此可以避免这些问题,特别是在你不确定对象的来源或结构时。
示例:
const obj = {};
obj.__proto__.foo = 'bar'; // 污染了原型链console.log(obj.foo); // 'bar'const map = new Map();
map.set('foo', 'baz');console.log(map.get('foo')); // 'baz'
WeakMap
与Map的却别
-
weakMap只接受对象(NULL除外)和Symbol值作为键名,不接受其它类型的值作为键名
-
const map = new WeakMap(); map.set(1, 2) // 报错 map.set(null, 2) // 报错 map.set(Symbol(), 2) // 不报错
-
-
WeakMap
的键名所指向的对象,不计入垃圾回收机制。键名所引用的对象都是弱引用,即垃圾回收机制不将该引用考虑在内(也就是说,一旦不再需要,WeakMap 里面的键名对象和所对应的键值对会自动消失,不用手动删除引用。),注意是键名,而不是键值,键值依然是正常引用 -
没有遍历操作,没有size属性,无法清空
设计目的是:有时想在某个对象上面存放一些数据,但是这会形成对于这个对象的引用,所以设计出WeakMap解决这个问题
第2条例子说明解释
const e1 = document.getElementById('foo');
const e2 = document.getElementById('bar');
const arr = [[e1, 'foo 元素'],[e2, 'bar 元素'],
];
// 对这两个对象添加一些文字说明,这就形成了对e1和e2的引用//如果不再需要这两个对象,就必须手动删除这个引用,否则垃圾回收机制就不会释放e1和e2占用的内存
arr[0] = null
arr[1] = null
// 这样的手动删除的方法很容易忘记写然后造成内存泄漏
键值是正常应用,所以WeakMap外部消除了obj的引用,WeakMap内部的引用依然存在
const wm = new WeakMap();
let key = {};
let obj = {foo: 1};wm.set(key, obj);
obj = null;
wm.get(key)
// Object {foo: 1}
一个典型应用场景是,在网页的 DOM 元素上添加数据,就可以使用WeakMap
结构。
WeakMap结构的方法
- get()
- set()
- has()
- delete()
用途
WeakMap 应用的典型场合就是 DOM 节点作为键名。下面是一个例子。
let myWeakmap = new WeakMap();myWeakmap.set(document.getElementById('logo'),{timesClicked: 0})
;document.getElementById('logo').addEventListener('click', function() {let logoData = myWeakmap.get(document.getElementById('logo'));logoData.timesClicked++;
}, false);
上面代码中,document.getElementById('logo')
是一个 DOM 节点,每当发生click
事件,就更新一下状态。我们将这个状态作为键值放在 WeakMap 里,对应的键名就是这个节点对象。一旦这个 DOM 节点删除,该状态就会自动消失,不存在内存泄漏风险。
WeakMap 的另一个用处是部署私有属性。
const _counter = new WeakMap();
const _action = new WeakMap();class Countdown {constructor(counter, action) {_counter.set(this, counter);_action.set(this, action);}dec() {let counter = _counter.get(this);if (counter < 1) return;counter--;_counter.set(this, counter);if (counter === 0) {_action.get(this)();}}
}const c = new Countdown(2, () => console.log('DONE'));c.dec()
c.dec()
// DONE
上面代码中,Countdown
类的两个内部属性_counter
和_action
,是实例的弱引用,所以如果删除实例,它们也就随之消失,不会造成内存泄漏。
WeakRef
是基于弱引用的数据结构
ES2021提供了WeakRef
对象用于直接创建对象的弱引用
let target = {}
let wr = new WeakRef(target)
// wr属于对target的弱引用。垃圾回收机制不会计入这个引用,wr的引用不会妨碍原始对象target被垃圾回收机制清除
相关文章:
ES6中的map和set
Set ES6 提供了新的数据结构 Set。它类似于数组,但是成员的值都是唯一的,没有重复的值。 Set本身是一个构造函数,用来生成 Set 数据结构。 以下代码 const s new Set();[2, 3, 5, 4, 5, 2, 2].forEach(x > s.add(x));for (let i of s…...
【WRF安装】WRF编译错误总结1:HDF5库包安装
目录 1 HDF5库包安装有误:HDF5 not set in environment. Will configure WRF for use without.HDF5的重新编译 错误原因1:提示 overflow 错误1. 检查系统是否缺少依赖库或工具2. 检查和更新编译器版本3. 检查 ./configure 报错信息4. 检查系统环境变量5.…...
MyBatis常见面试题总结
#{} 和 ${} 的区别是什么? 注:这道题是面试官面试我同事的。 答: ${}是 Properties 文件中的变量占位符,它可以用于标签属性值和 sql 内部,属于原样文本替换,可以替换任意内容,比如${driver}…...
Qt生成随机数的方法
后台接口要求传个流水单号,流水号的格式是:“设备序列号”“设备MAC地址”“20位的随机数”。 具体的是: “设备序列号”:就是烧录工具写入设备的序列编号,这就不多说了,读出来就行; “设备MAC地…...
深入探索Vue.js中的v-if指令:条件渲染的高级技巧
深入探索Vue.js中的v-if指令:条件渲染的高级技巧 引言 在现代Web开发中,根据条件动态地渲染或移除DOM元素是一个常见的需求。Vue.js提供了一种简洁而强大的方法来实现这一目标,即通过v-if指令来根据表达式的值来控制元素的渲染。本文将详细…...
【记录50】uniapp安装uview插件,样式引入失败分析及解决
SassError: Undefined variable: "$u-border-color". 表示样式变量$u-border-color没定义,实际是定义的 首先确保安装了scss/sass 其次,根目录下 app.vue中是否全局引入 <style lang"scss">import /uni_modules/uview-ui/in…...
NTLMv2 离线爆破
攻击者(kali):192.168.72.162 受害者(administrator):192.168.72.163 因为 NTLM 身份验证是通过计算正确的挑战值得出的,所以如果我们能获取域用户的 NTLM 认证某一服务的 Net-NTLM v2 Hash …...
LabVIEW实现RFID通信
目录 1、RFID通信原理 2、硬件环境部署 3、程序架构 4、前面板设计 5、程序框图设计 6、测试验证 本专栏以LabVIEW为开发平台,讲解物联网通信组网原理与开发方法,覆盖RS232、TCP、MQTT、蓝牙、Wi-Fi、NB-IoT等协议。 结合实际案例,展示如何利用LabVIEW和常用模块实现物联网系…...
【Three.js基础学习】31.Lights Shading
前言 关于灯光如何在着色器中应用! 下面将创建三个灯光 分别是点光源,环境光,方向光通过这几种光应用着色器显示对应阴影 学习灯光阴影,着色器的使用 添加三盏灯 点光,方向光,环境光 创建一个环境光 在现…...
Oracle Database 21c Express Edition数据库 和 Sqlplus客户端安装配置
目录 一. 前置条件二. Win10安装配置Oracle数据库2.1 数据库获取2.2 数据库安装2.3 数据库配置确认2.4 数据库访问 三. Win10配置Oracle数据库可对外访问3.1 打开文件和打印机共享3.2 开放1521端口 四. 端口与地址确认4.1 查看监听器的状态4.2 Win10查看1521端口是否被监听4.3 …...
IDEA搭建springboot demo
如下所示创建SpringBootTest18项目,我选的maven,创建完成项目后,maven会自动下载一些依赖库到maven的repository目录中。 创建的项目结构如下图所示 接下来在项目中加入Framework支持,右击项目,弹出的菜单如下图所示&a…...
SQLite Update 语句
SQLite Update 语句 SQLite 的 UPDATE 语句用于更新数据库表中的现有记录。使用 UPDATE 语句,您可以修改一个或多个列的值。本教程将详细介绍如何使用 SQLite UPDATE 语句,包括语法、示例以及一些最佳实践。 语法 SQLite UPDATE 语句的基本语法如下&a…...
node.js的简单示例
Node.js是一个基于Chrome V8引擎的JavaScript运行时环境,用于方便地构建快速、可扩展的网络应用。下面是一个简单的Node.js示例,它创建了一个简单的HTTP服务器,当访问服务器时,它会响应“Hello World” // 引入Node.js的HTTP模块…...
fpga系列 HDL:Quartus II 时序约束 静态时序分析 (STA) test.out.sdc的文件结构
test.out.sdc的文件结构 ## Generated SDC file "test.out.sdc"## Copyright (C) 1991-2013 Altera Corporation ## Your use of Altera Corporations design tools, logic functions ## and other software and tools, and its AMPP partner logic ## functions,…...
Restaurants WebAPI(一)—— clean architecture
文章目录 项目地址一、Restaurants.Domain 核心业务层1.1 Entities实体层1.2 Repositories 数据操作EF的接口二、Restaurants.Infrastructure 基础设施层2.1 Persistence 数据EF CORE配置2.2 Repositories 数据查询实现2.3 Extensions 服务注册三、Restaurants.Application用例…...
A Unified Framework for STAR-RIS Coefficients Optimization
文章目录 AbstractB. A Penalty-based Reformulation of (1) III. OPTIMIZING AUXILIARY VARIABLES φ \boldsymbol φ φ IN P1IV. A CASE STUDY OF P2 ON DOWNLINK STAR-RIS ASSISTED TRANSMISSION SYSTEMA. 优化 x , ρ , w , λ t x, \rho, \mathbf{w}, \lambda^t x,ρ,w…...
rebase ‘A‘ onto ‘master‘ 和 merge ‘master‘ into ‘A‘有什么区别
在Git版本控制系统中,rebase 和 merge 是两种不同的操作,用于合并分支。rebase A onto master 和 merge master into A 虽然最终目的都是将两个分支的更改合并在一起,但它们在处理方式和结果上有所不同。 rebase ‘A’ onto ‘master’ 含义…...
谷歌发布最新视频生成模型 Veo 2:视频生成AI新王牌
谷歌 在当今数字化快速发展的时代,人工智能视频生成技术正不断突破创新。就在12月17日,谷歌推出了一个新的视频模型 Veo 2 。 Veo 2 Veo 2 Veo 2 可以创建各种主题和风格的高质量视频。在谷歌官方由人工评估员判断中,Veo 2 与领先模型相比取得…...
2025erp系统开源免费进销存系统搭建教程/功能介绍/上线即可运营软件平台源码
系统介绍 基于ThinkPHP与LayUI构建的全方位进销存解决方案 本系统集成了采购、销售、零售、多仓库管理、财务管理等核心功能模块,旨在为企业提供一站式进销存管理体验。借助详尽的报表分析和灵活的设置选项,企业可实现精细化管理,提升运营效…...
基于Docker的Minio分布式集群实践
目录 1. 说明 2. 配置表 3. 步骤 3.1 放行服务端口 3.2 docker-compose 编排 4. 入口反向代理与负载均衡配置 4.1 api入口 4.2 管理入口 5. 用例 6. 参考 1. 说明 以多节点的Docker容器方式实现minio存储集群,并配以nginx反向代理及负载均衡作为访问入口。…...
解决node.js的req.body为空的问题
从昨晚一直在试,明明之前用的封装的axios发送请求给其他的后端(springboot)是可以的,但昨天用了新项目的后端(node.js)就不行。 之前用了代理,所以浏览器发送的post请求不会被拦截,…...
数据结构期末算法复习:树、查找、排序
一、树 1.二叉链-定义 typedef struct BiTNode{ ElemType data;//数据域 struct BiTNode *lchild ,*rchild;//左、右孩子指针 }BiTNode , *BiTree ;2.查找值为x的结点 BTNode FindNode(BTNode b,ElemType x) { BTNode *p;if (bNULL) return NULL;else if (…...
复习打卡Linux篇
目录 1. Linux常用操作命令 2. vim编辑器 3. 用户权限 4. Linux系统信息查看 1. Linux常用操作命令 基础操作: 命令说明history查看历史执行命令ls查看指定目录下内容ls -a查看所有文件 包括隐藏文件ls -l ll查看文件详细信息,包括权限类型时间大小…...
OpenAI API深度解析:参数、Token、计费与多种调用方式
随着人工智能技术的飞速发展,OpenAI API已成为许多开发者和企业的得力助手。本文将深入探讨OpenAI API的参数、Token、计费方式,以及如何通过Rest API(以Postman为例)、Java API调用、工具调用等方式实现与OpenAI的交互࿰…...
Centos7 部署ZLMediakit
1、拉取代码 #国内用户推荐从同步镜像网站gitee下载 git clone --depth 1 https://gitee.com/xia-chu/ZLMediaKit cd ZLMediaKit #千万不要忘记执行这句命令 git submodule update --init 2、安装编译器 sudo yum -y install gcc 3、安装cmake sudo yum -y install cmake 4…...
python:用 sklearn.metrics 评价 K-Means 聚类模型
sklearn 的 metrics 模块提供的聚类模型评价指标如下: ARI 评价法(兰德系数): adjusted_rand_score AMI 评价法(相互信息): adjusted_mutual_info_score V-measure 评分 : completeness_score FMI 评价法 : fowlkes_m…...
谁说C比C++快?
看到这个问题,我我得说:这事儿没有那么简单。 1. 先把最大的误区打破 "C永远比C快" —— 某位1990年代的程序员 这种说法就像"自行车永远比汽车省油"一样荒谬。我们来看个例子: // C风格 char* str (char*)malloc(100…...
算法刷题Day23:BM60 括号生成
题目链接 描述:给出n对括号,请编写一个函数来生成所有的由n对括号组成的合法组合。 例如,给出n3,解集为: “((()))”, “(()())”, “(())()”, “()()()”, “()(())” 思路: 回溯左子树不断添加‘&#…...
基于Redis实现令牌桶算法
基于Redis实现令牌桶算法 令牌桶算法算法流程图优点缺点 实现其它限流算法 令牌桶算法 令牌桶是一种用于分组交换和电信网络的算法。它可用于检查数据包形式的数据传输是否符合定义的带宽和突发性限制(流量不均匀或变化的衡量标准)。它还可以用作调度算…...
XXE练习
pikachu-XXE靶场 1.POC:攻击测试 <?xml version"1.0"?> <!DOCTYPE foo [ <!ENTITY xxe "a">]> <foo>&xxe;</foo> 2.EXP:查看文件 <?xml version"1.0"?> <!DOCTYPE foo [ <!ENTITY xxe SY…...
Mac上使用ln指令创建软链接、硬链接
在Mac、Linux和Unix系统中,软连接(Symbolic Link)和硬连接(Hard Link)是两种不同的文件链接方式。它们的主要区别如下: 区别: 硬连接: 不能跨文件系统。不能链接目录(为…...
单元测试-Unittest框架实践
文章目录 1.Unittest简介1.1 自动化测试用例编写步骤1.2 相关概念1.3 用例编写规则1.4 断言方法 2.示例2.1 业务代码2.2 编写测试用例2.3 生成报告2.3.1 方法12.3.2 方法2 1.Unittest简介 Unittest是Python自带的单元测试框架,适用于:单元测试、Web自动…...
JAVA没有搞头了吗?
前言 今年的Java程序员群体似乎承受着前所未有的焦虑。投递简历无人问津,难得的面试机会也难以把握,即便成功入职,也往往难以长久。于是,不少程序员感叹:互联网的寒冬似乎又一次卷土重来,环境如此恶劣&…...
ECharts 饼图:数据可视化的重要工具
ECharts 饼图:数据可视化的重要工具 引言 在数据分析和可视化的领域,ECharts 是一个广受欢迎的开源库。它由百度团队开发,用于在网页中创建交互式图表。ECharts 提供了多种图表类型,包括柱状图、折线图、散点图等,而饼图则是其中最常用的一种。本文将深入探讨 ECharts 饼…...
arcGIS使用笔记(无人机tif合并、导出、去除黑边、重采样)
无人机航拍建图之后,通过大疆智图软件可以对所飞行的区域的进行拼图,但是如果需要对拼好的图再次合并,则需要利用到arcGIS软件。下面介绍arcGIS软件在这个过程中常用的操作。 1.导入tif文件并显示的方法:点击“”图标进行导入操作…...
0 前言
ArCS作为一个基于Rust的CAD(计算机辅助设计)开源系统,尽管已经有四年未更新,但其设计理念和技术实现仍然具有很高的学习和参考价值。以下是对ArCS项目的进一步分析和解读: 一、项目亮点与技术优势 高效与安全的Rust语…...
ubuntu server 安装
1 获取ubuntu https://ubuntu.com/download/server 2 安装ubuntu 详细教程查看视频: ubunut server 安装_哔哩哔哩_bilibili...
linux 添加默认网关
在linux 可以使用 route 命令添加默认网关,假设添加的默认网关是192.168.159.2 添加方式如下: route add default gw 192.168.159.2 以上命令只需要把add 改成 del ,就能删除刚才添加的路由 route del default gw 192.168.159.2 #该命…...
一个开源的自托管虚拟浏览器项目,支持在安全、私密的环境中使用浏览器
大家好,今天给大家分享一个开源的自托管虚拟浏览器项目Neko,旨在利用 WebRTC 技术在 Docker 容器中运行虚拟浏览器,为用户提供安全、私密且多功能的浏览体验。 项目介绍 Neko利用 WebRTC 技术在 Docker 容器中运行虚拟浏览器,提供…...
Qt之修改窗口标题、图标以及自定义标题栏(九)
Qt开发 系列文章 - titles-icons-titlebars(九) 目录 前言 一、修改标题 二、添加图标 三、更换标题栏 1.效果演示 2.创建标题栏类 3.定义相关函数 4.使用标题栏类 总结 前言 在我们利用Qt设计软件时,经常需要修改窗口标题、更改软…...
can总线相关概念---frame-signal-message
1、frame 帧是数据链路层的传输单元。它将上层传入的数据添加一个头部和尾部,组成了帧。它的起始点和目的点都是数据链路层。 2、signal 3、message-报文 我们将位于应用层的信息分组称为报文。报文是网络中交换与传输的数据单元,也是网络传输的单元。…...
全排列 dfs
给定一个由不同的小写字母组成的字符串,输出这个字符串的所有全排列。 我们假设对于小写字母有 a<b<…<y<z ,而且给定的字符串中的字母已经按照从小到大的顺序排列。 输入格式 输入只有一行,是一个由不同的小写字母组成的字符串…...
画图,matlab,
clear;close all;clc;tic;dirOutput dir(*.dat); % 罗列所有后缀-1.dat的文件列表,罗列BDDATA的数据 filenames string({dirOutput.name}); % 提取文件名%% 丢包统计 FILENAMES [""]; LOSS_YTJ [ ]; LOSS_RAD [ ]; LOSS_ETH [ ]…...
any/all 子查询优化规则的原理与解析 | OceanBase查询优化
背景 在通常情况下,当遇到包含any/all子查询的语句时,往往需要遵循嵌套执行的方式,因此其查询效率较低。Oceanbase中制定了相应的any/all子查询优化规则,能够能够识别并优化符合条件的any/all子查询,从而有效提升查询…...
Visio——导出的PDF文件缺乏嵌入字体的解决办法 / 设置导出的PDF文件添加嵌入字体的方法
导出PDF时,勾选 “符合PDF/A” 选项 这样就导出的PDF文件添加了嵌入字体了。...
python:用 sklearn SVM 构建分类模型,并评价
编写 test_sklearn_5.py 如下 # -*- coding: utf-8 -*- """ 使用 sklearn 估计器构建分类模型,并评价 """ import numpy as np import matplotlib.pyplot as plt from sklearn import datasets from sklearn.svm import SVC from sk…...
【Python】制作函数,并且实现【注册】【登录】功能
这段代码是一个简单的命令行论坛模拟系统,包含了用户注册、登录和退出的功能。让我们逐行分析代码,并解释每个部分的功能与逻辑: ### 1. 引入 hashlib 模块 python import hashlib - **功能**:引入 Python 内置的 hashlib 模块…...
【大模型】LLaMA-2:Open Foundation and Fine-Tuned Chat Models, July. 2023.
论文:LLaMA-2:Open Foundation and Fine-Tuned Chat Models, July. 2023. 链接:https://arxiv.org/abs/2307.09288 Introduction 创新点 7B - 70B 预训练 微调 开源Llama 2 和Llama 2-Chat,针对对话用例进行了优化Motivation A…...
WebRTC服务质量(04)- 重传机制(01) RTX NACK概述
WebRTC服务质量(01)- Qos概述 WebRTC服务质量(02)- RTP协议 WebRTC服务质量(03)- RTCP协议 WebRTC服务质量(04)- 重传机制(01) RTX NACK概述 WebRTC服务质量(…...
Qt之connectSlotsByName分析
简介 用于界面设置信号槽自动生成,要求槽函数定义形式为on_< objectName >_< signal > connectSlotsByName 其定义在QMetaObject类中,为静态方法,在文件qobjectdefs.h struct Q_CORE_EXPORT QMetaObject {....static void c…...