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

Android第十二次面试-多线程和字符串算法总结

多线程的创建与常见使用方法

一、多线程创建方式
1. 继承Thread类
class MyThread extends Thread {@Overridepublic void run() {// 线程执行逻辑System.out.println(Thread.currentThread().getName() + " is running");}
}// 使用
MyThread thread = new MyThread();
thread.start(); // 启动线程
2. 实现Runnable接口
class MyRunnable implements Runnable {@Overridepublic void run() {System.out.println(Thread.currentThread().getName() + " is running");}
}// 使用
Thread thread = new Thread(new MyRunnable());
thread.start();
​3. Android特有方式
// HandlerThread(自带Looper)
HandlerThread handlerThread = new HandlerThread("WorkerThread");
handlerThread.start();
Handler handler = new Handler(handlerThread.getLooper()) {@Overridepublic void handleMessage(Message msg) {// 后台线程处理消息}
};// 发送消息
handler.sendEmptyMessage(0);

二、线程池使用(推荐方式)​
1. 创建线程池
// 固定大小线程池
ExecutorService fixedPool = Executors.newFixedThreadPool(4);// 缓存线程池(自动扩容)
ExecutorService cachedPool = Executors.newCachedThreadPool();// 单线程池(顺序执行)
ExecutorService singleThreadPool = Executors.newSingleThreadExecutor();
2. 提交任务
// 执行Runnable任务
fixedPool.execute(() -> {System.out.println("Task running in thread pool");
});// 提交Callable任务并获取Future
Future<String> future = fixedPool.submit(() -> {return "Task result";
});
3. 自定义线程池
ThreadPoolExecutor customPool = new ThreadPoolExecutor(4, // 核心线程数10, // 最大线程数60, // 空闲线程存活时间(秒)TimeUnit.SECONDS,new LinkedBlockingQueue<>(100) // 任务队列
);// 拒绝策略(当队列满时)
customPool.setRejectedExecutionHandler((task, executor) -> {System.err.println("Task rejected: " + task);
});

​1. 交替打印数字(两个线程协作)

题目​:两个线程交替打印1~100,一个线程打印奇数,另一个打印偶数

public class AlternatePrint {private int num = 1;private final Object lock = new Object();public void printOdd() {synchronized (lock) {while (num <= 100) {if (num % 2 == 1) {System.out.println(Thread.currentThread().getName() + ": " + num++);lock.notify(); // 唤醒偶数线程} else {try {lock.wait(); // 等待偶数线程通知} catch (InterruptedException e) {Thread.currentThread().interrupt();}}}}}public void printEven() {synchronized (lock) {while (num <= 100) {if (num % 2 == 0) {System.out.println(Thread.currentThread().getName() + ": " + num++);lock.notify(); // 唤醒奇数线程} else {try {lock.wait(); // 等待奇数线程通知} catch (InterruptedException e) {Thread.currentThread().interrupt();}}}}}public static void main(String[] args) {AlternatePrint printer = new AlternatePrint();new Thread(printer::printOdd, "OddThread").start();new Thread(printer::printEven, "EvenThread").start();}
}
2. 生产者-消费者模型(缓冲区管理)

题目​:实现生产者线程生成数据,消费者线程消费数据,使用阻塞队列控制

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;public class ProducerConsumer {private static final int CAPACITY = 5;private final BlockingQueue<Integer> queue = new ArrayBlockingQueue<>(CAPACITY);public void produce() throws InterruptedException {int value = 0;while (true) {synchronized (this) {while (queue.size() == CAPACITY) {wait(); // 缓冲区满时等待}queue.put(value);System.out.println("Produced: " + value);value++;notifyAll(); // 通知消费者}Thread.sleep(100); // 模拟生产耗时}}public void consume() throws InterruptedException {while (true) {synchronized (this) {while (queue.isEmpty()) {wait(); // 缓冲区空时等待}int value = queue.take();System.out.println("Consumed: " + value);notifyAll(); // 通知生产者}Thread.sleep(150); // 模拟消费耗时}}public static void main(String[] args) {ProducerConsumer pc = new ProducerConsumer();new Thread(() -> {try { pc.produce(); } catch (InterruptedException e) { Thread.currentThread().interrupt(); }}, "Producer").start();new Thread(() -> {try { pc.consume(); } catch (InterruptedException e) { Thread.currentThread().interrupt(); }}, "Consumer").start();}
}
3. 多线程顺序打印(线程协同)

题目​:三个线程按顺序循环打印ABC各10次

public class SequentialPrinter {private final Object lock = new Object();private String state = "A";public void printA() {synchronized (lock) {for (int i = 0; i < 10; ) {if (state.equals("A")) {System.out.print("A");state = "B";i++;lock.notifyAll(); // 唤醒所有等待线程} else {try {lock.wait(); // 等待条件满足} catch (InterruptedException e) {Thread.currentThread().interrupt();}}}}}// 类似实现printB()和printC()public void printB() {synchronized (lock) {for (int i = 0; i < 10; ) {if (state.equals("B")) {System.out.print("B");state = "C";i++;lock.notifyAll();} else {try {lock.wait();} catch (InterruptedException e) {Thread.currentThread().interrupt();}}}}}public void printC() {synchronized (lock) {for (int i = 0; i < 10; ) {if (state.equals("C")) {System.out.print("C ");state = "A";i++;lock.notifyAll();} else {try {lock.wait();} catch (InterruptedException e) {Thread.currentThread().interrupt();}}}}}public static void main(String[] args) {SequentialPrinter printer = new SequentialPrinter();new Thread(printer::printA, "Thread-A").start();new Thread(printer::printB, "Thread-B").start();new Thread(printer::printC, "Thread-C").start();}
}
4. 多线程计算素数(任务分发)

题目​:使用线程池计算1~N范围内素数的数量

import java.util.concurrent.*;public class PrimeCounter {public static void main(String[] args) throws Exception {final int N = 1000000;final int THREADS = Runtime.getRuntime().availableProcessors();ExecutorService executor = Executors.newFixedThreadPool(THREADS);int segment = N / THREADS;Future<Integer>[] results = new Future[THREADS];// 分发任务for (int i = 0; i < THREADS; i++) {final int start = i * segment + 1;final int end = (i == THREADS - 1) ? N : (i + 1) * segment;results[i] = executor.submit(() -> {int count = 0;for (int num = start; num <= end; num++) {if (isPrime(num)) count++;}return count;});}// 汇总结果int totalPrimes = 0;for (Future<Integer> future : results) {totalPrimes += future.get();}System.out.println("Total primes: " + totalPrimes);executor.shutdown();}private static boolean isPrime(int n) {if (n <= 1) return false;if (n == 2) return true;if (n % 2 == 0) return false;for (int i = 3; i <= Math.sqrt(n); i += 2) {if (n % i == 0) return false;}return true;}
}
5. 自定义简单线程池

题目​:实现一个固定大小的线程池,支持提交任务和执行任务

import java.util.concurrent.*;
import java.util.*;public class SimpleThreadPool {private final BlockingQueue<Runnable> taskQueue;private final List<WorkerThread> workers;private volatile boolean isShutdown = false;public SimpleThreadPool(int poolSize) {this.taskQueue = new LinkedBlockingQueue<>();this.workers = new ArrayList<>();for (int i = 0; i < poolSize; i++) {WorkerThread worker = new WorkerThread("Worker-" + i);worker.start();workers.add(worker);}}public void execute(Runnable task) {if (isShutdown) {throw new IllegalStateException("ThreadPool is shutdown");}taskQueue.offer(task);}public void shutdown() {isShutdown = true;workers.forEach(Thread::interrupt);}private class WorkerThread extends Thread {public WorkerThread(String name) {super(name);}@Overridepublic void run() {while (!isShutdown || !taskQueue.isEmpty()) {try {Runnable task = taskQueue.take();task.run();} catch (InterruptedException e) {// 处理中断,结束线程}}}}public static void main(String[] args) {SimpleThreadPool pool = new SimpleThreadPool(4);// 提交任务for (int i = 0; i < 10; i++) {final int taskId = i;pool.execute(() -> {System.out.println(Thread.currentThread().getName() + " executing Task-" + taskId);try {Thread.sleep(500);} catch (InterruptedException e) {Thread.currentThread().interrupt();}});}// 等待任务完成try {Thread.sleep(3000);} catch (InterruptedException e) {Thread.currentThread().interrupt();}pool.shutdown();}
}

字符串算法总结

1. 字符串反转

题目​:反转字符串或单词顺序

// 整个字符串反转
public String reverseString(String s) {char[] chars = s.toCharArray();int left = 0, right = chars.length - 1;while (left < right) {char temp = chars[left];chars[left++] = chars[right];chars[right--] = temp;}return new String(chars);
}// 单词顺序反转(保留空格)
public String reverseWords(String s) {String[] words = s.trim().split("\\s+");StringBuilder sb = new StringBuilder();for (int i = words.length - 1; i >= 0; i--) {sb.append(words[i]);if (i > 0) sb.append(" ");}return sb.toString();
}
2. 字符串转换整数 (atoi)

题目​:处理边界条件(空格/正负号/溢出)

public int myAtoi(String s) {int index = 0, sign = 1, total = 0;// 1. 跳过空格while (index < s.length() && s.charAt(index) == ' ') index++;if (index == s.length()) return 0;// 2. 处理正负号if (s.charAt(index) == '+' || s.charAt(index) == '-') {sign = s.charAt(index) == '+' ? 1 : -1;index++;}// 3. 转换数字并处理溢出while (index < s.length()) {int digit = s.charAt(index) - '0';if (digit < 0 || digit > 9) break;// 检查溢出if (total > Integer.MAX_VALUE / 10 || (total == Integer.MAX_VALUE / 10 && digit > 7)) {return sign == 1 ? Integer.MAX_VALUE : Integer.MIN_VALUE;}total = total * 10 + digit;index++;}return total * sign;
}
3. 最长公共前缀

题目​:查找字符串数组的最长公共前缀

public String longestCommonPrefix(String[] strs) {if (strs == null || strs.length == 0) return "";for (int i = 0; i < strs[0].length(); i++) {char c = strs[0].charAt(i);for (int j = 1; j < strs.length; j++) {if (i == strs[j].length() || strs[j].charAt(i) != c) {return strs[0].substring(0, i);}}}return strs[0];
}
4. 无重复字符的最长子串

题目​:滑动窗口经典应用

public int lengthOfLongestSubstring(String s) {Map<Character, Integer> map = new HashMap<>();int maxLen = 0;for (int left = 0, right = 0; right < s.length(); right++) {char c = s.charAt(right);if (map.containsKey(c)) {left = Math.max(left, map.get(c) + 1); // 跳过重复字符}map.put(c, right);maxLen = Math.max(maxLen, right - left + 1);}return maxLen;
}
5. 最长回文子串

题目​:中心扩展法

public String longestPalindrome(String s) {if (s == null || s.length() < 1) return "";int start = 0, end = 0;for (int i = 0; i < s.length(); i++) {int len1 = expand(s, i, i);      // 奇数长度int len2 = expand(s, i, i + 1);  // 偶数长度int len = Math.max(len1, len2);if (len > end - start) {start = i - (len - 1) / 2;end = i + len / 2;}}return s.substring(start, end + 1);
}private int expand(String s, int left, int right) {while (left >= 0 && right < s.length() && s.charAt(left) == s.charAt(right)) {left--;right++;}return right - left - 1;
}
6. 字符串匹配算法(KMP)

题目​:实现 strStr()

public int strStr(String haystack, String needle) {// 空模式串直接返回 0if (needle.isEmpty()) return 0;// 核心预处理:计算 next 数组int[] next = getNext(needle);int i = 0, j = 0;while (i < haystack.length()) {// 当前字符匹配:继续比较后续字符if (j == -1 || haystack.charAt(i) == needle.charAt(j)) {i++;j++;} // 字符不匹配:模式串向右滑动else {j = next[j];}// 完整匹配成功if (j == needle.length()) {return i - j;}}return -1;
}// 计算 next 数组(部分匹配表)
private int[] getNext(String pattern) {int[] next = new int[pattern.length()];next[0] = -1;  // 初始值int i = 0, j = -1;while (i < pattern.length() - 1) {if (j == -1 || pattern.charAt(i) == pattern.charAt(j)) {i++;j++;next[i] = j;} else {j = next[j];  // 回退到上一匹配位置}}return next;
}

KMP 算法四步流程

  1. 初始化预处理

    • 对于模式串 needle,计算其 next 数组
    • next[i] 表示当 needle[i] 匹配失败时,模式串应该回退到的位置
  2. next 数组构建过程

    • 使用双指针 i(主指针)和 j(前缀指针)
    • next[0] = -1 作为特殊标记
    • 通过最长公共前后缀的查找计算每个位置的 next 值:
      模式串: "ABCDABD"
      next[]: [-1,0,0,0,0,1,2]
  3. 滑动匹配过程

    • 主串指针 i ​永不回溯
    • 当匹配失败时,模式串指针 j 回退到 next[j] 的位置
    • 利用 next 数组避免回溯导致的重复比较
  4. 匹配成功判断

    • 当 j == needle.length() 时,表示模式串完全匹配
    • 返回起始位置:i - j

优化(Hash) 

7. 有效的括号

题目​:栈的经典应用

public boolean isValid(String s) {Stack<Character> stack = new Stack<>();for (char c : s.toCharArray()) {if (c == '(') stack.push(')');else if (c == '[') stack.push(']');else if (c == '{') stack.push('}');else if (stack.isEmpty() || stack.pop() != c) return false;}return stack.isEmpty();
}
8. 字母异位词分组

题目​:HashMap的巧妙使用

public List<List<String>> groupAnagrams(String[] strs) {Map<String, List<String>> map = new HashMap<>();for (String s : strs) {char[] chars = s.toCharArray();Arrays.sort(chars);String key = new String(chars);map.computeIfAbsent(key, k -> new ArrayList<>()).add(s);}return new ArrayList<>(map.values());
}
9. 编辑距离(动态规划)

题目​:计算最小操作次数

public int minDistance(String word1, String word2) {int m = word1.length(), n = word2.length();int[][] dp = new int[m + 1][n + 1];for (int i = 0; i <= m; i++) dp[i][0] = i;for (int j = 0; j <= n; j++) dp[0][j] = j;for (int i = 1; i <= m; i++) {for (int j = 1; j <= n; j++) {if (word1.charAt(i - 1) == word2.charAt(j - 1)) {dp[i][j] = dp[i - 1][j - 1];} else {dp[i][j] = 1 + Math.min(dp[i - 1][j - 1], Math.min(dp[i][j - 1], dp[i - 1][j]));}}}return dp[m][n];
}
10. 字符串解码

题目​:嵌套括号处理

public String decodeString(String s) {Stack<Integer> numStack = new Stack<>();Stack<StringBuilder> strStack = new Stack<>();StringBuilder cur = new StringBuilder();int num = 0;for (char c : s.toCharArray()) {if (Character.isDigit(c)) {num = num * 10 + (c - '0');} else if (c == '[') {numStack.push(num);strStack.push(cur);cur = new StringBuilder();num = 0;} else if (c == ']') {StringBuilder tmp = cur;cur = strStack.pop();int repeat = numStack.pop();for (int i = 0; i < repeat; i++) {cur.append(tmp);}} else {cur.append(c);}}return cur.toString();
}

相关文章:

Android第十二次面试-多线程和字符串算法总结

多线程的创建与常见使用方法 ​一、多线程创建方式​ ​1. 继承Thread类​ class MyThread extends Thread {Overridepublic void run() {// 线程执行逻辑System.out.println(Thread.currentThread().getName() " is running");} }// 使用 MyThread thread new …...

ES6——数组扩展之Set数组

在ES6&#xff08;ECMAScript 2015&#xff09;中&#xff0c;JavaScript的Set对象提供了一种存储任何值唯一性的方式&#xff0c;类似于数组但又不需要索引访问。这对于需要确保元素唯一性的场景非常有用。Set对象本身并不直接提供数组那样的方法来操作数据&#xff08;例如ma…...

Cursor Rules 使用

前言 最近在使用 Cursor 进行编程辅助时&#xff0c;发现 AI 生成的代码风格和当前的代码风格大相径庭。而且有时它会输出很奇怪的代码&#xff0c;总是不符合预期。 遂引出本篇&#xff0c;介绍一下 Rules &#xff0c;它就可以做一些规范约束之类的事情。 什么是 Cursor R…...

服务器数据恢复—服务器raid5阵列崩溃如何恢复数据?

服务器数据恢复环境&故障&#xff1a; 某品牌型号为X3850服务器上有一组由14块数据盘和1块热备盘组建的raid5磁盘阵列。 服务器在正常使用过程中突然崩溃&#xff0c;管理员查看raid5阵列故障情况的时发现磁盘阵列中有2块硬盘掉线&#xff0c;但是热备盘没有启用。 服务器数…...

Go语言堆内存管理

Go堆内存管理 1. Go内存模型层级结构 Golang内存管理模型与TCMalloc的设计极其相似。基本轮廓和概念也几乎相同&#xff0c;只是一些规则和流程存在差异。 2. Go内存管理的基本概念 Go内存管理的许多概念在TCMalloc中已经有了&#xff0c;含义是相同的&#xff0c;只是名字有…...

【DAY41】简单CNN

内容来自浙大疏锦行python打卡训练营 浙大疏锦行 知识点&#xff1a; 数据增强卷积神经网络定义的写法batch归一化&#xff1a;调整一个批次的分布&#xff0c;常用与图像数据特征图&#xff1a;只有卷积操作输出的才叫特征图调度器&#xff1a;直接修改基础学习率 卷积操作常…...

Rust 学习笔记:使用自定义命令扩展 Cargo

Rust 学习笔记&#xff1a;使用自定义命令扩展 Cargo Rust 学习笔记&#xff1a;使用自定义命令扩展 Cargo Rust 学习笔记&#xff1a;使用自定义命令扩展 Cargo Cargo 支持通过 $PATH 中的 cargo-something 形式的二进制文件拓展子命令&#xff0c;而无需修改 Cargo 本身。 …...

LeetCode 08.06 面试题 汉诺塔 (Java)

经典递归解决汉诺塔问题&#xff1a;清晰的三步移动策略 问题描述 在汉诺塔问题中&#xff0c;有 3 根柱子和 N 个大小不同的盘子&#xff0c;盘子初始按升序堆叠在第一根柱子上&#xff08;最小的在顶部&#xff09;。目标是将所有盘子移动到第三根柱子上&#xff0c;并满足…...

使用MinIO搭建自己的分布式文件存储

目录 引言&#xff1a; 一.什么是 MinIO &#xff1f; 二.MinIO 的安装与部署&#xff1a; 三.Spring Cloud 集成 MinIO&#xff1a; 1.前提准备&#xff1a; &#xff08;1&#xff09;安装依赖&#xff1a; &#xff08;2&#xff09;配置MinIO连接&#xff1a; &…...

单元测试与QTestLib框架使用

一.单元测试的意义 在软件开发中&#xff0c;单元测试是指对软件中最小可测试单元&#xff08;通常是函数、类的方法&#xff09;进行隔离的、可重复的验证。进行单元测试具有以下重要意义&#xff1a; 1.提升代码质量与可靠性&#xff1a; 早期错误检测&#xff1a; 在开发…...

java面试场景题:QPS 短链系统怎么设计

以下是对文章的润色版本&#xff1a; 这道场景设计题&#xff0c;初看似乎业务简单&#xff0c;实则覆盖的知识点极为丰富&#xff1a; 高并发与高性能分布式 ID 生成机制&#xff1b;Redis Bloom Filter——高并发、低内存损耗的过滤组件知识&#xff1b;分库、分表海量数据存…...

java面试场景提题:

以下是润色后的文章&#xff0c;结构更清晰&#xff0c;语言更流畅&#xff0c;同时保留了技术细节&#xff1a; 应对百倍QPS增长的系统设计策略 整体架构设计思路 面对突发性百倍QPS增长&#xff0c;系统设计需从硬件、架构、代码、数据四个维度协同优化&#xff1a; 硬件层…...

K7 系列各种PCIE IP核的对比

上面三个IP 有什么区别&#xff0c;什么时候用呢&#xff1f; 7 series Integrated Block for PCIE AXI Memory Mapped to PCI Express DMA subsystem for PCI Express 特点 这是 Kintex-7 内置的 硬核 PCIe 模块。部分事务层也集成在里面&#xff0c;使用标准的PCIE 基本没…...

natapp 内网穿透失败

连不上网络错误调试排查详解 - NATAPP-内网穿透 基于ngrok的国内高速内网映射工具 如何将DNS服务器修改为114.114.114.114_百度知道 连不上/错误信息等问题解决汇总 - NATAPP-内网穿透 基于ngrok的国内高速内网映射工具 nslookup auth.natapp.cnping auth.natapp.cn...

深入解析CI/CD开发流程

引言&#xff1a;主播最近实习的时候发现部门里面使用的是CI/CD这样的集成开发部署&#xff0c;但是自己不是太了解什么意思&#xff0c;所以就自己查了一下ci/cd相关的资料&#xff0c;整理分享了一下 一、CI/CD CI/CD是持续集成和持续交付部署的缩写&#xff0c;旨在简化并…...

Docke启动Ktransformers部署Qwen3MOE模型实战与性能测试

docker运行Ktransformers部署Qwen3MOE模型实战及 性能测试 最开始拉取ktransformers:v0.3.1-AVX512版本&#xff0c;发现无论如何都启动不了大模型&#xff0c;后来发现是cpu不支持avx512指令集。 由于本地cpu不支持amx指令集&#xff0c;因此下载avx2版本镜像&#xff1a; …...

应用分享 | 精准生成和时序控制!AWG在确定性三量子比特纠缠光子源中的应用

在量子技术飞速发展的今天&#xff0c;实现高效稳定的量子态操控是推动量子计算、量子通信等领域迈向实用化的关键。任意波形发生器&#xff08;AWG&#xff09;作为精准信号控制的核心设备&#xff0c;在量子实验中发挥着不可或缺的作用。丹麦哥本哈根大学的研究团队基于单个量…...

相机--相机标定实操

教程 camera_calibration移动画面示例 usb_cam使用介绍和下载 标定流程 单目相机标定 我使用的是USB相机&#xff0c;所以直接使用ros的usb_cam功能包驱动相机闭关获取实时图像&#xff0c;然后用ros的camera_calibration标定相机。 1,下载usb_cam和camera_calibration: …...

深入理解汇编语言中的顺序与分支结构

本文将结合Visual Studio环境配置、顺序结构编程和分支结构实现&#xff0c;全面解析汇编语言中的核心编程概念。通过实际案例演示无符号/有符号数处理、分段函数实现和逻辑表达式短路计算等关键技术。 一、汇编环境配置回顾&#xff08;Win32MASM&#xff09; 在Visual Studi…...

DAY43 复习日

浙大疏锦行-CSDN博客 kaggle找到一个图像数据集&#xff0c;用cnn网络进行训练并且用grad-cam做可视化 进阶&#xff1a;把项目拆分成多个文件 src/config.py: 用于存放项目配置&#xff0c;例如文件路径、学习率、批次大小等。 # src/config.py# Paths DATA_DIR "data…...

【仿生机器人】仿生机器人智能架构:从感知到个性的完整设计

仿生机器人智能架构&#xff1a;从感知到个性的完整设计 仿生机器人不仅需要模拟人类的外表&#xff0c;更需要具备类人的认知、情感和个性特征。本研究提出了一个综合性的软件架构&#xff0c;实现了从环境感知到情感生成、从实时交互到人格塑造的完整智能系统。该架构突破了…...

【业务框架】3C-相机-Cinemachine

概述 插件&#xff0c;做相机需求&#xff0c;等于相机老师傅多年经验总结的工具 Feature Transform&#xff1a;略Control Camera&#xff1a;控制相机参数Noise&#xff1a;增加随机性Blend&#xff1a;CameraBrain的混合列表指定一个虚拟相机到另一个相机的过渡&#xff…...

【Auto.js例程】华为备忘录导出到其他手机

目录 问题描述方法步骤1.安装下载Visual Studio Code2.安装扩展3.找到Auto.js插件&#xff0c;并安装插件4.启动服务器5.连接手机6.撰写脚本并运行7.本文实现功能的代码8.启动手机上的换机软件 问题描述 问题背景&#xff1a;华为手机换成一加手机&#xff0c;华为备忘录无法批…...

单片机的低功耗模式

什么是低功耗&#xff1f; STM32的低功耗&#xff08;low power mode&#xff09;特性是其嵌入式处理器系列的一个重要优势&#xff0c;特别适用于需要长时间运行且功耗敏感的应用场景&#xff0c;如便携式设备、物联网设备、智能家居系统等。 在很多应用场合中都对电子设备的…...

架构师级考验!飞算 JavaAI 炫技赛:AI 辅助编程解决老项目难题

当十年前 Hibernate 框架的 N1 查询隐患在深夜持续困扰排查&#xff0c;当 SpringMVC 控制器中错综复杂的业务逻辑在跨语言迁移时令人抓狂&#xff0c;企业数字化进程中的百万行老系统&#xff0c;已然成为暗藏危机的 “技术债冰山”。而此刻&#xff0c;飞算科技全新发布的 Ja…...

手机端抓包大麦网抢票协议:实现自动抢票与支付

&#x1f680; 手机端抓包大麦网抢票协议&#xff1a;实现自动抢票与支付 &#x1f680; &#x1f525; 你是否还在为抢不到热门演出票而烦恼&#xff1f;本文将教你如何通过抓包技术获取大麦网抢票协议&#xff0c;并编写脚本实现自动化抢票与支付&#xff01;&#x1f525; …...

使用阿里云百炼embeddings+langchain+Milvus实现简单RAG

使用阿里云百炼embeddingslangchainMilvus实现简单RAG 注意测试时&#xff0c;替换其中的key、文档等 import os from langchain_community.embeddings import DashScopeEmbeddings from langchain_community.vectorstores import Milvus from langchain_text_splitters impor…...

C#合并CAN ASC文件:实现与优化

C#合并CAN ASC文件&#xff1a;实现与优化 在汽车电子和工业控制领域&#xff0c;CAN&#xff08;Controller Area Network&#xff09;总线是一种广泛使用的通信协议。CAN ASC&#xff08;American Standard Code&#xff09;文件则是记录CAN总线通信数据的标准格式&#xff…...

[TIP] Ubuntu 22.04 配置多个版本的 GCC 环境

问题背景 在 Ubuntu 22.04 中安装 VMware 虚拟机时&#xff0c;提示缺少 VMMON 和 VMNET 模块 编译这两个模块需要 GCC 的版本大于 12.3.0&#xff0c;而 Ubuntu 22.04 自带的 GCC 版本为 11.4.0 因此需要安装对应的 GCC 版本&#xff0c;但为了不影响其他程序&#xff0c;需…...

如何思考?分析篇

现代人每天刷 100 条信息&#xff0c;却难静下心读 10 页书。 前言&#xff1a; 我一直把思考当作一件生活中和工作中最为重要的事情。但是我发现当我想写一篇跟思考有关的文章时&#xff0c;却难以下手。因为思考是一件非常复杂的事情&#xff0c;用文字描述十分的困难。 读书…...