并发编程面试题汇总

2023-11-08

并发编程面试题

序号 内容 链接
1 Java基础 https://blog.csdn.net/qq_40355167/article/details/115239986
2 Java集合容器 https://blog.csdn.net/qq_40355167/article/details/114461884
3 并发编程 https://blog.csdn.net/qq_40355167/article/details/112489767
4 JVM https://blog.csdn.net/qq_40355167/article/details/115217078
5 msql https://blog.csdn.net/qq_40355167/article/details/115240090
6 redis https://blog.csdn.net/qq_40355167/article/details/115240289
7 rocket https://blog.csdn.net/qq_40355167/article/details/115240231
8 mybatis https://blog.csdn.net/qq_40355167/article/details/115241129
9 dubbo https://blog.csdn.net/qq_40355167/article/details/115240354
10 zookeeper https://blog.csdn.net/qq_40355167/article/details/115242812
11 spring https://blog.csdn.net/qq_40355167/article/details/115241385
12 SpringBoot https://blog.csdn.net/qq_40355167/article/details/115241082
13 mybatis https://blog.csdn.net/qq_40355167/article/details/115241129
14 elasticsearch https://blog.csdn.net/qq_40355167/article/details/115240154
15 tomcat https://blog.csdn.net/qq_40355167/article/details/115240394
16 设计模式 https://blog.csdn.net/qq_40355167/article/details/115240623
17 算法 https://blog.csdn.net/qq_40355167/article/details/115245150
18 项目架构 https://blog.csdn.net/qq_40355167/article/details/115240446

1.创建线程的方式有哪些?

创建线程有四种方式:

  • 继承 Thread 类;
  • 实现 Runnable 接口;
  • 实现 Callable 接口;
  • 使用 Executors 工具类创建线程池
  • 使用 ThreadPoolExecutor自定义线程池【阿里规范自定义线程池】

1.1继承 Thread 类

  1. 定义一个Thread类的子类,重写run方法,将相关逻辑实现,run()方法就是线程要执行的业务逻辑方法
  2. 创建自定义的线程子类对象
  3. 调用子类实例的star()方法来启动线程
public class MyThread extends Thread {
    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName() + " run()方法正在执行...");
    }
    public static void main(String[] args) {
        MyThread myThread = new MyThread(); 
        myThread.setName("继承Thread线程");	
        myThread.start();
        System.out.println(Thread.currentThread().getName() + " main()方法执行结束");
    }
}

执行结果:
在这里插入图片描述

1.2实现 Runnable 接口

  1. 定义Runnable接口实现类MyRunnable,并重写run()方法
  2. 创建MyRunnable实例myRunnable,以myRunnable作为target创建Thead对象,该Thread对象才是真正的线程对象
  3. 调用线程对象的start()方法
public class MyRunnable implements Runnable {
    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName() + " run()方法执行中...");
    }
    public static void main(String[] args) {
        MyRunnable myRunnable = new MyRunnable();
        Thread thread = new Thread(myRunnable);
        thread.setName("实现runnable接口线程");
        thread.start();
        System.out.println(Thread.currentThread().getName() + " main()方法执行完成");
    }
}

执行结果:
在这里插入图片描述

1.3实现 Callable 接口

  1. 创建实现Callable接口的类myCallable
  2. 创建FutureTask对象
  3. 创建Thread对象
  4. 调用线程对象的start()方法
public class MyCallable implements Callable<Integer> {
    @Override
    public Integer call() {
        System.out.println(Thread.currentThread().getName() + " call()方法执行中...");
        return 1;
    }
    public static void main(String[] args) {
        FutureTask<Integer> futureTask = new FutureTask<>(new MyCallable());
        Thread thread = new Thread(futureTask);
        thread.setName("实现Callable接口线程");
        thread.start();

        try {
            Thread.sleep(1000);
            System.out.println("返回结果 " + futureTask.get());
        } catch (InterruptedException | ExecutionException e) {
            e.printStackTrace();
        }
        System.out.println(Thread.currentThread().getName() + " main()方法执行完成");
    }
}

