总结前端常用数据结构 之 数组篇【JavaScript -包含常用数组方法】
【亲爱的读者,爱博主记得一键三连噢噢ooo~~ 啾咪】
创建数组:
- 以字面量的形式创建新数组:
let arr1 = [1, 2, 3];
- 通过 Array 构造函数并传入一组元素(4,5,6)来创建一个新数组:
let arr2 = new Array(4, 5, 6);
查找值:
在数组中可以根据下标/ 索引 来查找值:arr[0]
、arr[1]
、arr[2]
常用的数组方法(吐血分享):
【亲爱的读者,爱博主记得一键三连噢噢ooo~~】
第一类:增、删、改:
splice() - 任意位置添加、删除或替换元素:
splice() 方法允许你在数组的任意位置添加、删除或替换元素。这个方法会直接修改原数组,并返回一个包含被删除元素的新数组(如果没有删除元素,则返回一个空数组)。
使用结构:
array.splice(start[, deleteCount[, item1[, item2[, ...]]]])
参数:
- start:指定数组中开始修改的位置(索引)。如果该索引为负数,则从数组末尾开始计算位置(索引 -1 表示数组的最后一个元素)。
- deleteCount(可选):表示要移除的数组元素的个数。如果未指定 deleteCount,或者其值大于数组中实际可删除的元素数量,则将从 start 位置开始删除到数组末尾的所有元素。
- item1, item2, …(可选):要添加进数组的新元素。如果没有指定这些参数,splice() 将只删除数组元素。
举例说明:
- 删除元素:
let arr = [1, 2, 3, 4, 5];
let removed = arr.splice(2, 2);
console.log(arr); // [1, 2, 5]
console.log(removed); // [3, 4]
- 添加元素:
let arr = [1, 2, 3];
arr.splice(1, 0, 'a', 'b');
console.log(arr); // [1, 'a', 'b', 2, 3]
- 替换元素:
let arr = [1, 2, 3, 4];
arr.splice(2, 1, 'a');
console.log(arr); // [1, 2, 'a', 4]
unshift() - 数组的开头添加一个或多个元素:
unshift() 方法用于数组的开头添加一个或多个元素,并返回新的数组长度。这个方法会直接修改原数组,不会创建一个新的数组。
使用结构:
array.unshift(element1[, element2[, ...]])
参数:
- element1, element2, …:要添加到数组开头的元素。可以添加一个或多个元素。
举例说明:
let arr = [1, 2, 3];// 在数组开头添加一个元素
arr.unshift(0);
console.log(arr); // [0, 1, 2, 3]// 在数组开头添加多个元素
arr.unshift(-2, -1);
console.log(arr); // [-2, -1, 0, 1, 2, 3]// 获取数组的新长度
let newLength = arr.unshift(4);
console.log(newLength); // 7
console.log(arr); // [4, -2, -1, 0, 1, 2, 3]
提示:这个方法会修改原数组并且可能会导致数组中的元素重新分配内存(特别是当数组很大时),所以在性能敏感的应用中应该谨慎使用。如果你需要保持原数组不变,可以先复制数组(使用 slice() 方法等),然后在复制后的数组上使用 unshift() 方法。
push() - 数组的末尾添加一个或多个元素:
push() 方法用于数组的末尾添加一个或多个元素,并返回新的数组长度。这个方法会直接修改原数组,不会创建一个新的数组。
使用结构:
array.push(element1[, element2[, ...]])
参数:
- element1, element2, …:要添加到数组末尾的元素。可以添加一个或多个元素。
举例说明:
let arr = [1, 2, 3];// 在数组末尾添加一个元素
arr.push(4);
console.log(arr); // [1, 2, 3, 4]// 在数组末尾添加多个元素
arr.push(5, 6);
console.log(arr); // [1, 2, 3, 4, 5, 6]// 获取数组的新长度
let newLength = arr.push(7);
console.log(newLength); // 7
console.log(arr); // [1, 2, 3, 4, 5, 6, 7]
shift() - 删除数组的第一个元素:
shift()方法用于删除数组的第一个元素,并返回被删除的元素。 这个方法会直接修改原数组,将数组的第一个元素移除,并将所有后续元素向下移动一位,以填补被删除元素的位置。数组的新长度会相应地减少1。
使用结构:
array.shift()
返回值:
- 返回被删除的第一个元素。如果数组是空的,则返回 undefined。
举例说明:
let arr = [1, 2, 3, 4, 5];// 删除数组的第一个元素
let firstElement = arr.shift();
console.log(firstElement); // 1
console.log(arr); // [2, 3, 4, 5]// 再次删除数组的第一个元素
let secondElement = arr.shift();
console.log(secondElement); // 2
console.log(arr); // [3, 4, 5]// 尝试删除空数组的第一个元素
let emptyArr = [];
let nothing = emptyArr.shift();
console.log(nothing); // undefined
console.log(emptyArr); // []
提示:shift() 方法对于需要从数组开头移除元素的情况非常有用。但是,请注意,由于这个方法会修改原数组并且可能会导致数组中的元素重新分配内存(特别是当数组很大时),所以在性能敏感的应用中应该谨慎使用。如果你需要保持原数组不变,可以先复制数组(使用 slice() 方法等),然后在复制后的数组上使用 shift() 方法。
pop() - 删除数组中的最后一个元素:
pop()方法用于删除数组中的最后一个元素,并返回被删除的元素。 这个方法会直接修改原数组,使其长度减1。
使用结构:
array.pop()
返回值:
- 返回被删除的最后一个元素的值。如果数组为空,则返回 undefined。
举例说明:
let fruits = ["apple", "banana", "orange", "mango"];// 删除并返回数组的最后一个元素
let lastFruit = fruits.pop();
console.log(fruits); // ["apple", "banana", "orange"]
console.log(lastFruit); // "mango"// 删除并返回数组的最后一个元素(数组为空的情况)
let numbers = [];
let lastNumber = numbers.pop();
console.log(numbers); // []
console.log(lastNumber); // undefined
提示: pop() 方法在处理需要“后进先出”(LIFO)逻辑的场景时非常有用,例如在栈的实现中。栈是一种数据结构,只允许在一端(称为栈顶)进行插入和删除操作,而 pop() 方法正好符合这种操作模式。
第二类:迭代方法:
every() - 测试数组的所有元素是否都通过条件
every() 方法用于测试数组的所有元素是否都通过了被提供的测试函数。 如果数组中所有元素都满足测试函数,则返回 true;如果至少有一个元素不满足,则返回 false。
使用结构:
arr.every(callback(element[, index[, array]])[, thisArg])
参数:
- callback:为数组中每个元素执行的函数,接受三个参数:当前元素 (element)、当前元素的索引 (index) 和数组对象本身 (array)。
- thisArg(可选):执行 callback 时使用的 this 值。
举例说明:
const numbers = [1, 2, 3, 4, 5];// 检查数组中的所有元素是否都大于0
const allPositive = numbers.every(function(number) {return number > 0;
});console.log(allPositive); // 输出 true// 检查数组中的所有元素是否都大于10
const allGreaterThanTen = numbers.every(function(number) {return number > 10;
});console.log(allGreaterThanTen); // 输出 false
*简便写法:
arr1.every(item => item > 10);
some() - 测试数组中是否至少有一个元素通过条件
some()方法用于用于测试数组中是否至少有一个元素通过了被提供的测试函数。 只需要找到一个满足条件的元素就会返回 true,而不需要检查数组中的所有元素。如果数组中没有元素满足条件,则 some() 方法返回 false。
使用结构:
arr.some(callback(element[, index[, array]])[, thisArg])
参数:
- callback:为数组中每个元素执行的函数,接受三个参数:当前元素 (element)、当前元素的索引 (index) 和数组对象本身 (array)。
- thisArg(可选):执行 callback 时使用的 this 值。
举例说明:
const numbers = [1, 2, 3, 4, 5];// 检查数组中是否至少有一个偶数
const hasEven = numbers.some(function(number) {return number % 2 === 0;
});console.log(hasEven); // 输出 true// 检查数组中是否至少有一个大于10的数
const hasGreaterThanTen = numbers.some(function(number) {return number > 10;
});console.log(hasGreaterThanTen); // 输出 false
*简便写法:
arr1.some(item => item > 10);
filter() - 过滤出满足条件的元素
filter()方法用于用于创建一个新数组,这个新数组包含所有通过特定测试(由提供的函数实现)的元素。 返回一个新的数组,其中包含所有通过测试的元素。如果没有元素通过测试,则返回一个空数组。
使用结构:
arr.filter(callback(element[, index[, array]])[, thisArg])
参数:
- callback:一个函数,用来测试每个元素。该函数接受三个参数:当前元素 (element)、当前元素的索引 (index) 和调用 filter 的原数组 (array)。
- thisArg(可选):执行 callback 时使用的 this 值。
举例说明:
const numbers = [1, 2, 3, 4, 5, 6];// 过滤出所有的偶数
const evens = numbers.filter(function(number) {return number % 2 === 0;
});console.log(evens); // 输出 [2, 4, 6]// 过滤出大于3的元素
const greaterThanThree = numbers.filter(function(number) {return number > 3;
});console.log(greaterThanThree); // 输出 [4, 5, 6]
*简便写法:
arr1.filter(item => item > 3);
注意事项:
- filter() 方法不会改变原数组,而是返回一个新数组。
- 如果没有元素通过测试函数,filter() 方法会返回一个空数组,而不是 null 或 undefined。
- filter() 方法创建的数组是一个浅拷贝,这意味着如果原数组中的元素是对象,那么新数组中的元素将是对原数组中对象的引用。
forEach() - 每个元素都执行一次提供的函数
forEach()方法用于用于对数组的每个元素执行一次提供的函数。 forEach() 不会返回一个新的数组或值,它的返回值是 undefined。forEach() 方法主要用于执行有副作用的操作,比如修改数组中的元素、记录某些值或者进行输出等。
使用结构:
arr.forEach(callback(currentValue[, index[, array]])[, thisArg])
参数:
- callback:为数组中每个元素执行的函数,该函数接受三个参数:
- 1.currentValue:数组中正在处理的当前元素。
- 2.index(可选):数组中正在处理的当前元素的索引。
- 3.array(可选):调用 forEach() 方法的数组本身。
- thisArg(可选):执行 callback 时使用的 this 值。
举例说明:
const numbers = [1, 2, 3, 4, 5];// 使用 forEach 输出数组中的每个元素
numbers.forEach(function(number) {console.log(number);
});// 修改数组中的元素
numbers.forEach(function(number, index, array) {array[index] = number * 2;
});console.log(numbers); // 输出 [2, 4, 6, 8, 10]
*简便写法:
arr1.forEach((item,index,arr) => {arr[index] = item * 2;
});
map() - 每个元素都执行一次提供的函数
map()方法用于用于创建一个新数组,这个新数组的每个元素都是原数组中的元素经过某个函数处理后的结果。 map() 方法会对原数组中的每一个元素调用一个提供的函数,并按照元素出现的顺序将结果收集起来组成一个新的数组返回。
使用结构:
arr.map(callback(currentValue[, index[, array]])[, thisArg])
参数:
- callback:用来生成新数组中的每一个元素。该函数接受三个参数:
- 1.currentValue:数组中正在处理的当前元素。
- 2.index(可选):数组中正在处理的当前元素的索引。
- 3.array(可选):调用 map() 方法的数组本身。
- thisArg(可选):执行 callback 时使用的 this 值。
举例说明:
const numbers = [1, 2, 3, 4, 5];// 使用 map 创建一个新数组,其中包含原数组中每个元素加倍后的值
const doubledNumbers = numbers.map(function(number) {return number * 2;
});console.log(doubledNumbers); // 输出: [2, 4, 6, 8, 10]// 使用箭头函数简化代码,`**` 是计算平方哦
const squaredNumbers = numbers.map(number => number ** 2); console.log(squaredNumbers); // 输出: [1, 4, 9, 16, 25]
注意事项:
- map() 方法不会改变原数组,而是返回一个新数组。
- map() 方法创建的数组是一个浅拷贝,如果原数组中的元素是对象,那么新数组中的元素将是对原数组中对象的引用。
- 如果提供的回调函数不是函数,map() 方法会抛出 TypeError。
- map() 方法中的回调函数可以接受三个参数,但通常只需要使用第一个参数(当前元素的值。
reduce() - 将数组中的所有元素归纳(或“减少”)到单个值
reduce()方法用于用于将数组中的所有元素归纳(或“减少”)到单个值。 返回值:函数执行后的最终累积结果。
使用结构:
arr.reduce(callback(accumulator, currentValue[, index[, array]])[, initialValue])
参数:
- callback:一个函数,用来执行归纳操作。该函数接受四个参数:
- 1.accumulator:累积器,它累积回调的返回值。它是上一次调用回调时返回的累积值,或者是提供的初始值(initialValue)。
- 2.currentValue:数组中正在处理的当前元素。
- 3.index(可选):数组中正在处理的当前元素的索引。
- 4.array(可选):调用 reduce() 方法的数组本身。
- initialValue(可选):作为第一次调用回调函数时的第一个参数的值。如果没有提供初始值,则将数组的第一个元素视为初始值,并从第二个元素开始归纳。。
举例说明:
- 数组求和:
const numbers = [1, 2, 3, 4, 5];const sum = numbers.reduce((accumulator, currentValue) => {return accumulator + currentValue;
}, 0);console.log(sum); // 输出: 15
- 数组元素乘积:
const numbers = [1, 2, 3, 4, 5];const product = numbers.reduce((accumulator, currentValue) => {return accumulator * currentValue;
}, 1);console.log(product); // 输出: 120
- 数组元素连接成字符串:
const words = ['Hello', 'world', '!'];const sentence = words.reduce((accumulator, currentValue) => {return accumulator + ' ' + currentValue;
}, '');console.log(sentence); // 输出: " Hello world !"
注意事项:
- 如果没有提供 initialValue,则数组的第一个元素将被作为第一次调用回调函数时的 accumulator 的初始值,并且从数组的第二个元素开始归纳。
- 如果提供了 initialValue,则从数组的第一个元素开始归纳,并且 initialValue 将作为第一次调用回调函数时的 accumulator 的值。
- reduce() 方法不会改变原数组,而是返回一个新的值。
- 如果数组为空并且没有提供 initialValue,则会抛出 TypeError。如果数组为空但提供了 initialValue,则直接返回 initialValue。
第三类:搜索方法:
indexOf() - 用于查找数组某个元素首次出现的位置
indexOf() 方法用于查找数组中某个元素的首次出现位置,并返回该位置的索引(即下标)。如果数组中不存在该元素,则 indexOf() 方法返回 -1。
使用结构:
arr.indexOf(searchElement[, fromIndex])
参数:
- searchElement:要在数组中查找的元素。
- fromIndex(可选):开始查找的位置索引。默认为 0,即从数组的第一个元素开始查找。如果 fromIndex 为负数,则从数组末尾开始计算位置,但仍然是从前向后查找。如果 fromIndex 大于或等于数组的长度,返回 -1,因为这意味着在空数组中进行查找。
举例说明:
const fruits = ['apple', 'orange', 'banana', 'apple'];console.log(fruits.indexOf('apple')); // 输出: 0,因为 'apple' 是数组中的第一个元素
console.log(fruits.indexOf('banana')); // 输出: 2,因为 'banana' 是数组中的第三个元素
console.log(fruits.indexOf('mango')); // 输出: -1,因为 'mango' 不在数组中
console.log(fruits.indexOf('apple', 1)); // 输出: 3,从索引 1 开始查找 'apple',找到的是第二个 'apple'
console.log(fruits.indexOf('apple', -2)); // 输出: 3,从数组末尾往前数第二个位置开始查找,仍然找到的是第二个 'apple'
console.log(fruits.indexOf('apple', 4)); // 输出: -1,因为从索引 4 开始查找已经超出了数组的长度
注意事项:
- indexOf() 方法是严格的
===
检查,即它会比较数组元素和 searchElement 的类型和值。 - indexOf() 方法不会改变原数组。
- 在使用 indexOf() 方法查找元素时,如果数组中包含 NaN,即使 searchElement 也是 NaN,indexOf() 方法也不会找到它,因为 NaN 不等于 NaN(这是浮点数运算中的一个特殊性质)。
- 对于包含 +0 和 -0 的数组,indexOf() 方法会认为它们是相同的,因为 +0
===
-0。
includes() - 是否包含一个指定的值或子字符串
includes()方法用于数组(Array)和字符串(String)对象都具备的一个方法,用于判断一个数组或字符串是否包含一个指定的值或子字符串,根据情况返回 true 或 false。
使用结构 - 对于数组:
arr.includes(valueToFind[, fromIndex])
参数:
- valueToFind:需要查找的元素值。
- fromIndex(可选):开始查找的位置索引。如果省略,则默认从数组的第一个元素开始查找。如果为负值,则从数组的长度减去这个负值的位置开始,仍然是从前向后查找。
举例说明:
const fruits = ['apple', 'banana', 'mango'];console.log(fruits.includes('banana')); // 输出: true
console.log(fruits.includes('grape')); // 输出: false
console.log(fruits.includes('mango', 2)); // 输出: true,从索引2开始查找,仍然找到了'mango'
console.log(fruits.includes('mango', 3)); // 输出: false,从索引3开始查找,已经超出了'mango'的位置
使用结构 - 对于字符串:
str.includes(searchString[, position])
参数:
- searchString:需要查找的子字符串。
- position(可选):开始查找的位置索引。如果省略,则默认从字符串的第一个字符开始查找。
举例说明:
const text = "Hello, world!";console.log(text.includes("world")); // 输出: true
console.log(text.includes("hello")); // 输出: false,因为'H'是大写
console.log(text.includes("Hello", 6)); // 输出: false,从索引6开始查找,已经错过了"Hello"
注意事项:
- includes() 方法是区分大小写的,对于字符串来说,它会比较每个字符的Unicode编码。
- 对于数组,includes() 方法能够检测 NaN 和 -0,这是与 indexOf() 方法的一个区别,因为 NaN !== NaN,但 includes() 会认为 NaN 是相等的,同时 +0 和 -0 也被认为是相等的。
- includes() 方法不会改变原数组或原字符串。
includes() 方法是ES6(ECMAScript 2015)中引入的哦!
lastIndexOf() - 用于查找数组某个元素最后一次出现的位置
lastIndexOf()方法用于** 查找指定元素或子字符串在数组或字符串中最后一次出现的位置(索引)。如果未找到,则返回 -1。**
使用结构 -对于数组:
arr.lastIndexOf(searchElement[, fromIndex])
参数:
- searchElement:要在数组中查找的元素。
- fromIndex(可选):开始向后搜索的位置索引。如果省略,则默认从数组的最后一个元素开始查找。如果为负值,则从数组末尾加上这个负值的位置开始向前查找。如果 fromIndex 大于或等于数组的长度,整个数组都会被搜索。
举例说明:
const fruits = ['apple', 'banana', 'mango', 'banana', 'apple'];console.log(fruits.lastIndexOf('banana')); // 输出: 3,因为最后一个 'banana' 在索引 3
console.log(fruits.lastIndexOf('orange')); // 输出: -1,因为 'orange' 不在数组中
console.log(fruits.lastIndexOf('apple', 3)); // 输出: 3,因为从索引 3 开始向后查找,最后一个 'apple' 在索引 3
console.log(fruits.lastIndexOf('apple', 2)); // 输出: 0,因为从索引 2 开始向后查找,只找到了索引 0 的 'apple'
使用结构 -对于字符串:
str.lastIndexOf(searchValue[, fromIndex])
参数:
- searchValue:要在字符串中查找的子字符串。
- fromIndex(可选):开始向后搜索的位置索引。如果省略,则默认从字符串的最后一个字符开始查找。
举例说明:
const text = "Hello, world! Hello, everyone.";console.log(text.lastIndexOf("Hello")); // 输出: 23,因为最后一个 "Hello" 的起始索引是 23
console.log(text.lastIndexOf("hello")); // 输出: -1,因为 'H' 是大写,不匹配
console.log(text.lastIndexOf("world", 10)); // 输出: 7,因为从索引 10 开始向后查找,只找到了索引 7 的 "world"
注意事项:
- lastIndexOf() 方法是区分大小写的,对于字符串来说,它会比较每个字符的Unicode编码。
- lastIndexOf() 方法不会改变原数组或原字符串。
- fromIndex 的值可以是负数,表示从数组或字符串的末尾向前计算的位置开始搜索。
findLast() - 遍历数组并返回最后一个满足条件元素
findLast()方法用于遍历数组并返回最后一个满足提供的测试函数的元素。如果没有找到满足条件的元素,则返回 undefined。)
举例说明:
const array = [1, 2, 3, 4, 5, 4, 3, 2, 1];
const lastFour = array.findLast(element => element === 4);
console.log(lastFour); // 输出: 4
这个方法是es2023引入的哦!
findIndex() - 返回满足条件的第一个元素索引
indexOf() 方法用于返回数组中满足提供的测试函数的第一个元素的索引。。如果数组中不存在该元素,则 indexOf() 方法返回 -1。
使用结构:
arr.findIndex(callback(element[, index[, array]])[, thisArg])
参数:
- callback:为数组中每个元素执行的函数,接受三个参数:
- 1.element:当前遍历到的元素。
- 2.index(可选):当前元素的索引。
- 3.array(可选):调用 findIndex 的数组。
- thisArg(可选):执行 callback 时使用的 this 值。
举例说明:
const array = [4, 9, 16, 25];const evenIndex = array.findIndex((element) => element % 2 === 0);
console.log(evenIndex); // 输出: 0,因为4是第一个偶数const oddIndex = array.findIndex((element) => element % 2 !== 0);
console.log(oddIndex); // 输出: 1,因为9是第一个奇数const nonExistentIndex = array.findIndex((element) => element === 100);
console.log(nonExistentIndex); // 输出: -1,因为数组中没有100
注意事项:
- findIndex 方法不会改变原数组。
- 如果数组中有多个元素满足条件,findIndex 只会返回第一个满足条件的元素的索引。
- 如果没有元素满足条件,findIndex 会返回 -1。
兼容性:
findIndex 方法在 ECMAScript 6(ES6)中被引入,因此它在现代浏览器和 Node.js 环境中广泛受支持。如果你需要在不支持 ES6 的旧环境中使用,可以考虑使用转译器(如 Babel)将代码转换为旧版本的 JavaScript。
findLastIndex() - 返回满足条件的最后一个元素索引
findLastIndex() 方法用于返回数组中满足提供的测试函数的最后一个元素的索引。如果数组中不存在该元素,则 indexOf() 方法返回 -1。
使用结构:
arr.findLastIndex(callback(element[, index[, array]])[, thisArg])
参数:
- callback:为数组中每个元素执行的函数,接受三个参数:
- 1.element:数组中当处理的元素。
- 2.index(可选):当前元素的索引。
- 3.array(可选):调用 findLastIndex 的数组。
- thisArg(可选):执行 callback 时使用的 this 值。
举例说明:
const array = [1, 2, 3, 4, 5, 4, 3, 2, 1];// 查找最后一个等于 4 的元素的索引
const lastIndex = array.findLastIndex((element) => element === 4);
console.log(lastIndex); // 输出: 5// 查找最后一个大于 5 的元素的索引(不存在,所以返回 -1)
const nonExistentIndex = array.findLastIndex((element) => element > 5);
console.log(nonExistentIndex); // 输出: -1
注意事项:
- indLastIndex 方法不会改变原数组。
- 如果没有元素满足条件,findLastIndex 会返回 -1。
- 在使用这个方法之前,请确保你的 JavaScript 环境支持它(例如,现代的浏览器或 Node.js 版本)。
兼容性:
虽然 findLastIndex 是在 ECMAScript 2022 中正式引入的,但许多现代浏览器和 JavaScript 引擎在此之前就已经支持了这个方法。然而,为了确保兼容性,特别是在较旧的环境或需要广泛支持的应用程序中,你可能需要检查这个方法的可用性或使用转译器(如 Babel)来转换你的代码。
相关文章:

