摘要: Arrays 1. 截取数组 int[] arr2 = Arrays.copyOfRange(int[] original, int from, int to) original − 这是要从中复制范围的数组。 from − 这是要复制的范围的初始索引,包括在内。 to − 这是要复制的范围的最终索 阅读全文
posted @ 2025-05-02 13:20 kuki' 阅读(4) 评论(0) 推荐(0)
摘要: ArrayList扩容的本质是计算出新的扩容数组的size后实例化,并将原有数组内容复制到新数组中。 ArrayList的底层是用动态数组实现的, 初始化一个ArrayList 集合还没有添加元素时,是个空数组, 当添加第一个元素时,内部会调用扩容方法并返回最小容量10,也就是ArrayList 初 阅读全文
posted @ 2025-05-14 19:59 kuki' 阅读(0) 评论(0) 推荐(0)
摘要: 大小和自动扩容 Array在创建时必须指定大小,且大小是固定的。 存储对象 Array可以存储基本类型数据,也可以存储对象。 ArrayList只能存储对象。对于基本数据类型,需要使用其对应的包装类(如Integer、Double) 阅读全文
posted @ 2025-05-14 17:41 kuki' 阅读(1) 评论(0) 推荐(0)
摘要: 线程安全的集合类可以在多线程环境中安全地使用,而线程不安全的集合类在多线程环境中可能会导致不确定的行为。 线程安全 Vector:Vector是一个古老的集合类,它的方法都是同步的,因此是线程安全的。然而相对较重 HashTable:HashTable是一个古老的Map实现,其方法都是同步的,因此线 阅读全文
posted @ 2025-05-14 17:27 kuki' 阅读(1) 评论(0) 推荐(0)
摘要: Java中的集合类主要由Collection和Map这两个接口派生,其中Collection接口派生出三个子接口,分别是Set、List、Queue。 所有的Java集合类,都是Set、List、Queue、Map这四个接口的实现类,这四个接口将集合分成了四大类。 Collection接口:所有集合 阅读全文
posted @ 2025-05-14 17:14 kuki' 阅读(1) 评论(0) 推荐(0)
摘要: 多态是指子类对象可以直接赋给父类变量(父类引用指向子类对象),但运行时依然表现出子类的行为特征,(同一类型的对象在执行同一个方法时,能表现出多种行为特征) 当把一个子类对象直接赋给父类引用变量时,例如BaseClass obj = new SubClass;, 这个obj引用变量的编译时类型是Bas 阅读全文
posted @ 2025-05-14 16:31 kuki' 阅读(2) 评论(0) 推荐(0)
摘要: 面向对象编程OOP和面向过程编程是两种不同的 面向对象编程 抽象出具有状态,行为的对象,然后用对象执行方法的方式解决问题,强调封装、继承和多态。 面向过程 将系统视为一系列的过程或函数,通过调用这些过程来完成任务。强调算法和流程。 阅读全文
posted @ 2025-05-14 16:00 kuki' 阅读(2) 评论(0) 推荐(0)
摘要: 在Java中,集合存在一个缺点,即将对象添加到集合中后,集合会失去对该对象的具体数据类型的记忆,导致取出对象时,集合将其视为Object类型。(这是因为集合的设计者在创建时无法确定集合将被用来存储哪种类型的对象,因此选择设计成能够存储任何类型的对象,保持通用性。 但这个设计带来了两个问题 集合对元素 阅读全文
posted @ 2025-05-14 15:49 kuki' 阅读(1) 评论(0) 推荐(0)
摘要: 重载是在同一个类中定义多个方法,方法名相同但参数列表不同。(方法的返回类型可以相同可以不同) 重写是在子类中重新定义父类中已有的方法,方法名和参数列表必须相同 重载于返回类型和修饰符无关,方法名相同但参数列表不同 阅读全文
posted @ 2025-05-14 15:07 kuki' 阅读(1) 评论(0) 推荐(0)
摘要: Exception和Error都派生自Throwable类的子类 Exception类及其子类主要用于表示程序可以处理的异常情况 Error Error类层次结构描述了Java运行时系统的内部错误和资源耗尽错误。 阅读全文
posted @ 2025-05-14 15:03 kuki' 阅读(2) 评论(0) 推荐(0)
摘要: Java的异常派生于 Throwable类的一个实例 异常分为RuntimeException和其他异常(也可以称之为编译时异常)。 阅读全文
posted @ 2025-05-14 14:51 kuki' 阅读(3) 评论(0) 推荐(0)
摘要: 接口中的方法默认是抽象的,且接口中只能包含常量(static final 变量)和抽象方法,不能包含成员变量 抽象类是一个类,可以包含抽象方法和具体方法,也可以包含成员变量和常量。 抽象类中的抽象方法是没有实现的方法,而具体方法则包含实现代码。 抽象类不能直接实例化,需要子类继承并实现其中的抽象方法 阅读全文
posted @ 2025-05-14 14:49 kuki' 阅读(0) 评论(0) 推荐(0)
摘要: AOP是面向切面编程,它允许开发者在不改动业务代码的情况下,横向切入添加新的功能,比如日志等。降低了各业务部分横向的耦合度。 AOP的底层原理是JDK或者CGLIB的动态代理 通过反射机制,在不改变原代码的情况下,实现想要的功能。 什么是AOP AOP(Aspect Oriented Program 阅读全文
posted @ 2025-05-13 21:41 kuki' 阅读(0) 评论(0) 推荐(0)
摘要: 题目 请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。 实现 LRUCache 类: LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存 int get(int key) 如果关键字 key 存在于缓存中,则返回关键字的 阅读全文
posted @ 2025-05-13 20:50 kuki' 阅读(2) 评论(0) 推荐(0)
摘要: 思路 左右滑动窗口 用set维护一个没有重复的字符的窗口 维护两个指针,left,right,当有重复的时候不断右移left 若不重复,则值放入set 每次更新后,用窗口大小更新res 阅读全文
posted @ 2025-05-13 16:37 kuki' 阅读(1) 评论(0) 推荐(0)
摘要: 问题 你有考虑过像中后台的一个,比如说Kafka那些,你有多个点的数据库的时候,你会怎么考虑,比如说业务中经常会有多中心,很多人都去用这个服务,到时他部署的时候可能为了稳定性,它会可能会多中心,多中心就会存在写完立即就读的一个问题,你有考虑过这多中心的这么快的一个运营部署,你会怎么去设计呢? 对,就 阅读全文
posted @ 2025-05-13 15:52 kuki' 阅读(2) 评论(0) 推荐(0)
摘要: Redis持久化机制保证了Redis服务器在重启后数据不丢失,通过RDB和AOF文件来恢复内存中原有的数据。 这两种持久化方式可以单独使用,也可以同时使用 说一下RDB RDB持久化通过创建数据集的快照来工作,在指定的时间间隔内将Redis在某一时刻的数据状态保存到磁盘中的一个RDB文件中。 还可以 阅读全文
posted @ 2025-05-13 15:10 kuki' 阅读(2) 评论(0) 推荐(0)
摘要: 在 JVM 中,堆通常分为新生代(Young Generation)和老年代(Old Generation),其比例可通过 -XX:NewRatio 参数控制。常见配置包括: 默认 Server JVM 中 NewRatio=2,即新生代与老年代比例约为 1:2(新生代约占堆的 1/3) 默认 Cl 阅读全文
posted @ 2025-05-13 14:48 kuki' 阅读(4) 评论(0) 推荐(0)
摘要: Java虚拟机在执行Java程序的过程中会把它管理的内存划分成若干个不同的数据区域。 1 运行时数据区域 1.1 堆(线程共享) 字符串常量池 1.2 线程(Thread) 虚拟机栈 本地方法栈 程序计数器 2 本地内存 2.1 元空间 运行时常量池 2.2 直接内存 阅读全文
posted @ 2025-05-13 14:33 kuki' 阅读(1) 评论(0) 推荐(0)
摘要: AbstractQueuedSynchronizer的简称,即抽象队列同步器 AQS是一个抽象类,它维护了一个共享变量state和一个线程等待队列,为ReentrantLock等提供底层支持。 AQS的思想是,如果被请求的共享资源处于空闲状态,则当前线程成功获取锁;否则将当前线程加入到等待队列中,当 阅读全文
posted @ 2025-05-13 14:10 kuki' 阅读(2) 评论(0) 推荐(0)
摘要: ReentrantLock基于AQS实现。而synchronized由JVM内部的Monitor机制实现 ReentrantLock需要手动Lock()和UnLock() synchronized可以在方法和代码块上加锁,ReentrantLock只能在代码块上加锁,但可以指定公平锁还是非公平锁。 阅读全文
posted @ 2025-05-13 13:49 kuki' 阅读(3) 评论(0) 推荐(0)
摘要: Monitor 是 JVM 内置的同步机制,每个对象在内存中都有一个对象头——Mark Word,用于存储锁的状态,以及 Monitor 对象的指针。 synchronized依赖对象头的mark word进行状态管理,支持无锁、偏向锁、轻量级锁、以及重量级锁。 阅读全文
posted @ 2025-05-13 13:37 kuki' 阅读(2) 评论(0) 推荐(0)
摘要: 线程在遇到同步请求时,会执行 monitorenter 字节码指令, JVM 根据对象头的 mark word 尝试“抢”这把锁; 如果失败,线程就会自动排队、挂起,直到锁可用时再被唤醒并重试获取。 在执行monitorenter时,会尝试获取对象的锁,如果锁的计数器为 0 则表示锁可以被获取,获取 阅读全文
posted @ 2025-05-13 13:26 kuki' 阅读(2) 评论(0) 推荐(0)
摘要: synchronized 依赖JVM内部的Monitor对象来实现线程同步。使用的时候不用手动lock和unlock,JVM会自动加锁和解锁。 synchronized加锁代码块时 JVM通过 monitorenter、monitorexit两个指令来实现同步 前者表示线程正在尝试获取lock对象的 阅读全文
posted @ 2025-05-13 13:21 kuki' 阅读(2) 评论(0) 推荐(0)
摘要: synchronized可以上锁的对象有 普通方法 synchronized用在普通方法上时,上锁的是执行这个方法的对象。 public synchronized void increment(){ this.count++; } 静态方法 synchronized用在静态方法上时,上锁的是这个类的 阅读全文
posted @ 2025-05-12 23:32 kuki' 阅读(1) 评论(0) 推荐(0)
摘要: Kafka保证在同一个分区内消息是有序的, 生产者写入到同一分区的消息会按照写入顺序追加到分区日志文件中, 消费者从分区中读取消息时也会按照这个顺序。 生产者端 为了保证消息写入同一分区从而确保顺序性,为消息指定相同的Key,保证相同Key的消息发送到同一分区。 消费者端 消费者在消费消息时,需要单 阅读全文
posted @ 2025-05-12 21:18 kuki' 阅读(1) 评论(0) 推荐(0)
摘要: 常见优化索引的方法: 前缀索引优化 ALTER TABLE users ADD INDEX idx_email(email(6)); 这样,索引中只存储每个 email 字段的前 6 个字符,减少了索引的存储空间。 使用前缀索引是为了减少索引字段大小,可以增加一个索引页中存储的索引值,提高索引的查询 阅读全文
posted @ 2025-05-12 11:08 kuki' 阅读(1) 评论(0) 推荐(0)
摘要: 当一个线程结束时,其ThreadLocalMap也会随之销毁,但是ThreadLocal对象本身不会立即被垃圾回收,直到没有其他引用指向它为止。 因此,在使用 ThreadLocal 时需要注意,如果不显示调用remove()方法,或者线程结束时未正确清理ThreadLocal变量,可能会导致内存泄 阅读全文
posted @ 2025-05-11 16:26 kuki' 阅读(14) 评论(0) 推荐(0)
摘要: ThreadLocal的实现依赖于Thread类中的一个ThreadLocalMap字段,它存储ThreadLocal变量本身和对应值的映射。 每个线程都有自己的ThreadLocalMap实例,用于存储该线程持有的所有ThreadLocal变量的值。 当创建一个ThreadLocal变量时,它就是 阅读全文
posted @ 2025-05-11 15:57 kuki' 阅读(5) 评论(0) 推荐(0)
摘要: MVCC指的是多版本并发控制,每次修改数据时,都会生成一个新的版本,而不是直接在原有数据上进行修改。 并且每个事务只能看到在它开始之前已经提交的数据版本。 这样读操作就不会阻塞写操作,写操作也不会阻塞读操作,从而避免加锁带来的性能损耗。 底层实现依赖于Undo Log 和Read View。 每次修 阅读全文
posted @ 2025-05-10 22:02 kuki' 阅读(1) 评论(0) 推荐(0)
摘要: 1. 串行化 串行化是最高的隔离级别,通过强制事务串行执行来解决“幻读”问题。 但会导致大量的锁竞争问题,实际应用中很少用。 什么是幻读 幻读是指在同一个事务中,多次执行相同的范围查询,结果却不同。 这种现象通常发生在其他事务在两次查询之间 插入或删除了符合当前查询条件的数据。 在可重复读隔离级别下 阅读全文
posted @ 2025-05-10 18:31 kuki' 阅读(2) 评论(0) 推荐(0)
摘要: 可重复读能确保同一事务内多次读取相同数据的结果一致,即使其他事务已提交修改结果。 但没避免 幻读 幻读是指在同一个事务中,多次执行相同的范围查询,结果却不同。 这种现象通常发生在其他事务在两次查询之间插入或删除了符合当前查询条件的数据。 阅读全文
posted @ 2025-05-10 16:26 kuki' 阅读(3) 评论(0) 推荐(0)
摘要: 可重复读是MySQL默认的隔离级别,避免了“脏读”和“不可重复读”,通过MVCC和临键锁也能在一定程度上避免幻读。 阅读全文
posted @ 2025-05-10 15:47 kuki' 阅读(2) 评论(0) 推荐(0)
摘要: 四种隔离级别: 读未提交,读已提交,可重复读,串行化。 读未提交: 事务可以读取其他未提交事务修改的数据。 也就是,如果未提交的事务一旦回滚,读取到的数据就会变成了“脏数据”,通常不会使用。 读已提交: 避免了脏读,但可能会出现不可重复度。 同一事务内多次读取同一数据结果会不同,因为其他事务提交的修 阅读全文
posted @ 2025-05-10 15:36 kuki' 阅读(2) 评论(0) 推荐(0)
摘要: 事务是一条或多条SQL语句组成的执行单元。四个特性分别是A原子性、C一致性、I隔离性和D持久性。 A原子性主要通过Undo Log来实现,持久性通过Redo Log来实现,隔离性由MVCC和锁机制来实现,一致性有其他三特性保证。 原子性 事务中的所有操作要么全部完成,要么全部不完成, 一致性 事务从 阅读全文
posted @ 2025-05-10 15:19 kuki' 阅读(3) 评论(0) 推荐(0)
摘要: Spring的声明式事务管理是通过AOP(面向切面编程)和代理机制实现的。 第一步,在Bean初始化阶段创建代理对象 Spring容器在初始化单例Bean的时候,会遍历所有BeanPostProcessor实现类(BeanPostProcessor 是 Spring 提供的一个扩展接口,允许在 Be 阅读全文
posted @ 2025-05-10 14:41 kuki' 阅读(3) 评论(0) 推荐(0)
摘要: Spring中,事务有2类 声明式事务管理和编程式事务管理 编程式事务管理 编程式事务,使用TransactionTemplate和PlatformTransactionManager实现,需要显示地执行事务。(允许在代码中直接控制事务的边界,通过编程方式明确指定事务的开始、提交和回滚。 publi 阅读全文
posted @ 2025-05-10 12:24 kuki' 阅读(1) 评论(0) 推荐(0)
摘要: 5个阶段 实例化:Spring使用构造方法或者工厂方法创建一个Bean的实例。(在这个阶段,Bean只是一个空的Java对象,还未设置任何属性) 属性赋值: Spring将配置文件中的属性值或依赖的Bean注入到该Bean中。 这个过程称为依赖注入,确保Bean所需的所有依赖都被注入。 初始化:Sp 阅读全文
posted @ 2025-05-09 23:52 kuki' 阅读(1) 评论(0) 推荐(0)
摘要: Kafka生产者是线程安全的,多个线程可以共享同一个KafkaProducer实例进行消息发送。 Kafka消费者不是线程安全的,每个线程一个消费者实例 阅读全文
posted @ 2025-05-07 23:56 kuki' 阅读(3) 评论(0) 推荐(0)
摘要: 特性 ActiveMQ RabbitMQ RocketMQ Kafka 消息顺序性 有序 有序 有序 分区有序 阅读全文
posted @ 2025-05-07 23:49 kuki' 阅读(3) 评论(0) 推荐(0)
摘要: Kafka可以保证在同一个分区内,消息的有序性。 生产者写入到同一分区的消息,会按照写入顺序追加到分区日志文件中 消费者从分区中读取消息时,也会按照这个顺序。(Kafka天然具备的特性)。 具体说明如何实现如何实现顺序读取消息 生产者端确保消息顺序:为保证消息写入同一分区从而确保顺序性, 生产者需要 阅读全文
posted @ 2025-05-07 23:47 kuki' 阅读(3) 评论(0) 推荐(0)