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)笔记中涉及资源: 一、二分查找①:代码实现1. 流程2. 代码实现3. 测试 ②:解决整数溢出(方法一&…...
快速构建数据产品原型 —— 我用 VChart Figma 插件
快速构建数据产品原型 —— 我用 VChart Figma 插件 10 种图表类型、24 种内置模板类型、丰富的图表样式配置、自动生成图表实现代码。VChart Figma 插件的目标是提供 便捷好用 & 功能丰富 & 开发友好 的 figma 图表创建能力。目前 VChart 插件功能仍在持续更新中&…...
登录—令牌技术
这里写目录标题 令牌技术2.4.1 JWT令牌2.4.2 jwt使用 令牌技术 令牌,其实它就是一个用户身份的标识,其实本质就是一个字符串。 如果通过令牌技术来跟踪会话,就可以在浏览器发起请求。在请求登录接口的时候,如果登录成功ÿ…...
NPOI 操作详解(操作Excel)
目录 1. 安装 NPOI 2. 使用 NPOI 创建新 Excel 文件 3. 设置列宽和行高 1. 设置列宽 2. 设置行高 3. 同时设置列宽和行高 4. 设置统一的行高 5. 设置统一的列宽 6. 应用统一的行高和列宽 4. 合并单元格 5. 设置单元格样式(字体、边框、背景色等…...
2024年北京海淀区中小学生信息学竞赛校级预选赛试题
2024年北京海淀区中小学生信息学竞赛校级预选赛试题 题目总数:24 总分数:100 编程基础知识单选题 第 1 题 单选题 关于 2024年海淀区信息学竞赛的描述错误的是( ) A.报名在网上报名系统进行 B.必须经过学籍所在学校的指导教师审核 C.学校…...
GPT-SoVITS 部署方案
简介 当前主流的开源TTS框架,这里介绍部署该服务的主要流程和我在使用过程中出现的问题。 使用的技术 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 是一个便捷的工具,用于将本地服务器暴露到互联网上,常用于开发和调试。 1. 更新树莓派 首先,更新树莓派的系统: sudo apt update sudo apt upgrade -y2. 安装 Ngrok (1)下载 Ngrok: 访…...
多核架构的基本概念
目录 1.为什么使用多核 2.多核分类 2.1 同构和异构 2.2 SMP和AMP 3 小结 1.为什么使用多核 这个问题个人认为可以从两个方面来看: 性能问题 随着汽车ECU对集成化的要求越来越高,把多个ECU功能集中到一个多核MCU的需求也越来越明显。 以汽车制动…...
yolov8模型推理测试代码(pt/onnx)
🦖yolov8训练出来的模型,不使用detect.py代码进行模型测试🦖 pt格式模型测试 import cv2 import os from ultralytics import YOLO # 定义输入和输出文件夹路径 input_folder /input/folder # 输入文件夹 output_folder /output/folder …...
二叉树 最大深度(递归)
给定一个二叉树 root ,返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 示例 1: 输入:root [3,9,20,null,null,15,7] 输出:3示例 2: 输入:root [1,null,2] 输出…...
C++详细笔记(五)
1.类和对象 1.1运算符重载(补) 1.运算符重载中,参数顺序和操作数顺序是一致的。 2.一般成员函数重载为成员函数,输入流和输出流重载为全局函数。 3.由1和2只正常的成员函数默认第一个参数为this指针而重载中参数顺序和操作数顺…...
简易CPU设计入门:译码模块(一)
项目代码下载 还是请大家首先准备好本项目所用的源代码。如果已经下载了,那就不用重复下载了。如果还没有下载,那么,请大家点击下方链接,来了解下载本项目的CPU源代码的方法。 下载本项目代码 准备好了项目源代码以后ÿ…...
力扣题目解析--三数之和
题目 给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k ,同时还满足 nums[i] nums[j] nums[k] 0 。请你返回所有和为 0 且不重复的三元组。 注意:答案中不可以包含重复的三元组。 示…...
qt QTabWidget详解
1、概述 QTabWidget是Qt框架中的一个控件,它提供了一个标签页式的界面,允许用户在不同的页面(或称为标签)之间切换。每个页面都可以包含不同的内容,如文本、图像、按钮或其他小部件。QTabWidget非常适合用于创建具有多…...
linux shell脚本学习(1):shell脚本基本概念与操作
1.什么是shell脚本 linux系统中,shell脚本或称之为bash shell程序,通常是由vim编辑,由linux命令、bash shell指令、逻辑控制语句、注释信息组成的可执行文件 *linux中常以.sh后缀作为shell脚本的后缀。linux系统中文件乃至脚本的后缀并没有…...
Savitzky-Golay(SG)滤波器
Savitzky-Golay(SG)滤波器是一种在时域内基于局域多项式最小二乘法拟合的滤波方法,它最初由Savitzky A和Golay M于1964年提出,并广泛应用于数据流平滑除噪。 基本介绍 一、基本原理 SG滤波器通过在滑动窗口内拟合多项式来平滑数…...
Webserver(2.7)共享内存
目录 共享内存共享内存实现进程通信 共享内存 共享内存比内存映射效率更高,因为内存映射关联了一个文件 共享内存实现进程通信 write.c #include <stdio.h> #include <sys/ipc.h> #include <sys/shm.h> #include <string.h>int main(){…...
【网安案例学习】凭证填充Credential Stuffing
### 凭证填充的深入讨论 凭证填充(Credential Stuffing)是一种网络攻击技术,攻击者利用从数据泄露中获取的大量用户名和密码组合,尝试在其他网站和服务上进行自动化登录。这种攻击依赖于用户在多个网站上重复使用相同密码的习惯。…...
网站建设公司怎么选?网站制作公司怎么选才不会出错?
寻找适合靠谱的网站设计公司,不要盲目选广告推最多的几家,毕竟要实现自身品牌营销,还是需要多方面考量。以下几个方面可以作为选择的参考: 1. 专业能力如何? 一个公司的专业能力,决定了最后网站设计的成果…...
Docker 离线安装指南
参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性,不同版本的Docker对内核版本有不同要求。例如,Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本,Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...
Java 语言特性(面试系列2)
一、SQL 基础 1. 复杂查询 (1)连接查询(JOIN) 内连接(INNER JOIN):返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...
大型活动交通拥堵治理的视觉算法应用
大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动(如演唱会、马拉松赛事、高考中考等)期间,城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例,暖城商圈曾因观众集中离场导致周边…...
Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...
【git】把本地更改提交远程新分支feature_g
创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...
Java入门学习详细版(一)
大家好,Java 学习是一个系统学习的过程,核心原则就是“理论 实践 坚持”,并且需循序渐进,不可过于着急,本篇文章推出的这份详细入门学习资料将带大家从零基础开始,逐步掌握 Java 的核心概念和编程技能。 …...
安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)
船舶制造装配管理现状:装配工作依赖人工经验,装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书,但在实际执行中,工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...
go 里面的指针
指针 在 Go 中,指针(pointer)是一个变量的内存地址,就像 C 语言那样: a : 10 p : &a // p 是一个指向 a 的指针 fmt.Println(*p) // 输出 10,通过指针解引用• &a 表示获取变量 a 的地址 p 表示…...
Python学习(8) ----- Python的类与对象
Python 中的类(Class)与对象(Object)是面向对象编程(OOP)的核心。我们可以通过“类是模板,对象是实例”来理解它们的关系。 🧱 一句话理解: 类就像“图纸”,对…...
2025-05-08-deepseek本地化部署
title: 2025-05-08-deepseek 本地化部署 tags: 深度学习 程序开发 2025-05-08-deepseek 本地化部署 参考博客 本地部署 DeepSeek:小白也能轻松搞定! 如何给本地部署的 DeepSeek 投喂数据,让他更懂你 [实验目的]:理解系统架构与原…...