总结前端常用数据结构 之 数组篇【JavaScript -包含常用数组方法】
【亲爱的读者,爱博主记得一键三连噢噢ooo~~ 啾咪】 创建数组: 以字面量的形式创建新数组:let arr1 [1, 2, 3];通过 Array 构造函数并传入一组元素(4,5,6)来创建一个新数组:let arr2 new Array(4, 5, 6);…...
利率掉期(Interest Rate Swap):运作原理、收益模式及市场角色解析(中英双语)
利率掉期(Interest Rate Swap):运作原理、收益模式及市场角色解析 引言 利率掉期(Interest Rate Swap, IRS) 是金融市场中最常见的衍生品之一,它允许两方交换固定利率和浮动利率,以优化融资成…...
Mac 开发工具推荐
Homebrew 软件安装管理必备神器,相当于 Linux 上的 yum,安装了homebrew之后,以下软件都可以通过brew cask install 和 brew install进行直接安装 IntelliJ IDEA Java开发ide 相关插件: 1)lombok 2)Aliba…...
NCHAR_CS和CHAR_CS,导致UNION ALL 时,提示SQL 错误 [12704] [72000]: ORA-12704: 字符集不匹配
检查涉及的数据表和列的字符集设置 -- 查询表的字符集 SELECT parameter, value FROM nls_database_parameters WHERE parameter LIKE NLS_CHARACTERSET;-- 查询列的字符集(对于特定表) SELECT column_name, character_set_name FROM all_tab_columns W…...