执行结果:
在这里插入图片描述

1.4使用 Executors 工具类创建线程池

创建链接如下:Executors 创建线程池
总结:
(1)newSingleThreadExecutor:创建一个单线程的线程池。这个线程池只有一个线程在工作,也就是相当于单线程串行执行所有任务。如果这个唯一的线程因为异常结束,那么会有一个新的线程来替代它。此线程池保证所有任务的执行顺序按照任务的提交顺序执行。

(2)newFixedThreadPool:创建固定大小的线程池。每次提交一个任务就创建一个线程,直到线程达到线程池的最大大小。线程池的大小一旦达到最大值就会保持不变,如果某个线程因为执行异常而结束,那么线程池会补充一个新线程。如果希望在服务器上使用线程池,建议使用 newFixedThreadPool方法来创建线程池,这样能获得更好的性能。

(3) newCachedThreadPool:创建一个可缓存的线程池。如果线程池的大小超过了处理任务所需要的线程,那么就会回收部分空闲(60 秒不执行任务)的线程,当任务数增加时,此线程池又可以智能的添加新线程来处理任务。此线程池不会对线程池大小做限制,线程池大小完全依赖于操作系统(或者说 JVM)能够创建的最大线程大小。

(4)newScheduledThreadPool:创建一个大小无限的线程池。此线程池支持定时以及周期性执行任务的需求。

缺点:
newFixedThreadPool 和 newSingleThreadExecutor:
主要问题是堆积的请求处理队列可能会耗费非常大的内存,甚至 OOM。

    public static ExecutorService newFixedThreadPool(int nThreads) {
        return new ThreadPoolExecutor(nThreads, nThreads,
                                      0L, TimeUnit.MILLISECONDS,
                                      new LinkedBlockingQueue<Runnable>());
    }
    public static ExecutorService newSingleThreadExecutor() {
        return new FinalizableDelegatedExecutorService
            (new ThreadPoolExecutor(1, 1,
                                    0L, TimeUnit.MILLISECONDS,
                                    new LinkedBlockingQueue<Runnable>()));
    }

newCachedThreadPool 和 newScheduledThreadPool:
主要问题是线程数最大数是 Integer.MAX_VALUE,可能会创建数量非常多的线程,甚至 OOM。

    public static ExecutorService newCachedThreadPool() {
        return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
                                      60L, TimeUnit.SECONDS,
                                      new SynchronousQueue<Runnable>());
    }
    public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize) {
        return new ScheduledThreadPoolExecutor(corePoolSize);
    }
    public ScheduledThreadPoolExecutor(int corePoolSize) {
        super(corePoolSize, Integer.MAX_VALUE, 0, NANOSECONDS,
              new DelayedWorkQueue());
    }
    public ThreadPoolExecutor(int corePoolSize,
                              int maximumPoolSize,
                              long keepAliveTime,
                              TimeUnit unit,
                              BlockingQueue<Runnable> workQueue) {
        this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
             Executors.defaultThreadFactory(), defaultHandler);
    }

1.5使用 ThreadPoolExecutor自定义线程池【阿里规范自定义线程池】

/**XXService*/
public interface XXService {
    Long getRandomNumber(Long businessId);
}

/**XXService实现类*/
@Service
public class XXServiceImpl implements XXService{
    @Override
    public Long getRandomNumber(Long businessId) {
        return new Random().nextInt(100) + businessId;
    }
}

/**执行线程*/
public class TaskThread implements Callable<Object> {
    private Long businessId;
    private XXService xxService;

	/**构造方法*/
    public TaskThread(Long businessId, XXService xxService) {
        this.businessId = businessId;
        this.xxService = xxService;
    }

    @Override
    public Long call() {
        System.out.println("ThreadName" + Thread.currentThread().getName() + "执行业务逻辑");
        //业务逻辑处理
        Long randomNumber = xxService.getRandomNumber(businessId);
        System.out.println("ThreadName" + Thread.currentThread().getName() + "获取返回结果为: " + randomNumber);
        return randomNumber;
    }
}

