- 博客(29)
- 收藏
- 关注
原创 Java为什么不直接实现Iterator接口,而是实现Iterable?
依赖倒置原则:Iterable接口与Iterator的分离使得集合类(Iterable的实现)不需要直接依赖具体的迭代器实现细节,只需要知道它能返回一个实现了Iterator接口的对象即可。Iterable接口包含方法iterator(),他的作用是为集合提供一个创建其迭代器实例的工厂方法。单一职责原则:Iterable接口专注于暴露一个创建迭代器的入口,而Iterator接口专注于定义迭代行为。首先Iterable是集合类的顶层接口,作为一个顶层接口,它提供了获取迭代器的方法。他提供遍历集合元素的功能。
2024-09-22 15:07:26
191
1
原创 Error和Exception的区别
尤其是受检异常,要求开发者在编译期间就采取声明、捕获异常或者抛出异常等手段对异常进行处理。对于运行时异常,虽然编译器不要求强制处理,单良好的编程习惯要求我们发现、处理和记录这些异常,以此增加程序的健壮性。代表严重系统错误,通常是不可预期的,外部环境或者资源限制问题,如虚拟机异常、内存溢出等。分为受检异常和运行时异常,代表程序运行时可预见的异常情况,比如找不到文件、空指针异常等。通过适当的处理手段,程序往往是可恢复的。通常是不可恢复的,无法通过代码逻辑来尝试解决,一般需要记录错误信息,通知用户。
2024-09-22 14:49:21
212
原创 concurrentHashMap线程安全实现的原理
ConcurrentHashMap 内部维护一个 Segment 数组,每个 Segment 都是一个小型的 HashMap。Segment 继承自 ReentrantLock,因此每个 Segment 都是一个可重入锁。
2024-09-08 21:42:31
1003
原创 canal笔记
MySQL主从复制原理1.MySQL master会将数据变更写入binlog中2.MySQL slave将master的binlog日志拷贝到中继日志中3.MySQL slave将中继日志中的操作重放,将变更数据同步到最新Canal工作原理1.canal将自己伪装成从数据库,向主数据库发送dump请求2.主数据库接收到dump请求吧binlog推送给canal3.Canal解析binlog日志,并执行后续操作
2024-09-06 10:37:58
368
原创 布隆过滤器详解
布隆过滤器(Bloom Filter)是一种空间效率高的概率数据结构,主要用于测试一个元素是否在一个集合中。它的特点是可以快速判断某个元素是否在集合中,但可能会出现误判,即某个元素被判断为在集合中,但实际上并不在。布隆过滤器广泛应用于缓存穿透、数据库查询优化、网络爬虫、去重等场景.布隆过滤器遵循存在的不一定存在,不存在的一定不存在。
2024-09-01 09:51:34
542
原创 缓存穿透是什么?什么场景下会发生?如何解决?
缓存穿透是指请求的数据在缓存和数据库中均不存在的情况。当大量请求同时查询一个不存在的数据时,这些请求会直接打到数据库上,导致数据库压力增大,甚至可能引发数据库崩溃。换句话说,缓存穿透是指请求绕过缓存,直接访问后端数据库。
2024-09-01 09:42:42
601
原创 Theadlocal是什么?有哪些使用场景?底层实现是什么?
首先在线程里有一个ThreadlocalMap这个变量,在我们调用threadlocal.set()方法的时候其实就是操作当前线程的ThreadlocalMap,将threadlocal放到key上将threadlocal的值存入value中。这是set方法的具体实现。需要注意的是,ThreadLocalMap并不是放在ThreadLocal当中的,而是放在当前Thread对象中的。
2024-08-30 23:47:21
332
原创 Java中的强引用和弱引用是什么?
JVM会自动地分配和释放对象的内存。JVM使用垃圾回收器来识别和回收不再被程序使用的对象,以释放它们占用的内存空间。垃圾回收器周期性地扫描堆内存,找出哪些对象是不可达的,然后回收它们占用的内存。垃圾回收器使用可达性分析算法来判断对象是否可达。从根节点(例如局部变量或静态变量)开始遍历引用链,如果某个对象不可达,则认为它是垃圾,可以被回收。不了解内存泄露和可达性算法的的可以查看我之前的博客。
2024-08-30 22:40:36
502
原创 可达性分析算法是什么?用于什么场景?解决什么问题?
可达性分析算法的基本思想是从一组称为“根节点”的对象开始,遍历所有可达对象,标记这些对象。局部变量:当前线程中的局部变量。静态变量:类的静态字段。JNI引用:通过Java Native Interface (JNI)创建的引用。活动线程:当前正在执行的线程。
2024-08-30 22:38:48
543
原创 内存泄漏是什么?发生在什么场景?如何解决?
内存泄漏发生在程序中,当对象不再被需要时,仍然存在对它的引用,导致垃圾回收器无法回收这些对象。虽然这些对象占用的内存并没有被释放,但程序仍然在继续消耗内存,最终可能导致系统内存不足。
2024-08-30 22:34:45
949
原创 12306项目学习笔记(框架篇Base)
首先学习的是基础框架提供了一种静态方式来访问Spring容器中的Bean,适用于某些特定场景,如工具类和框架集成。在12306项目中由于我们引入了RocketMQ消息队列,这些库的对象通常不是Spring管理的,无法直接使用@Autowired注入,所以需要类提供一种静态方式来访问Spring容器中的Bean。比如在我们的TicketServiceImpl中的bean对象就是用以下方法获取的。
2024-08-30 08:38:15
1312
原创 全网最详细的Hashmap源码逐层剖析(一)
它通过哈希函数将键映射到数组中的位置,以实现高效的键值对存储和查找。这种混合操作有助于减少哈希冲突,因为它使得哈希值的分布更加均匀,避免了由于哈希码的某些位不变而导致的冲突。HashMap的主干是一个数组,数组中的每个元素被称为“桶”(bucket),用于存储键值对。会创建一个更大的数组,并将所有现有的键值对重新哈希到新数组中。中插入一个键值对时,会触发一系列操作,包括计算哈希值、找到合适的数组索引、处理冲突等。这个哈希函数通过将键的哈希码高位和低位混合,减少了哈希冲突的概率。找到合适的数组索引后,
2024-08-08 11:19:33
1402
原创 Redis如何优化频繁命令往返造成的性能瓶颈?
Redis管道(Pipeline)是一种优化技术,允许客户端一次性发送多个命令到服务器,而无需等待每个命令的响应。服务器会依次执行这些命令,并将所有结果一次性返回给客户端。减少网络往返次数,显著降低延迟提高吞吐量,特别是在高延迟网络环境中减少CPU消耗,因为服务器可以批量处理命令。
2024-08-06 22:04:23
1070
原创 <JAVA>一文搞懂红黑树
红黑树是一种特殊的二叉搜索树,它在每个节点上增加了一个存储位来表示节点的颜色,可以是红色或黑色。通过对任何一条从根到叶子的路径上各个节点着色方式的限制,红黑树确保没有一条路径会比其他路径长出两倍,因此,红黑树是一种弱平衡二叉树(由于是弱平衡,可以看到,在相同的节点情况下,AVL树的高度低于红黑树)。红黑树在很多地方都有应用,例如:1. Java中的TreeMap和TreeSet2. 数据库中的索引实现。
2024-08-06 19:12:09
1129
原创 一篇文章带你搞懂Redis RDB和AOF持久化
RDB(Redis Database)是Redis默认的持久化方式。RDB持久化是指在指定的时间间隔内,将内存中的数据集快照写入磁盘,也就是行话讲的Snapshot快照,它恢复时是将快照文件直接读到内存里。AOF(Append Only File)持久化是通过保存Redis服务器所执行的写命令来记录数据库状态的。
2024-08-06 17:47:32
2059
原创 JAVA 二叉搜索树(BST)详解
左子树上所有节点的值均小于根节点的值右子树上所有节点的值均大于根节点的值左、右子树也分别为二叉搜索树这种特性使得二叉搜索树能够支持快速的查找、插入和删除操作。
2024-08-05 10:42:26
917
原创 Redis使用单线程模型为何还能如此高效,并且不会造成数据同步问题?
但如果使用数据分片,将用户信息按照用户ID的哈希值分布到16个Redis实例中,则每个实例只需要存储约600万用户的信息,内存压力和查询压力都会大大减小。传统的阻塞IO模型中,当一个线程调用一个IO操作时,它会被阻塞,直到该操作完成。假设有10000个并发请求同时访问一个计数器,如果使用多线程编程,则需要使用锁来保证计数器的一致性,而锁的获取和释放会导致大量的CPU时间浪费。但如果使用Redis的单线程模型,则可以使用INCR命令来原子地增加计数器的值,不需要任何锁操作,从而大大提高了性能。
2024-08-05 10:21:41
1591
原创 Redis十大类型总体叙述
1.String(字符串)String是Redis最基本的数据类型,也是最常用的数据类型 一个键最大能存储512MB的数据 可以存储字符串、整数、浮点数等 支持对字符串的部分修改、自增自减等操作 String类型是二进制安全的,这意味着它可以包含任何数据,比如jpg图片或者序列化的对象。2. Hash(哈希)Hash是一个键值对集合,类似于Java中的HashMap 在Redis中它是以k1 filed v1存储的 每个Hash可以存储2^32-1个键值对 适合存储对象,如用户信息等
2024-08-05 09:41:20
1016
原创 @ControllerAdvice全局异常处理器注解的作用
是 Spring Framework 中的一个注解,用于定义全局控制器异常处理器、绑定数据、或者模型属性。它是@Component注解的一个特殊化,主要用于对控制器进行增强。
2024-08-02 20:03:31
873
原创 ThreadLocal<T>概述
内存是泄露风险:如果不正确使用,ThreadLocal可能会导致内存泄漏,特别是使用线程池的时候,如果不及时清理,线程被重用的时候可能会泄露之前的数据。给个访问该变量的线程都会有自己的、独立的初始化变量副本。3.避免参数传递:使用ThreadLocal可以避免方法在调用链中传递参数,特别是在处理如身份用户信息这样的上下文数据的时候。2.线程隔离:ThreadLocal中的值对于每个线程来说是独立的,一个线程设置了某个值,不会影响其他线程中的值。
2024-08-02 19:17:02
788
原创 如何使用@EnumValue和@JsonValue注解,解决TypeHandler枚举类型转换,HTTPMessageConverter枚举类型转换的对象和属性的映射问题
其对枚举类型的默认处理规则也是枚举对象实例(ItemType.APARTMENT)和实例名称("APARTMENT")相互映射。等等,其中也包含枚举类型,但是枚举类型的默认转换规则是枚举对象实例(ItemType.APARTMENT)和实例名称("APARTMENT")相互映射。属性之间的互相映射。属性到枚举对象实例的相互映射,需要自定义。,Mybatis-Plus便可完成从。属性之间的相互映射,具体配置如下。可以处理常用的数据类型转换,例如。,Jackson便可完成从。其使用十分简单,只需在。
2024-08-01 02:39:27
1287
原创 @RequestParam和@RequestBody
选择使用@RequestParam还是@RequestBody取决于具体的请求参数传递方式和数据格式。如果参数是在请求体中以JSON、XML等格式传递的,使用@RequestBody。需要注意的是,在使用@RequestBody时,请求的Content-Type头部应该设置为相应的数据格式,如"application/json"。@RequestParam和@RequestBody都是Spring框架中用于处理HTTP请求参数的注解,但它们有一些区别。
2024-08-01 01:50:28
1130
原创 FormatterRegistry接口和Converter和ConverterFactory的作用
Converter是一个用于在不同数据类型之间进行转换的工具类或接口。它的主要作用是将一种数据类型转换为另一种数据类型,以满足不同场景下的需求。
2024-08-01 01:42:33
1470
原创 mybatisplus快速入门保姆级教程
MyBatis-Plus(简称 MP)是一个MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑:内置通用 Mapper、通用 Service,提供了大量的通用的CRUD方法,因此可以省去大量手写sql的语句的工作。:提供了强大的条件构造器,可以构造各种复杂的查询条件,以应对各种复杂查询。:配置好插件之后,写分页等同于普通 List 查询,无需关注分页逻辑。
2024-07-29 09:38:36
2107
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人