使用 Python paramiko 自动备份设备配置实验
一、实验拓扑: 要求:交换机 SW1 做为 SSH 服务端,桥接本地虚拟虚拟网卡;本地主机通过 python paramiko 库功能登录到 SW1 上进行配置备份;AR1 做为测试 SW1 的 SSH 客户端 二、实验环境搭建: 1、SW1 配置…...

goland2022.3.3 安装过程
到csdn下载安装包 开始安装 安装完后,安装中文包...

工业级推荐系统冷启动解决方案:基于元迁移学习与动态知识图谱的混合架构设计与实践
技术原理与数学模型 1. 元学习冷启动适配器(MAML改进) 数学原理: \min_\theta \sum_{\mathcal{T}_i\sim p(\mathcal{T})} \mathcal{L}_{\mathcal{T}_i}(U_i(\theta - \alpha\nabla_\theta\mathcal{L}_{\mathcal{T}_i}^{sup}(\theta))))其中…...

小小小病毒(3)(~_~|)
一分耕耘一分收获 声明: 仅供损害电脑,不得用于非法。损坏电脑,作者一律不负责。此作为作者原创,转载请经过同意。 欢迎来到小小小病毒(3) 感谢大家的支持 还是那句话:上代码! …...
在 WSL上的 Ubuntu 中通过 Docker 来运行 Redis,并在微服务项目中使用redis
通过在 WSL(Windows Subsystem for Linux)上的 Ubuntu 虚拟机中通过 Docker 来运行 Redis,然后再微服务项目中使用redis 以下是步骤: 1. 安装 Docker(如果还未安装) 首先,确保你已经在 WSL 的…...

