后端面试高频笔试题(非常规LeetCode类型)
目录
1. 常见的五种单例模式的实现⽅式
2. 约瑟夫环 (递归)
3. 交替打印奇偶数 (Semaphore、synchronized搭配wait、notify)
4. 交替打印 ABC (Semaphore)
5. 三个线程交替打印 1 到 99 (Semaphore、AtomicInteger)
6. 实现⼀个线程安全的计数器 (ThreadPool、AtomicInteger / LongAdder)
7. 控制三个线程的执⾏顺序 (CountDownLatch、join)
8. 五⼈赛跑裁判 (ThreadPool、AtomicInteger、CountDownLatch)
9. LRU缓存(升级版:带缓存过期时间)
常见的五种单例模式的实现⽅式
1、枚举(推荐):
public enum Singleton {INSTANCE;public void doSomething(String str){System.out.println(str);}
}
《Effective Java》 作者推荐的⼀种单例实现⽅式,简单⾼效,⽆需加锁,线程安全,可以避免通过反射破坏枚举单例。
2、静态内部类(推荐):
public class Singleton {// 私有化构造方法public Singleton() {}// 对外提供获取实例的公共⽅法public static Singleton getInstance() {return SingletonInner.INSTANCE;}// 定义静态内部类private static class SingletonInner {private final static Singleton INSTANCE = new Singleton();}
}
当外部类 Singleton
被加载的时候,并不会创建静态内部类 SingletonInner
的实例对象。只有当调⽤ getInstance()
⽅法时, SingletonInner
才会被加载,这个时候才会创建单例对象INSTANCE
。INSTANCE
的唯⼀性、创建过程的线程安全性,都由 JVM 来保证。
这种⽅式同样简单⾼效,⽆需加锁,线程安全,并且⽀持延时加载。
3、双重校验锁:
public class Singleton {private volatile static Singleton uniqueInstance;// 私有化构造⽅法private Singleton(){}public static Singleton getInstance(){//先判断对象是否已经实例过,没有实例化过才进⼊加锁代码if(uniqueInstance == null){//类对象加锁synchronized (Singleton.class){if (uniqueInstance == null){uniqueInstance = new singlton();}}}return uniqueInstance;}
}
uniqueInstance
采⽤ volatile
关键字修饰也是很有必要的, uniqueInstance = new Singleton();
这段代码其实是分为三步执⾏:
- 为 uniqueInstance 分配内存空间
- 初始化 uniqueInstance
- 将 uniqueInstance 指向分配的内存地址
但是由于 JVM 具有指令重排的特性,执⾏顺序有可能变成 1->3->2
。指令排在单线程环境下不会出现问题,但是在多线程环境下会导致⼀个线程获得还没有初始化的实例。例如,线程 T1 执⾏了 1 和 3,此时 T2 调⽤ getUniqueInstance ()
后发现 uniqueInstance
不为空,因此返回 uniqueInstance
,但此时 uniqueInstance
还未被初始化。
这种⽅式实现起来较麻烦,但同样线程安全,⽀持延时加载。
4、饿汉式:
public class HungrySingleton {// 类加载时就创建实例,保证线程安全private static final HungrySingleton INSTANCE = new HungrySingleton();// 私有构造方法,防止外部实例化private HungrySingleton() {}// 获取单例实例public static HungrySingleton getInstance() {return INSTANCE;}
}
利⽤ Java 的静态特性,在类加载时就创建实例,天然线程安全,但可能会导致资源浪费。
5、懒汉式:
public class LazySingleton {private static LazySingleton instance;// 私有构造方法,防止外部实例化private LazySingleton() {}// 线程不安全的懒汉式public static LazySingleton getInstance() {if (instance == null) {instance = new LazySingleton();}return instance;}
}
在第⼀次使⽤时才创建实例。在多线程环境下,可能会出现多个线程同时进入 if (instance == null)
语句块,导致创建多个实例,不符合单例模式的设计。
五种单例模式对比
方式 | 线程安全性 | 是否懒加载 | 实现难度 | 性能 |
---|---|---|---|---|
饿汉式 | ✅ 线程安全 | ❌ 不是懒加载 | ⭐⭐ 易实现 | ⭐⭐⭐ 访问快 |
懒汉式(非线程安全) | ❌ 线程不安全 | ✅ 懒加载 | ⭐⭐ 易实现 | ⭐⭐⭐ 访问快 |
懒汉式(DCL双重检查锁) | ✅ 线程安全 | ✅ 懒加载 | ⭐⭐⭐ 代码复杂 | ⭐ 访问需加锁 |
静态内部类 | ✅ 线程安全 | ✅ 懒加载 | ⭐⭐ 易实现 | ⭐⭐⭐ 访问快 |
约瑟夫环
约瑟夫环问题的核心思想是:一群人围成一圈,从某个起点开始依次报数,报到特定数字的人出局,直到只剩下最后一个人为止。
求解思路
这个问题可以用 递推公式 来表示:
其中:
f(n, k)
代表 n 个人围成一圈,每次报数到k
的人出局,最终留下的人的编号。- 递归的终止条件是当
n = 1
时,唯一的那个人自然是编号 1(即f(1, k) = 1
)。 - 递推公式的含义是:在 n - 1 个人的情况下找到安全位置,然后映射到当前 n 个人的编号。
换个更直观的理解
想象有 n 个人站成一个圈,他们按顺序报数,每报到 k 的人出局。我们希望知道最终谁能存活下来。
- 从 1 个人开始(显然他是幸存者)。
- 增加到 2 个人,谁存活取决于前一个人的位置加上
k
,再取模计算位置。 - 每次增加 1 个人,都要重新计算安全位置。
这就像我们 不断从后往前推导,找到一个人站在“安全位置”。最终,我们得到了 最后留下的那个人的编号。
代码实现
public class JosephusProblem {public static int josephus(int n, int k) {// 如果只有⼀个⼈,则返回 1if (n == 1) return 1;return (josephus(n - 1, k) + k - 1) % n + 1;}public static void main(String[] args) {int n = 10;int k = 3;System.out.println("最后留下的人的编号是:" + josephus(n, k));}
}
输出:
最后留下的人的编号是:4
交替打印奇偶数
问题描述:写两个线程打印 1-100,⼀个线程打印奇数,⼀个线程打印偶数。
这道题的实现⽅式还是挺多的,线程的等待/通知机制 ( wait() 和 notify() ) 、信号Semaphore
等都可以实现。
synchronized+wait/notify 实现
/** synchronized+wait/notify 实现*/
class ParityPrinter {private final int max;// 从1开始计数private int count = 1;private final Object lock = new Object();public ParityPrinter(int max) {this.max = max;}public void printOdd() {print(true);}public void printEven() {print(false);}private void print(boolean isOdd) {while (count <= max) {synchronized (lock) {while (isOdd == (count % 2 != 0)) {System.out.println(Thread.currentThread().getName() + " : " + count++);lock.notify(); // 唤醒另一个线程}// 只有正确的线程才能打印,错误的线程会 lock.wait() 进入等待状态try {lock.wait();} catch (InterruptedException e) {Thread.currentThread().interrupt();return;}}}}
}public class OddAndEven {public static void main(String[] args) {// 打印 1-100ParityPrinter printer = new ParityPrinter(100);// 创建打印奇数和偶数的线程Thread t1 = new Thread(printer::printOdd, "Odd");Thread t2 = new Thread(printer::printEven, "Even");t1.start();t2.start();}
}
输出:
Odd : 1
Even : 2
Odd : 3
Even : 4
Odd : 5
...
Odd : 95
Even : 96
Odd : 97
Even : 98
Odd : 99
Even : 100
Semaphore 实现
如果想要把上⾯的代码修改为基于 Semaphore
实现也挺简单的。
/*** Semaphore 实现*/
class ParityPrinter {private int max;private int count = 1;private Semaphore semaphoreOdd = new Semaphore(1);private Semaphore semaphoreEven = new Semaphore(0);public ParityPrinter(int max) {this.max = max;}public void printOdd() {print(semaphoreOdd, semaphoreEven);}public void printEven() {print(semaphoreEven, semaphoreOdd);}public void print(Semaphore cur, Semaphore next) {while (true) {try {// 信号量 -1 cur.acquire();// 防止 max 取值导致多打印或者死锁if (count > max) {next.release();break;}System.out.println(Thread.currentThread().getName() + " : " + count++);// 信号量 +1 next.release();} catch (InterruptedException e) {Thread.currentThread().interrupt();return;}}}
}public class OddAndEven {public static void main(String[] args) {// 打印 1-100ParityPrinter printer = new ParityPrinter(100);// 创建打印奇数和偶数的线程Thread t1 = new Thread(printer::printOdd, "Odd");Thread t2 = new Thread(printer::printEven, "Even");t1.start();t2.start();}
}
可以看到,我们这⾥使⽤两个信号 semaphoreOdd
和 semaphoreEven
来确保两个线程交替执⾏。semaphoreOdd
信号先获取,也就是先执⾏奇数输出。⼀个线程执⾏完之后,就释放下⼀个信号。
输出:
Odd : 1
Even : 2
Odd : 3
Even : 4
Odd : 5
Even : 6
Odd : 7
Even : 8
...
...
...
Odd : 95
Even : 96
Odd : 97
Even : 98
Odd : 99
Even : 100
交替打印 ABC
问题描述:写三个线程打印 “ABC”,⼀个线程打印 A,⼀个线程打印 B,⼀个线程打印 C,⼀共打印 10 轮。
这个问题其实和上⾯的交替打印奇偶数是⼀样的。
class ABCPrinter {private int max;private Semaphore semaphoreA = new Semaphore(1);private Semaphore semaphoreB = new Semaphore(0);private Semaphore semaphoreC = new Semaphore(0);public ABCPrinter(int max) {this.max = max;}public void printerA() {print(semaphoreA, semaphoreB, "A");}public void printerB() {print(semaphoreB, semaphoreC, "B");}public void printerC() {print(semaphoreC, semaphoreA, "C");}private void print(Semaphore cur, Semaphore next, String x) {for (int i = 0; i < max; i++) {try {cur.acquire();System.out.println(Thread.currentThread().getName() + " : " + x);next.release();} catch (InterruptedException e) {e.printStackTrace();}}}
}public class ABC {public static void main(String[] args) {ABCPrinter abcPrinter = new ABCPrinter(30);Thread a = new Thread(abcPrinter::printerA, "Thread 1");Thread b = new Thread(abcPrinter::printerB, "Thread 2");Thread c = new Thread(abcPrinter::printerC, "Thread 3");a.start();b.start();c.start();}
}
输出:
Thread 1 : A
Thread 2 : B
Thread 3 : C
Thread 1 : A
Thread 2 : B
Thread 3 : C
...
...
...
Thread 1 : A
Thread 2 : B
Thread 3 : C
三个线程交替打印 1 到 99
问题描述:写三个线程 A、B、C,A 线程打印 3n+1,B 线程打印 3n+2,C 线程打印 3n+3。
这道题和三个线程交替打印 ABC 这道题有挺多相似之处,唯一不同之处就是对count计数的调整,这次我们选用线程安全的原子类AtomicInteger
来作替代。话不多说上代码:
class NumPrinter {private final int max;// 用线程安全的原子类来替代count变量private final AtomicInteger count = new AtomicInteger(1);private final Semaphore semaphoreA = new Semaphore(1);private final Semaphore semaphoreB = new Semaphore(0);private final Semaphore semaphoreC = new Semaphore(0);public NumPrinter(int cap) {this.max = cap;}public void printerA() {print(semaphoreA, semaphoreB);}public void printerB() {print(semaphoreB, semaphoreC);}public void printerC() {print(semaphoreC, semaphoreA);}private void print(Semaphore cur, Semaphore next) {while (true){try {cur.acquire();// 取值并逐渐递增int value = count.getAndIncrement();if (value > max) { // 超出范围,释放信号量防止死锁next.release();return;}System.out.println(Thread.currentThread().getName() + " : " + value);next.release();} catch (InterruptedException e) {Thread.currentThread().interrupt();return;}}}
}public class OneTo99 {public static void main(String[] args) {NumPrinter numPrinter = new NumPrinter(99);Thread a = new Thread(numPrinter::printerA,"Thread A");Thread b = new Thread(numPrinter::printerB,"Thread B");Thread c = new Thread(numPrinter::printerC,"Thread C");a.start();b.start();c.start();}
}
输出:
Thread A : 1
Thread B : 2
Thread C : 3
Thread A : 4
Thread B : 5
Thread C : 6
Thread A : 7
Thread B : 8
...
...
...
Thread A : 94
Thread B : 95
Thread C : 96
Thread A : 97
Thread B : 98
Thread C : 99
实现⼀个线程安全的计数器
问题描述:实现⼀个线程安全的计数器,100 个线程,每个线程累加 100 次。
AtomicLong
通过使⽤ CAS(Compare-And-Swap) 操作,实现了⽆锁的线程安全机制,能够对⻓整型数据进⾏原⼦操作。⾼并发的场景下,乐观锁相⽐悲观锁来说,不存在锁竞争造成线程阻塞,也不会有死锁的问题,在性能上往往会更胜⼀筹。
public class SafeCounter {public static void main(String[] args) {// 创建⼀个线程安全的计数器AtomicLong counter = new AtomicLong();// 创建⼀个固定⼤⼩的线程池ExecutorService executor = Executors.newFixedThreadPool(100);for (int i = 0; i < 100; i++) {// 100 个线程,每个线程累加 100 次executor.submit(() -> {for (int j = 0; j < 100; j++) {counter.getAndIncrement();}});}// 关闭线程池executor.shutdown();System.out.println("Final Counter Value: " + counter.get());}
}
输出:
10000
虽然 AtomicLong
的性能已经相当优秀,但在⾼并发场景下仍存在⼀些效率问题。JDK 8 新增了⼀个原⼦性递增或者递减类 LongAdder
⽤来克服在⾼并发下使⽤ AtomicLong
的⼀些缺点。
使⽤ LongAdder
改造后的代码如下:
public class SafeCounter {public static void main(String[] args) {LongAdder counter = new LongAdder();// 创建⼀个固定⼤⼩的线程池ExecutorService executor = Executors.newFixedThreadPool(100);for (int i = 0; i < 100; i++) {// 100 个线程,每个线程累加 100 次executor.execute(() -> {for (int j = 0; j < 100; j++) {counter.increment();}});}// 关闭线程池executor.shutdown();System.out.println("Final Counter Value: " + counter.sum());}
}
LongAdder 使⽤ increment()
⽅法累加,所有累加的总和通过 sum()
⽅法获取。
控制三个线程的执⾏顺序
问题描述:假设有 T1、T2、T3 三个线程,你怎样保证 T2 在 T1 执⾏完后执⾏,T3 在 T2 执⾏完后执⾏?
这道题不难,⼤部分⼈都是⽤ join()
或者 CountDownLatch
实现。话不多说上代码:
public class ThreadSequence {public static void main(String[] args) {// join();countDownLatch();}private static void countDownLatch() {CountDownLatch latch1 = new CountDownLatch(1);CountDownLatch latch2 = new CountDownLatch(1);// 创建三个线程Thread t1 = new Thread(() -> {try {System.out.println("T1 is running");Thread.sleep(1000);System.out.println("T1 finished");} catch (InterruptedException e) {e.printStackTrace();} finally {latch1.countDown(); // T1 完成后释放 latch1}});Thread t2 = new Thread(() -> {try {// 等待 T1 完成latch1.await();System.out.println("T2 is running");Thread.sleep(1000); // 模拟工作System.out.println("T2 finished");} catch (InterruptedException e) {e.printStackTrace();} finally {latch2.countDown(); // T2 完成后释放 latch2}});Thread t3 = new Thread(() -> {try {// 等待 T2 完成latch2.await();System.out.println("T3 is running");Thread.sleep(1000); // 模拟工作System.out.println("T3 finished");} catch (InterruptedException e) {e.printStackTrace();}});// 启动所有线程t1.start();t2.start();t3.start();}private static void join() {// 创建三个线程Thread t1 = new Thread(() -> {System.out.println("T1 is running");try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("T1 finished");});Thread t2 = new Thread(() -> {System.out.println("T2 is running");try {Thread.sleep(1000); // 模拟工作} catch (InterruptedException e) {e.printStackTrace();}System.out.println("T2 finished");});Thread t3 = new Thread(() -> {System.out.println("T3 is running");try {Thread.sleep(1000); // 模拟工作} catch (InterruptedException e) {e.printStackTrace();}System.out.println("T3 finished");});try {// 启动 T1 并等待其完成t1.start();t1.join();// T1 完成后启动 T2 并等待其完成t2.start();t2.join();// T2 完成后启动 T3 并等待其完成t3.start();t3.join();} catch (InterruptedException e) {e.printStackTrace();}}
}
五⼈赛跑裁判
问题描述:有 5 个⼈赛跑,请你设计⼀个多线程的裁判程序给出他们赛跑的结果顺序,5 个⼈的速度随机处理。
我们借助线程池
和 CountDownLatch
来实现这⼀需求即可。
public class Racing {// 使⽤ AtomicInteger 确保线程安全public static AtomicInteger num = new AtomicInteger(0);public static String[] res = new String[5];private static final int threadCount = 5;public static void main(String[] args) throws InterruptedException {// 创建⼀个固定⼤⼩的线程池ExecutorService threadPool = Executors.newFixedThreadPool(threadCount);CountDownLatch latch = new CountDownLatch(threadCount);Random random = new Random();for (int i = 0; i < threadCount; i++) {final int id = i + 1;threadPool.execute(() -> {try {// 模拟随机耗时int sleepTime = random.nextInt(401) + 100; // 100ms ~ 500msThread.sleep(sleepTime);// 使⽤ AtomicInteger 确保线程安全int index = num.getAndIncrement();res[index] = "运动员" + id + "消耗的时间为" + sleepTime;} catch (InterruptedException e) {throw new RuntimeException(e);} finally {latch.countDown();}});}// 等待所有线程完成latch.await();threadPool.shutdown();// 输出结果for (String x : res) {System.out.println(x);}}
}
输出:
运动员5消耗的时间为162
运动员2消耗的时间为181
运动员4消耗的时间为266
运动员3消耗的时间为425
运动员1消耗的时间为452
解题的核⼼是 AtomicInteger
和 CountDownLatch
类的运⽤:
AtomicInteger
是⼀个线程安全的整数类,⽀持原⼦性操作。CountDownLatch
是⼀个线程同步⼯具类,⽤于让主线程等待其他线程完成⼯作。在本题中,初始化计数器为线程数 5。每个线程完成任务后,调⽤countDownLatch.countDown()
,主线程调⽤countDownLatch.await()
。
完整的执⾏流程如下:
- 创建⼀个固定⼤⼩的线程池和⼀个
CountDownLatch
,初始化为5。 - 提交5个线程任务到线程池,模拟每个运动员完成⽐赛的过程:
- 每个线程随机等待⼀定时间 (100ms~500ms),表示运动员⽐赛时⻓。
- 使⽤
AtomicInteger
确保线程安全,将⽐赛结果写⼊数组。 - 每个线程完成后,调⽤
countDown()
减少计数器值。
- 主线程调⽤
await()
,等待所有线程完成。 - 所有线程完成后,主线程输出⽐赛结果。
9. LRU缓存(升级版:带缓存过期时间)
👉详情见该博客
最后
如果您渴望探索更多精心挑选的高频LeetCode面试题,以及它们背后的巧妙解法,欢迎您访问我的博客,那里有我精心准备的一系列文章,旨在帮助技术爱好者们提升算法能力与编程技巧。
👉更多高频有趣LeetCode算法题
👉LeetCode高频面试题题单
在我的博客中,每一篇文章都是我对算法世界的一次深入挖掘,不仅包含详尽的题目解析,还有我个人的心得体会、优化思路及实战经验分享。无论是准备面试还是追求技术成长,我相信这些内容都能为您提供宝贵的参考与启发。期待您的光临,让我们共同在技术之路上不断前行!
相关文章:
后端面试高频笔试题(非常规LeetCode类型)
目录 1. 常见的五种单例模式的实现⽅式 2. 约瑟夫环 (递归) 3. 交替打印奇偶数 (Semaphore、synchronized搭配wait、notify) 4. 交替打印 ABC (Semaphore) 5. 三个线程交替打印 1 到 99 (Semap…...
el-table 通过 slot=“header“ 自定义表头,遇到数据不更新的问题。
从表中可以看到我要的数据为空,但是在控制台输出数据又不为空,由此判断是自定义表头的内容未在数据变化时触发重新渲染 在 Element UI 官方示例中,若通过旧式插槽语法 slot"header" 实现自定义表头,并在表头内集成 el-s…...
ESP32S3N16R8驱动ST7701S屏幕(vscode+PlatfoemIO)
1.开发板配置 本人开发板使用ESP32S3-wroom1-n16r8最小系统板 由于基于vscode与PlatformIO框架开发,无espidf框架,因此无法直接烧录程序,配置开发板参数如下: 在platformio.ini文件中,配置使用esp32-s3-devkitc-1开发…...
ios 小组件和数据共享
创建主工程就不必讲了 1 创建小组件 创建子工程 [new Target ] 选择 [ Widger Extension] 小组件入口是WidgetBundle文件,可以进行多个小组件的调试 TestWidget2文件是主要操作,小组件使用swiftUI布局,使用 AppIntent进行事件处理ÿ…...
鸿蒙开发可以从事的岗位
学完鸿蒙开发方向后,可以从事的岗位主要集中在以下几个领域: 鸿蒙系统开发工程师 负责鸿蒙操作系统的开发、优化、维护和更新工作,包括系统层、框架层、应用层的开发等。 嵌入式软件开发工程师 鸿蒙系统广泛应用于物联网设备、智能硬件等领域…...
深度学习和机器学习的差异
一、技术架构的本质差异 传统机器学习(Machine Learning)建立在统计学和数学优化基础之上,其核心技术是通过人工设计的特征工程(Feature Engineering)构建模型。以支持向量机(SVM)为例…...
OpenCV常用函数以及使用场景
类别函数名参数功能使用场景经验值/注意事项返回值图像 I/Ocv2.imread()filename (str): 文件路径。flags (int, 可选): 读取标志。常用值: * cv2.IMREAD_COLOR (默认): 读取彩色图像 (BGR)。 * cv2.IMREAD_GRAYSCALE: 读取灰度图像。 * cv2.IMREAD_UNCHANGED: 读取包含 Alpha…...
【iOS逆向与安全】sms短信转发插件与上传服务器开发
一、目标 一步步分析并编写一个短信自动转发的deb插件 二、工具 mac系统已越狱iOS设备:脱壳及frida调试IDA Pro:静态分析测试设备:iphone6s-ios14.1.1三、步骤 1、守护进程 守护进程(daemon)是一类在后台运行的特殊进程,用于执行特定的系统任务。例如:推送服务、人…...
Linux内核实时机制19 - RT调度器2 - 更新时间 update_curr_rt
update_curr_rt update_curr_rt函数用来更新当前实时进程的运行时间统计值,//kernel/sched/rt.c 1009 static void update_curr_rt(struct rq *rq) 1010 {...
《Android应用性能优化全解析:常见问题与解决方案》
目录 一、UI卡顿/掉帧 二、内存泄漏(Memory Leak) 三、ANR(Application Not Responding) 四、列表滑动卡顿(RecyclerView/ListView) 五、冷启动耗时过长 六、内存抖动(Memory Churn&#x…...
Mybatis批量更新数据
批量传参样例: [{"sid": "111", "createTime": "2025-03-11 09:12:00", "pbilId": "pbil_id_111"}, {"sid": "222", "createTime": "2025-03-11 09:13:00"…...
HTML 超链接(简单易懂较详细)
在 HTML 中,超链接是通过 <a> 标签(anchor tag)创建的。超链接允许用户通过点击文本、图像或其他元素跳转到另一个网页、文件或页面的特定部分。本文将详细介绍 HTML 超链接的语法、属性和应用场景。 一、基本语法 <a href"U…...
计算机网络--访问一个网页的全过程
文章目录 访问一个网页的全过程应用层在浏览器输入URL网址http://www.aspxfans.com:8080/news/index.aspboardID5&ID24618&page1#r_70732423通过DNS获取IP地址生成HTTP请求报文应用层最后 传输层传输层处理应用层报文建立TCP连接传输层最后 网络层网络层对TCP报文进行处…...
LLaMA-Factory训练DeepSeek大模型+本地部署
前言 前面我们介绍了基于硅基流动训练私有大模型《10分钟教你微调自己的私有大模型》,该平台有三个不好的点就是可选的模型有限,训练时间需要排队等待耗时长,另外还要 给钱。今天我们换一个平台,使用:魔搭平台 llama…...
mapbox-gl的Popup的使用详解
下面提供一个完整的 HTML 示例代码,展示了如何使用 mapbox-gl 的 Popup。代码中包含了两种使用方式: 在地图加载时直接创建一个 Popup;结合 Marker,在点击 Marker 或地图任意位置时显示 Popup。请确保将 YOUR_MAPBOX_ACCESS_TOKEN 替换为你自己的 Mapbox 访问令牌。下面是代…...
【K8s】专题十六(3):Kubernetes 包管理工具之 Helm 语法
本文内容均来自个人笔记并重新梳理,如有错误欢迎指正! 如果对您有帮助,烦请点赞、关注、转发、订阅专栏! 专栏订阅入口 | 精选文章 | Kubernetes | Docker | Linux | 羊毛资源 | 工具推荐 | 往期精彩文章 【Docker】(全…...
仅仅使用pytorch来手撕transformer架构(3):编码器模块和编码器类的实现和向前传播
仅仅使用pytorch来手撕transformer架构(2):编码器模块和编码器类的实现和向前传播 往期文章: 仅仅使用pytorch来手撕transformer架构(1):位置编码的类的实现和向前传播 最适合小白入门的Transformer介绍 仅仅使用pytorch来手撕transformer…...
LWIP网络模型及接口简介(DAY 01)
目录 1.网络协议分层模型 2. LWIP三种编程接口 1.网络协议分层模型 其中各层级的封装与拆封过程 2. LWIP三种编程接口 LwIP 提供了三种编程接口,分别为 RAW/Callback API、NETCONN API、SOCKET API。它们的易用性从左到右依次提高,而执行效率从左到右依…...
Docker构建启动jar包
Docker构建启动jar包 1、首先是把java服务打包成jar包 mvn clean install -Dmaven.skip.testtrue package -Pprod这个命令的意思是,跳过测试,打包prod环境。 2、编写Dockerfile文件 # 拉取jdk8作为基础镜像 FROM registry.supos.ai/library/openjdk:…...
基于Python+Vue开发的电影订票管理系统源码+运行步骤
项目简介 该项目是基于PythonVue开发的电影订票管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Python编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Python的电影订…...
javase集合框架List篇
一、Vector和ArrayList、LinkedList联系和区别,分别的使用场景 ArrayList:底层是数组实现,线程不安全,查询和修改非常快,但是增加和删除慢 LinkedList: 底层是双向链表,线程不安全,查询和修改…...
Kafka×DeepSeek:智能决策破取经八十一难!
《西游记》的故事中,唐僧师徒四人历经九九八十一难,从东土大唐前往西天取经。一路上,火焰山酷热难耐、通天河水位忽高忽低、妖怪神出鬼没…… 现在,唐僧师徒取经路上的种种难题,在KafkaDeepSeek双引擎加持下有了全新解…...
python-leetcode-反转字符串中的元音字母
345. 反转字符串中的元音字母 - 力扣(LeetCode) 使用双指针的方法高效地反转字符串中的元音字母。以下是 Python 代码实现: def reverseVowels(s: str) -> str:vowels set("aeiouAEIOU")s list(s) # 将字符串转换为列表&…...
Blender UV纹理贴图,导出FBX到Unity
加载ps好的模型贴图。右下角选择《材质》基础色里面选择《图像纹理》,选择你的图片。 选择上面UV选项卡。左上角选择UV编辑器。选中物体,TAB进入编辑模式。即可调整映射的图像范围。 其中渲染设置可以在左侧下边脱出。 导出带纹理FBX模型 路径选择复…...
AttributeError: module ‘backend_interagg‘ has no attribute ‘FigureCanvas‘
AttributeError: module backend_interagg has no attribute FigureCanvas 这个错误通常是由于 Matplotlib 的后端配置问题引起的。具体来说,Matplotlib 在尝试加载某个后端时,发现该后端模块中缺少必要的属性(如 FigureCanvas)&a…...
调试正常 ≠ 运行正常:Keil5中MicroLIB的“量子态BUG”破解实录
调试正常 ≠ 运行正常:Keil5中MicroLIB的“量子态BUG”破解实录——从勾选一个选项到理解半主机模式,嵌入式开发的认知升级 📌 现象描述:调试与烧录的诡异差异 在线调试时 程序正常运行 - 独立运行时 设备无响应 ! 编译过程 0 Err…...
【Pandas】pandas Series update
Pandas2.2 Series Computations descriptive stats 方法描述Series.compare(other[, align_axis, …])用于比较两个 SeriesSeries.update(other)用于用另一个序列(Series)中的值更新当前序列 pandas.Series.update pandas.Series.update(other) 方法…...
2025软件供应链安全案例︱证券行业云原生DevSecOps敏捷安全实践
最佳实践 打造云原生DevSecOps敏捷安全治理体系 以容器、微服务、服务网格、声明式API等为代表的云原生技术的深入应用,改变了以往的研发方式:传统瀑布流开发模式逐渐被取代,DevOps敏捷开发成为主流。在云原生架构下,服务数量和…...
Android : Camera之CHI API
来自: https://www.cnblogs.com/szsky/articles/10861918.html 一、CAM CHI API功能介绍: CHI API建立在Google HAL3的灵活性基础之上,目的是将Camera2/HAL3接口分离出来用于使用相机功能,它是一个灵活的图像处理驱动程序&#…...
【动手实验】TCP 连接的建立与关闭抓包分析
本文是基于知识星球程序员踩坑案例分享中的作业进行的复现和总结,借此加深对 TCP 协议的理解, 原文参见TCP 连接的建立和关闭 —— 强烈建议新手看看。 实验环境 这里使用两台位于同一子网的腾讯云服务器,IP 分别是 node2(172.1…...
语音识别踩坑记录
本来想在原来的语音识别的基础上增加本地扩展本地词典, 采用的语音识别是Vosk识别器,模型是 vosk-model-small-cn-0.22 // 初始化Vosk识别器 if (recognizer null) {using (Model model new Model(modelPath)){string grammar "{""…...
Conda常用命令汇总
Conda 是一个流行的包管理器和环境管理工具,广泛应用于数据科学、机器学习等领域。它可以帮助我们管理 Python 包以及不同版本的环境,避免包冲突,提升项目的可复现性。以下是一些常用的 Conda 命令,涵盖环境创建、管理、包安装等常…...
消息队列MQ使用场景有哪些?
MQ 在实际项目中的应用场景主要围绕异步处理、系统解耦、流量控制三大核心能力展开,结合具体业务需求可细分为以下场景: 1. 异步处理 典型场景:用户注册成功后发送短信/邮件、支付成功后通知物流系统发货、商品上架后同步至搜索引擎。优势&…...
5. 前后端实现文件上传与解析
1. 说明 在实际开发中,比较常见的一个功能是需要在前端页面中选择系统中的某个文件上传到服务器中进行解析,解析后的文件内容可以用来在服务器中当作参数,或者传递给其它组件使用,或者需要存储到数据库中。所以本文就提供一种方式…...
基于腾讯云高性能HAI-CPU的跨境电商客服助手全链路解析
跨境电商的背景以及痛点 根据Statista数据,2025年全球跨境电商市场规模预计达6.57万亿美元,年增长率保持在12.5% 。随着平台规则趋严(如亚马逊封店潮),更多卖家选择自建独立站,2024年独立站占比已达35%。A…...
python中time模块的常用方法及应用
Python 的 time 模块是自带的标准模块,不需要额外安装,可以直接通过import time的方式导入并使用其中的函数和类。该模块提供了与时间相关的各种功能,以下是一些常用方法及其应用场景和示例: ### 1. time.time() - **功能**&…...
JavaScript性能优化
JavaScript性能优化指南 一:性能分析与指标确立 使用性能分析工具 • 使用Lighthouse、Chrome DevTools的Performance面板和WebPageTest进行基准测试,识别加载时间、脚本执行时长等瓶颈。 • 关注核心Web指标:LCP(最大内容绘制&a…...
《React 属性与状态江湖:从验证到表单受控的实战探险》
属性初识 属性能解决两个大问题:通信和复用 props.js: import React, { Component } from react import Navbar from ./Navbarexport default class App extends Component {state {a:100}render() {return (<div><div><h2>首页</h2>&l…...
Android Retrofit 框架注解定义与解析模块深度剖析(一)
一、引言 在现代 Android 和 Java 开发中,网络请求是不可或缺的一部分。Retrofit 作为 Square 公司开源的一款强大的类型安全的 HTTP 客户端,凭借其简洁易用的 API 和高效的性能,在开发者社区中广受欢迎。Retrofit 的核心特性之一便是通过注…...
嵌入式学习L6网络编程D3TCP
TCP编程 写代码 第一步socket 绑定 先填充 点分十进制转换成32位整数 client 然后就连接成功了就可以读写数据了 client #include "net.h"int main (void) {int fd -1;struct sockaddr_in sin;/* 1. 创建socket fd */if ((fd socket (AF_INET, SOCK_S…...
【玩转23种Java设计模式】结构型模式篇:享元模式
软件设计模式(Design pattern),又称设计模式,是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性、程序的重用性。 汇总目录链接&…...
超分之DeSRA
Desra: detect and delete the artifacts of gan-based real-world super-resolution models.DeSRA:检测并消除基于GAN的真实世界超分辨率模型中的伪影Xie L, Wang X, Chen X, et al.arXiv preprint arXiv:2307.02457, 2023. 摘要 背景: GAN-SR模型虽然…...
产城融合典范:树莓科技如何助力宜宾数字经济腾飞
宜宾在推动数字经济发展的征程中,树莓科技扮演着至关重要的角色,堪称产城融合的典范。 树莓科技入驻宜宾后,积极与当地政府合作,以产业发展带动城市建设,以城市功能完善促进产业升级。在产业布局上,树莓科…...
Java数据结构第二十二期:Map与Set的高效应用之道(一)
专栏:Java数据结构秘籍 个人主页:手握风云 目录 一、Map和Set 1.1. 概念 二、搜索树 2.1. 概念 2.2. 查找操作 2.2. 插入操作 2.3. 删除操作 2.4. 性能分析 三、搜索 3.1. 概念及场景 3.2. 模型 四、Map 4.1. Map的说明 3.2. Map的使用 五…...
焊接安全的新纪元:智能监管系统的力量
在现代制造业中,焊接作为一项关键工艺,其安全性直接关系到生产质量和人员安全。为了应对这一挑战,一款创新的焊接联网智能化监管系统应运而生,为焊接行业带来了新的安全保障。 智能监管,安全升级 这款系统通过“一机…...
OpenGL中绘制图形元素的实现(使用visual studio(C++)绘制一个矩形)
目标:使用OpenGL提供的函数绘制矩形、线段、三角形等基本图形元素 所需效果 实验步骤 1、配置OpenGL(详情参见OpenGL的配置) 2、头文件引入 #include <gl/glut.h> 3、编写方法体 1>矩形实现 //绘制矩形 void DisplayRectangl…...
政安晨【零基础玩转各类开源AI项目】Wan 2.1 本地部署,基于ComfyUI运行,最强文生视频 图生视频,一键生成高质量影片
政安晨的个人主页:政安晨 欢迎 👍点赞✍评论⭐收藏 希望政安晨的博客能够对您有所裨益,如有不足之处,欢迎在评论区提出指正! 目录 下载项目 创建虚拟环境 安装项目依赖 尝试运行 依次下载模型 完成 我们今天要使…...
DeepLabv3+改进8:在主干网络中添加SIM注意力机制|助力涨点
🔥【DeepLabv3+改进专栏!探索语义分割新高度】 🌟 你是否在为图像分割的精度与效率发愁? 📢 本专栏重磅推出: ✅ 独家改进策略:融合注意力机制、轻量化设计与多尺度优化 ✅ 即插即用模块:ASPP+升级、解码器 PS:订阅专栏提供完整代码 论文简介 在本文中,我们提出了…...
卷积神经网络(笔记01)
视觉处理三大任务:分类、目标检测、图像分割 CNN网络主要有三部分构成:卷积层(Convolutional Layer)、池化层(Pooling Layer)和激活函数 一、解释卷积层中的偏置项是什么,并讨论在神经网络中引…...
从自己电脑的浏览器访问阿里云主机中运行的LLaMA-Factory webui
阿里云主机上LLaMA-Factory的webui在0.0.0.0:7860侦听,无法直接打开,需要通过代理的方法访问。 在LLaMA-Factory目录下创建一个脚本文件run.sh,并加上执行权限,内容如下: #!/bin/shexport GRADIO_SERVER_PORT7860 ex…...