
java面试
文章平均质量分 92
主要包含java后端方向面试相关八股,以更深入的方式去理解八股
自律的kkk
正在努力学好全栈和算法的java工程师
我的github地址:https://github.com/lonelykkk
展开
-
CompletableFuture介绍及使用
虽然Future也解决了 Runnable 的 “三无” 短板,但是它自身还是有短板:不能手动完成计算假设你使用 Future 运行子线程调用远程 API 来获取某款产品的最新价格,服务器由于洪灾宕机了,此时如果你想手动结束计算,而是想返回上次缓存中的价格,这是 Future 做不到的调用 get() 方法会阻塞程序Future 不会通知你它的完成,它提供了一个get()方法,程序调用该方法会阻塞直到结果可用为止,没有办法利用回调函数附加到Future,并在Future的结果可用时自动调用它。原创 2025-04-16 19:29:49 · 685 阅读 · 0 评论 -
java中的动态代理(jdk和Cglib)
拓展性:要是考虑使用角度Cglib无疑是更好的,因为JDK只能代理接口原理:JDK代理是利用反射机制生成匿名类,调用也是通过反射来调用 Cglib是采用字节码技术,通过修改字节码生成子类效率:JDK创建对象效率较高,但执行较慢,Cglib创建对象效率低,但执行较快局限性: Cglib需要额外导入第三方包,而Jdk代理不需要,但JDK局限于代理接口到底用什么相信大家有选择了,如果没特殊需求,就直接JDK得了,有特殊需求不用Cglib,JDK能满足吗?原创 2025-04-15 20:50:26 · 938 阅读 · 0 评论 -
Java类加载器的原理及应用
classloader顾名思义,即是类加载。虚拟机把描述类的数据从class字节码文件加载到内存,并对数据进行检验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制。了解java的类加载机制,可以快速解决运行时的各种加载问题并快速定位其背后的本质原因,也是解决疑难杂症的利器。因此学好类加载原理也至关重要。原创 2025-04-23 21:46:39 · 774 阅读 · 0 评论 -
java中常用的集合 - 面试篇
都应该知道HashMap 的结构是数组+链表,链表会在一定条件下树化变成红黑树(本节我们只追究常规操作,不深究红黑树这种数据结构),结构如下图所示我们可以看到初始化的时候传的参数是初始容量大小和扩容因子,为什么在初始化的时候并没看看数组容量的初始化,反而把数组容量赋值给了扩容阈值,阈值还没*扩容因子?为什么数组容量的初始化要做2的n次方处理?其实我们在了解HashMap的结构后,已经猜得到添加操作需要做什么了源码如下:四、resize 扩容机制HashMap的扩容与正常的数组扩容没啥区别都是要新建一个原创 2025-04-14 20:03:44 · 905 阅读 · 0 评论 -
深入理解java中的ConcurrentHashmap
好了核心操作基本都结束了,对了,还有个remove操作(这里就不贴了,理解完上面的在自己去看看吧,会发现哇原来这么简单),我觉得也没啥好总结的,综合来说使用了volatile+synchronized+CAS+自旋保证了线程安全,synchronized锁的细粒度+分槽位可协助扩容+ 计数器特殊处理极大程度的保证了性能的提升1.ConcurrentHashMap是怎么判断正在扩容中的?2.扩容期间在未迁移到的槽位中插入数据会发生什么?3.为什么get操作不需要加锁?原创 2025-04-14 11:25:40 · 897 阅读 · 0 评论 -
深入理解java中的线程池
核心线程池大小。一般来说任务比较耗时可以配。原创 2025-04-13 21:21:46 · 560 阅读 · 0 评论 -
volatile和synchronized介绍
可能很多人搞不清楚什么是可见性,只能单纯的从字面意思去理解,下面通过一个例子带大家深刻理解一下例子很简单,两个线程一个线程等待变量改变才结束否则就死循环,另一个线程去改变变量flag=false;System.out.println("还没变");// flag不改变 就一直死循环直至发现值改变System.out.println("我感知到变化了");}).start();try {//等待1s才执行下一个线程setFlag();System.out.println("我修改了")原创 2025-04-10 19:03:24 · 989 阅读 · 0 评论 -
深入理解Threadlocal
从名称上来看可以理解为,也可以认为是,线程与线程之间都是隔离的,所以说也是线程安全的,是典型的的设计理念。原创 2025-04-11 15:15:21 · 824 阅读 · 0 评论 -
深入理解CAS与AQS
AQS是什么?全称是翻译过来就是抽象的队列式同步器,是一个抽象类,可以说是JUC包里面的核心,为啥平时开发没用过呢?因为这个是一个多线程访问共享资源的同步器框架,当然不能直接用了,但他的其他实现类你们一定很熟,等等先尝试获取资源,成功则直接返回没获取到资源就要进队等待,于是要加入队尾然后就进行自旋,进入等待状态前先尝试获取一下资源,获取不到则检查及设置前驱状态,然后再进入等待状态休息等待时被unpark()唤醒或者被interrupt()中断,就继续步骤3,直到获取到资源。原创 2025-04-13 15:25:52 · 987 阅读 · 0 评论 -
什么是CAP理论
CAP理论是分布式系统设计中的核心理论之一,由计算机科学家Eric Brewer在2000年提出,后经Nancy Lynch等人证明。它阐述了分布式系统在面临网络分区时必须在三个关键特性之间做出权衡。提出,指出在分布式系统中,原创 2025-03-25 09:13:55 · 912 阅读 · 0 评论 -
java中为什么需要同时重写 equals 和 hashCode
这是为了确保对象在哈希表中行为一致,并遵守 Java 的相等性契约。忽略这一点会导致程序出现隐蔽的逻辑错误,尤其在依赖哈希结构的场景下。,这是为了确保对象在哈希表中行为一致,并遵守 Java 的相等性契约。忽略这一点会导致程序出现隐蔽的逻辑错误,尤其在依赖哈希结构的场景下。如果违反这一规则,对象在使用哈希表(如。如果违反这一规则,对象在使用哈希表(如。方法,这是因为两者共同维护了对象的。方法的类通常也需要重写。)时会出现逻辑错误。)时会出现逻辑错误。原创 2025-04-01 10:42:56 · 883 阅读 · 0 评论 -
网络编程中的黏包和半包问题
在网络编程中,黏包和半包问题是常见的数据传输问题,尤其是在使用TCP协议时。Netty作为一个高性能的网络框架,提供了多种解决方案来处理这些问题。下面我将详细解释黏包和半包问题,以及Netty中如何处理它们。如果上述解码器无法满足需求,Netty还允许用户自定义解码器。用户可以继承或来实现自己的解码逻辑。@Override// 自定义解码逻辑黏包和半包问题是TCP协议中常见的数据传输问题,Netty提供了多种解码器来处理这些问题。原创 2025-03-19 16:31:14 · 628 阅读 · 0 评论 -
什么是索引下推和索引覆盖?
核心思想:在存储引擎层(如 InnoDB)提前过滤数据,减少不必要的回表操作。通俗解释:假设你有一个联合索引,查询时部分条件可以直接在索引层过滤掉不符合条件的记录,而不是把数据全部交给 MySQL 服务层再过滤。核心思想:查询所需的所有列都包含在索引中,无需回表查询主键索引。通俗解释:就像查字典时,你要查的单词和解释都在目录里,不需要翻到正文页。比喻:快递分拣员在仓库里直接扔掉不符合条件的包裹(如收件地址错误),而不是把所有包裹送到分拣中心再处理。核心。原创 2025-03-28 20:44:11 · 849 阅读 · 0 评论 -
mysql进阶(innodb、索引、类型、权限)
当字段类型为字符串(varchar, text等)时,有时候需要索引很长的字符串,这会让索引变得很大,查询时,浪费大量的磁盘IO,影响查询效率,此时可以只降字符串的一部分前缀,建立索引,这样可以大大节约索引空间,从而提高索引效率。前缀长度:可以根据索引的选择性来决定,而选择性是指不重复的索引值(基数)和数据表的记录总数的比值,索引选择性越高则查询效率越高,唯一索引的选择性是1,这是最好的索引选择性,性能也是最好的。InnoDB 的指针占用6个字节的空间,主键假设为bigint,占用字节数为8.原创 2025-03-20 14:37:54 · 1117 阅读 · 0 评论 -
java中String、StringBuffer、StringBuilder的区别和联系
都是用于处理字符串的类,但它们在性能、线程安全和适用场景上有显著区别。频繁修改会导致大量临时对象,降低性能(尤其是循环操作时)。对象一旦创建,其内容不可修改。所有看似修改的操作(如。减少扩容次数(默认容量为 16,扩容代价高)。由于同步锁,单线程环境下性能低于。修饰,保证多线程环境下的安全。即使性能略低,但能避免并发问题。),修改时直接在原对象上操作。方法未加锁,适用于单线程环境。不可变性天然保证线程安全。类似,基于可变字符数组。在单线程环境下,性能比。内部维护可变字符数组(原创 2025-04-01 10:53:28 · 592 阅读 · 0 评论 -
什么是动态代理?动态代理和静态代理的区别
静态代理适合简单场景,但代码冗余。动态代理通过反射或字节码技术动态生成代理类,灵活且高效。JDK 动态代理基于接口,CGLIB基于继承,根据需求选择合适方式。原创 2025-03-31 21:28:07 · 914 阅读 · 0 评论 -
mysql基础(超详细)
mysql基础入门DDL: 数据定义语言,用来定义数据库对象(数据库、表、字段)DML: 数据操作语言,用来对数据库表中的数据进行增删改DQL: 数据查询语言,用来查询数据库中表的记录DCL: 数据控制语言,用来创建数据库用户、控制数据库的控制权限原创 2025-03-20 14:32:02 · 768 阅读 · 0 评论 -
mysql索引
当字段类型为字符串(varchar, text等)时,有时候需要索引很长的字符串,这会让索引变得很大,查询时,浪费大量的磁盘IO,影响查询效率,此时可以只降字符串的一部分前缀,建立索引,这样可以大大节约索引空间,从而提高索引效率。前缀长度:可以根据索引的选择性来决定,而选择性是指不重复的索引值(基数)和数据表的记录总数的比值,索引选择性越高则查询效率越高,唯一索引的选择性是1,这是最好的索引选择性,性能也是最好的。算出n约为1170。联合索引中,出现范围查询(<, >),范围查询右侧的列索引失效。原创 2025-03-06 15:15:57 · 646 阅读 · 0 评论 -
初识netty-netty快速入门
WebSocket 是一种在客户端和服务器之间建立持久连接的协议,允许双向、全双工的通信,避免了传统 HTTP 请求响应模式的高开销。WebSocket 协议通过握手建立连接,在连接建立后,可以持续发送和接收数据,适合实时应用,如聊天、在线游戏、股票行情等。@Overridelogger.info("心跳超时");@Slf4j@Component/*** 用于处理每个传入的消息。原创 2024-11-19 09:41:58 · 4300 阅读 · 0 评论 -
SpringBoot 中的 AOP 切面编程
切面是 AOP 的核心概念,它包含了通知(Advice)和切点(Pointcut)。通知定义了在切点执行的逻辑,而切点定义了在哪些地方应用通知。切点定义了在哪些方法上应用通知。可以使用@Pointcut// 定义一个切点,匹配所有以 "find" 开头的方法 @Pointcut("execution(* com.example.demo.service.*.find*(..))") public void findMethods() {} }原创 2024-12-23 17:19:31 · 1209 阅读 · 0 评论 -
网络编程中的黏包和半包问题
在网络编程中,黏包和半包问题是常见的数据传输问题,尤其是在使用TCP协议时。Netty作为一个高性能的网络框架,提供了多种解决方案来处理这些问题。下面我将详细解释黏包和半包问题,以及Netty中如何处理它们。如果上述解码器无法满足需求,Netty还允许用户自定义解码器。用户可以继承或来实现自己的解码逻辑。@Override// 自定义解码逻辑黏包和半包问题是TCP协议中常见的数据传输问题,Netty提供了多种解码器来处理这些问题。原创 2024-12-17 19:15:19 · 1092 阅读 · 0 评论