- 博客(200)
- 收藏
- 关注
原创 算法题--链表反转
本文介绍了两种链表反转的算法实现:1. 基础反转链表(迭代法):通过三个指针(head、index、later)实现链表完全反转,时间复杂度O(n),空间复杂度O(1)。关键点在于先保存下一节点再修改指针,防止断链。2. 区间反转链表(反转链表II):使用虚拟头节点处理边界情况,先定位反转区间的前驱和后继节点,再复用基础反转方法处理指定区间,最后拼接前后链表。两种方法均采用迭代方式,通过指针操作实现高效反转,后者通过虚拟头节点使代码逻辑更统一。
2025-09-08 10:49:20
625
原创 算法题--二分查找
二分查找是一种在有序数组中快速查找目标值的高效算法,核心是通过中点比较不断缩小区间。文章介绍了两种区间表示方法:闭区间[left,right]和左闭右开[left,right),分别对应不同的循环条件和边界更新方式。重点讲解了查找边界的两种常见情况:左边界(第一个≥target的位置)和右边界(第一个>target的位置),并总结了四种典型情况的比较表。关键技巧包括:使用mid=left+(right-left)/2防止溢出,明确区间类型对应的循环条件,以及测试边界情况验证算法正确性。建议查值时使用闭区间,
2025-09-08 10:49:08
930
原创 算法题--用队列实现栈
本文介绍了两种用队列实现栈的方法。栈是后进先出(LIFO),队列是先进先出(FIFO),需要通过特殊处理使最后入队的元素最先出队。方法一使用单个队列,在push时旋转队列使新元素成为队首,时间复杂度为O(n);方法二使用两个队列,通过交换队列实现栈顶操作。两种方法都能实现O(1)的pop和top操作,但方法一代码更简洁。关键思路都是通过队列操作将新元素置于队首位置,从而模拟栈的特性。
2025-09-08 10:48:57
492
原创 算法题--用栈实现队列
本文介绍了用两个栈实现队列的方法。通过inStack处理入队操作,outStack处理出队操作:当outStack为空时,将inStack元素全部转移到outStack实现顺序反转。这样保证了队列的先进先出特性。关键操作包括入队直接压入inStack(O(1)),出队均摊O(1)(每个元素最多转移一次)。代码示例展示了如何用Java的Stack类实现这一结构,并分析了各操作的时间复杂度。该方法高效地利用栈的LIFO特性模拟了队列的FIFO行为。
2025-09-08 10:48:40
650
原创 算法题--合并两个有序链表
摘要:本文介绍了如何合并两个升序链表(LeetCode 21题)。通过创建虚拟头节点dummyHead简化操作,使用prev指针逐步构建新链表。具体步骤包括循环比较节点值、接入较小节点,最后处理剩余节点。代码采用迭代法(节省栈空间),返回dummyHead.next作为合并后的链表头。此解法是合并K个链表的基础模板,时间复杂度为O(m+n),空间复杂度O(1)。(150字)
2025-09-08 10:48:13
347
原创 kafka--超级详细的kafka安装启动方式:四种不同的方式(Window和Linux版本都包含)以及docker启动kafka时IDEA无法连接kafka的问题解决
摘要:本文介绍了Kafka的三种部署方式:1)经典方式(需单独启动ZooKeeper),适合生产环境;2)内置ZooKeeper方式,适合开发测试;3)KRaft模式(Kafka 2.8+),无需ZooKeeper。详细说明了各方式的启动步骤和注意事项,包括Linux和Windows系统的命令差异。特别强调了KRaft模式中UUID生成、数据目录清理等关键操作,以及Docker部署时需配置advertised.listeners解决外部连接问题。文章提供了完整的命令示例和问题解决方法,适合不同环境下Kafk
2025-09-08 10:47:24
1752
原创 RabbitMQ--延时队列总结
本文介绍了RabbitMQ中实现延迟队列的两种主要方法。延迟队列是一种特殊队列,元素需在指定时间点被处理,适用于订单超时、任务调度等场景。第一种方法通过TTL(消息/队列过期时间)和死信队列实现,但存在消息顺序处理导致延迟不准确的问题。第二种方法使用x-delayed-message插件,能更灵活地设置每条消息的延迟时间,但需要额外安装插件。文章详细阐述了两种方案的实现步骤、配置代码及各自优缺点,为处理时间敏感任务提供了技术参考。
2025-09-07 16:34:15
975
原创 redis--redis.conf的相关配置问题
Redis安全配置要点:bind设置监听IP(127.0.0.1仅限本地,0.0.0.0允许所有);protected-mode控制保护模式(yes需同时设置密码和bind 0.0.0.0才能外部连接,no时仅需bind 0.0.0.0);requirepass设置访问密码增强安全;port修改默认6379端口;daemonize决定后台运行方式。建议生产环境配置密码并将protected-mode设为yes,bind谨慎设置为0.0.0.0。
2025-09-07 15:37:46
839
原创 dubbo笔记
https://blog.csdn.net/m0_57921272/article/details/151281263?fromshare=blogdetail&sharetype=blogdetail&sharerId=151281263&sharerefer=PC&sharesource=m0_57921272&sharefrom=from_link
2025-09-07 10:38:53
92
原创 软件启动时加配置文件 vs 不加配置文件
摘要:本文对比了不加配置文件与指定配置文件启动Redis、ZooKeeper和Kafka的区别。不加配置文件采用默认参数(如Redis默认6379端口、无密码),适合测试但灵活性差且不安全;指定配置文件可自定义端口、密码、存储路径等关键参数(如Redis可改端口/加密、ZooKeeper避免/tmp丢数据、Kafka必配监听地址),适合生产环境。核心结论:测试环境可用默认配置快速启动,生产环境必须通过配置文件实现安全可控的定制化部署。
2025-09-05 21:30:02
405
原创 面试tips--java--Java 继承、静态代码块、实例代码块、构造方法执行顺序(2)
文章摘要: 本文通过两个版本的Java代码示例,分析了静态代码块、实例代码块和构造方法的执行顺序。版本一main在子类中,程序启动即加载Child和Parent类,静态代码块最先执行;版本二main在独立Test类中,Parent/Child类延迟加载。关键结论:父类静态块→子类静态块(类加载时执行一次);实例化时执行父类实例块→父类构造方法→子类实例块→子类构造方法。静态方法调用不会触发对象创建,但未加载类时会先执行静态块。不同点在于main方法位置影响类的加载时机。
2025-09-05 11:06:31
449
原创 java--泛型
Java泛型是JDK1.5引入的特性,本质是将数据类型参数化,用于类、接口和方法。主要优势包括:编译期类型安全检查、避免强制类型转换、提高代码复用性。泛型支持通配符(?)实现灵活类型约束,包括上界(extends)和下界(super)。但存在类型擦除机制,运行时泛型信息会被擦除。泛型与数组不同,不支持协变,且不能使用基本类型、创建泛型数组等。常见应用在集合框架和工具类中,遵循"生产者extends,消费者super"原则(PECS)。
2025-09-05 10:10:21
413
原创 分布式微服务--ZooKeeper作为分布式锁
摘要:分布式锁用于解决分布式系统中共享资源的并发访问问题。ZooKeeper通过临时顺序节点机制实现可靠的分布式锁:客户端创建临时顺序节点,判断是否为最小节点来获取锁,否则监听前一节点。业务完成后删除节点释放锁,异常时节点自动删除避免死锁。Curator客户端封装了InterProcessMutex锁,简化开发流程。ZooKeeper锁具有强一致性、自动释放和公平性优点,但性能较低且部署复杂,适用于一致性要求高、中低并发的场景,如订单防超卖和分布式任务调度。
2025-09-05 09:58:25
1087
原创 分布式微服务--ZooKeeper的客户端常用命令 & Java API 操作
ZooKeeper客户端操作指南 命令行操作: 基本命令:启动/退出客户端(zkCli.sh, quit) 节点管理:创建(create)、查看(ls/get)、修改(set)、删除(delete/deleteall) 其他功能:Watch监听(一次性)、ACL权限控制 Java API操作: 原生API:ZooKeeper类提供基本操作 Curator客户端(推荐): 简化API:支持创建多级节点、自动重试等 提供节点增删改查完整功能 支持异步回调和命名空间隔离 核心特性: 支持多种节点类型(持久/临时/
2025-09-04 10:38:16
420
原创 java--写在 try 中的创建连接
本文对比了Java中两种资源管理方式:传统try-finally和Java7引入的try-with-resources。传统方式需手动在finally中关闭资源,代码冗余且易出错;而try-with-resources自动关闭实现了AutoCloseable接口的资源,代码更简洁安全。推荐在Java7+中使用后者来管理数据库、ZooKeeper、Redis等资源,避免资源泄漏问题。
2025-09-04 10:19:33
390
原创 分布式微服务--单体架构 ,垂直架构 ,分布式架构 ,SOA ,微服务 以及他们之间的演变过程
本文系统梳理了软件架构的演进历程:从单体架构(简单但扩展性差)、垂直架构(业务解耦但功能冗余)、分布式架构(性能提升但耦合度高)、SOA架构(ESB中心化管理)、到微服务架构(去中心化、细粒度服务)。重点分析了Dubbo在SOA和微服务中的双重角色,以及Zookeeper作为注册中心与ESB的本质区别。架构演进的核心逻辑是:通过不断解耦和分布式治理来应对系统复杂度提升,最终形成以微服务为代表的云原生架构体系。
2025-09-04 09:37:23
1088
原创 分布式微服务--集群(Cluster)与分布式(Distributed)的区别
摘要:集群与分布式系统是两种不同的服务器组织方式。集群由多台运行相同应用的服务器组成,通过负载均衡和冗余提升性能与可靠性(如Web集群)。分布式系统则将功能拆分为多个子系统,部署在不同服务器上协作完成整体任务(如电商微服务)。关键区别在于:集群侧重同一功能的高可用,分布式强调功能拆分与扩展。实际应用中二者常结合使用:分布式架构拆分业务模块,各模块内部再通过集群保证高可用。(149字)
2025-09-04 09:37:09
331
原创 MYSQL--EXPLAIN 与慢 SQL 排查
本文介绍了MySQL性能优化的核心工具和方法。EXPLAIN命令用于分析SQL执行计划,重点关注type、rows、Extra等关键字段,判断查询是否使用了索引、是否存在全表扫描等问题。慢SQL排查思路包括开启慢查询日志、使用EXPLAIN和SHOW PROFILE等工具分析。常见优化场景涉及全表扫描、索引失效、排序分组等问题,解决方案包括添加合适索引、优化SQL写法(避免SELECT*/函数运算/大IN列表)、使用UNION ALL替代OR等。优化需从索引、SQL语句、架构设计三个层面综合考虑,如建立覆盖
2025-09-03 10:06:35
809
原创 MYSQL--分表和分库
分库分表是应对业务增长导致数据库性能瓶颈的解决方案。水平分表将大表拆分为同结构小表,缓解单表压力但无法突破单机限制;垂直分表拆分宽表字段,提高查询效率但增加关联复杂度。水平分库通过数据分片实现分布式扩展,但带来路由和事务问题;垂直分库按业务隔离,优化性能却增加跨库操作难度。实施时需权衡:单表过大优先水平分表,单库压力考虑水平分库,字段多用垂直分表,业务清晰采用垂直分库。方案选择需考虑查询复杂度、事务处理等衍生问题。
2025-09-03 10:06:17
963
原创 面试tips--MySQL&Redis--Redis 有序集合用跳表不用B+树 & MySQL用B+树作为存储引擎不用跳表:原因如下
Redis选择跳表实现有序集合,因其内存友好、实现简单、范围查询高效,特别适合内存操作;MySQL采用B+树作为索引结构,主要优化磁盘IO,减少访问次数,支持高效范围查询,更适合大规模数据存储。两者各有所长:跳表适合内存环境,B+树适合磁盘存储。
2025-09-02 17:33:14
376
原创 数据结构--跳表(Skip List)
跳表是一种基于有序链表的多层索引数据结构,通过添加"索引层"实现快速查找(平均O(logn))。它包含多层链表结构,底层为完整链表,上层为采样索引。查找时从高层开始快速定位,逐步降层精确查找。支持高效插入、删除和范围查询,实现比红黑树更简单。插入时通过随机算法(如抛硬币)决定节点层级,保持索引平衡。Redis的有序集合就采用跳表实现,特别适合需要快速范围查询的场景。相比树结构,跳表用链表实现类似效率,但代码更简洁直观。
2025-09-02 17:22:10
1104
原创 面试tips--JVM(4)--Minor GC & Major GC & Full GC
JVM垃圾回收机制主要分为三种类型:1) MinorGC针对新生代,Eden区满时触发,使用复制算法,速度快且频繁;2) MajorGC针对老年代,在老年代满或对象晋升失败时触发,速度较慢;3) FullGC清理整个堆和方法区,触发条件包括系统调用、空间不足等,速度最慢且影响最大。主要区别在于回收范围和执行频率,MinorGC最轻量高效,FullGC应尽量避免。理解不同GC类型的触发条件和特点对JVM调优至关重要。
2025-09-02 10:45:49
407
原创 面试tips--并发--notify() vs notifyAll()
Java多线程中的wait()、notify()和notifyAll()方法用于线程间通信。wait()使线程进入等待队列并释放锁,notify()唤醒单个线程,notifyAll()唤醒所有线程。被唤醒线程需重新获取锁才能继续执行。关键区别:notify()高效但可能导致线程饿死,适合单生产者-消费者场景;notifyAll()更安全但性能较低,适合多线程竞争场景。使用时需在同步代码块内调用,推荐用while循环检查条件以避免虚假唤醒。根据场景选择合适方法:明确只需唤醒一个线程用notify(),不确定时
2025-09-02 09:30:22
478
原创 面试tips----并发--BLOCKED和WAITING两个状态
摘要: Java线程中,BLOCKED与WAITING状态的核心区别在于等待机制: BLOCKED:线程被动等待获取synchronized锁(如锁被占用),需等待锁释放后才能继续执行(如线程B等待线程A释放锁)。 WAITING:线程主动放弃执行权(通过wait()或park()),需其他线程显式唤醒(如notify())。 比喻:BLOCKED像排队等进屋,WAITING像进屋后坐下等人叫醒。关键差异在于被动锁竞争 vs. 主动协作唤醒。
2025-09-02 09:30:06
509
原创 并发 -- JUC(java.util.concurrent) 包的简单介绍
Java并发工具包JUC(java.util.concurrent)是Java进行多线程编程的核心工具集,主要包含:1)锁机制(ReentrantLock、ReadWriteLock等替代synchronized);2)线程安全集合(ConcurrentHashMap、BlockingQueue等);3)线程池(ThreadPoolExecutor)及任务调度;4)原子操作类(AtomicInteger等基于CAS实现);5)同步辅助工具(CountDownLatch、Semaphore等)。使用建议包括优
2025-09-01 22:04:24
1246
原创 并发编程--线程池(1)线程池概念 & Java 线程池体系(Executor、ThreadPoolExecutor、Executors)
摘要:线程池通过复用线程减少创建销毁开销,提升并发性能。Java线程池体系包括Executor接口、ExecutorService扩展接口和ThreadPoolExecutor核心实现类。Executors工具类虽提供便捷工厂方法,但多数使用无界队列或无限线程,存在OOM风险,生产环境推荐直接使用ThreadPoolExecutor自定义参数(核心/最大线程数、有界队列、拒绝策略等),确保系统稳定性和可控性。
2025-09-01 21:59:29
952
原创 并发--并发中的线程状态及不同状态下线程所在队列
Java线程有6种状态:NEW、RUNNABLE(含Ready和Running)、BLOCKED、WAITING、TIMED_WAITING和TERMINATED。线程在不同状态下会进入不同队列:就绪队列存放等待CPU的RUNNABLE线程;阻塞队列存放获取锁失败的BLOCKED线程;等待队列存放执行wait/sleep等操作的WAITING/TIMED_WAITING线程。状态转换时,被唤醒的线程会先进入就绪队列,不会直接运行。锁释放和notify操作都会将线程转移到就绪队列等待CPU调度。
2025-09-01 20:09:27
502
原创 Redis--Lua脚本以及在SpringBoot中的使用
Redis中使用Lua脚本可实现原子性操作,减少网络通信并提升性能。主要方式有两种:通过redis-cli直接执行脚本文件或使用eval命令在交互模式中执行。Lua脚本通过KEYS和ARGV参数分别接收键名和其他参数值,支持多参数传递。在SpringBoot中,可通过RedisTemplate执行Lua脚本,实现类似SETNX+EXPIRE的原子操作,常用于分布式锁等场景。虽然Redis原生命令已支持部分原子操作,但Lua脚本提供了更灵活的复杂逻辑处理能力。使用时应根据需求选择最合适的方式,确保性能和原子性
2025-09-01 17:00:28
983
原创 java--Java 注解(Annotation)
摘要:Java注解是JDK5.0引入的元数据标记,用于类、方法等元素,提供编译检查、代码生成和运行时处理功能。内置注解包括@Override、@Deprecated等。自定义注解需使用@Target、@Retention等元注解定义,可通过反射读取。注解广泛应用于Spring、JUnit等框架,如@Autowired自动注入、@Test标记测试方法。注解本质是程序标签,不影响代码逻辑但能指导编译器和框架行为。
2025-09-01 09:40:35
391
原创 java--Java 枚举(enum)
Java枚举(enum)是一种特殊类,用于定义一组固定常量。它比传统常量定义更安全高效,支持构造方法、成员变量和方法。枚举本质继承自java.lang.Enum,每个值都是单例实例。使用场景包括表示星期、状态等固定值集合。枚举可以定义属性(如状态码和描述信息)及对应方法,通过private构造方法初始化。主要特点:类型安全、可读性强、支持遍历和扩展功能。基本用法包括定义枚举类、获取枚举值、遍历及访问属性方法。
2025-09-01 09:40:24
506
原创 java--浅拷贝&深拷贝
Java对象拷贝分为浅拷贝和深拷贝。浅拷贝仅复制基本类型值和引用地址,副本与原对象共享引用对象;深拷贝则会完全复制引用对象,实现完全独立。浅拷贝通过实现Cloneable接口重写clone()方法实现,深拷贝可通过手动clone引用对象、序列化或工具库实现。深拷贝性能较低但能确保对象独立性,适合复杂引用场景,而浅拷贝适用于简单对象复制。开发中应根据需求选择拷贝方式,通常推荐使用深拷贝以避免引用共享带来的副作用。
2025-08-31 12:50:29
432
原创 java--Java 中的排序:Comparable 与 Comparator 的使用与区别
Java提供了Comparable和Comparator两种对象排序方式:Comparable接口在类内部实现,定义自然排序规则(如String按字典序);Comparator接口在类外部实现,支持多种灵活排序规则。Comparable通过compareTo方法实现单一排序,而Comparator通过compare方法可定义多个比较器。实际应用中,对固定排序规则使用Comparable,需要多条件排序时推荐使用Comparator的链式比较(如comparing().thenComparing())和Lam
2025-08-31 11:11:48
1144
原创 面试tips--MyBatis--<where> & where 1=1 的区别
动态SQL中拼接WHERE子句有两种常见方法:1)使用WHERE 1=1作为占位符,方便后续AND条件拼接;2)使用MyBatis的<where>标签自动处理WHERE和多余AND/OR。虽然MySQL 5.7+已能优化WHERE 1=1,但该写法仍存在语义不清晰、可维护性差等问题。推荐优先使用<where>标签,它能自动处理条件拼接,避免SQL脏乱,且不受MySQL版本限制,在语义和维护性上更优。
2025-08-30 16:54:28
363
原创 SpringBoot防止重复提交(2)
摘要:针对提现操作中用户多次点击导致的重复请求问题,提出两种解决方案。方案1在页面打开时生成短期有效Token(如5秒),快速防止重复请求,但存在Token过期导致操作中断的缺点。方案2在首次点击时生成Token并存储于前端,可避免过期问题,适合长时间操作场景,但依赖前端存储且实现较复杂。两种方案各有利弊,需根据具体场景选择。
2025-08-30 16:36:17
652
原创 数据结构--栈(Stack)& 队列(Queue)
本文介绍了Java中队列(Queue)和栈(Stack)两种数据结构。队列是FIFO(先进先出)结构,常用实现类有LinkedList、PriorityQueue和ArrayDeque,适用于排队系统、BFS等场景;栈是LIFO(后进先出)结构,可用Stack类或ArrayDeque实现,应用于函数调用栈、表达式求值等场景。文章对比了两种结构的特点,推荐使用ArrayDeque实现队列和栈以获得更好性能。
2025-08-30 11:45:23
1017
原创 数据结构--List & Set & Map
Java集合框架主要包含Collection(List、Set)和Map两大体系。List有序可重复,常用ArrayList(数组,随机访问快)和LinkedList(链表,插入删除快);Set无序不重复,常用HashSet(快速查找)、LinkedHashSet(保持顺序)和TreeSet(自动排序)。Map存储键值对,常用HashMap(高效查找)、LinkedHashMap(保持顺序)和TreeMap(自动排序)。选择集合类型需考虑:是否需要有序/排序、是否允许重复、访问方式(索引/键)和性能需求(读
2025-08-30 11:39:38
857
原创 面试tips--java--equals() & hashCode()
文章摘要:equals()方法用于比较对象内容,默认比较内存地址,需重写以实现内容比较;hashCode()返回对象哈希值,用于哈希集合存储。Java规定重写equals()必须同时重写hashCode(),否则会导致哈希集合查找失败(如两个内容相同的对象因哈希值不同而被存入不同位置)。正确做法是保持两者一致性:当equals()返回true时,hashCode()必须相同。推荐使用IDE自动生成基于字段的equals()和hashCode()方法,确保哈希集合正常工作。
2025-08-29 16:08:38
485
原创 计算机网络知识--对称加密、非对称加密和数字证书详解
加密技术主要包括对称加密和非对称加密两种方式。对称加密使用同一密钥进行加解密,速度快但密钥分发不安全;非对称加密采用公钥/私钥对,解决了密钥分发问题但速度较慢。实际应用中(如HTTPS)通常结合两者优势:先用非对称加密传输对称密钥,再用对称加密处理数据。数字证书则用于验证公钥真实性,防止中间人攻击。这种组合方案既确保了安全性,又保证了传输效率。
2025-08-29 11:07:13
658
原创 计算机网络知识-域名&域名的解析过程
域名是网站的"名字",用于替代难记的IP地址。域名采用层级结构,从右往左依次为根域、顶级域、二级域和子域名。域名解析是将域名转换为IP地址的过程,通过DNS系统完成。解析流程包括:浏览器缓存→系统缓存→Hosts文件→本地DNS→根服务器→顶级域名服务器→权威域名服务器。DNS查询分为递归查询和迭代查询两种方式。最终权威服务器返回IP地址,各环节会缓存结果以提高效率。
2025-08-29 10:44:30
983
原创 面试tips--JVM(3)--类加载过程
JVM类加载过程分为五个阶段:加载(通过类加载器读取.class文件)、链接(含验证、准备、解析三个子阶段)、初始化(执行静态代码块和赋值)、使用和卸载。其中双亲委派机制确保核心类库安全,避免重复加载。类加载器包括启动类、扩展类、应用类加载器及自定义加载器。初始化阶段线程安全,且触发条件包括new实例化、访问静态成员等。卸载需满足实例回收、类加载器回收等条件,常见于热部署场景。
2025-08-28 22:09:03
497
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人