![](https://img-blog.csdnimg.cn/ae1b935a26fe4f879fb8d67d762e9b7a.jpeg?x-oss-process=image/resize,m_fixed,h_224,w_224)
Java面试题大全
文章平均质量分 91
讲解Java真实场景下的面试题,助力大厂offer。本专栏JavaGuide部分,原文地址可在Github搜索JavaGuide,或关注公众号【JavaGuide】
世界尽头与你
一个懂安全的开发者
展开
-
【JavaGuide面试总结】操作系统篇·上
我们先来了解一下用户态和系统态。用户态(user mode) : 用户态运行的进程可以直接读取用户程序的数据。系统态(kernel mode):可以简单的理解系统态运行的进程或程序几乎可以访问计算机的任何资源,不受限制。说了用户态和系统态之后,那么什么是系统调用呢?我们运行的程序基本都是运行在用户态,如果我们调用操作系统提供的系统态级别的子功能咋办呢?那就需要系统调用了!原创 2023-02-28 09:45:44 · 317 阅读 · 0 评论 -
【Java面试总结】Git篇
会把branch分支优先合并到主分支,然后把本地分支的commit放到主分支后面,合并后的分支就好像从合并后主分支又拉了一个分支一样,本地分支本身不会保留提交历史。会把branch分支的差异内容pull到本地,然后与本地分支的内容一并形成一个committer对象提交到主分支上,合并后的分支与主分支一致;:表示查看当前分支前number个详细的提交历史记录;如果修改最近一次提交的历史记录,就可以用。可以把branch A的commit。是把工作区修改的内容存储在栈区。都是合并分支的命令。原创 2023-02-18 21:38:07 · 794 阅读 · 0 评论 -
【Java面试总结】Maven篇
这会一些问题:如果 D 依赖用到了 1.5 版本的 X 中才有的一个类,运行项目就会报。根据路径最短优先原则,X(1.0) 会被解析使用,也就是说实际用的是 1.0 版本的 X。单纯依赖 Maven 来进行依赖调解,在很多情况下是不适用的,需要我们手动排除依赖。如果 D 依赖用到了 1.5 版本的 X 中才有的一个方法,运行项目就会报。配置一个打包类型为pom的聚合模块,然后在该pom中使用。包含编译,打包,安装到本地仓库,上传到私服仓库。本地安装, 包含编译,打包,安装到本地仓库。, 然后让子模块通过。原创 2023-02-18 17:38:40 · 736 阅读 · 0 评论 -
【Java面试总结】MySQL篇·优化篇
如果使用索引进行查询,查询语句可以根据索引快速定位到待查询记录,从而减少查询的记录数,达到提高查询速度的目的。很多高性能的应用都会对关联查询进行分解,就是可以对每一个表进行一次单表查询,然后将查询结果在应用程序中进行关联,很多场景下这样会更高效。针对这种问题,我们可以在每次查询分页时,前端返回一个上一次查询到的分页的最大值,之后的分页查询参考上一次查询的最大值进行查询。这样的查询,这是MySQL需要查询10020条然后只返回最后20条,前面的10000条记录都将被舍弃,这样的代价很高。原创 2023-02-18 16:47:49 · 1382 阅读 · 0 评论 -
【面试总结】Linux篇·操作及原理篇
硬盘的最小存储单位是扇区(Sector),块(block)由多个扇区组成。文件数据存储在块中。块的最常见的大小是 4kb,约为 8 个连续的扇区组成(每个扇区存储 512 字节)。一个文件可能会占用多个 block,但是一个块只能存放一个文件。虽然,我们将文件存储在了块(block)中,但是我们还需要一个空间来存储文件的元信息 metadata:如某个文件被分成几块、每一块在的地址、文件拥有者,创建时间,权限,大小等。这种存储文件元信息的区域就叫 inode。原创 2023-02-17 17:24:15 · 1040 阅读 · 0 评论 -
【JavaGuide面试总结】Redis篇·下
Redis 事务在运行错误的情况下,除了执行过程中出现错误的命令外,其他命令都能正常执行。因此,严格来说,通过 Lua 脚本来批量执行 Redis 命令也是不满足原子性的。把所有可能存在的请求的值都存放在布隆过滤器中,当用户请求过来,先判断用户发来的请求的值是否存在于布隆过滤器中。这就导致这些请求直接到了数据库上,根本没有经过缓存这一层,对数据库造成了巨大的压力,可能直接就被这么多请求弄宕机了。这就可能会导致瞬时大量的请求直接打到了数据库上,对数据库造成了巨大的压力,可能直接就被这么多请求弄宕机了。原创 2023-02-17 15:36:03 · 527 阅读 · 0 评论 -
【JavaGuide面试总结】Redis篇·中
Redis 可以通过创建快照来获得存储在内存里面的数据在某个时间点上的副本。Redis 创建快照之后,可以对快照进行备份,可以将快照复制到其他服务器从而创建具有相同数据的服务器副本(Redis 主从结构,主要用来提高 Redis 性能),还可以将快照留在原地以便重启服务器的时候使用。开启 AOF 持久化后每执行一条会更改 Redis 中的数据的命令,Redis 就会将该命令写入到内存缓存中,然后再根据配置来决定何时将其同步到硬盘中的 AOF 文件。原创 2023-02-17 15:05:03 · 652 阅读 · 0 评论 -
【JavaGuide面试总结】Redis篇·上
因此,我们通常建议是不使用 Redis 来做消息队列的,你完全可以选择市面上比较成熟的一些消息队列比如。因为 Redis 在执行 Lua 脚本时,可以以原子性的方式执行,从而保证了锁释放操作的原子性。的数据结构经常被用在各种排行榜的场景,比如直播间送礼物的排行榜、朋友圈的微信步数排行榜、王者荣耀中的段位排行榜、话题热度排行榜等等。如果 key 不存在的话,才会设置 key 的值。:String(字符串)、List(列表)、Set(集合)、Hash(散列)、Zset(有序集合)。在 Redis 中,原创 2023-02-16 20:36:54 · 474 阅读 · 0 评论 -
【JavaGuide面试总结】SpringBoot篇
很多时候我们需要将一些常用的配置信息比如阿里云 oss、发送短信、微信认证的相关配置信息等等放到配置文件中。下面我们来看一下 Spring 为我们提供了哪些方式帮助我们从配置文件中读取这些配置信息。方法时,如果数据是从数据库中查询出来的,这里的权限和数据库中保存一致即可,可以不加。格式的数据,接收到数据之后会自动将数据绑定到 Java 对象上去。将请求的 body 中的 json 字符串转换为 java 对象。这样我们的后端就可以直接把 json 格式的数据映射到我们的。一般用于类的属性上,作用和上面的。原创 2023-02-04 15:49:00 · 894 阅读 · 0 评论 -
【JavaGuide面试总结】Spring篇·下
事务属性可以理解成事务的一些基本配置,描述了事务策略如何应用到方法上。原创 2023-02-03 22:26:45 · 201 阅读 · 0 评论 -
【JavaGuide面试总结】Spring篇·中
Before(前置通知):目标对象的方法调用之前触发After(后置通知):目标对象的方法调用之后触发(返回通知):目标对象的方法调用完成,在返回结果值之后触发(异常通知) :目标对象的方法运行中抛出 / 触发异常后触发。AfterReturning 和 AfterThrowing 两者互斥。如果方法调用成功无异常,则会有返回值;如果方法抛出了异常,则不会有返回值。Around(环绕通知):编程式控制目标对象的方法调用。原创 2023-02-03 20:39:06 · 380 阅读 · 0 评论 -
【JavaGuide面试总结】Spring篇·上
Bean 代指的就是那些被 IoC 容器所管理的对象。我们需要告诉 IoC 容器帮助我们管理哪些对象,这个是通过配置元数据来定义的。配置元数据可以是 XML 文件、注解或者 Java 配置类。原创 2023-02-01 16:13:29 · 453 阅读 · 0 评论 -
【JavaGuide面试总结】高性能篇
我们可以通过 Referer 字段获取到当前请求页面的来源页面的网站地址,这样我们就能确定请求是否来自合法的网站。GSLB (Global Server Load Balance,全局负载均衡)是 CDN 的大脑,负责多个CDN节点之间相互协作,最常用的是基于 DNS 的 GSLB。你可以通过预热的方式将源站的资源同步到 CDN 的节点中。,删除 CDN 节点上缓存的资源,当用户访问对应的资源时直接回源获取最新的资源,并重新缓存。如果我们的资源被其他用户或者网站非法盗刷的话,将会是一笔不小的开支。原创 2023-02-01 11:37:28 · 395 阅读 · 0 评论 -
【JavaGuide面试总结】Mybatis篇·下
的这些特点,都严格限制在 SqlSession 生命周期范围内。MyBatis 有三种基本的。Mybatis默认的是。原创 2023-01-31 15:57:15 · 472 阅读 · 0 评论 -
【JavaGuide面试总结】Mybatis篇·上
第二种是使用 sql 列的别名功能,将列别名书写为对象属性名,比如 T_NAME AS NAME,对象属性名一般是 name,小写,但是列名不区分大小写,MyBatis 会忽略列名大小写,智能找到与之对应对象属性名。分页插件的基本原理是使用 MyBatis 提供的插件接口,实现自定义插件,在插件的拦截方法内拦截待执行的 sql,然后重写 sql,根据 dialect 方言,添加对应的物理分页语句和物理分页参数。接口,接口的全限名,就是映射文件中的 namespace 的值,接口的方法名,就是映射文件中。原创 2023-01-31 15:28:18 · 710 阅读 · 0 评论 -
【JavaGuide面试总结】Java IO篇
IO 多路复用模型中,线程首先发起 select 调用,询问内核数据是否准备就绪,等内核把数据准备好了,用户线程再发起 read 调用。但是,当面对十万甚至百万级连接的时候,传统的 BIO 模型是无能为力的。同步非阻塞 IO 模型中,应用程序会一直发起 read 调用,等待数据从内核空间拷贝到用户空间的这段时间里,线程依然是阻塞的,直到在内核把数据拷贝到用户空间。异步 IO 是基于事件和回调机制实现的,也就是应用操作之后会直接返回,不会堵塞在那里,当后台处理完成,操作系统会通知相应的线程进行后续的操作。原创 2023-01-28 21:24:58 · 455 阅读 · 0 评论 -
【JavaGuide面试总结】Java集合篇·下
加快哈希计算我们都知道为了找到 KEY 的位置在哈希表的哪个槽里面,需要计算hash(KEY) % 数组长度但是计算比慢很多,采用二进制位操作,相对于能够提高运算效率取余(%)操作中如果除数是 2 的幂次则等价于与其除数减一的与(&)操作(也就是说的前提是 length 是 2 的 n 次方;减少冲突length 取 2 的整数次幂,是为了使不同 hash 值发生碰撞的概率较小,这样就能使元素在哈希表中均匀地散列(2的整数次幂对于每一位的更改都会影响散列的结果)原创 2023-01-28 17:00:26 · 589 阅读 · 0 评论 -
【JavaGuide面试总结】Java集合篇·中
相比于之前的版本, JDK1.8 之后在解决哈希冲突时有了较大的变化,当链表长度大于阈值(默认为 8)(将链表转换成红黑树前会判断,如果当前数组的长度小于 64,那么会选择先进行数组扩容,而不是转换为红黑树)时,将链表转化为红黑树,以减少搜索时间。判断当前元素存放的位置(这里的 n 指的是数组的长度),如果当前位置存在元素的话,就判断该元素与要存入的元素的 hash 值以及 key 是否相同,如果相同的话,直接覆盖,不相同就通过拉链法解决冲突。就是:将链表和数组相结合。链表的长度大于 8 的时候,就执行。原创 2023-01-28 12:00:40 · 416 阅读 · 0 评论 -
【JavaGuide面试总结】Java集合篇·上
方法来比较 minCapacity 和 MAX_ARRAY_SIZE,如果 minCapacity 大于最大容量,则新容量则为。需要目标数组,将原数组拷贝到你自己定义的数组里或者原数组,而且可以选择拷贝的起点和长度以及放入新数组中的位置,主要根据集合的特点来选用,比如我们需要根据键值获取到元素值时就选用。,否则,新容量大小则为 MAX_ARRAY_SIZE 即为。,然后再根据实现这些接口的集合的特点来选用。接口的集合,需要保证元素唯一时选择实现。接口,主要用于存放单一元素;接口下的集合,需要排序时选择。原创 2023-01-27 16:48:37 · 1107 阅读 · 0 评论 -
【JavaGuide面试总结】计算机网络·下
典型的场景是购物车,当你要添加商品到购物车的时候,系统不知道是哪个用户操作的,因为 HTTP 协议是无状态的。比如说,100 (Continue)——在请求大资源前的预热请求,206 (Partial Content)——范围请求的标识码,409 (Conflict)——请求与当前资源的规定冲突,410 (Gone)——资源已被永久转移,而且没有任何已知的转发地址。时间后,资源被修改过,则返回给客户端一个200 OK的响应体,并附带全新的资源内容,表示”你要的我已经改过的,给你一份新的”。原创 2023-01-21 17:50:17 · 797 阅读 · 0 评论 -
【JavaGuide面试总结】计算机网络·中
当我们开始在浏览器中输入网址的时候,浏览器其实就已经在智能的匹配可能得 url 了,他会从历史记录,书签等地方,找到已经输入的字符串可能对应的 url,然后给出智能提示,让你可以补全url地址。这个连接请求到达服务器端后(这中间通过各种路由设备,局域网内除外),进入到网卡,然后是进入到内核的TCP/IP协议栈(用于识别该连接请求,解封包,一层一层的剥开),还有可能要经过Netfilter防火墙(属于内核的模块)的过滤,最终到达WEB程序,最终建立了TCP/IP的连接。TCP是全双工通信,可以双向传输数据。原创 2023-01-20 16:15:42 · 618 阅读 · 0 评论 -
【JavaGuide面试总结】计算机网络·上
服务端传回发送端所发送的 ACK 是为了告诉客户端:“我接收到的信息确实就是你所发送的信号了”,这表明从客户端到服务端的通信是正常的。回传 SYN 则是为了建立并确认从服务端到客户端的通信。SYN 同步序列编号是 TCP/IP 建立连接时使用的握手信号。在客户机和服务器之间建立正常的 TCP 网络连接时,客户机首先发出一个 SYN 消息,服务器使用 SYN-ACK 应答表示接收到了这个消息,最后客户机再以 ACK消息响应。这样在客户机和服务器之间才能建立起可靠的 TCP 连接,数据才可以在客户机和服原创 2023-01-19 21:12:07 · 694 阅读 · 0 评论 -
【JavaGuide面试总结】MySQL篇·下
索引是一种用于快速查询和检索数据的数据结构,其本质可以看成是一种排序好的数据结构。索引的作用就相当于书的目录。打个比方: 我们在查字典的时候,如果没有目录,那我们就只能一页一页的去找我们需要查的那个字,速度很慢。如果有目录了,我们只需要先去目录里查找字的位置,然后直接翻到那一页就行了。在 MySQL 中,无论是 Innodb 还是 MyIsam,都使用了 B+树作为索引结构。🤑。原创 2023-01-18 18:01:00 · 713 阅读 · 0 评论 -
【JavaGuide面试总结】MySQL篇·中
这种存储方式的具有 Timestamp 类型的所具有一些优点,并且使用它的进行日期排序以及对比等操作的效率会更高,跨系统也很方便,毕竟只是存放的数值。当执行当前读时,会锁定读取到的记录的同时,锁定它们的间隙,防止其它事务在查询范围内插入数据。快照读的情况下,如果读取的记录正在执行 UPDATE/DELETE 操作,读取操作不会因此去等待记录上 X 锁的释放,而是会去读取行的一个快照。在当前读下,读取的都是最新的数据,如果其它事务有插入新的记录,并且刚好在当前事务查询范围内,就会产生幻读!原创 2023-01-17 17:20:05 · 525 阅读 · 0 评论 -
【JavaGuide面试总结】MySQL篇·上
连接器主要和身份认证和权限相关的功能相关,就好比一个级别很高的门卫一样。主要负责用户登录数据库,进行用户的身份认证,包括校验账户密码,权限等操作,如果用户账户密码已通过,连接器会到权限表中查询该用户的所有权限,之后在这个连接里的权限逻辑判断都是会依赖此时读取到的权限数据,也就是说,后续只要这个连接不断开,即使管理员修改了该用户的权限,该用户也是不受影响的。查询缓存主要用来缓存我们所执行的 SELECT 语句以及该语句的结果集。原创 2023-01-17 15:46:47 · 406 阅读 · 0 评论 -
【面试总结】Linux篇·命令篇
查看进程运行状态、查看内存使用情况的指令均可使用。显示当前系统正在执行的进程的相关信息,包括。有些进程通过kill不掉,可以强制终止进程: ❌。cat 路径/文件名 | grep 关键词。查看进程运行状态的指令:ps命令。如果只需要临时更改主机名,可以使用。如果想永久改变主机名,可以使用。然后在这个文件底部添加脚本即可。”,用来查看某PID进程状态。”,命令查看内存使用情况。原创 2023-01-11 10:52:42 · 303 阅读 · 0 评论 -
【JavaGuide面试总结】Java高级特性基础篇·下
序列化: 将数据结构或对象转换成二进制字节流的过程反序列化:将在序列化过程中所生成的二进制字节流转换成数据结构或者对象的过程对象在进行网络传输(比如远程方法调用 RPC 的时候)之前需要先被序列化,接收到序列化的对象之后需要再进行反序列化;将对象存储到文件之前需要进行序列化,将对象从文件中读取出来需要进行反序列化;将对象存储到数据库(如 Redis)之前需要用到序列化,将对象从缓存数据库中读取出来需要反序列化;将对象存储到内存之前需要进行序列化,从内存中读取出来之后需要进行反序列化。原创 2023-01-10 16:50:34 · 329 阅读 · 0 评论 -
【JavaGuide面试总结】Java高级特性基础篇·反射五连问
它赋予了我们在运行时分析类以及执行类中方法的能力。通过反射你可以获取任意一个类的所有属性和方法,你还可以调用这些方法和属性。原创 2023-01-10 15:06:55 · 238 阅读 · 0 评论 -
【JavaGuide面试总结】Java高级特性基础篇·上
被 static 修饰的成员属于类,不属于单个这个类的某个对象,被类中所有对象共享,可以并且建议通过类名调用。静态内部类与非静态内部类之间存在一个最大的区别,我们知道非静态内部类在编译完成之后会隐含地保存着一个引用,该引用是指向创建它的外围类,但是静态内部类却没有。静态代码块定义在类中方法外, 静态代码块在非静态代码块之前执行(静态代码块 —> 非静态代码块 —> 构造方法)。这两个关键字连用可以指定导入某个类中的指定静态资源,并且不需要使用类名调用类中静态成员,可以直接使用类中静态成员变量和成员方法。原创 2023-01-10 10:19:58 · 794 阅读 · 0 评论 -
【JavaGuide面试总结】Java基础篇·下
浅拷贝:浅拷贝会在堆上创建一个新的对象(区别于引用拷贝的一点),不过,如果原对象内部的属性是引用类型的话,浅拷贝会直接复制内部对象的引用地址,也就是说拷贝对象和原对象共用同一个内部对象。深拷贝:深拷贝会完全复制整个对象,包括这个对象所包含的内部对象。那什么是引用拷贝呢?简单来说,引用拷贝就是两个不同的引用指向同一个对象。String类中使用final关键字修饰字符数组来保存字符串(不是主要原因)// ... }// ... }// ... }我们知道被final。原创 2023-01-08 10:29:00 · 302 阅读 · 0 评论 -
【JavaGuide面试总结】Java基础篇·中
所谓可变长参数就是允许在调用方法时传入不定长度的参数,可变参数只能作为函数的最后一个参数} } }Java 的可变参数编译后实际会被转换成一个数组🧇那么,我们快来看一个有意思的问题,当可变参数遇到方法重载的情况怎么办呢?会优先匹配固定参数还是可变参数的方法呢?答案是会优先匹配固定参数的方法,因为固定参数的方法匹配度更高。// 非可变参数的方法tom lili } public static void test(String . . . kill) {原创 2023-01-07 16:43:50 · 388 阅读 · 0 评论 -
【JavaGuide面试总结】Java基础篇·上
静态方法在访问本类的成员时,只允许访问静态成员(即静态成员变量和静态方法),不允许访问实例成员(即实例成员变量和实例方法),而实例方法不存在这个限制。简单说,默认方法就是接口可以有实现方法,而且不需要实现类去实现其方法。:成员变量是对象的一部分,它随着对象的创建而存在,而局部变量随着方法的调用而自动生成,随着方法的调用结束而消亡。:成员变量是属于类的,而局部变量是在代码块或方法中定义的变量或是方法的参数;:成员变量如果没有被赋初始值,则会自动以类型的默认值而赋值,而局部变量则不会自动赋值。原创 2023-01-06 16:02:06 · 1370 阅读 · 0 评论