
Java面试黄金宝典
文章平均质量分 90
1.具备基础开发能力却遭遇成长瓶颈的工程师
2.渴望深入JDK源码却苦于无从下手的源码探索者
3.深陷“知识纸面化“困境的实践派开发者
4.面临金三银四跳槽季却屡屡折戟的技术求职者
ylfhpy
学海无涯,虚怀若谷.
展开
-
Java面试黄金宝典34
定义索引是数据库中一种特殊的数据结构,用于加快数据查询速度。它对表中某些列的值进行排序和存储,建立快速查找的映射关系,使数据库查询时可直接定位所需数据记录,无需扫描整个表。用法创建索引:使用语句创建索引,如使用索引:在查询语句中,数据库会自动根据索引进行优化,提高查询效率,如删除索引:使用DROP INDEX语句删除索引,如要点选择合适的列创建索引:通常在经常用于查询条件、排序和连接的列上创建索引。避免创建过多的索引:过多索引会增加数据插入、更新和删除的开销,同时占用更多存储空间。定期维护索引。原创 2025-04-04 23:58:45 · 176 阅读 · 0 评论 -
Java面试黄金宝典33
在游戏排行榜系统中,找出排名第三的玩家分数。:记录数据库的所有操作,包括用户登录、数据查询、插入、更新、删除等,以便在发生安全事件时进行审计和追溯。:在在线银行系统中,用户登录时需要输入用户名、密码和短信验证码进行身份验证,并且不同用户角色(如普通用户、管理员)具有不同的操作权限。:在高并发的电商系统中,使用 MySQL 5.7 的多线程复制可以更快地将主库的数据同步到从库,确保数据的一致性。:在设计用户信息表时,将用户的联系方式拆分为手机号码、电子邮箱等单独的字段,而不是将多个联系方式放在一个字段中。原创 2025-04-04 23:33:31 · 773 阅读 · 0 评论 -
Java面试黄金宝典32
是 B 树的一种变体,它的所有数据都存储在叶子节点,非叶子节点只存储索引信息,所有查询都必须到达叶子节点,并且叶子节点之间有指针相连,便于进行范围查询。:是一种自平衡的多路搜索树,每个节点可以包含多个键和子节点,键和数据可以存储在所有节点中,查询操作可能在非叶子节点就结束。:插入时,如果叶子节点的键数量超过最大限制,叶子节点会分裂成两个节点,中间的键会被复制到父节点,同时调整叶子节点间的指针。:根据业务需求,设计数据库的结构,包括表、字段、关系等,遵循数据库设计的范式,以确保数据的一致性和完整性。原创 2025-04-03 10:07:44 · 390 阅读 · 0 评论 -
Java面试黄金宝典31
next - key 锁是 GAP 锁和记录锁的组合,它不仅锁定索引记录本身,还锁定该记录之前的间隙。:GAP 锁是 MySQL 中 InnoDB 存储引擎在可重复读隔离级别下使用的一种锁,用于锁定索引记录之间的间隙,防止其他事务在这些间隙中插入新的记录,从而避免幻读问题。:事务在执行过程中分为两个阶段,第一阶段是扩展阶段,事务可以申请任何需要的锁,但不能释放已获得的锁;:分为不同的级别,如一级封锁协议可防止丢失修改,二级封锁协议在一级基础上可防止读 “脏” 数据,三级封锁协议能防止不可重复读。原创 2025-04-03 09:42:44 · 537 阅读 · 0 评论 -
Java面试黄金宝典30
这样能保证在迁移期间新旧数据库的数据一致。是 MySQL 提供的一个用于分析查询语句执行计划的工具,它可以显示查询语句如何执行,包括使用的索引、扫描的行数、连接的顺序等信息,帮助开发人员了解查询的性能瓶颈。分库分表是指当数据库的数据量和访问量达到一定程度时,将数据库的数据分散存储到多个数据库(分库)或多个表(分表)中,以提高数据库的并发处理能力和可扩展性的技术手段。不同的范式有不同的要求,通常数据库设计需要满足一定的范式,但也不是越高的范式越好,需要根据实际情况进行权衡,在数据冗余和查询性能之间找到平衡。原创 2025-04-02 17:21:12 · 844 阅读 · 0 评论 -
Java面试黄金宝典29
一个事务在执行过程中,根据某个条件查询到了一些数据,在该事务再次根据相同条件查询时,由于其他事务插入或删除了符合条件的数据,导致查询结果的行数发生了变化。:是最基本的索引类型,它为数据表中的某一列或多列建立索引,以加快数据的查询速度。:一个事务在执行过程中,多次读取同一数据时,无论其他事务是否对该数据进行了修改并提交,读取的结果都是一致的。:在普通索引的基础上,增加了索引列值必须唯一的约束条件,即该列中不允许出现重复的值,但可以有一个。:表数据按照索引的顺序进行存储,索引的叶子节点直接存储实际的数据行。原创 2025-04-02 16:23:45 · 737 阅读 · 0 评论 -
Java面试黄金宝典28
根节点不存字符,除根节点外每个节点存一个字符,从根到某节点路径上字符连接起来是该节点对应的字符串。它对表中某些列建立索引,将列值和对应记录位置存于索引文件,查询时可快速定位记录。B + 树是一种多路平衡搜索树,非叶子节点只存索引信息,不存数据,所有数据存于叶子节点。根据不同查询需求选择合适的索引类型,如等值查询用哈希索引,范围查询用 B + 树索引。:节点由数据域和指向下一节点的指针组成,访问节点需从头节点开始按顺序遍历。唯一索引和主键索引都保证列值唯一,但主键索引可作为表的主键,唯一标识记录。原创 2025-04-01 09:19:35 · 608 阅读 · 0 评论 -
Java面试黄金宝典27
插入新节点后会形成临时的 4 - node(有三个键),为保持红黑树性质,需进行分裂和旋转操作,一般会把中间的键提升到父节点,同时调整左右子树。B+ 树是 B - 树的变体,非叶子节点只存储索引信息,不存储数据,所有数据都存储在叶子节点中,叶子节点间通过指针相连形成有序链表。树是无向无环图,有根节点,每个节点可有零个或多个子节点,节点间有明显层次关系,从根节点到任意节点有且仅有一条路径。,底层数据结构是红黑树。B - 树是多路平衡搜索树,每个节点可有多个子节点,所有节点都存储数据,节点中的键有序。原创 2025-04-01 08:27:01 · 562 阅读 · 0 评论 -
Java面试黄金宝典26
定义快速排序(Quick Sort)是对冒泡排序的一种改进,它采用分治法(Divide and Conquer)策略来把一个串行(list)分为两个子串行(sub-lists)。该算法选择一个基准值(pivot),将数组分为两部分,使得左边部分的所有元素都小于等于基准值,右边部分的所有元素都大于等于基准值,然后分别对左右两部分递归地进行快速排序,最终使整个数组有序。要点基准值选择:基准值的选取对排序性能有较大影响,常见的选择方式有选第一个元素、最后一个元素、中间元素或者随机元素作为基准值。分区操作。原创 2025-03-31 11:50:47 · 652 阅读 · 0 评论 -
Java面试黄金宝典25
它先将原始数据分成多个子序列,对每个子序列进行插入排序,然后逐渐缩小子序列的间隔,直至间隔为 1,此时进行一次普通的插入排序。在内存有限(100M)的情况下,处理三个大于 10G 且每行包含一个数字的文件,找出在三个文件中都出现且出现次数最多的前 10 个数字。冒泡排序是一种简单的排序算法,其基本思想是重复遍历待排序数列,依次比较相邻的两个元素,若顺序错误则交换它们的位置,直到整个数列有序。归并排序:时间复杂度稳定为 O(nlogn),空间复杂度为 O(n),排序稳定,但需要额外空间。原创 2025-03-31 10:52:43 · 914 阅读 · 0 评论 -
Java面试黄金宝典24
由于内存有限,无法一次性将三个文件的数据加载到内存中,所以将每个文件按照哈希函数进行划分,存储到多个小文件中,使每个小文件的数据量能被加载到内存。当数据量极大,无法一次性将所有数据加载到内存中进行排序时,外部排序将大文件分割成多个小文件,每个小文件能被加载到内存中进行内部排序(如快速排序、归并排序等),之后将这些有序的小文件进行归并,得到最终的有序大文件。在生成括号组合的过程中,需要保证在任何位置,左括号的数量都不小于右括号的数量,并且最终左括号和右括号的数量都等于 n,以此确保组合的合法性。原创 2025-03-30 10:07:46 · 533 阅读 · 0 评论 -
Java面试黄金宝典23
它通过预处理模式串,构建一个部分匹配表(也称为最长前缀后缀表),利用已匹配的信息,避免在匹配过程中进行不必要的回溯,从而提高匹配效率。它选择一个基准元素,将数组分为两部分,使得左边部分的元素都小于等于基准元素,右边部分的元素都大于等于基准元素,然后递归地对左右两部分进行排序。对于一个包含 n 个元素的集合,它的子集个数为 2n。插入排序是一种简单直观的排序算法,它的工作原理是将未排序的数据插入到已排序序列的合适位置。:在链表的各种操作中,反转链表是一个基本的操作,常用于解决其他链表相关的问题。原创 2025-03-30 09:17:15 · 687 阅读 · 0 评论 -
Java面试黄金宝典22
栈实现是将根节点入栈,然后不断从栈中取出节点,访问该节点,将其右子节点和左子节点依次入栈(注意顺序,先右后左)。通过选择一个基准元素,将数组分为两部分,使得左边部分的元素都小于等于基准元素,右边部分的元素都大于等于基准元素,然后根据基准元素的位置与 k 的关系,决定在左边或右边部分继续查找。通常使用队列来实现,将起始节点入队,然后不断从队列中取出节点,将其未访问的邻接节点入队。:若当前节点的左子树为空,或者左子树的最右节点的右指针已经指向当前节点,说明左子树已经遍历完,此时访问当前节点,并继续遍历右子树。原创 2025-03-29 17:13:28 · 781 阅读 · 0 评论 -
Java面试黄金宝典21
然后找到这个异或结果中任意一位为 1 的位,根据这一位是否为 1 将数组中的元素分为两组,这样这两个只出现一次的数就会被分到不同的组中,最后分别对这两组元素进行异或运算,得到这两个只出现一次的数。对于一个数组,从第一个位置开始,依次将每个元素放到该位置,然后递归地对剩余的元素进行全排列,在递归过程中,若发现当前的选择无法得到有效的解,则回溯到上一步,尝试其他选择。根据异或运算的交换律和结合律,对数组中的所有元素进行异或运算,相同的元素异或结果为 0,最终剩下的就是只出现一次的数。原创 2025-03-29 16:43:32 · 750 阅读 · 0 评论 -
Java面试黄金宝典20
二叉树的深度是指从根节点到最远叶子节点的最长路径上的节点数。此方法采用递归的方式计算,对于二叉树的每个节点,其深度等于左右子树深度的最大值加 1,当节点为空时,深度为 0。原创 2025-03-28 10:29:28 · 736 阅读 · 0 评论 -
Java面试黄金宝典19
它与快速排序算法有关,利用了快速排序中分区的思想,通过不断缩小搜索范围,只在包含目标元素的那一部分继续进行分区操作,从而避免对整个数组进行排序。通过二分查找在较短的数组上找到一个合适的分割点,使得两个数组分割后的左右两部分元素个数相等,并且左边部分的最大值小于等于右边部分的最小值,从而计算出两个有序数组的中位数。从三维数组的某个角开始,根据元素的大小关系,在三个维度上进行移动,直到找到目标元素或超出数组范围。利用二分查找的思想,通过比较中间元素和最右边元素的大小关系,不断缩小搜索范围,找到翻转点的下标。原创 2025-03-28 10:01:47 · 3241 阅读 · 0 评论 -
Java面试黄金宝典18
定义图算法是用于处理图数据结构的一系列算法。图由顶点和边构成,图算法能够解决图的遍历、最短路径、连通性、拓扑排序等问题。常见图算法深度优先搜索(DFS):沿着图的深度遍历节点,尽可能深地搜索分支。广度优先搜索(BFS):从起始节点开始,逐层地访问节点。Dijkstra 算法:用于求解单源最短路径问题。Floyd - Warshall 算法:用于求解所有节点对之间的最短路径问题。Kruskal 算法和 Prim 算法:用于求解最小生成树问题。应用社交网络分析:如好友推荐、社区发现。地图导航。原创 2025-03-27 11:33:19 · 953 阅读 · 0 评论 -
Java面试黄金宝典17
图是由顶点和边组成的数据结构。在二维矩阵中,若该矩阵为图的邻接矩阵,矩阵的行和列对应图的顶点,矩阵元素值为 1 表示对应顶点间有边相连。一个合法的无向图邻接矩阵需满足:矩阵为方阵(n * n);矩阵对称,即。原创 2025-03-27 10:45:18 · 429 阅读 · 0 评论 -
Java面试黄金宝典16
首先将数组中所有小于等于 0 或大于数组长度的数置为一个特殊值(如数组长度加 1),然后遍历数组,将出现过的正整数对应的数组位置的元素置为负数,最后再次遍历数组,找到第一个正数所在的位置,该位置加 1 就是未出现的第一个正整数。它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。求和公式方法是先计算 0 到 n 的和,再减去数组中所有元素的和,得到的差值就是缺少的数;原创 2025-03-26 18:07:04 · 699 阅读 · 0 评论 -
Java面试黄金宝典15
由于数组是增序排列的,我们可以利用二分查找的特性来高效地定位目标数字。对于查找第一次出现的位置,当中间元素等于目标数字时,我们需要继续向左搜索,以确保找到最左边的目标数字;对于查找最后一次出现的位置,当中间元素等于目标数字时,我们需要继续向右搜索,以确保找到最右边的目标数字。代码示例java若数组不是严格增序,存在重复元素且可能有相等元素打乱顺序的情况,可先对数组进行排序,再使用上述方法。不过排序会增加额外的时间复杂度,如使用快速排序,时间复杂度为 O(nlogn)。代码示例(哈希表)java当原创 2025-03-26 17:00:54 · 651 阅读 · 0 评论 -
Java面试黄金宝典14
例如,在处理海量的日志数据时,在 Map 阶段将日志数据按时间戳进行初步排序,在 Shuffle 阶段将相同时间戳的日志数据发送到同一个 Reduce 任务中,在 Reduce 阶段对这些日志数据进行最终排序。例如,在处理海量的用户交易记录时,可以将交易记录分成多个文件,分别对每个文件进行排序,然后再将这些有序的文件合并成一个有序的大文件。单链表的快速排序可以采用和数组快速排序类似的思想,通过选择一个基准节点,将链表分成两部分,小于基准的节点放在左边,大于基准的节点放在右边,然后递归地对两部分进行排序。原创 2025-03-25 10:56:37 · 770 阅读 · 0 评论 -
Java面试黄金宝典13
新创建的对象首先会被分配到 Eden 区,当 Eden 区满时,会触发 Minor GC,将存活的对象复制到其中一个 Survivor 区,当这个 Survivor 区满时,会将存活的对象复制到另一个 Survivor 区,经过多次 Minor GC 后,仍然存活的对象会被晋升到老年代。不同的引用类型对应着不同的垃圾回收策略,这样开发者就能根据不同的场景管理对象的生命周期,提高内存的使用效率。强引用保证对象的存活,软引用在内存不足时才会被回收,弱引用在垃圾回收时必定被回收,虚引用用于监控对象的垃圾回收。原创 2025-03-25 09:48:51 · 678 阅读 · 0 评论 -
Java面试黄金宝典12
同时,不同的类加载器可以实现不同的加载策略,从而满足不同的应用场景需求,像在模块化开发中,每个模块可以使用独立的类加载器来加载自身的类。JVM 调优的核心是根据应用程序的内存使用情况和性能需求,合理分配资源,减少垃圾回收的频率和时间,提高程序的响应速度和吞吐量。Java 堆的实现是基于分代收集的思想,根据对象的存活时间将内存划分为不同的区域,不同的区域采用不同的垃圾回收算法,以提高垃圾回收的效率。例如,在类的方法中调用另一个类的方法时,最初使用的是符号引用,解析阶段会将其转换为实际的内存地址引用。原创 2025-03-23 15:37:40 · 942 阅读 · 0 评论 -
Java面试黄金宝典11
弱引用在垃圾回收时会被直接回收;在某些情况下,临时对象也可能成为 GC Roots,例如在垃圾回收过程中,正在被使用的对象可能会被标记为 GC Roots,以确保在回收过程中这些对象不会被错误地回收。此外,在 Java 中,类加载器也可以作为一种特殊的 GC Roots,因为类加载器会引用类的元数据和类的实例对象。它主要负责回收新生代中的垃圾对象,由于新生代中的对象大多是朝生夕灭的,所以 YGC 发生的频率比较高。GC Roots 是程序中正在使用的对象,它们引用的对象也被认为是有用的,不能被回收。原创 2025-03-23 12:13:38 · 1363 阅读 · 0 评论 -
Java面试黄金宝典10
Hibernate 是一个全功能的对象关系映射(ORM)框架,将 Java 对象和数据库表进行映射,开发者可以通过操作 Java 对象来完成数据库的增删改查操作,而无需编写 SQL 语句。例如,当测试一个服务类时,该服务类依赖于一个数据库访问类,可以使用 Mockito 模拟数据库访问类的行为,提高测试的效率和准确性。可以根据不同的业务需求选择合适的技术和工具进行组合使用。:Mockito 是一个用于 Java 测试的模拟框架,它可以创建模拟对象,模拟对象的行为和方法调用,方便进行单元测试和集成测试。原创 2025-03-22 10:19:32 · 640 阅读 · 0 评论 -
Java面试黄金宝典9
例如,增加一个新节点 D,其哈希值为 HD,从 HD 开始顺时针查找,第一个遇到的节点是 B,那么原本存储在节点 B 上,哈希值在 HD 到 HB 之间的数据就会被迁移到节点 D 上,而其他节点的数据不会发生变化。例如,一个物理节点可以映射成 100 个虚拟节点,这样在数据存储时,就会有更多的机会选择不同的物理节点,减少了数据倾斜的可能性。哈希函数可以将任意长度的输入转换为固定长度的输出,通过哈希处理可以将不同的 key 映射到不同的哈希值,从而减少 key 冲突的概率。:负责接收客户端的请求和发送响应。原创 2025-03-22 09:38:32 · 536 阅读 · 0 评论 -
Java面试黄金宝典8
Spring MVC 的设计理念是基于 Java 的注解和 IoC 容器,通过注解和配置文件来实现请求的映射和处理,利用 Spring 的 IoC 容器来管理控制器和其他组件。:是 Servlet 规范的一部分,主要用于对请求和响应进行预处理和后处理,适用于所有的 Web 应用程序,包括基于 Servlet 的应用和基于 Spring MVC、Struts 等框架的应用。Struts2 的设计理念是基于请求的,每个请求都会创建一个新的 Action 实例,这种实例化方式保证了 Action 的线程安全性。原创 2025-03-21 13:40:14 · 945 阅读 · 0 评论 -
Java面试黄金宝典7
在 Bean 的初始化和销毁阶段,Spring 会调用相应的方法,开发者可在这些方法中进行初始化和清理工作。因为 Spring 的事务是通过 AOP 代理实现的,同一个类中的方法调用不会经过代理对象,所以事务不会生效。例如,一个类需要依赖另一个类的实例,通过 Spring 的 IoC 容器,可将依赖的实例注入到该类中,无需在类内部手动创建依赖对象。:若事务方法中捕获了异常但没有重新抛出,事务不会回滚。线程池是一种线程管理机制,它预先创建一定数量的线程,当有任务提交时,从线程池中获取一个空闲线程来执行任务。原创 2025-03-21 11:17:06 · 2150 阅读 · 0 评论 -
Java面试黄金宝典6
乐观锁适用于读多写少的场景,因为在这种场景下数据发生冲突的概率较低,使用乐观锁可以减少加锁和解锁的开销;悲观锁适用于写多读少的场景,因为在这种场景下数据发生冲突的概率较高,使用悲观锁可以保证数据的一致性。接口,是一种可重入的互斥锁。当一个线程第一次获取锁时,锁的计数器会加 1,之后该线程再次获取同一把锁时,计数器会继续加 1;每次释放锁时,计数器会减 1,当计数器为 0 时,锁才会被完全释放。:是一种为其他线程提供服务的线程,当所有用户线程执行完毕后,守护线程会自动终止,即使守护线程的任务还没有完成。原创 2025-03-20 10:26:04 · 708 阅读 · 0 评论 -
Java面试黄金宝典5
分析在不同场景下如何选择使用 ArrayList、LinkedList 和 Vector,例如在需要频繁随机访问元素时使用 ArrayList,在需要频繁插入和删除元素时使用 LinkedList,在多线程环境下使用 Vector。它使用数组 + 链表 + 红黑树的数据结构,在进行插入、删除和查找操作时,首先通过哈希值找到对应的桶,然后对桶首节点加锁,锁的粒度更小,性能更高。插入和删除操作只需要修改节点的引用,不需要移动大量元素,因此在插入和删除操作频繁的场景下性能较好。:用于数据的快速查找、存储和验证。原创 2025-03-20 09:51:59 · 544 阅读 · 0 评论 -
Java面试黄金宝典4
泛型是 Java 编程语言中的一个强大特性,它提供了编译时类型安全检查机制,允许在定义类、接口和方法时使用类型参数。当调用方法时,会将对象的引用复制一份传递给方法的形式参数,方法内部可以通过这个引用修改对象的状态,但不能改变引用本身的值(即不能让引用指向另一个对象)。等)的参数传递是值传递。当调用方法时,会将实际参数的值复制一份传递给方法的形式参数,方法内部对形式参数的修改不会影响实际参数的值。进行了优化,引入了红黑树来处理哈希冲突,当链表长度超过一定阈值时,会将链表转换为红黑树,提高了查找效率。原创 2025-03-19 15:10:31 · 531 阅读 · 0 评论 -
Java面试黄金宝典3
抽象类的主要作用是为子类提供一个通用的模板,子类必须实现抽象类中的抽象方法,同时可以继承抽象类中的具体方法。在实际应用中,Netty 框架是基于 Java NIO 构建的高性能网络编程框架,它简化了 NIO 编程的复杂性,提供了更强大的功能和更好的性能。它是一个线性的、有限的基本数据元素序列,本质上是一块内存区域,被包装成了一个对象,以便于进行高效的数据读写操作。在 Java 8 及以后的版本中,接口可以包含默认方法和静态方法,默认方法提供了方法的默认实现,静态方法可以通过接口名直接调用。原创 2025-03-19 14:28:12 · 634 阅读 · 0 评论 -
Java面试黄金宝典2
但反射会带来一定的性能开销,因为它需要在运行时进行类的查找和方法的调用,因此在性能敏感的场景中应谨慎使用。例如,在游戏开发中,可以将不同的角色抽象成类,通过继承和多态实现不同角色的不同行为。例如,在电商系统的促销活动期间,并发访问量会大幅增加,可以适当增加线程池的最大线程数,以应对高并发请求。例如,在一个 Web 服务器中,可以根据请求的并发量来调整线程池的大小,提高系统的处理能力。可以定义一个绘制图形的方法,接收一个图形类的引用作为参数,在方法内部根据实际传入的对象类型调用相应的绘制方法,实现多态。原创 2025-03-18 22:44:36 · 854 阅读 · 0 评论 -
Java面试黄金宝典1
例如,在游戏开发中,不同的角色可能有不同的攻击方式,可以通过多态来实现统一的攻击接口,根据实际角色类型调用相应的攻击方法。它是最小的整数类型,占用 1 个字节(8 位)。是引用类型,变量存储的是对象的引用,对象本身存储在堆内存中,引用存储在栈内存中。:当需要修改对象的内部实现时,只需要修改封装类的内部代码,而不会影响到外部调用代码,降低了代码的耦合度,提高了代码的可维护性。:数组中的每个元素都是基本类型,数组本身是引用类型,存储在堆内存中,而数组元素存储在数组所占用的内存空间中。原创 2025-03-18 21:03:11 · 532 阅读 · 0 评论