面试
文章平均质量分 63
赫萝的红苹果
心若有向往,何惧道阻且长!
https://github.com/yumoxuan-25
展开
-
如何实现分布式锁
锁是为了解决多线程情况下,对于共享资源的访问安全问题。原创 2023-03-24 13:31:56 · 670 阅读 · 1 评论 -
kafka初体验
kafka是一个开源的分布式事件流平台,主要被用于高性能数据管道、流分析、数据集成和关键任务应用。原创 2023-03-23 15:41:24 · 256 阅读 · 0 评论 -
聊聊泛型吧
Java的泛型是由编译器在编译时实行的,编译器内部永远把所有类型T视为Object处理,但是,在需要转型的时候,编译器会根据T的类型自动为我们实行安全的强制转型。验证:可以尝试获取带泛型的Class,不同泛型类型情况下,获取到的Class是一样的,说明Class无法携带泛型。在编译的时候其实会把泛型类型进行擦除,使用的都是Object类型,到需要使用的时候再强制类型转换。比如编译器看到的代码,就是带泛型的,而虚拟机看到的代码,就是直接将泛型替换成Object的。使用extends通配符表示可以读,不能写。原创 2022-10-09 17:49:00 · 181 阅读 · 0 评论 -
秋招算是结束了,写个总结吧!
一些絮叨应该从五月份找实习算起,一直到现在,一路上的困难,或许只有和我类似的人才知道。投递大厂有些连笔试机会都没有,就算有笔试的也是笔试完就结束,或许是我leetcode刷得太少了。面试的话,我个人更加喜欢场景题,而不是八股文。因为八股文有点多,而且我感觉就算我背出来了,也并不能让我从众多候选人中脱颖而出。而场景题是最能突出个人的,因为会面试的面试官会根据你说的内容去拓展问你,这样比较容易进入自己的节奏。说说简历吧简历方面,比较重要的是实习经历,最好是有大厂实习,这样有大厂背书,秋招投递会顺很多。原创 2021-09-30 23:13:15 · 160 阅读 · 3 评论 -
Spring面试题
Spring AOP IOCIOC是控制反转,反转和正转相对应,正转代表创建对象的操作有程序员手动完成,使用构造函数new对象,而反转则是将创建对象的逻辑交给IOC容器,IOC容器根据程序需要自动创建所依赖的对象并放到IOC容器中,在需要的时候利用依赖注入将对象注入到对应的引用中。依赖注入有注解注入,setter注入,构造注入。最常用的是注解注入。注解注入有@autowried,默认按照类型注入,@resource默认按照名称或类型注入(先名称后类型);@Value 注入int、float、St原创 2021-09-30 09:50:55 · 118 阅读 · 2 评论 -
java子类强转父类失败 类方法不能被重写
在java中,子类是不能直接转成父类的。如果直接强转就会出现ClassCastException。public class ChongXie extends A{ public static void hello(){ System.out.println("chongxie"); } public static void main(String[] args) { A a=new A(); ChongXie b=null;原创 2021-09-29 13:10:31 · 2394 阅读 · 0 评论 -
秋招面试补不足!!!
sql执行时,底层发送了什么?说说AQSdequeue和queue区别SpringBoot和SSM有什么区别,如何实现的?SpringBoot动态装配如何实现?synchronized底层如何实现加锁?如何解决分布式主键id原创 2021-09-22 21:24:13 · 109 阅读 · 0 评论 -
字符串常量池变化,字符串intern方法。
调用intern方法,如果常量池有该对象,会将常量池里面该String对象对应的地址返回。如果字符串常量池没有该对象,那么就会创建一个引用指向堆中的该对象。(jdk1.7以及以后,之前是检测到没有就在常量池创建对象,因为1.7之前常量池在方法区,而1.7开始常量池移到了堆)分析过程:从以下面代码为例。首先b的引用是一定指向堆中创建的该对象的。从第一块代码调用intern方法返回的地址和b的地址不一样可以看出,返回的地址是前面字符串c在字符串常量池创建的对象。而第二段代码,首先b是指向堆中的对象,三者相等原创 2021-09-16 00:09:04 · 107 阅读 · 0 评论 -
基本数据类型的常量池情况,基本数据类型包装类型的比较
基本数据类型和包装类型有自动装箱拆箱机制,因此有一个定律可以使用:取值范围在-128~127。并且两个引用都是包装类型,创建方式至少有一个是用new,那么两者就不相等,否则两者相等。注意char后面是字符还是ASCII码,ASCII常量池范围是0~127。原因:首先是自动装箱拆箱机制(这个是针对两个引用类型不同的情况),是在比较的时候,如果一个引用是基础类型,一个是包装类型,会将包装类型转成基本类型再进行比较;因此是比较值,无论值是多少都相等。如果引用是包装类型,使用直接赋值,并且范围在-128原创 2021-09-15 23:04:14 · 210 阅读 · 0 评论 -
leetcoe253 最少会议室问题
题目:有一堆会议,每个会议都有开始时间和结束时间,问至少需要几个房间可以安排下这些会议?该问题可以使用贪心来做,使用小顶堆来实现最简单。首先用一个最小堆来将会议按照会议开始时间从小到大排序,然后遍历该小顶堆。在遍历里面,如果第二个小顶堆不为空,并且第二个小顶堆的堆顶值小于等于遍历出堆的开始值,就将堆顶值出堆,然后将该会议的结束时间入堆。否则将堆的结束时间入最小堆。最后第二个堆的大小就是最少会议室数量。看代码可能更好理解。package BiShi;import java.util.Prior原创 2021-09-09 22:55:53 · 1188 阅读 · 0 评论 -
说说BIO,NIO,AIO区别(直接可用)
从客户端服务端连接角度看:BIO:同步并阻塞,线程发起 IO 请求,不管内核是否准备好 IO 操作,从发起请求起,线程一直阻塞,直到操作完成。服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销,当然可以通过线程池机制改善。NIO:同步非阻塞,客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有 I/O 请求时才启动一个线程进行处理。服务器实现模式为一个请求一个线程,即客户端发送的连接请求都会注册到多路复原创 2021-09-06 20:44:13 · 125 阅读 · 0 评论 -
简述设计模式之简单工厂模式,工厂方法模式,抽象工厂模式
单例模式保证一个类仅有一个实例,并提供一个访问它的全局访问点。也就是要防止多次实例化对象,因此要把构造方法私有化,然后在全局访问点里面进行创建。单例模式可以分为饿汉模式和懒汉模式。饿汉模式就是创建对象就直接初始化实例,所以要提前占用系统资源;而懒汉模式就是当调用类的全局访问点时才进行创建,不过需要双重判断机制来保证多线程安全。一般情况下用饿汉模式就够了。简单工厂模式就是把创建对象的逻辑封装在工厂类里面,用户只需要传入需要创建的类名称,工厂类就会根据传入的参数不同,帮忙创建相应的对象,并返回给调原创 2021-08-31 22:21:52 · 204 阅读 · 0 评论 -
说说CopyOnWriteArrayList
CopyOnWriteArrayList是ArrayList线程安全的一种实现。CopyOnWrite也叫写诗复制容器,从字面看也就是先复制一份,然后再进行写操作。在进行元素修改的时候,会先将数组拷贝一份,在拷贝的数组上进行更改,然后再将新数组更新到原来的引用上面。数组的拷贝主要使用System.arraycpoy和Arrays.copyOf.在add,set,remove等方法都加了可重入锁,这样写操作就不能并发,但是在写时候还可以进行读操作,因为读操作没有锁,不过读到的数据是旧数据。CopyOn.原创 2021-08-23 21:44:37 · 171 阅读 · 0 评论 -
说说concurrenthashmap的底层实现?说说hashmap和concurrenthashmap的区别
concurrenthashmap是安全的hashmap,它底层数据结构使用的是数组+链表+红黑树。它的默认初始化容量是16,如果使用有参构造,参数为n,那么初始化容量就是不小于1.5n+1的最小2的n次方值。然后会将容量值放在sizeCTL中。sizeCTL的值为正数,如果数组已经初始化,那么该值就是下一次扩容的阈值,如果还没初始化,那么这个就是初始化容量。如果为负数,-1的话,就代表数组正在初始化。非-1的负数,代表正在扩容,值是扩容线程的个数,本线程也会进入协助扩容。初始化操作在第一次put元.原创 2021-05-30 16:29:09 · 311 阅读 · 0 评论 -
hashmap不安全例子,arraylist不安全例子
hashmap不安全例子hashmap扩容是先把原数组赋给一个临时引用,然后创建一个新容量的数组赋给原引用,再把内容从临时引用copy过来。两个线程同时put元素,如果两个都刚好计算到同一个位置上,然后前一个判断为空,但是节点还没添加进去,另一个线程也判断为空,这样就会出现后一个覆盖前一个的情况,但是原本应该按先后形成链表。两个线程一个put,一个get,如果前者导致扩容,可能后者get到空。因为扩容的时候会把table赋给一个引用,然后创建一个新容量的数组,赋给table,再把旧数组的内容拷贝过来原创 2021-05-29 16:12:40 · 164 阅读 · 0 评论 -
说说java内存模型
我一直以为java内存模型就是运行时数据区,呜呜呜,两者根本不是同一个东西。原创 2021-07-01 17:41:34 · 130 阅读 · 0 评论 -
mysql主从复制,读写分离配置流程的理解,分库分表原理
为什么需要主从复制?在进行事务写入的时候,语句需要锁表,这样的话,这时候就没法进行读操作了,这样影响业务性能。可以进行数据的热备份,主服务器挂了,从服务器还在。业务量大的时候,如果只有一个服务器,那么进行读写都在这个服务器上,IO访问频率高,性能下降,如果有多个服务器分散操作,就可以降低单个服务器的磁盘IO频率,提升单个机器的IO性能。主从复制MYSQL主从复制时指数据可以从服务器主节点复制到一个或多个从节点,MySQL 默认采用异步复制方式。原理主服务器的数据变化都会写入到一个二进制b原创 2021-06-19 16:33:37 · 108 阅读 · 0 评论 -
两个线程实现交替打印1-100
这是一道多线程的算法,直接使用类似于生产者消费者模式的算法就行.输出一次之后先唤醒其他线程,然后就调用wait方法,释放锁.另一个线程就会获取锁,并打印,重复上述流程.如果要求某个线程先打印,可以在第一个线程启动之后,睡眠100ms再启动第二个线程,这样第一个线程就一定打印第一个数据.(当然我没加睡眠也一直是先启动的线程先打印,不知道是不是概率问题)挺简单的,看代码应该都能懂.源码:package leetcode;public class JiaoTiDaYin { public st原创 2021-08-11 21:56:42 · 1944 阅读 · 0 评论 -
说说线程池原理
先说使用:ThreadPoolExecutor类参数,核心线程数,最大线程数(连核心数算在里面),非核心线程销毁之前等待任务的最长时间,前面时间的单位,等待队列大小。提交优先级:核心线程>等待队列>非核心线程执行优先级:核心线程>非核心线程>等待队列如果核心线程10个,最大线程数20,等待队列10,在执行30个线程的时候。会先执行任务1-10,然后执行任务21-30,最后执行任务11-20.首先任务1-10会直接给核心线程执行,核心线程满了之后,任务会被放到等待队列;等待原创 2021-08-10 21:10:24 · 1105 阅读 · 0 评论 -
JAVA基础面试题(根据今年面经收集)
为什么Arraylist每次扩容1.5倍?首先扩容因子应该小于2,不然后面创建的数组会一直无法使用前面释放的空间。例如1,2,4,8,当第三次扩容的时候,容量为8,而前面的容量加起来才7。确定应该在1-2之间之后,再如何取就需要综合考虑,容量太小,就扩容频繁,影响性能,容量太大,就会造成空间的浪费,1.5是权衡利弊的结果。...原创 2021-08-10 21:09:59 · 179 阅读 · 0 评论 -
垃圾收集器
垃圾收集器的选择如果你想要最小化地使用内存和并行开销,请选 serial GC如果你想要最大化应用程序的吞吐量,请选Parallel GC如果你想要最小化GC的中断或停顿时间,请选 CMS GC.CMS使用标记-清除算法。初始标记阶段:标记处GC Roots能直接关联到的对象。(需要stop the world)并发标记阶段:从GC Roots直接关联的对象开始遍历整个对象图,这个过程耗时长,但是不需要暂停用户线程。重新标记阶段:修正并发标记阶段,因用户程序继续运行而导致的标记产生变动的那原创 2021-07-22 11:08:16 · 111 阅读 · 0 评论 -
session的过期时间设置
可以设施session过期时间的地方有三处。第一:在tomcat/conf/web.xml里面进行配置,单位是分钟,永不过期可以设置-1。<session-config> <session-timeout>5</session-timeout> </session-config> 第二:在项目的web.xml文件里面配置,但是也是分钟。<session-config> <session-timeout>原创 2021-07-22 08:40:54 · 6446 阅读 · 0 评论 -
计算机网络常见面试题
说说TCP三次握手第一次握手,客户端向服务器发起连接请求,SYN=1,代表发起请求,req=x,代表发送的消息第一个字节的序号为x。第二次握手,服务器向客户端回发接受请求报文,SYN=1,代表接受请求;req=y,代表发送的第一个字节的序号是y;ACK=1,代表是回复报文;ack=x+1,代表期待收到下一个包的序号为x+1。第三次握手,客户端向服务端回复确认报文,seq=x+1,代表发送的消息的第一个字节的序号是x+1;ACK=1,代表是回应报文;ack=y+1,代表期待收到下一个包的序号是y+1。原创 2021-07-21 21:26:29 · 114 阅读 · 2 评论 -
redis数据类型,使用场景,缓存击穿,缓存雪崩,缓存穿透,redis多线程,redis持久化
缓存穿透缓存穿透就是有请求访问数据库和缓存都不存在的key,访问过来的时候,因为缓存没有,请求就会打到数据库,数据库也没有也就没法写入缓存,所以下一次请求过来的时候还是会重复上述的操作。在这个过程中,缓存起不了作用,访问都直接打到了数据库,就好像请求都直接穿透缓存到达数据库一样。流量大的时候,可能会把数据库打挂。解决方案:①接口校验。可以校验数据的合法性,可以校验用户权限,不符合的数据就进行拦截。②缓存空值。当访问缓存和数据库都没有的key的时候,可以将空值写入缓存,然后设置比较短的过期时间。③原创 2021-07-21 15:41:22 · 278 阅读 · 0 评论 -
40. 组合总和 II leetcode
给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。candidates 中的每个数字在每个组合中只能使用一次。注意:解集不能包含重复的组合。示例 1:输入: candidates = [10,1,2,7,6,1,5], target = 8,输出:[[1,1,6],[1,2,5],[1,7],[2,6]]示例 2:输入: candidates = [2,5,2,1,2], target = 5,原创 2021-07-21 11:12:42 · 67 阅读 · 0 评论 -
数据库常见面试题(更新中)
B+树叶子节点存储的是索引还是数据?如果是java的默认存储引擎是innoDB,innoDB使用聚集索引,也就是索引和数据在同一个文件,因此叶子节点存储的是数据。如果是myisam存储引擎的话,叶子节点存储的是索引。说说Myisam和InnoDB的区别。InnoDB使用的是行锁,Myisam使用的是表锁InnoDB支持事务,Myisam不支持事务InnoDB支持外键,Myisam不支持外键InnoDB不支持全文索引,Myisam支持全文索引InnoDB使用聚集索引,Myisam使用非聚原创 2021-07-19 09:21:45 · 524 阅读 · 0 评论 -
JVM的一些常见面试题
JVM的一些常见面试题:jdk1.8默认的垃圾收集器是什么?1.7和1.8使用parellelGC和parellelOldGC,1.9之后一直是g1如果查看当前使用的是什么垃圾收集器?(如何查看jvm参数?)通过命令java -XX:+PrintCommandLineFlags -version可以打印jvm的各种参数,里面就有使用的垃圾收集器。cpu一直占用过高,如何排查?首先使用top命令来找到cpu占用高的进程(window使用jps),如果是java进程,记住pid。然后再使原创 2021-07-18 16:15:40 · 96 阅读 · 0 评论 -
说说hashmap底层原理
jdk1.7hashmap底层的数据结构是数组+链表;1.8之后是数组+链表+红黑树。默认初始化容量为16,默认加载因子是0.75,代表当数组填满了75%的节点,就会触发数组扩容,每次扩容容量变为原容量的两倍。当链表长度超过8;同时数组长度超过64,链表就会转变成红黑树,否则先扩容数组。当链表长度小于6,红黑树就变回链表。一个类,如果其对象将会被放到hashmap中,那么该类应该重写hashcode和equals方法。因为hashmap是通过hashcode和equals来判断两个对象是否相同。首先.原创 2021-07-13 17:55:07 · 155 阅读 · 0 评论 -
说说ArrayList,LinkedList,Vector的区别
ArrayList叫动态数组,底层使用的是数组,LinkedList底层是双向链表,维护有头指针,尾指针,因此可以在链表的头尾添加元素。Vector底层也是数组。ArrayList适合查询多的情况,因为数组每个节点大小相同,地址相邻,因此知道第一个节点地址通过下标可以快速找到某个下标对应的地址。LinkedList适合增删多的情况,可以直接在链表头和尾添加元素。ArrayList无法创建大的对象,因为数组需要连续的地址,而链表不要求地址连续。ArrayList的动态是通过扩容来实现的。在创建集合,添.原创 2021-07-05 21:18:58 · 123 阅读 · 0 评论