
java
王佑辉
个人笔记,多谢指正,不喜勿喷
展开
-
【java】HashMap的实现原理
2.插入:将键值对封装到Entry对象中,根据键的哈希值找到对应的桶,然后处理哈希冲突(添加到链表末尾或红黑树中)。3.删除:根据键的哈希值找到对应的桶,然后遍历桶中的链表或红黑树来找到要删除的键值对,并将其从链表或红黑树中移除。3.扩容操作会将数组的长度扩大为原来的两倍(但数组的大小始终是2的幂次方),并重新计算每个键值对在新数组中的位置,然后将它们移动到新数组中。1.查找:根据键的哈希值找到对应的桶,然后遍历桶中的链表或红黑树来找到具体的键值对。1.HashMap使用哈希函数来计算键的哈希值。原创 2024-12-31 18:18:01 · 403 阅读 · 0 评论 -
【java】java.util.Optional的用法
3.通过这些用法,Optional 类提供了一种优雅且安全的方式来处理可能为 null 的对象,从而减少了 NullPointerException 的风险。1.如果 Optional 对象不为空且值满足给定的条件,则返回该 Optional 对象,否则返回一个空的 Optional 对象。1.如果 Optional 对象不为空,会对值应用给定的函数并返回一个新的 Optional 对象。1.flatMap 可以处理返回的 Optional 对象,并返回一个嵌套的 Optional。原创 2024-12-23 16:35:12 · 570 阅读 · 0 评论 -
【java】Executor框架的组成部分
2.FutureTask类是RunnableFuture接口的实现,它实现了Runnable和Future接口,因此既可以作为任务提交给执行器,又可以作为获取任务结果的Future对象。当一个任务提交给执行器后,执行器会返回一个Future对象,通过该对象可以查询任务的状态、等待任务完成或获取任务的结果。1.线程工厂用于创建新线程。2.ThreadPoolExecutor类是线程池的具体实现,它提供了线程池的核心功能,包括线程的创建、销毁、任务调度、线程复用等。1.任务队列用于存储等待执行的任务。原创 2024-12-19 18:12:31 · 421 阅读 · 0 评论 -
【java】线程池的好处
3.线程池执行是延迟的,受当前线程池空闲线程以及任务队列等因素影响,线程池的使用本身并不直接发布对象的引用,而是将任务(通常是实现了Runnable或Callable接口的对象)提交给线程池执行,这减小了this逃逸的风险。2.普通线程在创建执行完任务之后即被销毁,下次执行任务时又需创建新的线程,而线程池可以管理线程,使得多个线程可以重复使用,从而避免了重复创建以及销毁线程带来的资源消耗。1.线程池可以对线程进行统一管理,包括设置线程的优先级、线程名称等,有利于系统资源的统一管理。原创 2024-12-19 17:56:47 · 212 阅读 · 0 评论 -
【java】MDC
4.它允许开发者在日志中包含线程特有的信息,如用户会话ID、请求ID、用户身份信息等,以便后续的日志处理器(如日志输出器)能够在日志中显示或处理这些信息。2.MDC通常用于将TraceID设置到当前线程的MDC上下文中,以便在整个请求处理过程中,不同的业务逻辑都能够打印出TraceID,并保持日志的一致性。6.MDC是Java中一个非常有用的日志跟踪工具,它允许开发者在多线程环境中关联和传递特定的上下文信息,从而帮助理解和调试日志事件。3.MDC是一个线程本地的、可维护的、可传递的上下文环境。原创 2024-12-16 19:41:21 · 935 阅读 · 0 评论 -
【java】finalize方法
3.对象复活:在finalize方法中,开发者可以重新将该对象引用赋值给某个静态变量或其他对象的成员变量,从而使该对象重新变为可达状态,这被称为“对象复活”。3.调用finalize方法:finalization队列中的对象会等待一个专门的Finalizer线程调用它们的finalize方法。3.当JVM(Java虚拟机)确定一个对象不再被引用、即将被回收时,会调用该对象的finalize方法(如果该方法被重写)。4.对象回收:在finalize方法执行完成后,对象将被垃圾回收器正式回收,释放占用的内存。原创 2024-12-12 21:53:13 · 369 阅读 · 0 评论 -
【java】利用stimulsoft生成pdf或excel
5.报警告: Element named ‘xxxx’ missing错误时,表明xxxx需要与模板中的名称要保持一致。4.设计时注意模版中的字体支持中文,这里模版的字体是微软雅黑。否则生成的pdf中的中文会变成方块。1.利用stimulsoft的mrt模版生成pdf文件或excel文件。2.需要购买获取stimulsoft的license.key。3.需要设计stimulsoft的mrt模版。6.这里演示的是maven项目示例。原创 2024-12-12 11:16:10 · 350 阅读 · 0 评论 -
【java】System.gc()
例如,-XX:+UseG1GC 启用 G1 垃圾回收器,-XX:+DisableExplicitGC 可以禁用 System.gc() 的调用,使得调用这个方法不会触发垃圾回收。然而,这通常不是推荐的做法,因为更好的方法是设计内存友好的应用程序。3.不可预测性:即使 JVM 响应了 System.gc() 的请求,垃圾回收的确切时间和行为也是不可预测的。2.调用这个方法并不会立即强制 JVM 执行垃圾回收,而只是发送了一个请求或建议给 JVM,表明应用程序认为现在是进行垃圾回收的一个合适时机。原创 2024-12-11 21:39:31 · 574 阅读 · 0 评论 -
【多线程】伪共享的概念
1.伪共享是多线程编程中的一个性能问题,具体指在多线程环境中,不同线程更新同一缓存行中的不同变量时,由于缓存行的粒度,这些线程可能会频繁地读写同一缓存行,进而产生缓存冲突,导致程序性能下降。2.如果多个线程同时访问并更新位于同一个缓存行中的不同变量,就会触发缓存锁定,使得整个缓存行的内容都被锁定,其他需要访问该缓存行中任意变量的线程都将被迫等待。2.例如,在需要避免伪共享的变量前后分别添加多个long类型的变量作为填充,这样目标变量就会被分配到独立的缓存行中,避免了与其他变量的缓存冲突。原创 2024-11-13 21:19:10 · 425 阅读 · 0 评论 -
【java】守护线程
守护线程是在Java多线程编程中,一种用于为其他线程提供服务的线程。3.它的主要任务是。原创 2024-11-13 10:33:52 · 537 阅读 · 0 评论 -
【java】如何理解线程安全问题
这同样需要同步机制来保证,因为Java虚拟机可能会对变量的访问进行优化(如缓存),导致其他线程看不到最新的变量值。3.线程安全的集合类:Java提供了许多线程安全的集合类,如ConcurrentHashMap、CopyOnWriteArrayList等,这些类内部已经实现了必要的同步机制。2.同步机制可以确保同一时间只有一个线程能够访问共享资源(互斥),或者确保多个线程在访问共享资源时能够按照一定的顺序进行(有序性)。3.优先级反转:高优先级的线程被低优先级的线程阻塞,导致程序性能下降。原创 2024-11-12 21:32:16 · 490 阅读 · 0 评论 -
【java】死锁产生的原因,以及如何避免
如果并发访问模式主要是读操作,而写操作较少,可以考虑使用ReadWriteLock,它允许多个线程同时读取数据,但只允许一个线程写入数据。:为锁操作设定超时时间,当超时发生时,线程将自动释放锁并重新尝试。:线程获取锁的顺序不一致,导致一个线程持有资源A在等待资源B,另一个线程持有资源B在等待资源A,就会发生死锁。:当线程持有锁时发生异常或者其他情况导致锁释放失败,但是其他线程无法获得该锁,可能会导致死锁。:某一个线程一直无法获取所需资源,导致一直处于等待状态,一直无法执行,也可能最终导致死锁。原创 2024-11-12 20:47:42 · 483 阅读 · 0 评论 -
【juc】ConcurrentHashMap
在JDK 1.8中,引入了多线程并发扩容的机制,多个线程可以同时对原始数组进行分片后,每个线程负责一个分片的数据迁移,从而提升了扩容过程中数据迁移的效率。4.但在JDK 1.8及之后的版本中,虽然概念上仍然保留了分段锁的思想,但实际上是通过更细粒度的锁(如CAS操作和synchronized关键字对链表头节点的加锁)来实现的。:由于ConcurrentHashMap的读操作是线程安全的,且不需要获取锁,因此读操作在没有竞争的情况下几乎没有性能损耗。2.重新分配数组:创建一个新的数组,其长度为新容量的值。原创 2024-11-11 18:03:13 · 597 阅读 · 0 评论 -
【java】什么叫阻塞队列的有界和无界
1.阻塞队列(BlockingQueue)是一种特殊的队列,它支持两个附加操作:在尝试添加元素到队列中时,如果队列满,则线程会被阻塞;4.有界队列在达到容量上限时会阻塞生产者线程,而无界队列则通常不会因为容量问题而阻塞生产者(尽管在实际应用中可能会受到系统内存的限制)。2.当队列达到其容量上限时,尝试向队列中添加新元素的线程将会被阻塞,直到队列中有空闲位置为止。2.阻塞队列是线程安全的,多个线程可以并发访问而不会发生冲突,它常用于生产者和消费者的场景。实现的有界阻塞队列,同样按照先进先出的原则排序元素。原创 2024-11-11 15:40:59 · 386 阅读 · 0 评论 -
【java】 ThreadLocal
1.内存泄漏:由于 ThreadLocal 变量是线程局部存储的,如果线程长时间存活(如线程池中的线程),而 ThreadLocal 变量又没有及时被清理(通过 remove 方法),那么可能会导致内存泄漏。1.ThreadLocal 是 Java 中提供的一个线程局部变量类,它用于为每个使用该变量的线程提供一个独立的变量副本,这样每个线程都可以独立地改变自己的副本,而不会影响其他线程的副本。4.清理线程变量:在不再需要时,通过 remove 方法清理当前线程的变量值,以避免内存泄漏。原创 2024-11-04 10:49:41 · 301 阅读 · 0 评论 -
【java】ArrayList与LinkedList的区别
因此,这些操作的时间复杂度为O(1)(在列表的头部或尾部操作时)或O(n)(在列表的中间位置操作时,因为需要遍历到该位置)。1.ArrayList:在ArrayList中进行插入和删除操作时,需要移动插入或删除点之后的所有元素来保持元素的连续性,因此这些操作的时间复杂度为O(n)。特别地,在列表的末尾添加元素时,ArrayList的性能相对较好,因为不需要移动元素。1.ArrayList中的元素是连续存储的,因此空间开销相对较小(除了元素本身外,还需要一些额外的空间来存储数组的长度和容量等信息)。原创 2024-11-04 10:41:55 · 921 阅读 · 0 评论 -
【java】前端RSA加密后端解密
5.ApiDecryptParamResolver是解析requestParam参数的,这里没写全,需要额外写注解。3.此示例是前端加密,后端解密,后端返回的数据未加密。如果后端相应数据也要加密,可以另写注解,采用对称加密。4.公钥私钥的base64格式可以由RsaUtil工具类生成,参考其中main方法。5.在需要加密的接口上添加自定义注解@ApiDecryptRsa即可解密。2.前端采用公钥加密,后端采用私钥解密。1.RSA是非对称加密。原创 2024-09-27 14:52:17 · 3276 阅读 · 0 评论 -
【java】websocket对接微软语音实时识别
/ log.info("开始write,EchoStream");= 0){//log.info("开始read,EchoStream");try {if (!@Overridetry {// 唤醒所有等待的线程try {// 注意:我们在这里不唤醒任何线程,因为它们是等待信号被设置try {while (!原创 2024-05-20 17:00:49 · 1058 阅读 · 1 评论 -
【问题】feignClient接口既走了正常接口也走了回调接口问题
2.回调接口ISearchClientFallback继承FallbackFactory,并打印错误日志。2.说是IPage是接口,不能实例化,因此可以自定义MyPage实现IPage接口进行转化。1.将feign接口中的fallback改为fallbackFactory。1.调用一次feign接口发现既走了正常接口也走了回调接口。3.重启服务重新调用接口。原创 2024-04-07 16:14:29 · 483 阅读 · 0 评论 -
【设计模式】模板方法模式
1.在父类定义一个操作中的算法骨架,将算法的一些步骤延迟到子类中,使得子类可以不改变该算法结构的情况下重定义该算法的某些特定步骤。原创 2023-11-27 14:01:39 · 518 阅读 · 0 评论 -
【java】JdbcTemplate的简单使用
【代码】【java】JdbcTemplate的简单使用。原创 2023-09-04 11:47:43 · 343 阅读 · 0 评论 -
【java】获取当前年份
【代码】【java】获取当前年份。原创 2023-08-29 10:53:36 · 2358 阅读 · 0 评论 -
【juc】AQS原理
1.是一个抽象父类,全称是AbstractQueuedSynchronizer,是阻塞式锁和相关的同步器工具的框架2.用法是同步器类继承该父类,去实现父类的方法,调用同步器类的方法达到加锁、解锁等目的。原创 2023-07-29 21:44:05 · 281 阅读 · 0 评论 -
【poi】使用poi时报错:java.io.EOFException: Unexpected end of ZLIB input stream
【代码】【poi】使用poi时报错:java.io.EOFException: Unexpected end of ZLIB input stream。原创 2023-07-27 10:28:58 · 753 阅读 · 0 评论 -
【java】String类的不可变设计
1.substring方法内部是调用String的构造方法创建了一个新的字符串,并没有改变原有的字符串。3.类用final修饰保证了该类中的方法不能被覆盖,防止子类无意间破坏不可变性。2.通过创建副本对象来避免共享的手段称为保护性拷贝defensive copy。2.属性用final修饰保证该属性是只读的,不能修改。1.该类、类中的所有属性都是final的。原创 2023-07-08 21:50:52 · 227 阅读 · 0 评论 -
【java】lambda表达式
1.大数据量下处理集合效率非常高,易于并发编程(并行流,使用多线程处理)2.方法体只有一句代码时,大括号return和唯一一句代码的分号可以省略。4.不用关注是什么对象,关注对数据进行什么样的操作。6.基本格式:(参数列表)->{代码}7.使用条件:是接口且只有一个抽象方法。3.方法只有一个参数时小括号可以省略。2.可以对匿名内部类的写法进行简化。3.是函数式编程思想的一个重要体现。2.代码简洁可读性高、快速开发。1.是jdk8中的一个语法糖。5.核心原则是可推导可省略。1.参数类型可以省略。原创 2023-06-24 15:24:27 · 324 阅读 · 0 评论 -
【java】上传与下载
【代码】【java】上传与下载。原创 2023-06-13 11:03:04 · 195 阅读 · 0 评论 -
【java】@Retention注解
7.java源文件(.java文件) 、编译后的文件(.class文件) 、内存中的字节码,生命周期比较 SOURCE < CLASS < RUNTIME ,作用范围越来越大。4.RetentionPolicy.SOURCE:被修饰的注解只会保留在源文件,当.java文件编译成.class文件时,被修饰的注解会被遗弃。5.RetentionPolicy.CLASS:被修饰的注解被保留到.class文件,jvm加载.class文件时候被遗弃,是默认的生命周期。原创 2023-06-05 22:14:59 · 1849 阅读 · 0 评论 -
【java】@Target注解
6.ElementType.LOCAL_VARIABLE:允许作用在本地局部变量上。1.ElementType.TYPE:允许被修饰的注解作用在类、接口和枚举上。7.ElementType.ANNOTATION_TYPE:允许作用在注解上。5.ElementType.CONSTRUCTOR:允许作用在构造器上。4.ElementType.PARAMETER:允许作用在方法参数上。2.ElementType.FIELD:允许作用在属性字段上。3.ElementType.METHOD:允许作用在方法上。原创 2023-06-05 21:54:25 · 783 阅读 · 0 评论 -
【java】mapperstruct将date转string
【代码】【java】mapperstruct将date转string。原创 2023-05-22 14:46:16 · 1454 阅读 · 0 评论 -
【java】获取最近30天
获取最近30天原创 2023-05-19 14:01:36 · 1279 阅读 · 0 评论 -
【java】树结构数据组装
【代码】【java】树结构数据组装。原创 2023-04-23 10:24:32 · 474 阅读 · 0 评论 -
【java】反射机制
1.将类的各个组成部分封装为其他对象。原创 2023-04-15 22:45:58 · 547 阅读 · 0 评论 -
【java】按指定开始符号、结束符号循环截取字符串与去除
123原创 2023-04-12 11:46:51 · 398 阅读 · 0 评论 -
【java】final关键字
2.自定义常量,被final修饰的变量,被赋值一次就变成了常量,例如final int a = 20;还是可以修改的,因为student指向的是student的内存地址,被final修饰后是不能变的,但age属性的地址没有被final修饰,所以是可变的。1.字面值常量,能够直接写出来的数据,例如100,3.14,‘a’,true,“abcd”,null(null不能被直接打印)3.final修饰变量(成员变量、静态变量和局部变量),只能被赋值一次。4.final修饰的变量,变量的属性值是可以重新赋值的。原创 2023-03-27 21:40:25 · 163 阅读 · 0 评论 -
【rabbitmq】rabbitmq高级特性之消费者Ack
Acknowledge消费端收到消息后的确认方式原创 2023-02-25 13:43:01 · 485 阅读 · 0 评论 -
【rabbitmq】rabbitmq高级特性之消息的可靠投递
rabbitmq消息的可靠投递原创 2023-02-23 21:50:48 · 350 阅读 · 0 评论 -
【面试】谈谈对Spring的理解
对spring的理解原创 2023-02-22 22:34:31 · 340 阅读 · 0 评论 -
【面试】单例的实现方式
单例的实现方式原创 2023-02-19 21:29:45 · 88 阅读 · 0 评论 -
【java】spi使用
spi的使用原创 2023-02-05 21:53:59 · 975 阅读 · 0 评论