首页 > 编程语言 >Java面试查漏补缺(1)

Java面试查漏补缺(1)

时间:2023-05-13 13:22:51浏览次数:54  
标签:Web 查漏 Java LinkedList Tomcat 应用程序 任务 线程 补缺

Java面试查漏补缺(1)

1. 无序List查询问题

如果你有一个存储了10万条无序整数数据的LinkedList,并且需要高效地查询其中一个元素,可以考虑以下两种方式

  1. 使用HashSet进行查询:

    • 将LinkedList中的所有元素逐个添加到HashSet中。HashSet是基于哈希表实现的数据结构,具有快速的查找性能。
    • 查询时,可以直接使用HashSet的 contains方法来检查元素是否存在,时间复杂度为O(1)。
    • 这种方法的时间复杂度为O(n),其中n是LinkedList中的元素数量。
     javaCopy code
     LinkedList<Integer> linkedList = new LinkedList<>();
     // 添加元素到LinkedList
     
     HashSet<Integer> hashSet = new HashSet<>(linkedList);
     
     // 查询元素
     if (hashSet.contains(targetElement)) {
         // 元素存在
     } else {
         // 元素不存在
     }
    
  2. 将****LinkedList转换为数组后进行二分查找

    • 将LinkedList转换为数组,可以使用 toArray方法。
    • 对数组进行排序,可以使用 Arrays.sort方法。
    • 使用二分查找算法,如 Arrays.binarySearch方法,在排序后的数组中进行查询,时间复杂度为O(log n)。
    • 这种方法的时间复杂度为O(n log n),其中n是LinkedList中的元素数量。
     javaCopy code
     LinkedList<Integer> linkedList = new LinkedList<>();
     // 添加元素到LinkedList
     
     Integer[] array = linkedList.toArray(new Integer[0]);
     Arrays.sort(array);
     
     // 查询元素
     int index = Arrays.binarySearch(array, targetElement);
     if (index >= 0) {
         // 元素存在
     } else {
         // 元素不存在
     }
    

根据具体情况,选择适合的方法可以高效地查询LinkedList中的元素。如果查询次数较多,可以考虑将LinkedList转换为HashSet进行查询,而如果只进行一次查询或查询次数较少,可以将LinkedList转换为数组后使用二分查找算法。

2. java如何保证线程池中的线程都处于工作状态

Java的线程池通过以下方式来确保线程都处于工作状态:

  1. 核心线程和线程池大小:线程池有一个核心线程池大小,即最小线程数,以及一个最大线程池大小。在任务提交时,线程池会首先尝试创建核心线程来执行任务。如果核心线程都在执行任务,而任务队列未满,新任务会被放入任务队列中等待执行。如果任务队列已满,而且当前线程池中的线程数还未达到最大线程池大小,线程池会创建新的线程执行任务。因此,核心线程和最大线程池大小的设置可以确保线程池中有足够的线程来执行任务。
  2. 任务队列:线程池中的任务队列用于存储待执行的任务。任务队列可以是有界队列(如 ArrayBlockingQueue)或无界队列(如 LinkedBlockingQueue)。有界队列可以控制任务的提交速度,避免过多的任务提交导致内存溢出。无界队列可以无限制地接收任务,但可能会导致内存资源耗尽。
  3. 拒绝策略:当任务队列已满且线程池中的线程数已达到最大线程池大小时,新任务的处理方式由拒绝策略决定。Java提供了几种内置的拒绝策略,例如丢弃任务、丢弃最旧的任务、抛出异常等。通过合理选择拒绝策略,可以避免任务丢失或线程池资源耗尽的问题。
  4. 线程池的监控和调优:Java提供了一些监控和管理线程池的手段,例如 ThreadPoolExecutor类中的方法和属性,可以获取线程池的活动线程数、任务队列大小等信息。通过监控线程池的状态和性能,可以及时调整线程池的配置,确保线程池中的线程都处于工作状态。

综上所述,通过合理设置核心线程池大小、最大线程池大小、任务队列以及拒绝策略,并监控和调优线程池的状态,可以确保线程池中的线程都能够有效地执行任务,保持工作状态。

3. 如果线程池里有线程挂掉了怎么办

