首先感谢大家之前的观看呀~兄弟们~
这边把我去过几家公司面试的题目都写一下哈,像我大二下,就是前两个月7-9进了公司进行后端实习,哎.....反正就是学学学..话不多说~
1.Frist
1.HashMap实现原理
HashMap是基于哈希表的Map接口的非同步实现。它存储的内容是键值对(key-value)。主要通过数组的索引来快速定位数据的位置,同时解决哈希冲突问题(如链表法或红黑树法)。
2.创建线程的方式,线程的状态
- 创建线程的方式:继承
Thread
类、实现Runnable
接口、使用Callable
和FutureTask
(返回结果)、通过ExecutorService
等。 - 线程的状态:新建(NEW)、就绪(RUNNABLE)、运行(RUNNING)、阻塞(BLOCKED)、等待(WAITING)、超时等待(TIMED_WAITING)和终止(TERMINATED)
3.线程池的七个参数和应用场景
-
1. 核心线程数(corePoolSize)
定义:线程池中保持存活的最小线程数。即使这些线程是空闲的,它们也不会被销毁,除非设置了
allowCoreThreadTimeOut
为true
(这取决于具体的线程池实现,如ThreadPoolExecutor
)。应用场景:这个参数的设置取决于你的应用需要多少线程来并行处理任务,同时又不希望线程数量过多导致资源浪费。例如,如果你的应用需要持续处理大量的任务,并且这些任务可以并行执行,那么你可以设置一个相对较大的核心线程数来充分利用多核CPU的优势。
2. 最大线程数(maximumPoolSize)
定义:线程池中允许的最大线程数。当工作队列满了之后,线程池会尝试创建新的线程来执行任务,但最多只能创建到最大线程数。
应用场景:这个参数的设置取决于你的系统能够承受的最大并发线程数,以及你的应用能够从并发执行中获得的性能提升。设置得太大可能会导致过多的线程竞争CPU和内存资源,反而降低性能;设置得太小则可能无法充分利用系统资源。
3. 非核心线程空闲存活时间(keepAliveTime)
定义:超过核心线程数之外的线程空闲存活时间。当这些线程空闲超过这个时间后,它们将被终止并从线程池中移除。
应用场景:这个参数的设置可以帮助你控制线程池中的线程数量,避免在系统负载降低时还保留大量的空闲线程。通过调整这个参数,你可以让线程池更加灵活地适应系统负载的变化。
4. 时间单位(unit)
定义:
keepAliveTime
参数的时间单位,如秒、毫秒等。应用场景:这个参数通常与
keepAliveTime
一起使用,用于指定非核心线程空闲存活时间的具体单位。5. 工作队列(workQueue)
定义:用于存放待执行的任务的阻塞队列。当所有核心线程都在忙时,新任务会被添加到工作队列中等待执行。
应用场景:工作队列的选择会影响线程池的行为。常见的队列类型有
ArrayBlockingQueue
(有界队列)、LinkedBlockingQueue
(无界队列,但可以通过构造函数的参数限制其容量)、SynchronousQueue
(不存储元素的阻塞队列,每个插入操作必须等到另一个线程调用移除操作)等。根据你的应用需求选择合适的队列类型非常重要。6. 线程工厂(threadFactory)
定义:用于创建新线程的工厂。通过这个工厂,你可以自定义线程的创建过程,比如设置线程的优先级、守护状态、名称等。
应用场景:当你需要创建具有特定属性的线程时(如特定的线程名称或优先级),可以使用自定义的线程工厂。这有助于在日志中更容易地识别线程,或者在调试时更容易地跟踪线程的行为。
7. 拒绝策略(handler)
定义:当线程池和任务队列都满了时,用于处理新任务的策略。Java提供了几种预定义的拒绝策略,如
AbortPolicy
(默认策略,直接抛出异常)、CallerRunsPolicy
(由提交任务的线程执行该任务)、DiscardOldestPolicy
(丢弃队列中最老的任务,然后尝试提交新任务)和DiscardPolicy
(直接丢弃新任务,不执行也不抛出异常)。应用场景:选择合适的拒绝策略取决于你的应用需求。例如,如果你希望避免任务被丢弃,可以选择
CallerRunsPolicy
;如果你希望系统在达到负载极限时能够自我保护,可以选择AbortPolicy
并妥善处理异常。
4.JUC并发工具包用过哪些(有时候会问啊,频率不高)
JUC(java.util.concurrent)提供了丰富的并发工具,如CountDownLatch
、CyclicBarrier
、Semaphore
、ReentrantLock
、ReadWriteLock
、ConcurrentHashMap
等。
5.CAS和AQS(这个需要了解一下=。=,有时候会问..)
6.数据库Mysql的sql语句掌握程度
join left join这些,索引的话,他有时候会给出一个场景,但是其实很多就说哎呀数据库都会用吧
毕竟很多都有Ai来实现,工作后你把他们拼成一起就可以了
8.数据库索引的种类,为什么建索引(这个啥呀问了前边的就应该都会问)
数据库索引主要分为以下几种类型:
-
主键索引:保证数据唯一性,同时提高查询效率。
-
唯一索引:要求索引字段的值必须唯一,可以有多个唯一索引,允许NULL值。
-
普通索引:最基本的索引,无特别限制,用于提高查询速度。
-
全文索引:专门用于文本搜索,快速找到包含特定关键词的数据。
-
复合索引:在多个列上创建的索引,适用于查询条件涉及多个列的情况。
为什么建索引
建立索引主要是为了:
-
提高查询效率:避免全表扫描,快速定位数据。
-
维护数据完整性:如唯一性约束。
9.sql优化有了解吗?应用场景
应用场景
- 查询语句优化:
- 使用合适的索引:为经常作为查询条件的列添加索引,可以极大提高查询速度。
- 优化WHERE子句:确保WHERE子句中的条件能够有效利用索引,避免在WHERE子句中对字段进行函数操作或类型转换。
- **避免SELECT ***:只选择需要的列,而不是使用SELECT *,以减少数据传输量。
- 使用连接(JOIN)代替子查询:在可能的情况下,使用JOIN代替子查询可以提高查询效率。
- 使用LIMIT分页:对于大量数据的查询,使用LIMIT来限制返回的结果集大小,以减少资源消耗。
- 数据库表结构优化:
- 规范化:通过数据库规范化来减少数据冗余,提高数据完整性,但过度规范化会增加查询的复杂度。
- 反规范化:在某些情况下,适度的反规范化(如添加冗余字段、创建汇总表等)可以减少查询时的连接操作,提高查询效率。
- 使用合适的数据类型:确保表中使用的数据类型是恰当的,避免不必要的数据存储开销。
- 查询执行计划分析:
- 利用数据库提供的查询执行计划分析工具(如EXPLAIN),分析查询语句的执行路径和成本,从而找到性能瓶颈。
-
高并发访问的Web应用:在Web应用中,数据库往往是性能瓶颈之一。通过SQL优化,可以减少数据库的负载,提高Web应用的响应速度。
-
数据仓库和BI系统:在数据仓库和BI系统中,经常需要处理大量的历史数据和复杂的查询。SQL优化可以帮助这些系统更快地响应查询请求,提高分析效率。
-
实时数据处理系统:在实时数据处理系统中,如物联网、金融交易等,对数据的实时性要求很高。通过SQL优化,可以确保系统在处理大量实时数据时保持高性能。
-
大规模数据分析:在处理大规模数据集时(如大数据场景),SQL优化对于提高查询性能、减少资源消耗和缩短处理时间至关重要。
数据库就基本这些,反正就一堆一堆举例,我说实话挺多的
2.Redis
到了redis~
等我后续写另一篇...一大堆放在一起很麻烦
3.Spring
1.Spring框架IOC容器启动过程
2.Spring中的Bean的生命周期(这个问的话大家说一下就行)
3.像spring框架这种东西吧,他AOC IOP都会问~
4.Spring事务中,什么情况下导致事务失效
5.Spring框架提供集中事务的传播行为(基本上问的很少)
6.Springboot相比于SSM的优势劣势在哪
4.others(肯定是问你项目啦,我的是微服务)
1.你的项目中使用分布式锁,你的实现方案是什么,出现并发修改的时候你是怎么做的
2.分布式事务和传统的事务相同点和不同点
3.服务熔断和服务降级怎么理解的
4.介绍你的项目中某个具体的流程
比如RabbitMQ,消息队列嘛,你会不会遇到一些消息挤压,消息丢失,重复消费呀之类的问题,简单说说,哎呀面试官现在大部分问的项目一坨一坨= =你得非常了解
上一个不了解的人已经到村门口去放牛了,哎,谁叫我们19岁正是不懂劳动法当牛马的好年纪......
附加算法(我都服了,作为一个数据库和数据结构都挂过科的人= =
据说秋招还说笔试成绩决定面试成绩,笔试又都是算法+.....+)
1.AB间的最短路径
2.实现快排
3.反转链表
4.红黑树
5.空间换时间