
java后端面试题集
文章平均质量分 81
本专栏存放一些常见的八股知识点,希望能帮助到你~
银氨溶液
天生我材必有用,千金散尽还复来
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
Map集合之HashMap细说
最近在看面试题,看到了hashmap相关的知识,面试中问的也挺多的,然后我这里记录下来,供大家学习。原创 2024-06-22 20:01:32 · 1005 阅读 · 0 评论 -
Lambda表达式&Stream流-函数式编程入门教程
Stream流不只是Lambda表达式厉害,它其中还包含了很多 Java 8 中集合数据处理的利器,很多本来复杂、需要写很多代码的方法,比如过滤、分组等操作,往往使用 Stream 就可以在一行代码搞定,当然也因为 Stream 都是链式操作,一行代码可能会调用好几个方法。它的作用是每次计算的时候都用到上一次的计算结果,比如求和操作,前两个数的和加上第三个数的和,再加上第四个数,一直加到最后一个数位置,最后返回结果,就是。得名,直接对应于其中的lambda抽象,是一个匿名函数,即没有函数名的函数。原创 2024-05-11 17:39:47 · 928 阅读 · 0 评论 -
多线程讲解(详解)
说起多线程,那就不得不说什么是进程了,进程是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线程设计的计算机结构中,进程是线程的容器因此一个进程当中就可能存在多个线程。多线程就是指一个进程中同时有多个执行路径(线程)正在执行。t1.start();t2.start();t3.start();创建一个类,实现Runnable这个接口重写run方法。原创 2024-05-19 21:31:03 · 1253 阅读 · 0 评论 -
java基础-深拷贝和浅拷贝
java中有一个概念叫深拷贝和浅拷贝,那这两个是什么意思呢?其实你可以对比一下c中的传值和传引用的问题。原创 2024-06-02 20:50:24 · 466 阅读 · 1 评论 -
volatile关键字
相信各位朋友应该在项目中都有用到或者在别人项目中看到过volatile这个关键字,但是这个关键字具体是什么意思,有什么含义,本篇博客就带你来了解~这里我先提前预告一下这个关键字的功能:可见性、禁止指令重排、不能保证操作的原子性在java内存模型当中,当一个线程去读取一个变量的时候,首先会先从当中读取并存入到当中,这样如果该线程对变量进行了修改,其它线程来读取的时候,读取的变量就不是最新值但是如果我使用了volatile这个关键字就不一样了,现成会直接读取主内存当中的变量并将修改后的变量值。原创 2024-10-29 16:05:23 · 992 阅读 · 0 评论 -
ArrayList知识点(面试)
上一篇我们说了hashmap的相关知识点,这一篇我们再说一些ArrayList的相关知识,因为ArrayList也是我们项目中比较常用的。原创 2024-06-22 20:07:58 · 1063 阅读 · 0 评论 -
MySql数据引擎InnoDB引起的锁问题
脏读:一个事务还在对数据进行修改,但是还未更新到数据库,这个时候另外一个事务也来读取这些数据,由于第一个事务跟新的数据还没有提交到数据库,所以第二个事务读取的数据实际上就是脏数据。上一个事务的更新,而且事务之间是互相隔离的,彼此都不知道他们之间的存在,所以这种情况下就很有可能出现数据丢失的问题。,此时事务A再次通过相同的查询条件查询数据,发现两次查询的数据不一样,就给了一种出现幻觉的感觉。后的数据,导致事务A在事务B之前读取的数据和事务B后读取的数据不一样。不可重复读着重强调了事务A读取了事务B。原创 2024-10-06 18:00:26 · 456 阅读 · 0 评论 -
(一)Mysql篇---Mysql整体架构
首先,上一张图先让各位看看大致结构::这里主要是处理客户端和数据库连接的,直接使用的Tomcat的连接池,可以调整最大连接数;:这里主要包括了sql接口、解析器、优化器、缓存缓冲四个区域;:就比如我们常见的InnoDB、MyISAM这些数据库引擎都存放在这一层;:涵盖了所有日志,包括数据、索引文件,存在在磁盘上;当然,还包括了一个客户端,客户端主要负责编写sql,服务端则负责sql的执行和存储。好啦,那接下来就具体来看看每一层都是怎么用的吧~原创 2024-10-17 18:07:01 · 2654 阅读 · 0 评论 -
IO模型---BIO、NIO、IO多路复用、AIO详解
NIO提供了非阻塞I/O操作,使用缓冲区、通道和选择器来实现高效的并发I/O处理。IO多路复用也提供了非阻塞I/O操作,但通常需要为每个通道分配一个线程,它通过监听事件来处理I/O操作。听完这些概念后,可能你就有点儿糊涂了,没关系,我们现在再来梳理总结一下~BIO(同步阻塞):线程发来IO请求后,一直阻塞线程直到缓冲区数据准备好返回后才会释放(就像蛋糕店一个服务员必须做完你的蛋糕才能去做下一个蛋糕)原创 2024-09-12 15:15:10 · 1571 阅读 · 0 评论 -
脏读、不可重复读、幻读的解决方法
上一篇博客提到了脏读、不可重复读、幻读的含义,也知道了是因为什么情况导致出现的这些问题,这篇博客就带大家一起来了解一下他们的解决办法~:脏读出现的原因主要是因为一个事务读取了另外一个事务未提交的数据,就可能出现脏读,解决办法可以通过“读已提交”这种形式进行解决。原创 2024-10-06 19:35:38 · 1460 阅读 · 0 评论 -
为什么在重写equals方法后还要再重写hashcode方法(面试题)
这是因为set在新增数据进行比较数据是否相同的时候,首先会先去调用hashcode比较这两个对象的hashcode值是否相同,在我们还没有重写hashcode方法之前,两个对象的hashcode的值是不同的,所以这个时候就直接返回;后来,我们重写了hashcode方法,让两个对象返回相同的hashcode值,这个时候再用重写的equals去比较两个对象的值是否相同,如果都相同就会只存放一个值进入set中。)我们在代码中发现重写了equals方法后还需要重写hashcode方法,为什么呢?原创 2024-06-30 20:04:15 · 298 阅读 · 0 评论 -
==和equals的区别(面试题)
这是因为set在新增数据的时候,首先会先去调用hashcode比较这两个对象的hashcode值是否相同,在我们还没有重写hashcode方法之前,两个对象的hashcode的值是不同的,所以这个时候就直接返回;对于equals来说,基本数据类型没有equals方法,对于引用类型equals比较的是引用对象是否相同(我觉得比较的应该是地址)对于引用类型,==比较的是地址是否相同,equals如果被重写的话比较的是值是否相同,如果没有被重写,则会使用Object里面的equals进行比较他们的地址是否相同。原创 2024-06-30 20:01:01 · 778 阅读 · 0 评论 -
string、stringbuffer、stringbuilder的区别
内容不可变主要是因为string底层是通过字符串常量池来实现的,定义两个变量并设置相同的值,这两个值的地址是一样的,就相当于用的是同一个值的地址,这样做主要也是为了保证string类型设置的值是安全的,因为我们通常设置的用户的信息都是通过字符串来存储的,如果我修改了s的值,那么s2的值也会被修改,这肯定不是我们想看到的~简单来说一下这三个的区别吧,因为我也是在学习中~原创 2024-10-18 17:54:31 · 270 阅读 · 0 评论 -
一条sql语句执行的全过程
但是缓存也有好坏,好处是可以快速查出相关数据,坏处是如果有新的数据,缓存需要每次做同步处理,这样的话如果是插入场景较多的情况对系统性能影响较大。:开始执行的时候,先要判断一下你对这个表有没有执行查询的权限,如果没有,则会返回没有权限的错误,如果有权限,就打开表根据上一步生成的执行计划继续执行,并将所有满足条件的行组成记录集作为结果集返回给客户端。:优化器是在表里面有多个索引的时候,决定使用哪个索引,或者在一个多表关联的语句中,决定各个表的连接书序。:负责与服务端构建连接,并进行权限认证。原创 2024-09-13 14:36:56 · 441 阅读 · 0 评论 -
java事务讲解(详解篇)
本篇博客将各位介绍事务的相关内容,也算是对事物的大部分知识点进行的一个总结,接下来就跟着我一起来学习学习吧~原创 2024-10-20 17:07:48 · 2202 阅读 · 0 评论 -
DNS解析域名详解
如果没有,那DNS就会去网络中的某台DNS服务器查询,DNS服务器中存储了域名对应的ip的数据库表,当DNS服务器收到DNS查询请求后,会从数据库中查询数据,然后将查询到的对应的ip地址返回。对于我们而言,面对长串的ip地址,我们更喜欢记忆较短的域名,但是对于路由器来说,更喜欢定长的、有层次结构的ip,所以为了满足不同的喜好,就有了DNS解析服务。你有没有想过,当一个url传过来网络对它进行了哪些操作~DNS又是怎样对域名进行解析的~或者我们为什么要用到域名,为什么不直接使用ip地址~原创 2024-09-12 11:05:08 · 597 阅读 · 0 评论 -
线程池相关知识点
线程池是什么相信大家都是知道的,所以这里就不做解释了,直接看相关知识点吧。原创 2024-09-02 20:09:14 · 1197 阅读 · 0 评论 -
MySQL底层为什么选择用B+树作为索引
跳表底层实质就是可以进行二分查找的有序链表。而且在链表基础加上索引层。即能支持插入、删除等动态操作,也支持按区间高效查询。而且不管是查找、插入、删除对应的时间复杂度都是O(logn)。要理解跳表,先来看链表,假设链表存储是有序的数据,我们要想查询某一个数据,在最差的情况下要从头全遍历整个链表,时间复杂度是O(n)。从上图所示,我们如果要查询一个26的节点,跳表就可以先从索引层遍历,当遍历到在索引层的21节点,会发现下一个索引层的节点是36节点时,很明显要找的26的节点就在这区间。原创 2024-09-13 16:18:31 · 1437 阅读 · 1 评论 -
设计模式解析:简单工厂模式与工厂方法模式
⭐⭐本篇文章将向各位介绍工厂模式相关内容,包括简单工厂模式、工厂方法,置于抽象工厂模式我们留到后面的博客中进行讲解,因为博主认为工厂模式难倒不是很难,就是有点儿绕,先学好前两个好好理解了之后我们再学最后一个。工厂模式其实就是来帮助我们创建类的实例的,尤其是一些实现逻辑比较复杂或者对象生命周期需要集中管理的对象,使用工厂模式进行创建,调用者不必关心里面的实现逻辑,只需要直接调用即可,也免去了使用new去实例化一个对象。本篇我们以实现一个简单的计算机为例,去讲解工厂模式的运用。原创 2024-12-04 17:28:42 · 821 阅读 · 0 评论 -
创建线程池时为什么不建议使用Executors进行创建
这种情况下,一旦线程提交数超过我设定的数值,就会报一个异常`java.util.concurrent.RejectedExecutionException,这是因为当前队列已经是一个有边界的阻塞队列,一旦请求数量超过我设定的数值,就会抛出一个异常。Integer.MAX_VALUE,对于一个无边界队列来说,是可以不断的向队列中加入任务的,所以这个时候就会出现内存溢出的问题。这两个方法就安全了,这两种方式创建的最大线程数可能是。,而创建这么多线程,必然就有可能导致OOM。是有边界阻塞队列,对于。原创 2024-11-01 12:52:00 · 427 阅读 · 0 评论 -
缓存穿透——布隆过滤器
*** @description: 实现自定义布隆过滤器*/// 布隆过滤器的位数组// 布隆过滤器的哈希函数个数// 设置哈希函数数组// 初始化哈希函数数组i++)// 实现布隆过滤器的添加方法i++) {if (!// 如果某个位置之前没有设置过,标记为添加失败// 设置位为 true// 如果某个位置之前没有设置过,返回 false// 实现布隆过滤器的查询方法i++) {if (!// 如果某个位置为 false,说明一定不包含该值。原创 2024-11-23 20:05:15 · 811 阅读 · 0 评论 -
redis和数据库的数据一致性
但是这里会存在问题,你可以想一想,如果我的线程1在删除数据库数据的时候,因为网络延迟或者某些原因,还没有执行完成,这个时候缓存数据过期,线程2只能从数据库中获取数据,但是获取到的数据依旧是旧数据,然后线程1将数据库修改成功后再去删除缓存,然后线程2再把数据同步到缓存中,那这个时候缓存中的数据依旧是旧数据,从而导致数据一致性被破坏。这个时候线程1才将数据修改到数据库中,但是对于之后的线程读取的数据依旧是redis中的老数据,只有等到redis的缓存过期之后,才会从数据库读到新的数据。这个想法是没毛病滴~原创 2024-11-09 17:31:37 · 1256 阅读 · 0 评论 -
ThreadLocal详解
ThreadLocal是java.lang下面的一个类,是用来解决java多线程程序中并发问题的一种途径;通过为每一个线程创建一份共享变量的副本来保证各个线程之间的变量的访问和修改互相不影响;ThreadLocal存放的值是线程内共享的,线程间互斥的,主要用于线程内共享一些数据,避免通过参数来传递,这样处理后,能够优雅的解决一些实际问题。原创 2025-02-16 21:34:44 · 952 阅读 · 0 评论 -
(二)Mysql篇---Mysql索引
索引虽然能加速查询,但在以下几种情况下会失效:1. 使用 `OR` 连接多个条件。2. 使用 `LIKE` 查询时,尤其是以 `%` 开头。3. 查询涉及 `NULL` 值。4. 对索引列使用函数或表达式。5. 范围查询与等值查询混合。6. 使用 `DISTINCT` 或 `GROUP BY` 时。7. `JOIN` 操作时缺少合适的索引。8. 排序操作 (`ORDER BY`) 时缺少索引。9. 使用 `NOT IN` 或 `` 等操作时。😚😚💬。原创 2024-11-19 20:14:54 · 1138 阅读 · 0 评论 -
代理模式——动态代理、静态代理
⭐⭐代理模式是一种设计模式,能够保证在不改变源代码的情况下,给代码添加额外的功能。在java中,代理又分为两中:静态代理和动态代理。在说动态代理之前,我们先说一说静态代理,已经了解过的朋友可以直接跳过这一部分了~原创 2024-12-01 17:46:43 · 839 阅读 · 0 评论 -
Redis保持持久化——RDB、AOF
⭐⭐当你读到这篇博客的时候,你可能就已经产生这样的疑惑,既然redis是依托于内存的,那如果我的系统在某天发生故障或者因为某些原因导致我的内存数据丢失了,我的redis该怎么进行处理呢?解决这个问题的关键就是在于将内存数据同步到磁盘当中,在磁盘保存了这些数据后,我便可以确保我的数据不丢失。所以这里才会有redis的持久化这个说法,实现方式有RDB(redis数据库快照)、AOF(追加文件)。原创 2024-11-26 15:44:56 · 1079 阅读 · 0 评论 -
AtomicInteger保证线程安全
你会发现在最后main方法中打印出来的a依然是原来的值,这是因为java内存模型中基本数据类型是直接放在栈当中的,栈是线程内所有的,所以按照栈的特性,先进后出最后再方法里面输出的是4,当然方法结束后栈自然就被销毁了,由于栈是线程内的,所以自然不会同步到main方法当中的a;那我们再来看看对象,对象的实例是放在堆当中的,而堆里面存放的是线程间共享的数据,相当于对象在创建的时候会在线程里面创建一个对象引用,然后指向堆中的那个对象,如果我的线程里面的这个对象数据被修改过后,那么就会通知到堆中的对象并进行修改。原创 2024-11-02 17:47:44 · 1142 阅读 · 0 评论 -
操作系统——I/O多路复用
I/O多路复用指的就是通过一个线程或者进程同时去处理多个I/O操作(像文件、网络连接等),这样就解决我每一个I/O操作都需要开一个线程来处理,而且通过这样的方式如果我当前线程还在处理任务,此时不需要等待当前线程执行完成,也可以去执行其他任务,等当前线程执行完成后再来处理,这样就不会发生阻塞,从而提高了系统的吞吐率和使用率。原创 2024-11-25 18:09:40 · 982 阅读 · 0 评论