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

62-Java-面试专题(1)__基础

62-Java-面试专题(1)__基础-- 笔记

笔记内容来源与黑马程序员教学视频


文章目录

  • 62-Java-面试专题(1)__基础-- 笔记
  • Java-面试专题(1)
    • 笔记中涉及资源:
  • 一、二分查找
    • ①:代码实现
      • 1. 流程
      • 2. 代码实现
      • 3. 测试
    • ②:解决整数溢出(方法一)
    • ③:解决整数溢出(方法二)
    • ③:选择题目
    • ④:注意事项
  • 二、冒泡排序
    • ①:初步实现
    • ②:减少冒泡次数
    • ③:进一步优化
    • ④:总结
  • 三、选择排序
    • ①:代码实现
    • ②:总结
  • 四、插入排序
    • ①:代码实现
    • ②:总结
    • ③:插入和选择推到某一论排序结果
  • 五、快速排序
    • ①:文字描述
    • ②:单边循环
    • ③:双边循环
      • 1. 代码实现
      • 2. 注意事项
    • ④:特点
  • 六、ArrayList扩容规则
  • 七、Iterator_FailFast_FailSafe
  • 八、LinkedList
  • 九、HashMap


Java-面试专题(1)

笔记中涉及资源:

一、二分查找

①:代码实现

