职场新星:Java面试干货让你笑傲求职路(三)
职场新星:Java面试干货让你笑傲求职路
- 1、token 为什么存放在 redis 中?
- 2、索引的底层原理是什么?
- 3、Spring IOC和AOP的原理
- 4、接口和抽象类有什么共同点和区别?
- 5、为什么要使用线程池?直接new个线程不好吗?
- 6、 线程池的核心属性有哪些?
- 7、线程池中的各个状态分别代表什么含义?
- 8、线程池有哪些队列?
- 9、线程池有哪些拒绝策略?
- 10、Executors 提供了哪些创建线程池的方法?
1、token 为什么存放在 redis 中?
答:Token 是一种身份验证机制,用于验证用户的身份。在Web应用程序中,通常使用token来保护用户的敏感信息和操作。将token存储在Redis可以提供以下优点:
- 快速访问:Redis是内存数据库,读取速度非常快。这意味着通过Redis存储的token可以快速访问,从而提高了应用程序的性能。
- 分布式环境下的共享:在分布式环境中,多个服务器可能需要访问同一个token。将token存储在Redis中,可以使不同的服务器共享同一个token,从而确保应用程序的一致性。
- 自动过期:Redis支持设置过期时间,可以让token在一段时间后自动过期。这可以防止token被滥用和保护用户的安全。
- 可以进行监控和管理:Redis提供了监控和管理工具,可以帮助开发人员查看token的使用情况和管理token的过期时间。
2、索引的底层原理是什么?
答:索引(index)是能够帮助数据库提升查询效率的一种数据结构。换一种易懂的说法:索引是一种数据结构,他的作用是使数据库查询数据更快。
数据库对于索引的处理过程
在我们为表的某个字段设置索引之后,数据库会将该字段数据复制,并将复制的数据以某种数据结构重新排列,保存为索引文件。当使用索引字段做查询条件对该表进行查询操作的时候,数据库会打开索引文件并通过其中的数据结构来快速定位目标数据。
索引应用的数据结构
B TREE(Balance tree)、B+TREE
B TREE和B+TREE是一种优化关系:B TREE先出现,通过对它的优化设计产生了B+TREE。
B TREE:
上图为一个B TREE的结构示例,下面对B TREE中的元素逐一说明,需要结合图片理解:
1、阶:阶表示B TREE的层数(横向),那么B TREE为3阶平衡树
2、节点:每一个节点都是一个方块,位于最顶部的叫做根节点,最底部是叶子结点,其他的叫中间节点。每个节点中包含下列元素:
数字(K):关键字(存放索引字段)
Data(D):关键字对应详细数据Data
指针(P):指向下方子节点
BTree的特点:
1、叶子结点无P指针
2、指针P和关键字K交叉排序,所以每个节点中的指针P一定比关键字K多一个
3、关键字从左到右有序排列(K后的序号顺序)
4、所有子节点的关键字范围不得超过指针对应父节点左右两侧关键字的范围。
5、所有叶子节点的深度(阶数)相同
6、所有节点的关键字不重复(关键字可能不必走到叶子节点即可命中Data)
通过Btree的结构可以分析出:B TREE以类似二分的结构,通过范围过滤的算法来提高查询效率,当关键字在某节点命中后,获取该K的data来返回查询结果,这就是索引的底层原理。
B + TREE
B+TREE是基于B TREE的一种增强设计
B+TREE的特点:
1、节点中关键字x与指针p个数相同
2、目标数据只有到达叶子节点才会命中(data数据只存在于叶子节点),也就是说使用B+TREE的索引一定会走到叶子节点
3、每个叶子节点增加一个指针,按顺序指向相邻叶子节点(提升区间访问性能)
以上就是索引采用的两种底层数据结构,目前数据库产品的索引大都基于这两种数据结构,接下来以MYSQL为例看一下索引的应用实例:
MySQL索引实现
mysql中的索引是采用B+TREE实现的。另外,在mysql中有一个存储引擎的概念(可以理解为mysql存数据的一个中间处理器)。
- MyISAM:在MyISAM存储引擎中索引的实现逻辑是:在B+TREE的
叶子节点存放着对应记录的内存地址D,然后再通过该地址D关联对应表数据以获取消息数据,
这种设计方式实现的索引叫做“非聚合索引”, - InnoDB:与MyISAM最核心的区别是:在InnoDB存储引擎中,叶子节点直接存放了数据详细信息,也就是说InnoDB直接将表数据本身做成了B+TREE数据结构(由于不需要再查一次表数据,这使得查询速度更快),这种设计方式实现的索引叫做“聚合索引”。
3、Spring IOC和AOP的原理
答:1、IOC:控制反转,程序之间解耦,在类和类之间存在控制权,控制权指的是对象的创建和使用
比如说有类A和类B,我们之前的做法是在A中调用B,那么控制权就在A中,这样做的耦合度高,如果修改了B,A也要做相应修改。引入Spring框架后,控制权由Spring容器来负责。当A想使用B时,需要由Spring容器通过配置文件进行注入。这种思想就是ioc(将对象的创建和使用控制权转移到了Spring容器,由Spring容器来控制)。
2、AOP:面向切面编程,Struts2的拦截器,就是使用AOP的思想。使用AOP来管理事务(事务处理、日志管理、权限控制等)。Spring AOP就是基于动态代理的,如果要代理的对象,实现了某个接口,那么AOP会使用JDK Proxy,去创建代理对象,而对于没有实现接口的对象,就无法使用JDK proxy去进行代理,而是会使用Cglib Proxy来生成一个被代理对象的子类作为代理。
4、接口和抽象类有什么共同点和区别?
答:
- 共同点:
- 都不能被实例化。
- 都可以包含抽象方法。
- 都可以有默认实现的方法(Java 8 可以用 default 关键字在接口中定义默认方法)。
- 区别:
- 接口主要用于对类的行为进行约束,你实现了某个接口就具有了对应的行为。抽象类主要用于代码复用,强调的是所属关系。
- 一个类只能继承一个类,但是可以实现多个接口。
- 接口中的成员变量只能是 public static final 类型的,不能被修改且必须有初始值,而抽象类的成员变量默认 default,可在子类中被重新定义,也可被重新赋值。
5、为什么要使用线程池?直接new个线程不好吗?
答:如果我们在方法中直接new一个线程来处理,当这个方法被调用频繁时会创建很多线程,不仅会消耗系统资源,还会降低系统的稳定性。
使用线程池的好处:
- 降低资源消耗。通过重复利用已创建的线程,降低线程创建和销毁造成的消耗。
- 提高响应速度。当任务到达时,任务可以不需要等到线程床就能立即执行。
- 增加线程的可管理性。线程是稀缺资源,使用线程池可以进行统一分配,调优和监控。
6、 线程池的核心属性有哪些?
答:
threadFactory
(线程工厂):用于创建工作线程的工厂。corePoolSize
(核心线程数):当线程池运行的线程少于- corePoolSize 时,将创建一个新线程来处理请求,即使其他工作线程处于空闲状态。workQueue
(队列):用于保留任务并移交给工作线程的阻塞队列。maximumPoolSize
(最大线程数):线程池允许开启的最大线程数。handler
(拒绝策略):往线程池添加任务时,将在下面两种情况出发拒绝策略:1)线程池运行状态不是RUNNING;2:)线程池已经达到最大线程数,并且阻塞队列已满时。keepAliveTime
(保持存活时间):如果线程池当前线程数超过 corePoolSize,则多余的线程空闲时间超过 keepAliveTime 时会被终止。
7、线程池中的各个状态分别代表什么含义?
答:线程池目前有5个状态:
RUNNING
:接受新任务并处理排队的任务。SHUTDOWN
:不接受新任务,但处理排队的任务。STOP
:不接受新任务,不处理排队的任务,并中断正在进行的任务。TIDYING
:所有任务都已终止,workerCount为零,线程转换到 TIDYING 状态将运行 terminated() 钩子方法。TERMINATED
:terminated() 已完成。
8、线程池有哪些队列?
答:常见的阻塞队列有以下几种:
-
ArrayBlockingQueue
: 基于数组结构的有界阻塞队列,按先进先出对元素进行排序。 -
LinkedBlockingQueue
:基于链表结构的有界/无解阻塞队列,按先进先出对元素进行排序,吞吐量通常高于 ArrayBlockingQueue。Executor.newFixedThreadPool
使用了该队列。 -
SynchronousQueue
:不是一个真正的队列,而是一种在线程之间移交的机制。要将一个元素放入 SynchronousQueue 中,必须有另一个线程正在等待接受这个元素。如果没有线程等待,并且线程池的当前大小小于最大值,那么线程池将创建一个线程,否则根据拒绝策略,这个任务将被拒绝。使用直接移交将更高效,因为任务会直接移交给执行它的线程,而不是被放在队列中,然后由工作线程从队列中提取任务。只有当线程池是无界的或者可以拒绝任务时,该队列才有实际价值。Executor.newCachedThreadPool
使用了该队列。 -
PriorityBlockingQueue
:具有优先级的无界队列,按优先级对元素进行排序。元素的优先级是通过自然顺序或 Comparator 来定义的。
9、线程池有哪些拒绝策略?
答:常见的有以下几种:
AbortPolicy
:中止策略。默认的拒绝策略,直接抛出 RejectedExecutionException。调用者可以捕获这个异常,然后根据需求编写自己的处理代码。
DiscardPolicy
:抛弃策略。什么都不做,直接抛弃被拒绝的任务。
DiscardOldestPolicy
:抛弃最老策略。抛弃阻塞队列中最老的任务,相当于就是队列中下一个将要被执行的任务,然后重新提交被拒绝的任务。如果阻塞队列是一个优先队列,那么“抛弃最旧的”策略将导致抛弃优先级最高的任务,因此最好不要将该策略和优先级队列放在一起使用。
CallerRunsPolicy
:调用者运行策略。在调用者线程中执行该任务。该策略实现了一种调节机制,该策略既不会抛弃任务,也不会抛出异常,而是将任务回退到调用者(调用线程池执行任务的主线程),由于执行任务需要一定时间,因此主线程至少在一段时间内不能提交任务,从而使得线程池有时间来处理完正在执行的任务。
10、Executors 提供了哪些创建线程池的方法?
答:
-
newFixedThreadPool
:固定线程数的线程池。corePoolSize = maximumPoolSize,keepAliveTime为0,工作队列使用无界的LinkedBlockingQueue。适用于为了满足资源管理的需求,而需要限制当前线程数量的场景,适用于负载比较重的服务器。 -
newSingleThreadExecutor
:只有一个线程的线程池。corePoolSize = maximumPoolSize = 1,keepAliveTime为0, 工作队列使用无界的LinkedBlockingQueue。适用于需要保证顺序的执行各个任务的场景。 -
newCachedThreadPool
: 按需要创建新线程的线程池。核心线程数为0,最大线程数为 Integer.MAX_VALUE,keepAliveTime为60秒,工作队列使用同步移交 SynchronousQueue。该线程池可以无限扩展,当需求增加时,可以添加新的线程,而当需求降低时会自动回收空闲线程。适用于执行很多的短期异步任务,或者是负载较轻的服务器。 -
newScheduledThreadPool
:创建一个以延迟或定时的方式来执行任务的线程池,工作队列为 DelayedWorkQueue。适用于需要多个后台线程执行周期任务。 -
newWorkStealingPool
:JDK 1.8 新增,用于创建一个可以窃取的线程池,底层使用 ForkJoinPool 实现。
相关文章:

