- 博客(69)
- 收藏
- 关注
原创 hot 100(5) —— 盛最多水的容器(双指针)
2. 计算当前水量:容器水量由“短板高度”和“两板距离”决定,即 min(height[left], height[right]) * (right - left),并更新 maxArea。1. 初始化指针:左指针 left 指向数组起始(0),右指针 right 指向数组末尾(height.length - 1),maxArea 记录最大水量(初始为0)。3. 移动短板指针:为了寻找更大水量,需移动较短的线段指针(若移动长板,两板距离减小且短板不变,水量必然减少),直到左右指针相遇。
2025-10-24 11:52:44
186
7
原创 hot 100(4) —— 移动零(双指针)
• 快指针遍历数组 1 次(O(n)),慢指针后续填充 0 最多遍历剩余位置(O(n)),总操作次数为 2n,忽略常数后为 O(n)。该代码用于将数组 nums 中的所有 0 元素移动到数组末尾,同时保持非 0 元素的原有相对顺序,且不使用额外数组(原地修改)。3. 当快指针找到非 0 元素时,将其赋值给慢指针位置,慢指针后移;2. 慢指针(slow):指向“下一个非 0 元素应该存放的位置”。1. 快指针(fast):遍历整个数组,负责“寻找非 0 元素”。• O(n),其中 n 是数组长度。
2025-10-23 11:45:19
132
5
原创 hot 100(3) —— 最长连续序列(哈希)
• 原因:哈希表插入和查询均为O(1),且每个元素仅会被遍历两次:一次是加入哈希表,一次是作为序列起点或被起点向后查找时遍历;1. 遍历哈希表中的每个元素x,先判断x-1是否存在:若不存在,说明x是某连续序列的起点(避免重复遍历非起点元素,减少冗余计算);2. 以x为起点,向后查找连续元素:初始化y = x + 1,循环判断y是否在集合中,若存在则y继续递增,直到y不在集合中;• 原因:HashSet需存储数组所有元素(去重后最多n个),无其他与n相关的额外存储结构,故空间复杂度为O(n)。
2025-10-22 07:40:05
148
1
原创 hot 100(2) —— 字母异位词分组(哈希)
排序过程中字符数组的临时空间为O(k),整体由哈希表存储主导,故为O(n * k)。• 原因:遍历数组需O(n)时间,每个字符串的字符排序操作需O(k log k)时间(排序算法时间复杂度),整体时间由“遍历+排序”主导,故为O(n * k log k)。◦ 初始化HashMap,键为“排序后的字符串”(作为异位词的统一标识),值为存储同组异位词的List<String>;• 复杂度级别:O(n * k log k)(n为字符串数组strs的长度,k为数组中最长字符串的长度)。
2025-10-21 07:33:02
304
3
原创 hot 100 (1)—— 两数之和(哈希)
• 原因:算法耗时主要在排序步骤(Arrays.sort采用双轴快排,时间复杂度为O(n log n)),后续双指针遍历仅需O(n),整体由排序主导,故为O(n log n)。• 原因:外层循环执行n次,内层循环针对每个i分别执行n-1、n-2...1次,整体执行次数约为n(n-1)/2,属于平方级别的时间开销,数据量增大时效率会显著下降。• 原因:最坏情况下(如答案在数组末尾),需将数组中n-1个元素存入哈希表,哈希表占用空间随数组长度线性增长,故为O(n)。• 若满足条件,直接返回包含i和j的数组;
2025-10-20 12:09:11
2727
1
原创 Java JVM “类加载与虚拟机执行” 面试清单(含超通俗生活案例与深度理解)
一、请简述类的生命周期,并结合生活场景详细说明每个阶段的作用• 核心解析:类的生命周期是Java类从“被识别为可加载资源”到“从JVM内存中彻底清除”的完整过程,共包含七个紧密衔接的阶段,按执行顺序依次为加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化(Initialization)、使用(Using)和卸载(Unloading)。其中,验证、准备、解析三个阶段共同构成“连接(Linking)”阶段,是类从“二进制字节流”(如.c
2025-10-19 13:51:24
817
3
原创 Java JVM “调优” 面试清单(含超通俗生活案例与深度理解)
用jstack 12345 > thread.log的命令生成线程栈文件,查看“ChatHandlerThread”线程的栈信息,发现每个线程都在执行“Socket连接读取数据”的逻辑,而且每个线程都引用了一个“SocketConnection”对象,这些线程没有被线程池管理,客户端断开连接后,线程也没停止,一直处于运行状态,导致SocketConnection对象没法回收。另外,jstack日志里的线程ID是16进制的,而top命令显示的线程ID是十进制的,需要转换一下才能对应上,这是很多人容易踩的坑。
2025-10-18 11:35:54
848
3
原创 Java JVM “垃圾回收(GC)”面试清单(含超通俗生活案例与深度理解)
一、如何判断对象仍然存活?判断对象存活有两种核心算法:引用计数算法和可达性分析算法,主流JVM(如HotSpot)因引用计数算法存在缺陷,最终采用可达性分析算法。• 引用计数算法:给每个对象贴一张“借阅记录卡”,只要有代码用到这个对象(比如调用对象方法),就在卡片上记一次借阅(计数+1);当代码不再使用(引用失效,比如变量赋值为null),就划掉一次借阅(计数-1)。一旦卡片上的借阅次数清零,就说明这个对象没人用了,可以回收。比如图书馆的闲置书籍,每有读者借阅就登记一次,读者归还就注销一次,登记次数为零的书
2025-10-17 07:55:37
738
3
原创 Java JVM “内存(1)”面试清单(含超通俗生活案例与深度理解)
一、JVM基础概念1. 请解释什么是JVM?它为什么能让Java实现“一次编写,到处运行”?JVM全称Java虚拟机,是运行在操作系统之上的“虚拟计算环境”——它不直接执行Java源代码,而是先由Java编译器将源代码转换成“字节码”(一种与硬件、操作系统无关的中间代码,类似通用的“产品操作手册”),再根据当前运行的操作系统(比如Windows、Mac、Linux)特性,将字节码翻译成该系统能直接识别的机器指令,最终让代码在不同平台上正常运行。通俗例子:把JVM比作“多语种翻译官”。假设你写的Java代码
2025-10-16 07:57:08
727
3
原创 Java 面试清单(含超通俗生活案例与深度理解)
目前博主的专栏 —— Java 面试清单(含超通俗生活案例与深度理解),已经写了有一段时间了,涵盖了Java SE、Java 集合(List / Map / Set)、Java 高并发多线程、Java Spring、Java Redis等五大板块的内容,每个板块都从生活案例出发,让人理解复杂原理背后的本质,专业而又通俗易懂。
2025-10-15 07:46:05
723
1
原创 Java Redis “底层结构” 面试清单(含超通俗生活案例与深度理解)
一、Redis底层数据结构有哪些?为什么要基于这些结构构建对象系统?核心考点准确掌握Redis的6种底层基础结构,理解“底层结构≠直接使用”的设计逻辑——底层结构是“基础组件”,对象系统是“定制化产品”,适配不同业务场景的key-value存储需求。通俗理解+例子我们可以把Redis的底层结构和对象系统,类比成“家具工厂的原材料与成品家具”:• 底层结构就是“原材料”:动态字符串(SDS)像木板、链表像金属连接件、字典像合页、跳跃表像滑轨、整数集合像小五金件、压缩列表像布艺面料——这些原材料单独拿出来没用,
2025-10-14 14:35:37
726
3
原创 Java Redis “核心应用” 面试清单(含超通俗生活案例与深度理解)
这个版本看似解决了死锁,但有个新问题:setnx 和 expire 是两条独立的命令,不是原子执行的——如果员工A贴了纸条(setnx 成功),还没来得及在纸条上写“10分钟后失效”(expire 命令没执行),微波炉突然断电(Redis 宕机),重启后纸条还在,但没有过期时间,还是会出现死锁。比如你让收银员扫牛奶(正确),扫面包时说“把面包的价格改成负数”(语法正确,但超市规定不能改负数,逻辑错误),收银员会扫完牛奶,然后告诉面包改价失败,最后让你付牛奶的钱,面包不结算。
2025-10-14 07:48:14
952
1
原创 Java Redis “运维”面试清单(含超通俗生活案例与深度理解)
这种策略适合“有过期属性的数据可清理,非过期数据需保留”的场景,比如用户的登录会话缓存,会话设2小时过期,内存满时删最久没活动的会话,而用户的基础信息缓存(无过期时间)则保留。5. 主从用图状结构导致不稳定:超市总部(Master)同时给3家分店送清单(图状结构:Master→Slave1、Master→Slave2、Master→Slave3),总部突然停电(Master宕机),3家分店都要重新找总部(切换主从),且分店清单数据不一致(有的同步到最新,有的没同步完),导致补货混乱。
2025-10-13 14:26:01
671
1
原创 Java Redis “缓存设计”面试清单(含超通俗生活案例与深度理解)
一、请解释缓存击穿的定义、产生原因,并说明解决办法,结合生活例子辅助理解• 定义与原因:缓存击穿是指单个高频访问的热点Key在过期瞬间,大量并发请求直接穿透缓存,集中打向数据库,导致数据库短时间内压力骤增,甚至出现短暂响应延迟。核心问题在于“热点Key”与“过期时间”的叠加——这类Key日常访问量本就高,一旦过期,所有依赖它的请求会瞬间失去缓存保护,全部涌向数据库,形成“单点冲击”。• 生活例子:小区楼下的连锁奶茶店,每到周末下午2点就会迎来学生和上班族的点单高峰,其中“秋冬限定板栗奶茶”是爆款,平均每天这
2025-10-13 08:08:21
1016
1
原创 Java Redis “Sentinel(哨兵)与集群”面试清单(含超通俗生活案例与深度理解)
一、Redis Sentinel基础1. 面试题:Redis Sentinel的核心作用是什么?为什么主从复制场景下必须用到它?回答要点:核心作用是解决主从复制“无法自动故障转移”的痛点,实现Redis服务的高可用(即服务不中断、数据不丢失)。主从复制的本质是“主节点写数据、从节点复制数据”,但一旦主节点宕机(比如服务器断电、网络中断),从节点只能被动等待,需要人工手动修改配置把某个从节点升级为主节点——这个过程少则几分钟、多则十几分钟,期间服务完全无法写入,会直接影响业务。而Sentinel相当于“自动
2025-10-12 20:52:35
955
1
原创 Java Redis “高可用 — 主从复制”面试清单(含超通俗生活案例与深度理解)
一、请解释什么是Redis主从复制?它的数据流向有什么核心特点?思考:Redis主从复制本质是一种“单向数据同步机制”——需指定一台Redis服务器作为主节点(master),其他服务器作为从节点(slave),主节点上所有数据变更(如新增键值、修改内容、删除记录)会实时同步到从节点,但从节点的任何数据操作都无法反向同步给主节点,这是数据流向的核心约束。此外,它还支持“从从同步”设计:即一个从节点可作为下一级从节点的“间接主节点”,接收上层数据后再同步给下级,这种设计能大幅减轻主节点的同步压力——比如有20
2025-10-12 13:08:53
781
1
原创 Java Redis “持久化”面试清单(含超通俗生活案例与深度理解)
总公司(主节点)要给新开的大学城分店(从节点)同步所有饮品的配方和价格数据,总公司不会一条条给分店发“珍珠奶茶配方:红茶50ml+珍珠30g”“原味奶茶价格15元”这样的消息,而是先生成一份完整的“所有饮品配方+价格”清单(bgsave 生成 RDB 文件),然后把这份清单压缩后发给分店,分店拿到清单后解压,就能快速同步所有数据——这是因为 RDB 文件是二进制压缩格式,比一条条发文本命令快得多,能减少网络传输时间。”,如果早上8点停车场系统坏了,凌晨2点到8点之间进出的10辆车(增量数据)就丢了。
2025-10-11 14:40:38
667
5
原创 Java Redis “核心基础”面试清单(含超通俗生活案例与深度理解)
• 原理:如果多个线程同时执行命令,比如两个线程同时改“user:1001:balance”(用户余额),线程A执行“DECR balance 100”(减100),线程B执行“INCR balance 200”(加200),可能出现“线程A读余额是500,线程B也读500,线程A改完是400,线程B改完是700,最后余额是700,不是600”的错误——为了避免这种情况,要加“互斥锁”(比如线程A改的时候,线程B不能读),但加锁会导致“线程等待”,反而降低效率。20号快递有人取吗;
2025-10-11 07:46:06
658
1
原创 Java “Spring Boot + Spring Cloud ”面试清单(含超通俗生活案例与深度理解)
2. 服务之间如何找到对方?解决方案是“注册中心”——相当于商场的“店铺登记处”,每个服务启动后会把自己的地址(IP、端口)注册到注册中心(如Nacos、Eureka),其他服务要调用时,先去注册中心“查地址”(发现服务),再发起请求。解决方案是“网关”——相当于商场的“导览台”,用户只需要访问网关(如80端口),网关根据请求路径转发到对应的服务(比如“/user/”转发到用户服务,“/order/”转发到订单服务),同时统一处理认证(登录校验)、限流(每个用户每秒最多10个请求)、日志(记录所有请求)。
2025-10-10 10:43:33
550
5
原创 Java Spring “MVC ”面试清单(含超通俗生活案例与深度理解)
• 核心解答:ViewResolver 是 Spring MVC 的“视图路径解析器”,负责将 ModelAndView 中的“逻辑视图名”(比如“userList”“orderDetail”),根据预设的解析规则(如前缀、后缀),转换成真实的“物理视图路径”(比如“/WEB-INF/jsp/userList.jsp”“/templates/orderDetail.html”),让 DispatcherServlet 能找到具体的视图文件,完成数据渲染。
2025-10-10 07:44:01
676
1
原创 Java Spring “事务” 面试清单(含超通俗生活案例与深度理解)
• 例子:学校“科技节APP开发项目组”(A方法,主线程事务)需要“测试APP兼容性”(B方法),但测试成员需要“在家远程测试”(B方法在新线程执行)——此时B的测试工作(新线程)不在学校的“项目协作系统”里(无法获取主线程的事务信息),就算B测试出bug(B事务回滚),也不会影响APP开发组的进度(A事务);当你点击“下单10双”时(同一事务内执行写操作),系统会提示“库存不足,仅剩8双”——这就是“幻读”,读的是“事务内的一致数据”,但实际数据已变化,导致写操作与读操作结果冲突。
2025-10-09 16:47:29
612
10
原创 Java Spring “AOP” 面试清单(含超通俗生活案例与深度理解)
一、请用自己的话解释什么是 AOP?它解决了开发中的什么实际痛点?• 核心定义:AOP(面向切面编程)是一种聚焦“抽离重复逻辑、简化核心业务”的编程思想。简单说,就是把多个业务流程里反复出现的通用代码(比如日志记录、参数校验、事务控制这类不直接影响业务核心的逻辑),提炼成一个独立的“功能模块”(业内常叫“切面”),再通过技术手段动态嵌入到业务流程的指定环节中。这样一来,业务代码就不用再夹杂这些通用逻辑,只需专注于自己的核心功能,本质是“横向抽离重复工作,纵向不干扰业务主线”。• 解决的开发痛点:最关键的是解
2025-10-09 07:47:40
948
5
原创 Java Spring “Bean” 面试清单(含超通俗生活案例与深度理解)
一、Bean 定义和依赖定义有哪几种方式?核心回答Spring 中 Bean 定义与依赖定义主要有 直接编码、配置文件、注解 三种核心方式,本质是通过不同“指令形式”告诉 Spring 容器:“需要管理哪些对象(Bean)”以及“这些对象之间谁依赖谁(依赖关系)”,最终由容器统一负责对象的创建和组装,无需开发者手动 new 对象或维护依赖。深度解析这三种方式对应 Spring 技术发展的不同阶段:早期开发因注解尚未普及,多依赖配置文件来明确 Bean 和依赖;随着注解的简洁性被认可,注解方式逐渐成为主流,大
2025-10-08 16:24:27
995
5
原创 Java Spring “IOC + DI”面试清单(含超通俗生活案例与深度理解)
记得评论区领专属红包🧧一、请解释什么是 IOC(控制反转)?什么是 DI(依赖注入)?两者的关系是什么?• 核心回答:IOC 是一种颠覆传统对象管理逻辑的设计思想——过去开发时,若类 A 需要依赖类 B 完成功能,开发者必须在 A 的代码里手动写 new B() 创建实例,还要处理 B 依赖的其他类(比如 B 依赖 C,就得先在 A 里 new C、再用 C 实例化 B),相当于“自己包揽所有‘找帮手’的工作”;而 IOC 模式下,开发者只需告诉 Spring 容器“我需要 A 类来做什么”,容器会主动完
2025-10-08 12:38:19
1033
12
原创 Java Spring “核心基础”面试清单(含超通俗生活案例与深度理解)
记得评论区领专属红包🧧一、Spring 定义与核心特性1. 请用一句话定义Spring,并重点解释其核心特性IOC(控制反转)和DI(依赖注入)?• 核心理解:Spring是一款轻量级、非入侵式的Java开发框架,核心价值在于通过IOC(控制反转)实现对象创建与依赖关系的解耦管理,而DI(依赖注入)是IOC的具体落地方式——由框架主动将所需对象“注入”到使用处,而非开发者手动创建。两者结合能大幅降低代码耦合度,让后续维护更轻松,同时搭配AOP(面向切面编程)可进一步简化通用功能开发。• 生活例子:比如你平
2025-10-07 23:04:23
831
3
原创 Java “并发容器框架(Fork/Join)”面试清单(含超通俗生活案例与深度理解)
记得评论区领专属红包🧧一、Java并发容器相关1. 请详细说明CopyOnWriteList的实现原理,结合实际场景分析它为什么适合“读多写少”的业务需求?CopyOnWriteList的核心实现逻辑是“读写分离+写时复制”,它底层维护一个不可变的数组,所有读操作(比如get、contains)都直接访问这个原数组,且读操作全程无锁,不需要线程等待;而当执行写操作(比如add、remove、set)时,会先创建一个与原数组长度相同或+1的新数组,将原数组中的数据完整复制到新数组中,然后在新数组上执行具体
2025-10-07 11:34:10
1274
6
原创 Java “线程池(2)”面试清单(含超通俗生活案例与深度理解)
◦ 单线程池(newSingleThreadExecutor):只有1条工作线程,所有任务按提交顺序串行执行,前一个任务没做完,后一个只能排队,像家里的“打印机”——你发送多个打印任务,打印机只能先打第一个,打完才能打第二个,绝对不会同时处理两个任务。只有“开始执行”日志,说明没完成,需重执行。此时用固定线程池,把线程数设为“CPU核心数+1”(8核CPU设9条线程),既能让CPU充分利用(每条线程对应1个核心,避免闲置),又能避免线程切换开销(线程数远超核心数时,CPU频繁切换线程,反而浪费时间)。
2025-10-06 18:08:02
643
原创 Java “线程池(1)”面试清单(含超通俗生活案例与深度理解)
一、请解释什么是线程池?它的核心作用有哪些?• 核心回答:线程池本质是管理线程的“资源调度池”,它会预先创建一定数量的线程,统一负责线程的创建、分配、复用和销毁,从根本上避免程序频繁创建或销毁线程带来的资源损耗,同时优化任务执行的响应速度,确保系统资源被高效利用。在Java中,线程属于稀缺资源,若每次执行任务都新建线程,会频繁触发类加载、GC垃圾回收等操作——新建线程要经历类加载的验证、准备、解析流程,销毁线程要触发GC的标记-清除或复制算法,这些都会消耗CPU和内存;而线程池通过“池化思想”,让线程在完成
2025-10-06 13:43:10
886
原创 Java “并发工具类”面试清单(含超通俗生活案例与深度理解)
这里还可以延伸到“超时等待”的场景:如果约定早上 8 点集合,超过 8 点 15 分还有 2 名员工没到,老师不会一直等(避免耽误其他 48 名员工的时间),此时会调用 await(15, TimeUnit.MINUTES) 方法,15 分钟超时后,不管计数器是否归 0,都会唤醒等待线程,决定“先出发,让迟到员工的家长送去郊区汇合”。而 CyclicBarrier 的设计核心是“等待指定数量的线程到达屏障点”,必须是预先约定的那组线程(或指定数量的线程)全部到场,屏障才会打开,与任务数量无关。
2025-10-05 23:01:39
799
原创 Java 高并发多线程 “synchronized 锁”面试清单(含超通俗生活案例与深度理解)
• 核心回答:AQS的全称是AbstractQueuedSynchronizer(抽象队列同步器),它不是一个具体的锁,而是一个“锁的模板”——就像公司里的“打印机管理规则”,不管是黑白打印机还是彩色打印机(对应不同的锁,比如ReentrantLock、CountDownLatch),都能按照这个规则来管理“谁能使用打印机(线程获取锁)”“谁要排队(线程等待)”。◦ 第一种是修饰实例方法,此时锁对象是“当前对象实例”,比如家里的炒锅——炒锅是“对象实例”,每次做饭只能有一个人用它炒菜。
2025-10-05 17:32:32
772
原创 Java 内存模型(JMM)面试清单(含超通俗生活案例与深度理解)
一、说一下你对 Java 内存模型(JMM)的理解?核心定义:Java 内存模型(JMM)是 Java 虚拟机为了消除不同硬件(如 Intel x86、ARM 架构)、不同操作系统(如 Windows、Linux)在内存访问上的差异,而制定的一套抽象规则体系。它不对应真实的物理内存结构,而是通过约定线程与主内存、线程与本地内存的交互逻辑,确保 Java 程序在任何运行环境下,都能表现出一致的并发行为。具体来说,JMM 有两个关键约定:一是所有线程共享的变量(如类的静态变量、实例变量)必须存放在主内存(可理
2025-10-04 22:19:33
1134
原创 Java 高并发多线程 “ThreadLocal” 面试清单(含超通俗生活案例与深度理解)
一、请解释下 ThreadLocal 是什么?核心定义:ThreadLocal 全称“线程本地变量”,它的核心作用是为每个访问它的线程,单独创建一份变量的“专属副本”。简单来说,多个线程同时操作同一个 ThreadLocal 变量时,每个线程实际操作的都是自己手里的副本,不会影响其他线程的副本,最终实现“线程隔离”,从根源上避免了线程安全问题。原创生活例子:可以类比公司里每个员工的“工位专属抽屉”——假设公司为每个员工配置了带电子锁的抽屉(ThreadLocal 变量的载体),每个抽屉都绑定员工的工牌(T
2025-10-04 19:39:46
922
原创 Java 高并发多线程 “基础”面试清单(含超通俗生活案例与深度理解)
比如开发“电商后台”,每个用户请求对应一个线程(用户A、B的请求线程)——用ThreadLocal存“用户登录信息”(用户名、权限):用户A的线程set()自己的信息,用户B的线程set()自己的信息;比如开发“闹钟APP”,一个线程(计时线程)每隔1秒把“剩余时间”(volatile int time)减1,多个线程(界面线程、铃声线程)读time的值——计时线程修改后,界面线程立刻显示最新剩余时间,铃声线程判断time是否为0(触发闹钟),且time的修改(time--)是原子的。
2025-10-03 18:15:21
601
原创 Java 集合 “Map(2)”面试清单(含超通俗生活案例与深度理解)
◦ 逻辑:加“a.txt”(1 位)、“ab.txt”(2 位)、“abc.txt”(3 位),红黑树把“ab.txt”放中间,“a.txt”放左,“abc.txt”放右;查找时,不用挨个看文件,直接按树结构找(找 3 位文件,先找中间 2 位,再往右找),效率高(O(logn))。◦ 场景:联系人按“姓名首字母正序”排序(自然顺序),“李四(L)”在最前,“王五(W)”中间,“张三(Z)”最后,即使先加“张三”,再加“李四”,TreeMap 也会自动排成“李四→王五→张三”。
2025-10-03 14:25:02
667
原创 Java 集合 “Map(1)”面试清单(含超通俗生活案例与深度理解)
一、HashMap 核心数据结构(JDK1.8)1. JDK1.8 中 HashMap 的底层数据结构是什么?各组成部分的作用是什么?链表与红黑树的转换条件是什么?• 核心回答:JDK1.8 中 HashMap 底层采用 数组+链表+红黑树 的组合结构。其中,数组(又称“桶数组”)是基础存储容器,每个位置对应一个“桶”,通过索引能快速定位元素;链表用于解决“哈希冲突”——当多个元素的哈希值映射到同一数组索引时,用链表将这些元素串联起来,避免冲突元素无法存储;红黑树则是为了优化长链表的查询效率,防止链表过长导
2025-10-02 20:11:03
667
原创 Java 集合 “List + Set”面试清单(含超通俗生活案例与深度理解)
一、List类相关面试题1. Java中List集合的核心定义是什么?它和Collection、Set的关系是什么?常见的List实现类有哪些?• 核心回答:List是java.util.Collection接口的核心子接口,存储的元素有序且可重复——“有序”指元素存入顺序与取出顺序完全一致,支持通过索引(类似数组下标)直接访问指定位置的元素;与Set是Collection接口下的并列子接口,Set的核心特性是“无序且不可重复”,不支持索引访问;常见的List实现类包括ArrayList(基于动态数组实现)
2025-10-02 12:13:14
691
原创 Java SE “泛型 + 注解 + 反射”面试清单(含超通俗生活案例与深度理解)
一、泛型一、请解释 Java 泛型的核心概念是什么?它为什么能实现“编译时类型安全”?用生活中常见的场景举例,说明泛型的实际价值。• 核心概念:泛型是 JDK 5 引入的特性,本质是“参数化类型”——简单说,就是把“数据类型”当作参数传递给类、接口或方法,让同一套代码能适配多种不同类型的数据,不用为每种类型重复编写逻辑。比如一个泛型集合,既可以存整数用来统计成绩,也可以存字符串用来记录姓名,只要在使用时明确指定类型即可。• 编译时类型安全的原理:泛型的关键作用是“提前拦截错误”——在编写代码并编译时,编译器
2025-10-01 20:32:47
656
原创 Java SE “异常处理 + IO + 序列化”面试清单(含超通俗生活案例与深度理解)
一、异常处理一、请详细说说 Java 异常处理体系的结构,并用生活中常见的场景举例,让各部分的区别更清晰?• 核心体系逻辑:Java 中所有与“错误”“异常”相关的内容,都源于顶层基类 Throwable。这个基类就像“所有问题的总集合”,往下又分为两大分支——Error 和 Exception,二者最本质的区别是“程序是否有能力处理”:◦ Error 属于系统级别的错误,比如 JVM 崩溃、内存溢出等,这类问题并非程序代码逻辑错误导致,而是底层系统出现故障,程序自身没有修复能力,只能依赖外部干预(比如重启
2025-10-01 17:28:01
743
原创 Java SE “JDK1.8新特性”面试清单(含超通俗生活案例与深度理解)
一、接口默认方法面试问题1:什么是接口默认方法?它和接口里的抽象方法有什么不一样?核心理解接口默认方法是用default关键字修饰的接口方法,它自带完整的实现逻辑;而抽象方法没有实现,必须让实现接口的类去重写才能用。核心区别在于“是否强制重写”——默认方法不用重写,实现类能直接调用;抽象方法必须重写,否则实现类会编译报错。生活例子比如“健身器材”接口,早期只定义了“启动设备”这个抽象方法(所有健身器材,像跑步机、动感单车,都得自己实现“启动”的逻辑)。后来要给接口加“显示设备电量”的功能:如果加抽象方法,已
2025-09-30 08:37:56
612
原创 Java SE “面向对象”面试清单(含超通俗生活案例与深度理解)
重写是“子类继承父类后,对父类的方法进行重新实现,方法名、输入的东西(参数列表)、返回的东西(返回值)完全相同”——就像妈妈做红烧肉的步骤是“先炒糖色,再放肉炖1小时”(父类方法),你继承后觉得“先把肉炒香,再炒糖色,炖40分钟”更好吃(子类重写方法),方法名(做红烧肉)、输入的东西(肉、糖、酱油)、返回的东西(红烧肉)都相同,但步骤(实现)不同。final 关键字的意思是“不可变”,可修饰“类、方法、变量”,核心是“一旦确定,就不能改”——就像“身份证号”(final变量),一旦生成就不能改;
2025-09-30 07:34:26
780
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