1. 流程

  • 前提:有已排序数组A(假设已经做好)

  • 定义左边界L、右边界R,确定搜索范围,循环执行二分查找(3、4两步)

  • 获取中间索引M=Floor(L+R)/2)

  • 中间索引的值A[M]与待搜索的值T进行比较

    • ① A[M]==T表示找到,返回中间索引
    • ② A[M>T,中间值右侧的其它元素都大于T,无需比较,中间索引左边去找,M-1设置为右边界,重新查找
    • ③ A[M]<T,中间值左侧的其它元素都小于T,无需比较,中间索引右边去找,M+1设置为左边界,重新查找
  • 当L>R时,表示没有找到,应结束循环

2. 代码实现

    /*** 数据准备初始化一个排好序的数组*/public static int[] initArray(){Random random = new Random();// 创建一个数组,长度在10-20之间int len = random.nextInt(10) + 10;int[] array = new int[len];// 遍历添加数据for (int i = 0; i < array.length; i++) {array[i] = random.nextInt(100);}// 排序Arrays.sort(array);return array;}/*** 二分查找代码实现*/public static void testBinarySearch() {int[] array = initArray();System.out.println(Arrays.toString(array));System.out.println("请输入您要查找的数据:");int number = scanner.nextInt();// 初始化 开头 结尾 中间的下标int start = 0, end = array.length -1, middle;while (start <= end) {middle = (start + end) >>1;if (array[middle] == number){System.out.println("您要查找的数字下标为:" + middle);return;}else if (array[middle] > number){end = middle - 1;}else {start = middle +1;}}System.err.println("您要查找的数字不存在!");}public static void main(String[] args) {testBinarySearch();}

3. 测试

在这里插入图片描述
在这里插入图片描述

②:解决整数溢出(方法一)

在这里插入图片描述

③:解决整数溢出(方法二)

在这里插入图片描述

③:选择题目

  • 1.有一个有序表为1,5,8,11,19,22,31,35,40,45,48,49,50当二分查找值为48的结点时,查找成功需要比较的次数
4
  • 奇数二分取中间

  • 偶数二分取中间靠左

  • 2.使用二分法在序列1,4,6,7,15,33,39,50,64,78,75,81,89,96中查找元素81时,需要经过()次比较

4
  • 3.在已经的128个数组中二分查找一个数,需要比较的次数最多不超过多少次
7
  • 2n=128或128/2/2…直到1
  • 问题转化log^2 128,如果手边有计算器,用log10 128/log10 2
    • 是整数,则该整数即为最终结果
    • 是小数,则舍去小数部分,整数加一为最终结果

④:注意事项

  • 1.目前介绍的二分查找是以jdk中Arrays.binarySearch的实现作为讲解示范,后续选择题的解答思路也是以此为准
  • 2.但实际上,二分查找有诸多变体,一旦使用变体的实现代码,则左右边界的选取会有变化,进而会影响之前选择题的答案选择

二、冒泡排序

①:初步实现

    /*** 数据准备初始化一个数组*/public static int[] initArray(){Random random = new Random();// 创建一个数组,长度在10-20之间int len = random.nextInt(10) + 5;int[] array = new int[len];// 遍历添加数据for (int i = 0; i < array.length; i++) {array[i] = random.nextInt(100);}return array;}public static void main(String[] args) {// 调用方法获取一个无序的数组int[] array = initArray();System.out.println("排序前 :" + Arrays.toString(array));for (int i = 0; i < array.length -1; i++) {for (int j = 0; j < array.length - 1 - i; j++) {if (array[j] > array[j + 1]){array[j + 1] = array[j + 1] + array[j];array[j] = array[j + 1] - array[j];array[j + 1] = array[j + 1] - array[j];}}}System.out.println("排序后 :" + Arrays.toString(array));}

在这里插入图片描述

②:减少冒泡次数

在这里插入图片描述

    /*** 数据准备初始化一个数组*/public static int[] initArray(){Random random = new Random();// 创建一个数组,长度在10-20之间int len = random.nextInt(10) + 5;int[] array = new int[len];// 遍历添加数据for (int i = 0; i < array.length; i++) {array[i] = random.nextInt(100);}return array;}public static void main(String[] args) {// 调用方法获取一个无序的数组int[] array = initArray();System.out.println("排序前 :" + Arrays.toString(array));for (int i = 0; i < array.length -1; i++) {// 是否发生交换boolean swapped = false;for (int j = 0; j < array.length - 1 - i; j++) {System.out.println("比较次数:" + j);if (array[j] > array[j + 1]){array[j + 1] = array[j + 1] + array[j];array[j] = array[j + 1] - array[j];array[j + 1] = array[j + 1] - array[j];swapped = true;}}if (!swapped) {break;}System.out.println("第" + (i+1) + "排序 :" + Arrays.toString(array));}}

在这里插入图片描述

③:进一步优化

    /*** 数据准备初始化一个数组*/public static int[] initArray(){Random random = new Random();// 创建一个数组,长度在10-20之间int len = random.nextInt(10) + 5;int[] array = new int[len];// 遍历添加数据for (int i = 0; i < array.length; i++) {array[i] = random.nextInt(100);}return array;}public static void main(String[] args) {// 调用方法获取一个无序的数组int[] array = initArray();int n = array.length - 1;System.out.println("排序前 :" + Arrays.toString(array));for (int i = 0; i < n; i++) {int last = 0;for (int j = 0; j < n; j++) {System.out.println("比较次数:" + j);if (array[j] > array[j + 1]){array[j + 1] = array[j + 1] + array[j];array[j] = array[j + 1] - array[j];array[j + 1] = array[j + 1] - array[j];last = j;}}n = last;System.out.println("第" + (i+1) + "排序 :" + Arrays.toString(array));}}

在这里插入图片描述

④:总结

  • 文字描述
    (以升序为例)

    • 1.依次比较数组中相邻两个元素大小,若[a]>a[+1],则交换两个元素,两两都比较一遍称为一轮冒泡,结果是让最大的元素排至最后
    • 2.重复以上步骤,直到整个数组有序
  • 优化方式:

    • 每轮冒泡时,最后一次交换索引可以作为下一轮冒泡的比较次数,如果这个值为零,表示整个数组有序,直接退出外层循环即可

三、选择排序

①:代码实现

    /*** 数据准备初始化一个数组*/public static int[] initArray(){Random random = new Random();// 创建一个数组,长度在10-20之间int len = random.nextInt(10) + 5;int[] array = new int[len];// 遍历添加数据for (int i = 0; i < array.length; i++) {array[i] = random.nextInt(100);}return array;}public static void main(String[] args) {int[] array = initArray();System.out.println("排序前 :" + Arrays.toString(array));for (int i = 0; i < array.length - 1; i++) {// 每轮最小值对应的下标int minIndex = i;for (int j = i + 1; j < array.length; j++) {if (array[minIndex] > array[j]){minIndex = j;}}if (minIndex != i) {array[i] = array[minIndex] + array[i];array[minIndex] = array[i] - array[minIndex];array[i] = array[i] - array[minIndex];}System.out.println("第" + (i+1) + "次排序 :" + Arrays.toString(array));}}

②:总结

文字描述(以升序为例)

  • 1.将数组分为两个子集,排序的和未排序的,每一轮从未排序的子集中选出最小的元素,放入排序子集
  • 2.重复以上步骤,直到整个数组有序

优化方式

  • 1.为减少交换次数,每一轮可以先找最小的索引,在每轮最后再交换元素

与冒泡排序比较

  • 1.二者平均时间复杂度都是0(n2)
  • 2.选择排序一般要快于冒泡,因为其交换次数少
  • 3.但如果集合有序度高,冒泡优于选择
  • 4.冒泡属于稳定排序算法,而选择属于不稳定排序

四、插入排序

①:代码实现

    /*** 数据准备初始化一个数组*/public static int[] initArray(){Random random = new Random();// 创建一个数组,长度在10-20之间int len = random.nextInt(10) + 5;int[] array = new int[len];// 遍历添加数据for (int i = 0; i < array.length; i++) {array[i] = random.nextInt(100);}return array;}public static void main(String[] args) {int[] array = initArray();System.out.println("排序前 :" + Arrays.toString(array));for (int i = 1; i < array.length; i++) {// 假设最小值int minNum = array[i];int j = i-1;while (j >= 0) {if (minNum < array[j]) {array[j + 1] = array[j];}else {break;}j--;}array[j + 1] = minNum;System.out.println("第" + (i) + "次排序 :" + Arrays.toString(array));}}

②:总结

文字描述(以升序为例)

  • 1.将数组分为两个区域,排序区域和未排序区域,每一轮从未排序区域中取出第一个元素,插入到排序区域(需保证顺序)
  • 2.重复以上步骤,直到整个数组有序
    优化方式
  • 1.待插入元素进行比较时,遇到比自己小的元素,就代表找到了插入位置,无需进行后续比较
  • 2.插入时可以直接移动元素,而不是交换元素
    与选择排序比较
  • 1.二者平均时间复杂度都是0(n2)
  • 2.大部分情况下,插入都略优于选择
  • 3.有序集合插入的时间复杂度为O(m)公
  • 4.插入属于稳定排序算法,而选择属于不稳定排序

③:插入和选择推到某一论排序结果

1. 使用直接插入排序算法对序列18,23,19,9,23,15进行排序,第三趟排序后的结果为()

  • A.9,18,15,23,19,23
  • B.18,23,19,9,23,15
  • C.18,19,23,9,23,15
  • D.9,18,19,23,23,15

2. 使用直接选择排序算法对序列18,23,19,9,23,15进行排序,第3趟排序后的结果为()

  • A.9,23,19,18,23,15
  • B.9,15,18,19,23,23
  • C.18,19,23,9,23,15
  • D.18,19,23,9,15,23

五、快速排序

①:文字描述

  • 每一轮排序选择一个基准点(pivot)进行分区

    • 1.让小于基准点的元素的进入一个分区,大于基准点的元素的进入另一个分区
    • 2.当分区完成时,基准点元素的位置就是其最终位置
  • 在子分区内重复以上过程,直至子分区元素个数少于等于1,这体现的是分而治之的思想(divide-and-conquer)

②:单边循环

单边循环快排(lomuto洛穆托分区方案)

  • 选择最右元素作为基准点元素
  • j指针负责找到比基准点小的元素,一旦找到则与ⅰ进行交换
  • ⅰ指针维护小于基准点元素的边界,也是每次交换的目标索引
  • 最后基准点与ⅰ交换,ⅰ即为分区位置

在这里插入图片描述

    /*** 数据准备初始化一个数组*/public static int[] initArray(){Random random = new Random();// 创建一个数组,长度在10-20之间int len = random.nextInt(10) + 5;int[] array = new int[len];// 遍历添加数据for (int i = 0; i < array.length; i++) {array[i] = random.nextInt(100);}return array;}/*** 选择一个基准点(pivot)进行分区* @param array 排序数组* @param l 左边界* @param pivot 基准点* @return 返回值 = 分区后中间索引值*/public static int  partition(int[] array, int l, int pivot){// 右侧基准点(值)int pivotNum = array[pivot];int i = l;for (int j = l; j < pivot; j++) {if (array[j] < pivotNum) {if (i != j){swap(array, i, j);}i ++;}}if (i != pivot){swap(array, i, pivot);}return i;}/*** 交换位置* @param array 数组* @param i 位置1* @param j 位置2*/private static void swap(int[] array, int i, int j) {int temp = array[j];array[j] = array[i];array[i] = temp;}/*** 递归排序* @param array 排序数组* @param l 左边界* @param pivot 基准点*/public static void quick(int[] array, int l, int pivot){if (l >= pivot){return;}int index = partition(array, l, pivot);quick(array,l, index -1);quick(array,index +1,pivot);}public static void main(String[] args) {int[] array = initArray();System.out.println("排序前 :" + Arrays.toString(array));quick(array, 0, array.length - 1);System.out.println("排序后 :" + Arrays.toString(array));}

在这里插入图片描述

③:双边循环

双边循环快排(并不完全等价于hoare霍尔分区方案)

  • 选择最左元素作为基准点元素
  • j指针负责从右向左找比基准点小的元素,ⅰ指针负责从左向右
    找比基准点大的元素,一旦找到二者交换,直至ⅰ,j相交
  • 最后基准点与ⅰ(此时ⅰ与j相等)交换,ⅰ即为分区位置

1. 代码实现

    /*** 数据准备初始化一个数组*/public static int[] initArray(){Random random = new Random();// 创建一个数组,长度在10-20之间int len = random.nextInt(10) + 5;int[] array = new int[len];// 遍历添加数据for (int i = 0; i < array.length; i++) {array[i] = random.nextInt(100);}return array;}/*** 选择一个基准点(pivot)进行分区* @param array 排序数组* @param l 左边界* @param r 右边界* @return 返回值 = 分区后中间索引值*/public static int  partition(int[] array, int l, int r){// 左侧基准点(值)int pivotNum = array[l];int i = l;int j = r;while (i < j) {// j从右边找比基准点小的值while (i < j && array[j] > pivotNum){j--;}// i 从左边找比基准点大的值while (i < j && array[i] <= pivotNum){i++;}swap(array, i, j);}swap(array, i, l);return i;}/*** 交换位置* @param array 数组* @param i 位置1* @param j 位置2*/private static void swap(int[] array, int i, int j) {int temp = array[j];array[j] = array[i];array[i] = temp;}/*** 递归排序* @param array 排序数组* @param l 左边界* @param pivot 基准点*/public static void quick(int[] array, int l, int pivot){if (l >= pivot){return;}int index = partition(array, l, pivot);quick(array,l, index -1);quick(array,index +1,pivot);}public static void main(String[] args) {int[] array = initArray();System.out.println("排序前 :" + Arrays.toString(array));quick(array, 0, array.length - 1);System.out.println("排序后 :" + Arrays.toString(array));}

2. 注意事项

  • 1.基准点在左边,并且要先 j 后 i (先从右边找在从左边找)

  • 2.while ( i < j && array[ j ] > pivotNum)

// j从右边找比基准点小的值
while (i < j && array[j] > pivotNum){j--;
}
  • 3.while (i < j && array[i] <= pivotNum)
// i 从左边找比基准点大的值
while (i < j && array[i] <= pivotNum){i++;
}

④:特点


附绿

  • 洛穆托vs霍尔 https:/qastack.cn/cs/11458/quicksort-partitioning-hoare-Vs-lomuto

六、ArrayList扩容规则

可以看看这位博主的:https://www.cnblogs.com/ruoli-0/p/13714389.html

  • ArrayList()会使用长度为零的数组
    • 直接调用无参方法初始容量为0(空数组)
  • ArrayList(int initialCapacity)会使用指定容量的数组
    • 调用有参方法数组容量为传入的容量值
  • public ArrayList(Collection<?extends E>c)会使用c的大小作为数组容量
    • 传入的是一个集合使用的是集合的大小
  • add(0 bject o)首次扩容为10,再次扩容为上次容量的1.5倍
  • addAll(Collection c)没有元素时,扩容为Math.max(10,实际元素个数),有元素时为Math.max(原容量1.5倍,实际元素个数)
    • 如过集合中没有元素 扩容会在(10和实际元素个数)中选择一个大的,有元素时扩容会在(原容量1.5倍和实际元素个数)选择一个大的

ArrayList的特点:

  • 1.ArrayList的底层数据结构是数组,所以查找遍历快,增删慢。

  • 2.ArrayList可随着元素的增长而自动扩容,正常扩容的话,每次扩容到原来的1.5倍。

  • 3.ArrayList的线程是不安全的。

ArrayList的扩容:

扩容可分为两种情况:

第一种情况,当ArrayList的容量为0时,此时添加元素的话,需要扩容,三种构造方法创建的ArrayList在扩容时略有不同:

  • 1.无参构造,创建ArrayList后容量为0,添加第一个元素后,容量变为10,此后若需要扩容,则正常扩容。

  • 2.传容量构造,当参数为0时,创建ArrayList后容量为0,添加第一个元素后,容量为1,此时ArrayList是满的,下次添加元素时需正常扩容。

  • 3.传列表构造,当列表为空时,创建ArrayList后容量为0,添加第一个元素后,容量为1,此时ArrayList是满的,下次添加元素时需正常扩容。

第二种情况,当ArrayList的容量大于0,并且ArrayList是满的时,此时添加元素的话,进行正常扩容,每次扩容到原来的1.5倍。

七、Iterator_FailFast_FailSafe

  • ArrayList是fail-fast的典型代表,遍历的同时不能修改,尽快失败
  • CopyOnWriteArrayList是fail-safe的典型代表,遍历的同时可以修改,原理是读写分离

并发篇-32-ConcurrentHashMap

八、LinkedList

九、HashMap

相关文章:

62-Java-面试专题(1)__基础

62-Java-面试专题(1)__基础-- 笔记 笔记内容来源与黑马程序员教学视频 文章目录 62-Java-面试专题(1)__基础-- 笔记Java-面试专题(1)笔记中涉及资源&#xff1a; 一、二分查找①&#xff1a;代码实现1. 流程2. 代码实现3. 测试 ②&#xff1a;解决整数溢出&#xff08;方法一&…...

快速构建数据产品原型 —— 我用 VChart Figma 插件

快速构建数据产品原型 —— 我用 VChart Figma 插件 10 种图表类型、24 种内置模板类型、丰富的图表样式配置、自动生成图表实现代码。VChart Figma 插件的目标是提供 便捷好用 & 功能丰富 & 开发友好 的 figma 图表创建能力。目前 VChart 插件功能仍在持续更新中&…...

登录—令牌技术

这里写目录标题 令牌技术2.4.1 JWT令牌2.4.2 jwt使用 令牌技术 令牌&#xff0c;其实它就是一个用户身份的标识&#xff0c;其实本质就是一个字符串。 如果通过令牌技术来跟踪会话&#xff0c;就可以在浏览器发起请求。在请求登录接口的时候&#xff0c;如果登录成功&#xff…...

NPOI 操作详解(操作Excel)

目录 1. 安装 NPOI 2. 使用 NPOI 创建新 Excel 文件 3. 设置列宽和行高 1. 设置列宽 2. 设置行高 3. 同时设置列宽和行高 4. 设置统一的行高 5. 设置统一的列宽 6. 应用统一的行高和列宽 4. 合并单元格 5. 设置单元格样式&#xff08;字体、边框、背景色等&#xf…...

2024年北京海淀区中小学生信息学竞赛校级预选赛试题

2024年北京海淀区中小学生信息学竞赛校级预选赛试题 题目总数&#xff1a;24 总分数&#xff1a;100 编程基础知识单选题 第 1 题 单选题 关于 2024年海淀区信息学竞赛的描述错误的是( ) A.报名在网上报名系统进行 B.必须经过学籍所在学校的指导教师审核 C.学校…...

GPT-SoVITS 部署方案

简介 当前主流的开源TTS框架&#xff0c;这里介绍部署该服务的主要流程和我在使用过程中出现的问题。 使用的技术 Docker、Jupyter、Python、C# 部署 docker的使用 拉取命令 docker pull jupyter/base-notebook:python-3.10.11jupyter的访问 docker运行以后可以直接使用…...

pdf添加目录标签python(手动配置)

先安装对应的库: pip install pypdf 代码分为两个部分,一部分是config.py,代码如下: offset=10 catgorys=[("第一章",12),("第二章",45), ] 需要自己手动更改offset,和目录列表 下面是主要代码: import pypdf # import sys from config import…...

Ngrok 在树莓派上的配置与使用教程

Ngrok 是一个便捷的工具&#xff0c;用于将本地服务器暴露到互联网上&#xff0c;常用于开发和调试。 1. 更新树莓派 首先&#xff0c;更新树莓派的系统&#xff1a; sudo apt update sudo apt upgrade -y2. 安装 Ngrok &#xff08;1&#xff09;下载 Ngrok&#xff1a; 访…...

多核架构的基本概念

目录 1.为什么使用多核 2.多核分类 2.1 同构和异构 2.2 SMP和AMP 3 小结 1.为什么使用多核 这个问题个人认为可以从两个方面来看&#xff1a; 性能问题 随着汽车ECU对集成化的要求越来越高&#xff0c;把多个ECU功能集中到一个多核MCU的需求也越来越明显。 以汽车制动…...

yolov8模型推理测试代码(pt/onnx)

&#x1f996;yolov8训练出来的模型&#xff0c;不使用detect.py代码进行模型测试&#x1f996; pt格式模型测试 import cv2 import os from ultralytics import YOLO # 定义输入和输出文件夹路径 input_folder /input/folder # 输入文件夹 output_folder /output/folder …...

二叉树 最大深度(递归)

给定一个二叉树 root &#xff0c;返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;3示例 2&#xff1a; 输入&#xff1a;root [1,null,2] 输出…...

C++详细笔记(五)

1.类和对象 1.1运算符重载&#xff08;补&#xff09; 1.运算符重载中&#xff0c;参数顺序和操作数顺序是一致的。 2.一般成员函数重载为成员函数&#xff0c;输入流和输出流重载为全局函数。 3.由1和2只正常的成员函数默认第一个参数为this指针而重载中参数顺序和操作数顺…...

简易CPU设计入门:译码模块(一)

项目代码下载 还是请大家首先准备好本项目所用的源代码。如果已经下载了&#xff0c;那就不用重复下载了。如果还没有下载&#xff0c;那么&#xff0c;请大家点击下方链接&#xff0c;来了解下载本项目的CPU源代码的方法。 下载本项目代码 准备好了项目源代码以后&#xff…...

力扣题目解析--三数之和

题目 给你一个整数数组 nums &#xff0c;判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k &#xff0c;同时还满足 nums[i] nums[j] nums[k] 0 。请你返回所有和为 0 且不重复的三元组。 注意&#xff1a;答案中不可以包含重复的三元组。 示…...

qt QTabWidget详解

1、概述 QTabWidget是Qt框架中的一个控件&#xff0c;它提供了一个标签页式的界面&#xff0c;允许用户在不同的页面&#xff08;或称为标签&#xff09;之间切换。每个页面都可以包含不同的内容&#xff0c;如文本、图像、按钮或其他小部件。QTabWidget非常适合用于创建具有多…...

linux shell脚本学习(1):shell脚本基本概念与操作

1.什么是shell脚本 linux系统中&#xff0c;shell脚本或称之为bash shell程序&#xff0c;通常是由vim编辑&#xff0c;由linux命令、bash shell指令、逻辑控制语句、注释信息组成的可执行文件 *linux中常以.sh后缀作为shell脚本的后缀。linux系统中文件乃至脚本的后缀并没有…...

Savitzky-Golay(SG)滤波器

Savitzky-Golay&#xff08;SG&#xff09;滤波器是一种在时域内基于局域多项式最小二乘法拟合的滤波方法&#xff0c;它最初由Savitzky A和Golay M于1964年提出&#xff0c;并广泛应用于数据流平滑除噪。 基本介绍 一、基本原理 SG滤波器通过在滑动窗口内拟合多项式来平滑数…...

Webserver(2.7)共享内存

目录 共享内存共享内存实现进程通信 共享内存 共享内存比内存映射效率更高&#xff0c;因为内存映射关联了一个文件 共享内存实现进程通信 write.c #include <stdio.h> #include <sys/ipc.h> #include <sys/shm.h> #include <string.h>int main(){…...

【网安案例学习】凭证填充Credential Stuffing

### 凭证填充的深入讨论 凭证填充&#xff08;Credential Stuffing&#xff09;是一种网络攻击技术&#xff0c;攻击者利用从数据泄露中获取的大量用户名和密码组合&#xff0c;尝试在其他网站和服务上进行自动化登录。这种攻击依赖于用户在多个网站上重复使用相同密码的习惯。…...

网站建设公司怎么选?网站制作公司怎么选才不会出错?

寻找适合靠谱的网站设计公司&#xff0c;不要盲目选广告推最多的几家&#xff0c;毕竟要实现自身品牌营销&#xff0c;还是需要多方面考量。以下几个方面可以作为选择的参考&#xff1a; 1. 专业能力如何&#xff1f; 一个公司的专业能力&#xff0c;决定了最后网站设计的成果…...

19. 架构重要需求

文章目录 第19章 架构重要需求19.1 从需求文档中收集架构重要需求&#xff08;ASRs&#xff09;不要抱太大希望从需求文档中找出架构重要需求 19.2 通过访谈利益相关者收集架构重要需求19.3 通过理解业务目标收集架构重要需求19.4 在效用树中捕获架构重要需求19.5 变化总会发生…...

iOS 再谈KVC、 KVO

故事背景&#xff1a;大厂面试&#xff0c;又问道了基本的kvc kvo的原理和使用&#xff0c;由于转了前端&#xff0c;除了个setter和getter&#xff0c;我全忘记了&#xff0c;其实还是没有理解记忆&#xff0c;下面再看一下kvc 和kvo ,总结一个让人通过理解而无法忘记的方法&a…...

java、excel表格合并、指定单元格查找、合并文件夹

#创作灵感# 公司需求 记录工作内容 后端&#xff1a;JAVA、Solon、easyExcel、FastJson2 前端&#xff1a;vue2.js、js、HTML 模式1&#xff1a;合并文件夹 * 现有很多文件夹 想合并全部全部的文件夹的文件到一个文件夹内 * 每个部门发布的表格 合并全部的表格为方便操作 模…...

最基础版编译运行Java(纯小白)

流程图&#xff1a; ⚠ 需要先安装JDK (Java Development Kit) 1. 写文件 首先写好自己的“文件”&#xff0c;可以用Sublime Text等文本编辑器写&#xff0c;还可以直接新建文本文档写一个.txt文件。 以编写一个HelloWorld程序为例&#xff1a; public class HelloWorld{p…...

六西格玛项目助力,手术机器人零部件国产化稳中求胜——张驰咨询

项目背景 XR-1000型腔镜手术机器人是某头部手术机器人企业推出的高端手术设备&#xff0c;专注于微创手术领域&#xff0c;具有高度的精确性和稳定性。而XR-1000型机器人使用的部分核心零部件长期依赖进口&#xff0c;特别是高精度电机、关节执行机构和视觉系统等&#xff0c;…...

Python爬虫系列(一)

目录 一、urllib 1.1 初体验 1.2 使用urllib下载网页、图片、视频等 1.3 反爬介绍 1.4 请求对象定制 1.5 get请求的quote方法 1.6 多个参数转成ascii编码 1.7 post请求 1.8 综合案例演示 一、urllib 1.1 初体验 # urllib是python默认带的&#xff0c;无需额外下载 i…...

# vim那些事...... vim删除文件全部内容

vim那些事… vim删除文件全部内容 1、在 Vim 中删除整个文件的内容&#xff0c;可以使用以下命令&#xff1a; 1&#xff09;打开 Vim&#xff0c;并编辑你想要清空的文件。 2&#xff09;按 Esc 确保你不在插入模式&#xff0c;而在命令模式。 3&#xff09;输入 gg 跳转到…...

Selinux及防火墙

一&#xff0c;selinux简介&#xff1a; SELinux&#xff08;Security-Enhanced Linux&#xff09;是一个Linux内核安全模块&#xff0c;旨在提供强制访问控制&#xff08;MAC&#xff09;机制&#xff0c;以增强系统的安全性。由美国国家安全局&#xff08;NSA&#xff09;开…...

业绩代码查询实战——php

一、一级代码显示职员 foreach($data_职员信息 as $key > $value){//$where_查询分类$where_查询通用;//$dat分类one $业绩提成->where($where_查询分类)->order("CreateDate desc")->select();if($value[haschildname]0 && $value[key] !"…...

内网穿透技术选型PPTP(点对点隧道协议)和 FRP(Fast Reverse Proxy)

PPTP&#xff08;点对点隧道协议&#xff09;和 FRP&#xff08;Fast Reverse Proxy&#xff09;是两种实现内网穿透的技术&#xff0c;但它们的工作原理、使用场景和特点有很大区别。以下是它们的详细比较&#xff1a; PPTP&#xff08;Point-to-Point Tunneling Protocol&am…...