职场新星:Java面试干货让你笑傲求职路(三)
职场新星:Java面试干货让你笑傲求职路 1、token 为什么存放在 redis 中?2、索引的底层原理是什么?3、Spring IOC和AOP的原理4、接口和抽象类有什么共同点和区别?5、为什么要使用线程池?直接new个线程不好吗?…...
获取指定收获地址的信息
目录 1 /// 获取指定收获地址的信息 2 /// 删除指定的收获地址信息 3 /// 取消订单 4 /// 确认订单收货 /// <summary> /// 获取指定收获地址的信息</...

突破笔试:力扣全排列(medium)
1. 题目链接:46. 全排列 2. 题目描述:给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。 示例 1: 输入:nums [1,2,3] 输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[…...

gitlab 503 错误的解决方案
首先使用 sudo gitlab-ctl status 命令查看哪些服务没用启动 sudo gitlab-ctl status 再用 gitlab-rake gitlab:check 命令检查 gitlab。根据发生的错误一步一步纠正。 gitlab-rake gitlab:check 查看日志 tail /var/log/gitlab/gitaly/current删除gitaly.pid rm /var/opt…...

智能离子风棒联网监控静电消除器的主要功能和特点
智能离子风棒联网监控静电消除器是一种集成了智能化和网络化监控功能的设备,用于监测和消除静电现象。它的工作原理是通过产生大量的正负离子,将空气中的静电中和和消除,从而达到防止静电积累和放电的目的。 智能离子风棒联网监控静电消除器的…...

matplotlib 设置legend的位置在轴最上方,长度与图的长度相同
import matplotlib.pyplot as plt import numpy as npx1 np.linspace(0, 10, 50) x2 [6,4,3]ax plt.subplot() ax.plot(x1, label"test1") ax.plot(x2, label"test2") # 设置图例的位置 # 将左下角放置在【0, 1.02】位置处,横为1,…...
Docker-Compose 安装rabbitmq
【编写:docker-compose-rabbitmq.yml】创建数据目录: mkdir -p /opt/rabbitmq/data cd /opt/rabbitmq# 创建 docker-compose-rabbitmq.yml vim docker-compose-rabbitmq.yml 输入: version: "3.1" services:rabbitmq:image: rabbit…...
leetcode357- 2812. 找出最安全路径
这个题比较经典,可以用多个算法来求解,分别给出各个算法的求解方法,主要是分为第一部分的多源BFS求每个位置的距离和第二部分求(0,0)到(n-1,n-1)的最短路径(可以用多种方法求) 目录 多源BFS求最短路径枚举安全系数判断…...

Oracle连接数据库提示 ORA-12638:身份证明检索失败
ORA-12638 是一个 Oracle 数据库的错误代码,它表示身份验证(认证)检索失败。这通常与数据库连接相关,可能由于以下几个原因之一引起: 错误的用户名或密码: 提供的数据库用户名或密码不正确,导致…...
在 Linux 中使用 systemd 注册服务
Systemd 是一种现代的 Linux 系统初始化系统和服务管理器。它旨在管理系统服务的初始化、配置和控制。Systemd 的一个关键特性是它可以管理服务,这些服务是为系统提供特定功能的后台进程。在本指南中,我们将探讨如何使用 systemd 在 Linux 中注册服务。 …...

(03)Unity HTC VRTK 基于 URP 开发记录
1.简介 本篇主要内容为:URP如何与VRTK结合、URP需要注意的地方、VRTK的功能进行阐述。 因项目本身要求要渲染出比较好的画质,所以抛弃了Unity默认渲染管线Built-in,使用URP进行渲染,当然也可以选HDRP,但考虑到后期项目…...

.bit域名调研
.bit域名研究 问题: .bit域名和ENS域名的相同点?不同点?有什么关系? .bit的定义 .bit 是基于区块链的,开源的,跨链去中心化账户系统.bit 提供了以 .bit 为后缀的全局唯一的命名体系,可用于加密…...

Vue数组变更方法和替换方法
一、可以引起UI界面变化 Vue 将被侦听的数组的变更方法进行了包裹,所以它们也将会触发视图更新。这些被包裹过的方法包括: push()pop()shift()unshift()splice()sort()reverse() 以上七个数组都会改变原数组,下面来分别讲解它们的区别&…...
Centos-6.3安装使用MongoDB
安装说明 系统环境:Centos-6.3 安装软件:mongodb-linux-x86_64-2.2.2.tgz 下载地址:http://www.mongodb.org/downloads 安装机器:192.168.15.237 上传位置:/usr/local/ 软件安装位置:/usr/local/mongodb 数…...

Mysql 复杂查询丨联表查询
💗wei_shuo的个人主页 💫wei_shuo的学习社区 🌐Hello World ! JOIN(联表查询) 联表查询(Join)是一种在数据库中使用多个表进行关联查询的操作。它通过使用 JOIN 关键字将多个表连接在…...

C语言进阶第二课-----------指针的进阶----------升级版
作者前言 🎂 ✨✨✨✨✨✨🍧🍧🍧🍧🍧🍧🍧🎂 🎂 作者介绍: 🎂🎂 🎂 🎉🎉🎉…...

若依vue -【 111 ~ 更 ~ 127 完 】
【更】111 3.5.0版本更新介绍 112 使用docker实现一键部署 1、安装docker yum install https://download.docker.com/linux/fedora/30/x86_64/stable/Packages/containerd.io-1.2.6-3.3.fc30.x86_64.rpm yum install -y yum-utils device-mapper-persistent-data lvm2 yum-c…...

vue-pc端实现按钮防抖处理-自定义指令
前言 我们经常在移动端会处理按钮和输入框的防抖和节流处理,在pc端很少进行这样的操作 但是在pc端也是可以进行按钮的防抖操作,这样也是比较合理,可以不用但不可以不会 我们只要配合vue项目自定义指令加上全局注册,就可以实现按…...
python解决8皇后问题
def is_valid(queens, row, col):for i in range(row):if queens[i] == col or abs(queens[i] - col) == abs(i - row):return Falsereturn Truedef solve_n_queens(n, row, queens, result):if row == n:result.append(queens[:]) # 将当前解添加到结果中returnfor col in ra…...

xcode打包导出ipa
转载:xcode打包导出ipa 目录 转载:xcode打包导出ipa 第一步:注册苹果开发者账号 第二步:下载APP Uploader 第三步:使用xcode打包导出ipa文件,供其他人内测 众所周知,在开发苹果应用时需要使…...

最新SpringBoot+SpringCloud+Nacos微服务框架分享
文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的,根据Excel列的需求预估的工时直接打骨折,不要问我为什么,主要…...
Linux云原生安全:零信任架构与机密计算
Linux云原生安全:零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言:云原生安全的范式革命 随着云原生技术的普及,安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测,到2025年,零信任架构将成为超…...
C++.OpenGL (20/64)混合(Blending)
混合(Blending) 透明效果核心原理 #mermaid-svg-SWG0UzVfJms7Sm3e {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-icon{fill:#552222;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-text{fill…...
Linux安全加固:从攻防视角构建系统免疫
Linux安全加固:从攻防视角构建系统免疫 构建坚不可摧的数字堡垒 引言:攻防对抗的新纪元 在日益复杂的网络威胁环境中,Linux系统安全已从被动防御转向主动免疫。2023年全球网络安全报告显示,高级持续性威胁(APT)攻击同比增长65%,平均入侵停留时间缩短至48小时。本章将从…...

针对药品仓库的效期管理问题,如何利用WMS系统“破局”
案例: 某医药分销企业,主要经营各类药品的批发与零售。由于药品的特殊性,效期管理至关重要,但该企业一直面临效期问题的困扰。在未使用WMS系统之前,其药品入库、存储、出库等环节的效期管理主要依赖人工记录与检查。库…...

Vue3 PC端 UI组件库我更推荐Naive UI
一、Vue3生态现状与UI库选择的重要性 随着Vue3的稳定发布和Composition API的广泛采用,前端开发者面临着UI组件库的重新选择。一个好的UI库不仅能提升开发效率,还能确保项目的长期可维护性。本文将对比三大主流Vue3 UI库(Naive UI、Element …...
TJCTF 2025
还以为是天津的。这个比较容易,虽然绕了点弯,可还是把CP AK了,不过我会的别人也会,还是没啥名次。记录一下吧。 Crypto bacon-bits with open(flag.txt) as f: flag f.read().strip() with open(text.txt) as t: text t.read…...

DeepSeek越强,Kimi越慌?
被DeepSeek吊打的Kimi,还有多少人在用? 去年,月之暗面创始人杨植麟别提有多风光了。90后清华学霸,国产大模型六小虎之一,手握十几亿美金的融资。旗下的AI助手Kimi烧钱如流水,单月光是投流就花费2个亿。 疯…...
结合PDE反应扩散方程与物理信息神经网络(PINN)进行稀疏数据预测的技术方案
以下是一个结合PDE反应扩散方程与物理信息神经网络(PINN)进行稀疏数据预测的技术方案,包含完整数学推导、PyTorch/TensorFlow双框架实现代码及对比实验分析。 基于PINN的反应扩散方程稀疏数据预测与大规模数据泛化能力研究 1. 问题定义与数学模型 1.1 反应扩散方程 考虑标…...

[学习笔记]使用git rebase做分支差异化同步
在一个.NET 项目中,使用了Volo.Abp库,但出于某种原因,需要源码调试,因此,使用源码方式集成的项目做了一个分支archive-abp-source 其中引用方式变更操作的提交为:7de53907 后续,在master分支中…...