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

news2025/6/9 1:34:04

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

一、多线程创建方式
1. 继承Thread类
class MyThread extends Thread {
    @Override
    public void run() {
        // 线程执行逻辑
        System.out.println(Thread.currentThread().getName() + " is running");
    }
}

// 使用
MyThread thread = new MyThread();
thread.start(); // 启动线程
2. 实现Runnable接口
class MyRunnable implements Runnable {
    @Override
    public 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()) {
    @Override
    public 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);
        }
        
        @Override
        public 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) {
    // 空模式串直接返回 0
    if (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();
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2404809.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

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;直接修改基础学习率 卷积操作常…

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

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

DAY43 复习日

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

【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; …

[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;用文字描述十分的困难。 读书…

Redis:Hash数据类型

&#x1f308; 个人主页&#xff1a;Zfox_ &#x1f525; 系列专栏&#xff1a;Redis &#x1f525; Hash哈希 &#x1f433; ⼏乎所有的主流编程语⾔都提供了哈希&#xff08;hash&#xff09;类型&#xff0c;它们的叫法可能是哈希、字典、关联数组、映射。在Redis中&#…

快捷键的记录

下面对应的ATL数字 ATL4 显示编译输出 CTRL B 编译 CTRLR 运行exe 菜单栏 ALTF ALTE ALTB ALTD ALTH