如果线程池中的线程挂掉了,即线程异常终止或发生意外错误,可以采取以下措施来处理:

  1. 监控线程池:定期监控线程池的状态,包括活动线程数、任务队列大小等指标。可以使用线程池提供的监控方法或通过自定义监控逻辑来实现。如果发现线程池中的线程数低于预期或异常终止的线程数增多,可以判断线程挂掉了。
  2. 异常处理:当线程异常终止时,可以捕获异常并进行处理。在 Runnable任务的 run方法中,可以使用 try-catch块捕获异常,并在捕获到异常时进行相应的处理操作。例如,记录日志、重启线程、重新提交任务等。
  3. 自动重启线程:一种策略是在线程异常终止后,自动重启线程以保持线程池的可用性。可以通过监控线程池的状态,在线程异常终止后重新创建并启动新的线程,以填补线程池中的空缺。
  4. 线程池的拒绝策略:合理选择线程池的拒绝策略也可以应对线程挂掉的情况。例如,使用 CallerRunsPolicy拒绝策略可以将任务退回给调用线程执行,从而避免因线程挂掉导致的任务丢失。
  5. 监控和报警:建立线程池的监控系统,通过定期检查线程池的状态并进行报警,可以及时发现线程挂掉的情况,并采取相应的措施处理。

需要注意的是,线程挂掉可能是由于严重的错误或资源耗尽等问题引起的。因此,在处理线程挂掉的情况时,需要分析错误原因、调查异常情况,并采取相应的纠正措施,以确保线程池的稳定运行。

4. 如果在tomcat中部署了两个web应用程序,tomcat运行时会有几个进程?

在Tomcat中,每个Web应用程序都是作为独立的上下文(Context)运行的,而Tomcat本身会有一个主进程。因此,在部署了两个Web应用程序的情况下,Tomcat运行时通常会有两个进程:

  1. 主进程(Tomcat进程):这是Tomcat服务器的主进程,负责管理整个服务器的启动、关闭和主要的管理任务。该进程是整个Tomcat服务器的控制中心。
  2. 每个Web应用程序的进程:每个部署在Tomcat中的Web应用程序都会被分配一个独立的进程来运行。这些进程是相互隔离的,每个进程负责执行与该应用程序相关的任务,例如请求处理、会话管理等。

每个Web应用程序进程都有自己的线程池和资源,它们独立于其他Web应用程序进程。这样可以确保在一个Web应用程序中发生的故障或异常不会影响其他Web应用程序的正常运行。

需要注意的是,具体的进程数量可能还受到其他因素的影响,例如Tomcat的配置、使用的操作系统等。上述描述是基于一般情况下的典型行为。如果你想要确认Tomcat运行时的进程数量,可以查看操作系统的进程监视工具或Tomcat的日志文件来获取更准确的信息。

5. tomcat中部署的两个web程序的dependencies和tomcat的dependencies有关联吗

部署在Tomcat中的两个Web应用程序的依赖关系与Tomcat本身的依赖关系是有关联的,但它们之间的关联是间接的。下面解释一下这种关联的性质:

  1. 直接依赖关系:Tomcat本身是一个独立的服务器,它有自己的依赖关系,包括Java运行时环境(JRE)和Tomcat所需的各种库和组件。这些依赖关系是Tomcat服务器运行所必需的,与具体的Web应用程序无关。
  2. 间接依赖关系:每个Web应用程序可以有自己的依赖关系,包括第三方库、框架和其他模块。这些依赖关系是应用程序开发者定义的,与Tomcat服务器本身的依赖关系可能不同。当部署Web应用程序时,应用程序的依赖关系将被加载到Tomcat的类路径中,以便应用程序可以正常运行。

尽管两个Web应用程序可能共享Tomcat服务器的相同版本和共同的一些库,但它们的具体依赖关系可能是不同的。这意味着两个应用程序可以独立地包含它们自己的依赖项,并且它们之间的依赖关系通常是隔离的。Tomcat服务器负责管理并加载每个应用程序的依赖项,以确保它们在运行时不会相互干扰。