/**构造线程池*/
public class ResolveThreadExecutor {

    public static <V, T extends Callable<V>> Set<V> executeCompletionService(List<T> tasks) {
        ThreadPoolExecutor executor = new ThreadPoolExecutor(20, 40,
                10, TimeUnit.SECONDS, new LinkedBlockingQueue<>(tasks.size()),
                getThreadFactory(), new CustomRejectedExecutionHandler()
        );
        Set<V> result = new HashSet<>(10);
        CompletionService<V> completionService = new ExecutorCompletionService<>(executor);

        List<Future<V>> futureList = new ArrayList<>();
        for (T task : tasks) {
            Future<V> future = completionService.submit(task);
            futureList.add(future);
        }
        for (Future<V> future : futureList) {
            try {
                //方法是阻塞的,即:线程在没有返回结果前,get方法会一直等待,所以等线程执行完再获取结果
                result.add(future.get());
            } catch (InterruptedException | ExecutionException e) {
                e.printStackTrace();
            }
        }
        executor.shutdown();
        return result;
    }

    private static ThreadFactory getThreadFactory() {
        return new ThreadFactory() {
            //int i = 0;  用并发安全的包装类
            AtomicInteger atomicInteger = new AtomicInteger(1);
            @Override
            public Thread newThread(Runnable r) {
                //创建线程把任务传进来
                Thread thread = new Thread(r);
                //给线程起个名字
                thread.setName("Content-Thread" + atomicInteger.getAndIncrement());
                return thread;
            }
        };
    }