深入解析SVG图片原理:从基础到高级应用
文章目录 引言一、SVG基础概念1.1 什么是SVG?1.2 SVG的优势 二、SVG的基本结构2.1 SVG文档结构2.2 常用SVG元素 三、SVG的工作原理3.1 坐标系与变换3.2 路径与曲线3.3 渐变与滤镜 四、SVG的高级应用4.1 动画与交互4.2 数据可视化4.3 响应式设计 五、SVG的优化与性能…...
Python 中的一种调试工具 assert
assert 是 Python 中的一种调试工具,用于在代码中设置断言(assertion)。断言是一种声明,用于确保某个条件为真。如果条件为假,assert 会触发一个 AssertionError 异常,并可选地输出错误信息。 语法 asser…...
面基Spring Boot项目中实用注解一
在Spring Boot项目中,实用注解根据功能可以分为多个类别。以下是常见的注解分类、示例说明及对比分析: 1. 核心配置注解 SpringBootApplication 作用:标记主启动类,组合了Configuration、EnableAutoConfiguration和ComponentScan…...
【数据库维护】Clickhouse数据库维护关键系统表相关指标说明,支撑定位慢SQL及多实例场景下分析各实例运行情况
背景 当前使用环境上以Docker容器化部署Clickhouse服务8个实例,但在实际运行过程中,发现8个实例内存负载不均衡,ck-0实例在固定时间段内存会直线上升,直至服务报错memory exceeded max memory limit。 为排查ck-0节点内存直线上升…...
委托构造函数与继承构造函数
委托构造函数 允许同一类中的构造函数调用另一个构造函数,以复用初始化逻辑。 委托构造函数不能同时初始化成员变量,只能委托给其他构造函数。 避免循环委托(如构造函数A委托给B,B又委托给A)。 class MyClass { pu…...

DeepSeek操作Excel,实现图表自动化生成
案例 让DeepSeek操作Excel,实现图表自动化生成。我们只要用自然语言输入我们的需求(根据哪块单元格区域做什么图表),就可以直接在Excel中自动生成图表。 操作主界面和图表效果 设置接入方式 这里提供了多种接入方式将DeepSeek接…...
3.5 企业级AI Agent运维体系构建:从容器化部署到智能监控的工业级实践指南
企业级AI Agent运维体系构建:从容器化部署到智能监控的工业级实践指南 引言:AI时代运维的范式革新 Gartner研究指出,AI Agent系统的运维复杂度是传统应用的3.2倍,但采用云原生架构可使故障恢复时间缩短82%。本文以GitHub Sentinel、LanguageMentor等企业级案例为蓝本,揭…...
基于51单片机的定时器实现LED闪烁控制(CT107D)
引言 在嵌入式开发中,定时器是一个非常重要的外设,它可以用于实现精确的时间控制。本文将介绍如何在CT107D单片机综合训练平台上,利用51单片机的定时器T0实现LED灯的定时闪烁控制。具体功能如下: L1指示灯:每隔1秒闪烁…...
【java】作业1
1.需求:(1)机票价格按照淡季旺季、头等舱和经济舱收费、输入机票原价、原价、月份和头等舱或经济舱;(2)按照如下规则计算机票价格:旺季(5-10月)头等舱9折,经济…...

2025有哪些关键词优化工具好用
越来越多的企业和个人开始意识到搜索引擎优化(SEO)对于网站曝光和业务增长的重要性。在SEO优化的过程中,关键词优化占据着至关重要的地位。关键词是用户在搜索引擎中输入的词语,优化关键词有助于提高网站在搜索结果中的排名&#…...

【WPSOffice】汇总
写在前面 PPT篇 幻灯片母版 通过母版功能统一幻灯片的样式、字体、颜色等,提高整体一致性。 统一设置模板样式 字体安装 查找到字体并安装。 在WPS PPT(WPS演示)中,以下是最常用的十个功能,能够帮助用户高效制作…...
HTML 语义化
目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案: 语义化标签: <header>:页头<nav>:导航<main>:主要内容<article>&#x…...

为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?
在建筑行业,项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升,传统的管理模式已经难以满足现代工程的需求。过去,许多企业依赖手工记录、口头沟通和分散的信息管理,导致效率低下、成本失控、风险频发。例如&#…...

微信小程序 - 手机震动
一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注:文档 https://developers.weixin.qq…...

如何在看板中有效管理突发紧急任务
在看板中有效管理突发紧急任务需要:设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP(Work-in-Progress)弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中,设立专门的紧急任务通道尤为重要,这能…...

相机从app启动流程
一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...

网络编程(UDP编程)
思维导图 UDP基础编程(单播) 1.流程图 服务器:短信的接收方 创建套接字 (socket)-----------------------------------------》有手机指定网络信息-----------------------------------------------》有号码绑定套接字 (bind)--------------…...
大学生职业发展与就业创业指导教学评价
这里是引用 作为软工2203/2204班的学生,我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要,而您认真负责的教学态度,让课程的每一部分都充满了实用价值。 尤其让我…...
Mobile ALOHA全身模仿学习
一、题目 Mobile ALOHA:通过低成本全身远程操作学习双手移动操作 传统模仿学习(Imitation Learning)缺点:聚焦与桌面操作,缺乏通用任务所需的移动性和灵活性 本论文优点:(1)在ALOHA…...

人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式
今天是关于AI如何在教学中增强学生的学习体验,我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育,这并非炒作,而是已经发生的巨大变革。教育机构和教育者不能忽视它,试图简单地禁止学生使…...
Python 训练营打卡 Day 47
注意力热力图可视化 在day 46代码的基础上,对比不同卷积层热力图可视化的结果 import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import DataLoader import matplotlib.pypl…...