需要注意的是,如果两个Web应用程序使用相同的库和版本,这些库的实例可能会在Tomcat服务器的内存中共享。这可以减少内存使用,并提高性能。但是,每个应用程序仍然是独立的运行实体,它们之间的依赖关系不会直接影响对方。

标签:Web,查漏,Java,LinkedList,Tomcat,应用程序,任务,线程,补缺
From: https://www.cnblogs.com/maoqifansBlog/p/17397202.html

相关文章

  • Java实验
    Java实验一面向对象编程图书类点击查看代码importjava.util.Date;//java.sql.Date;importjava.text.SimpleDateFormat;interfacemanagement{voidborrow();voidrebook();}classBook{Stringname;Datedate;Stringlog;intcount;......
  • java 腾讯云、阿里云SMS短信工具类
    引入POM依赖<!--腾讯云SMSSDK--><dependency><groupId>com.tencentcloudapi</groupId><artifactId>tencentcloud-sdk-java-sms</artifactId><version>3.1.754</version&g......
  • Java | 一分钟掌握定时任务 | 1 - 基本概念
    作者:Mars酱声明:本文章由Mars酱原创,部分内容来源于网络,如有疑问请联系本人。转载:欢迎转载,转载前先请联系我!什么是定时任务定时任务就是在指定时间执行的一个或一串动作的行为。现实世界中,比如我们向自己心爱的女友送上祝福;给自己的好友送上祝福。那么,我们为了准时送祝福,会怎么做?当然......
  • Java基础学习
    Java特性和优势简单性面向对象性(万物皆对象)可移植性(跨平台性)高性能分布式(URL、远程方法调用)动态性(反射机制)多线程(交互性、实时性)安全性健壮性(异常机制)Java版本JVM:虚拟机,实现跨平台JavaSE(标准版):桌面程序、控制台开发......JavaME(嵌入式开发)JavaEE(企业级开......
  • Java--多线程
    Java--多线程进程线程多线程的实现方式方法1:继承Thread类定义一个类继承Thread方法再该类中重写run()方法创建该类的对象启动线程代码示例类publicclassdemoextendsThread{//继承Thread方法@Overridepublicvoidrun(){//重写run方法,把代码片断......
  • java基于springboot+vue的农机电招平台、农机租赁管理系统,附源码+数据库+文档+PPT,适合
    1、项目介绍该系统包括前台操作和后台管理两个部分,一方面,为用户提供首页,农机,系统公告,个人中心,后台管理等功能;另一方面,为管理员提供首页,个人中心,农机机主管理,使用者管理,农机类型管理,农机管理,农机预约管理,系统管理等功能。项目获取,看这里2、技术框架编程语言:java系统架构:B/S......
  • 必知必会的JavaScript前端面试题篇(二),不看后悔!
    必知必会的JavaScript前端面试题篇(二),不看后悔!1.JavaScript有哪些数据类型以及它们的区别?js一共有八种数据类型,分别是:Undefined,Null,Boolean,Number,String,Object,Symbol,BigInt其中Symbol,BigInt是ES6中新增的数据类型:Symbol:代表唯一的数据类型,主要为了解......
  • 10款Flash和Javascript网页音乐播放器
    关联:9FreshjQueryMediaPlayers   10款音乐播放器,有基于javascript的网页音乐播放器,也有基于Flash的音乐播放器。赶快挑一款,分享你喜爱的音乐吧! 1.Dewplayer  Dewplayer是一个微型,免费的Flashmp3播放器,具有简洁的界面。Dewplayer包含三种不同的尺寸界面。  2.......
  • java中this的内存原理以及成员变量和局部变量
    this的内存原理1、this的作用:区分局部变量和成员变量eg:publicclassStudent{ privateintage; publicvoidmethod(){ intage=10; System.out.println(age);//10 System.out.println(this.age);//0使用this.可以直接使用成员变量的age }}2、this的本质:代......
  • Java基础语法
    注意:​ 用记事本打开本文档,格式较差。​ 可安装typora软件后再次打开。​ 安装包位于:day01\资料\其他软件\阅读笔记的软件\typora-setup-x64.exeday01-Java基础语法1.人机交互1.1什么是cmd?就是在windows操作系统中,利用命令行的方式去操作计算机。我们可以利用cmd命令......