    private static class CustomRejectedExecutionHandler implements RejectedExecutionHandler {
        @Override
        public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
            try {
                // 核心改造点,由blockingqueue的offer改成put阻塞方法
                // 对于put方法,若向队尾添加元素的时候发现队列已经满了会发生阻塞一直等待空间,以加入元素
                executor.getQueue().put(r);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

/**业务执行调用*/
public class ThreadExecutorUsage {
    public static void main(String[] args) {
        List<TaskThread> taskList = new ArrayList<>();

        for (int i = 0; i < 6; i++) {
            //逻辑处理生成不同的TaskThread
            taskList.add(new TaskThread((long) i, new XXServiceImpl()));
        }
        Set<Object> failNewsInfoIds = ResolveThreadExecutor.executeCompletionService(taskList);
        System.out.println(failNewsInfoIds);
    }
}

执行结果:
在这里插入图片描述

2. 线程的 5 种状态及状态流转

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

3.线程中run方法和start方法区别?

线程Thread类的start()方法和run()方法.
总结:
start方法用来启动线程,真正实现了多线程并发执行运行。start方法的作用就是将线程由NEW状态,变为RUNABLE状态。当线程创建成功时,线程处于NEW(新建)状态,如果你不调用start方法,那么线程永远处于NEW状态。调用start后,才会变为RUNABLE状态,线程要等待CPU调度,start方法的被调用顺序不能决定线程的执行顺序

run方法其实是一个普通方法,是不能实现并发的,线程对象可以随时随地调用run方法,只不过当线程调用了start方法后,一旦线程被CPU调度,处于运行状态,那么线程才会去调用这个run方法;

public class MyTask implements Runnable{
    private Integer number;
    public MyTask(Integer number){
        this.number = number;
    }
    @Override
    public void run() {
        System.out.println(number);
    }
}
public static void main(String[] args) {
    Thread t1 = new Thread(new MyTask(1));
    Thread t2 = new Thread(new MyTask(2));
    //分开执行先执行t1、t2的start方法
    //t1.start();
    //t2.start();
    //再执行t1、t2的run方法
    t1.run();
    t2.run();
}

执行结果对比:
在这里插入图片描述
在这里插入图片描述

4.【高频】线程池在业务中的使用场景

5.【高频】线程池有哪些参数

ThreadPoolExecutor 3 个最重要的参数:
corePoolSize :核心线程数,线程数定义了最小可以同时运行的线程数量。
maximumPoolSize :线程池中允许存在的工作线程的最大数量
workQueue:当新任务来的时候会先判断当前运行的线程数量是否达到核心线程数,如果达到的话,任务就会被存放在队列中。

ThreadPoolExecutor其他常见参数:
keepAliveTime:线程池中的线程数量大于 corePoolSize 的时候,如果这时没有新的任务提交,核心线程外的线程不会立即销毁,而是会等待,直到等待的时间超过了 keepAliveTime才会被回收销毁;
TimeUnit :keepAliveTime 参数的时间单位。
ThreadFactory:为线程池提供创建新线程的线程工厂
RejectedExecutionHandler :线程池任务队列超过 maxinumPoolSize 之后的拒绝策略

6.ThreadPoolExecutor饱和策略

ThreadPoolExecutor 饱和策略定义:
如果当前同时运行的线程数量达到最大线程数量并且队列也已经被放满了任时,ThreadPoolTaskExecutor 定义一些策略:
ThreadPoolExecutor.AbortPolicy:抛出 RejectedExecutionException来拒绝新任务的处理。
ThreadPoolExecutor.CallerRunsPolicy:调用执行自己的线程运行任务。您不会任务请求。但是这种策略会降低对于新任务提交速度,影响程序的整体性能。另外,这个策略喜欢增加队列容量。如果您的应用程序可以承受此延迟并且你不能任务丢弃任何一个任务请求的话,你可以选择这个策略。
ThreadPoolExecutor.DiscardPolicy:不处理新任务,直接丢弃掉。
ThreadPoolExecutor.DiscardOldestPolicy: 此策略将丢弃最早的未处理的任务请求。

举个例子: Spring 通过 ThreadPoolTaskExecutor 或者我们直接通过 ThreadPoolExecutor 的构造函数创建线程池的时候,当我们不指定 RejectedExecutionHandler 饱和策略的话来配置线程池的时候默认使用的是 ThreadPoolExecutor.AbortPolicy。在默认情况下,ThreadPoolExecutor 将抛出 RejectedExecutionException 来拒绝新来的任务 ,这代表你将丢失对这个任务的处理。 对于可伸缩的应用程序,建议使用 ThreadPoolExecutor.CallerRunsPolicy。当最大池被填满时,此策略为我们提供可伸缩队列。

7.线程池实现原理

在这里插入图片描述

8.项目中会存在一些并发问题吗?

9.接口会有一些并发处理机制

10.juc工具包,AQS,队列数据结构是怎么样的 链表在公平锁和非公平锁情况下的处理

【深入AQS原理】我画了35张图就是为了让你深入 AQS
AQS详解

11.synchronized和lock区别

面试官:谈谈synchronized与ReentrantLock的区别?

12.synchronizedy优化过程,偏向锁怎么实现的?轻量级锁怎么实现的?

13.volatile在Double-check单例模式中的作用

24.ThreadLocal,使用场景,注意事项有哪些,ThreadLocal内存泄漏怎么解决

ThreadLocal全面解析
听说你看过ThreadLocal源码,来面试下这几个问题
谈谈引用和Threadlocal的那些事
面试官:听说你精通并发编程,来说说你对ThreadLocal的理解
ThreadLocal的内存泄露?什么原因?如何避免?

25.线程池参数

26.线程池内部

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

并发编程面试题汇总 的相关文章

  • 03 xxl-job任务执行流程

    作业类型 xxl job支持七种作业类型 Bean GLUE Java GLUE Shell GLUE Python GLUE PHP GLUE Nodejs GLUE PowerShell 其中 GLUE类型作业都是在admin管理端编辑
  • 14.QueuedConnection和BlockingQueuedConnection连接方式源码分析

    QT信号槽直连时的时序和信号槽的连接方式已经在前面的文章中分析过了 见https blog csdn net Master Cui article details 109011425和https blog csdn net Master C
  • java多线程中synchronized同步代码块执行问题

    在高洪岩老师的 java多线程编程核心技术 一书的用同步代码块解决同步方法的弊端一节中 p76页 有这样一句话 当一个线程访问object的一个synchronized同步代码块时 另一个线程依然可以访问该object对象中的非synchr
  • 无线传感网必知必会

    一 填空题 传感器网络三大基本要素 传感器 感知对象 用户 观测者 传感器节点的基本功能模块包括 数据采集模块 数据处理和控制模块 通信模块 供电模块 四个 其中 通信模块 能量消耗最大 传感器节点通信模块的工作模式有 发送 接收 空闲 睡
  • 多线程之创建工作者线程和用户界面线程区别

    转帖 部分原创 1 工作者线程倾向于琐碎的处理 与它不同的是 用户界面线程具有自己的界面而且实际上类似于运行其他应用程序 创建线程而不是其他应用程序的好处是线程可与应用程序共享程序空间 这样可以简化线程与应用程序共享数据的功能 2 典型情况
  • Cpp关键字破解(三)【volatile】篇

    关键字总结 volatile 文章目录 关键字总结 volatile 0 前言 1 概念 2 作用 3 使用场景 4 volatile成员函数 5 代码体验 0 前言 参考几位前辈博客 汇总整理了一下 C 中volatile关键字的使用详解
  • 线程相关面试题

    1 ThreadPoolExecutor 线程池执行 有哪些常用的方法 1 执行线程池 submit excute 2 终止线程池 shutdown 3 判断线程是否终止 isShutdown 4 获取正在运行的线程数 getAcitive
  • 多线程面试总结

    总结 每个对象有一个监视器锁monitor 线程进入同步方法时尝试获取monitor的所有权 其他线程进入阻塞状态 该线程释放monitor的所有权后其他线程重新尝试获取monitor的所有权 只能有一个线程对同步监视器加锁 1 多线程的问
  • Qt启动页多线程

    Qt启动页多线程 项目需要在Qt进入启动页之前加载一个大模型文件 同时要有一个页面用来提示用户加载状态 这里就需要用到多线程了 如果在单线程操作 要么需要等到文件加载完毕后才能显示等待页 要么干脆跳过了模型文件的加载 都是不符合需求的 我们
  • Java使用多线程导入数据到Oracle中

    Oracle中的设置 多线程导入数据到Oracle中 如果是自己设置主键的值 那么肯定会遇到主键冲突的问题 例如线程A计算出的id为10 max id 1 在A线程还没有完成导入时线程B用相同办法得到的id也是10 这时两个线程都请求插入数
  • cpu的出错概率?

    我今天想到了一个很不懂的问题 cpu执行指令会出错吗 出错的概率是多少 为什么服务器能够不间断的工作很长时间呢 难道cpu指令级的东西不会出错 操作系统怎么避免这些错误呢 2012 5 27 找到一篇文章 http wuyudong blo
  • 线程封闭概念

    线程封闭概念 为什么要有线程封闭这个概念呢 多线程中访问共享可变数据时 涉及到线程间数据同步的问题 并不是所有时候都需要共享数据 所以线程封闭概念就出来了 在Java中线程封闭该怎么做呢 可以通过两个方法来做 ThreadLocal 1 T
  • 条件变量(condition variable)详解

    原理 假设我们需要解决这样一个问题 一个列表记录需要处理的任务 一个线程往此列表添加任务 一个线程processTask处理此列表中的任务 这个问题的一个关键点在于processTask怎么判断任务列表不为空 一般有两种方法 一 proce
  • Java 多线程模式 —— Guarded Suspension 模式

    Part1Guarded Suspension 模式的介绍 我们只从字面上看 Guarded Suspension 是受保护暂停的意思 1Guarded Suspension 模式 在实际的并发编程中 Guarded Suspension
  • python网络爬虫实战——实时抓取西刺免费代理ip

    参考网上高手示例程序 利用了多线程技术 Python版本为2 7 coding utf8 import urllib2 import re import threading import time rawProxyList checkedP
  • 02Linux下C语言锁的学习之Linux下的读写锁

    02Linux下C语言锁的学习之Linux下的读写锁 概述 下面的锁的意思均是代表读写锁 读写锁的特性 1 若一把锁被一个线程以读方式锁住 当其它线程以读方式上锁的话 那么可以上锁成功 2 若一把锁被一个线程以写方式锁住 当其它线程以读或者
  • Java多线程(7):并发_线程同步_队列与锁(Synchronized)

    一 并发举例 线程不安全 1 两个人同时操作一张银行卡 如何保证线程安全 2 多个人同时购买一张火车票 谁能买到 二 并发特点 1 同一个对象 2 被多个线程操作 3 同时操作 三 如何保证线程安全 线程同步 队列 锁 1 使用队列的技术一
  • 由一个多线程共享Integer类变量问题引起的。。。

    假设并发环境下 业务代码中存在一些统计操作 为了保证线程安全 开发人员往往会对计数值进行加锁 synchronized 值得注意的是 直接对Integer类型进行加锁 似乎并不会达到预期效果 比如下面这段代码 Integer num new
  • ScheduledThreadPoolExecutor周期定时任务异常处理踩坑的问题!!

    问题原因 在公司写项目的时候 有一个周期定时任务的需求 就想着阿里巴巴开发手册里不是说不能用Executors去创建线程池 因为存在如下问题 FixedThreadPool和SingleThreadPool 允许的请求队列长度为 Integ
  • 线程安全的集合类

    Java中提供了许多集合类 其中有的是线程安全的 有的是线程不安全的 线程安全的集合类有 1 Vector Vector类实现了一个 动态数组 与ArrayList相似 但Vector是同步访问的 2 Stack Stack是Vector的

随机推荐

  • log4cplus基础知识

    一 简介 log4cplus是C 编写的开源的日志系统 具有线程安全 灵活 以及多粒度控制的特点 通过将信息划分优先级使其可以面向程序调试 运行 测试 和维护等全生命周期 你可以选择将信息输出到屏幕 文件 NT event log 甚至是远
  • SSM controller要能跳转页面又要能返回字符串

    SpringMVC因为添加了下面这个bean 视图解析器 当你方法返回的是 json 字符串等其它值时 会404 跳转 jsp jsp页面
  • 回文数的判断

    文章目录 题目 一 方案一 二 方案二 三 方案三 四 方案四 题目 判断一个整数是否是回文数 回文数是指正序 从左向右 和倒序 从右向左 读都是一样的整数 提示 下面案例可供参考 一 方案一 public boolean palindro
  • 二叉树 深度优先搜索(DFS)、广度优先搜索(BFS)

    深度优先搜索算法 Depth First Search DFS是搜索算法的一种 它沿着树的深度遍历树的节点 尽可能深的搜索树的分支 当节点v的所有边都己被探寻过 搜索将回溯到发现节点v的那条边的起始节点 这一过程一直进行到已发现从源节点可达
  • pytorch Embedding模块,自动为文本加载预训练的embedding

    pytorch 提供了一个简便方法torch nn Embedding from pretrained 可以将文本与预训练的embedding对应起来 词 embedding word1 0 2 3 4 word2 1 2 3 4 word
  • Pytorch(六)(模型参数的遍历) —— model.parameters() & model.named_parameters() & model.state_dict()

    神经网络的模型参数 model parameters model named parameters model state dict 这三个方法都可以查看神经网络的参数信息 用于更新参数 或者用于模型的保存 作用都类似 写法略有出入 就以P
  • 爬虫技术研究综述

    爬虫技术研究综述 整理 Ackarlix 挨踢网 中文IT技术社区 http www aitic net 引言 随着网络的迅速发展 万维网成为大量信息的载体 如何有效地提取并利用这些信息成为一个巨大的挑战 搜索引擎 Search Engin
  • react运行项目出现报错:process is not defined

    具体报错效果 导致页面完全不能动弹 点击按钮没有效果 解决方式 首先删除 package lock json 文件夹 然后执行命令 npm install react error overlay 6 0 9 最后重新启动项目
  • End-to-End Object Detection with Transformers[DETR]

    End to End Object Detection with Transformers DETR 背景 概述 相关技术 输入 提取特征 获取position embedding transformer encoder decoder 回
  • C++ 学习笔记(17)tuple类型、bitset类型、随机数(引擎和分布)、IO库(操纵符、未格式化输入输出、随机访问)

    C 学习笔记 17 tuple类型 bitset类型 随机数 引擎和分布 IO库 操纵符 未格式化输入输出 随机访问 参考书籍 C Primer 5th 17 1 tuple 类型 17 1 1 定义和初始化tuple tuple 的构造函
  • 极路由 1s HC5661 玩转 openwrt

    注意 我的极路由1s是老版本的 是不带A的 安装篇 1 安装breed 根据这篇文章安装breed 成功后你就拥有了一台刷不死的路由器 2 下载openwrt系统 在这个网站可以下载 选择HC5661的版本 3 断电 按住reset键 上电
  • 在字符串中删除特定字符

    题目 在字符串中删除特定字符 删除后字符串变为 hi i a 即将原串中包含t e s中的都删除掉了 分析 方法 1 从头扫描原串 每遇到一个字符 在要删的串中比一遍 有的话就删除当前字符 然后继续下一个字符的判断 方法 2 由于方法 1
  • Shell编程学习(三)条件判断、流程控制

    条件判断 test 类似于if 前面说到过 可以用来判断上一个命令是否正确执行 我们就用一下这个命令来查看 等号两边要有空格 root iZwz9hv1phm24s3jicy8x1Z echo a 12 root iZwz9hv1phm24
  • MySQL是怎样运行的:从根儿上理解MySQL

    文章目录 快速查询的秘籍 B 树索引 1 没有索引的查找 1 1 在一个页中的查找 1 2 在很多页中查找 2 索引 2 1 一个简单的索引方案 2 2 InnoDB中的索引方案 1 聚簇索引 2 二级索引 2 3 InnoDB的B 树索引
  • python输出文件有省略号_解决python 输出是省略号的问题

    这个问题非常非常重要 搞了一晚上都没解决好 但是真的很简单很简单 如果你也 是用的numpy array 如果你也想得到输出矩阵的全部内容 而不是省略形式 0 10284943 0 0959931 0 00076021 0 01035775
  • 计算机技能应用大赛Java

    GO GO GO 大家好 我是你们的晴天学长 这是Java初赛考试范围知识点的快速链接 请自取哦 各位小伙伴觉得有帮助的话 可以给博主来波关注哦 考试范围 Java基础及环境 JDK发展历史 不同版本的进阶内容 Java程序的编写 编译 调
  • Unbuntu 20.4 配置RTX2080ti环境

    具体配置 显卡驱动460 cuda 11 0 3 450 51 06 linux run cudnn 11 3 linux x64 v8 2 1 32 Tensirflow 1 13 1 python 3 6 亲测有效
  • 微服务Ribbon在docker中无法通过服务名(SERVICE-ID)映射到宿主机IP

    I O error on GET request for http API ADMIN microservice 1 280d0f4200d8 nested exception isjava net UnknownHostException
  • Ubuntu操作系统学习笔记之FTP基础

    说明 FTP File Transfer Protocol 一个 古老但应用极为广泛 的互联网协议 FTP提供了一种可靠的方式在网络上进行文件共享 C S 架构 基于 TCP 提供了数据传输的可靠性 标准端口 20 数据端口 21 指令端口
  • 并发编程面试题汇总

    并发编程面试题 1 创建线程的方式有哪些 1 1继承 Thread 类 1 2实现 Runnable 接口 1 3实现 Callable 接口 1 4使用 Executors 工具类创建线程池 1 5使用 ThreadPoolExecuto