⾯试JAVA常被问到的问题(持续更新中)
引⾔
有的⾯试会被问到有没有写博客,这时候我尴尬,不知道怎么回答,所以这篇⽂章仅仅是把我⾯试JAVA的遇到的问题记录下来⽽已,也算是我写博客迈出的第⼀步,起码,以后被问到:有没有写博客?我可以回答,我写过。 (最主要的是以后换⼯作我不⽤频繁百度常见⾯试题了。。。。)
ps
1,别把我太当回事,我是个LJ;
2,说得不对的地⽅请多多包涵,想看更详细的请百度官⽅⽂档和其他⼤佬的⽂章;
3,如果有被问到了,我这上⾯没有的话,也可以提出来,我去学习,补上去,谢谢各位⼤哥。
正⽂
1,跟我讲讲SpringMVC的执⾏流程?
浏览器提交http请求–>提交到DispatcherServlet–>根据配置⽂件到请求对应的HandlerMapping–>到常量指针怎么调
对应的Controller–
>Controller执⾏Service层业务代码–>返回结果封装到ModelAndView–>再次根据DispatcherServlet到对应的视图解释器–>数据封装到Model中–>返回给JSP–>http请求返回给浏览器
2,跟我讲讲Spring的IOC和AOP?
IOC简称:控制反转,⼜被叫做依赖注⼊(DI),其作⽤是把创建对象交由Spring⼯⼚完成,避免了程序员创建对象的⿇烦。
其实现⼤致分为以下四个步骤:
1,加载Spring容器BeanFactory创建Resource对象。
加载Spring的容器BeanFactory在其构造⽅法创建实现了Resource接⼝的对象的实例,Resource对象创建成功后会调⽤getConfiguration()⽅法获取到Spring配置⽂件的位置。
Resource的实现分为三种FileResource,UrlResource,ClassPathResource,分别对应获取⽂件,⽹络资源,项⽬路径下资源。Resource创建如果有⽗类就使⽤⽗类的容器,如果没有就创建新的容器。
2,提取验证模式
BeanFactory会调⽤getInputStream()⽅法获取到配置⽂件的输⼊流,在加载前,会以DTD或XSD,通过头标签验证配置⽂件的正确性和完整性。
3,提取内容
把配置⽂件转换成⼀个document对象,这个document对象把类的内容转换成Spring的特殊结构BeanDefinition,BeanDefinition中包涵了Bean的所有信息,例如:是否懒加载,是否单例,是否抽象类,是否私有类等等。
mysql面试题sql优化4,注册
把所有的Bean装到ConcurrentHashMap中,以BeanName作为key,BeanDefinition作为Value。其中,如果BeanName重复,并且Spring不允许重复的话,那么就会报错,否则就会覆盖。
AOP简称:⾯向切⾯编程,其主要应⽤在业务贯穿了整个系统的时候,例如事务的控制,权限,安全,⽇志。
它的核⼼归纳为:切⾯,切点,⽬标对象,连接点,增强,引⼊,植⼊。
通知的⽅式⼜分为五种:前置通知,后置通知,环绕通知,异常通知,返回后通知。
加载的⽅式有两种:动态加载和cglib加载。
3,你⽤AOP做过什么业务?能简单讲讲吗?
我利⽤AOP做过⽇志的管理,采⽤监听⽅法的调⽤去实现的。但是有缺点:每个⼈写的⽅法名不⼀样,有的时候监听不到⽅法的调⽤,所以我当时规定了起名规则,它的优点就是不需要去写⾃定义注解,可以少些代码,因为⽅法名的约束在所以提⾼代码后续的可读性。
第⼆种⽅法就是⾃定义注解去实现⽇志录⼊,优点就是灵活多变,缺点就是每个⽅法都要加这个注解。
4,能讲讲Mybatic的⼤概的执⾏流程吗?它是怎么与数据库完成数据的交互的?
mybatic会加载SqlSessionFactory容器,每次请求都会获取到⼀个SqlSession,由SqlSession建⽴起与数据库的会话,并把sql传⼊数据库执⾏,数据库执⾏后把结果返回,其中,也涉及到了mybatic⼀级缓存的调⽤(如果表的结构或数据没发⽣改变,并且SQL重复执⾏,那么查询的时候优先把⼀级缓存中的数据返回,⽽不是请求数据库查询SQL语句),每次查询的结果其实都会存到⼀级缓存中,mybatic默认开启了⼀级缓存,⼆级缓存则需要通过修改配置⽂件开启,⼆级缓存是针对Mapper的,主要是多个
SqlSession共享同⼀个Mapper。(这⾥我也把mybatic的⼀级缓存和⼆级缓存⼤概讲了⼀下)
5,数据库⽅⾯有了解吗?能讲讲NoSQL和MySql的区别吗?
数据库⽅⾯也涉及到了CAP三⼤定律,即:⼀致性(C),可⽤性(A),分区容忍性(P)。
其中:传统型数据库,如MySql遵循的是CA,保证了⼀致性和可⽤性;KV结构的数据库满⾜AP,可⽤性与分区容忍性。
传统型数据库的优势在于:体积⼩,速度快,成本低,能始终保证数据的⼀致性。缺点是当表数据量过⼤(五百万条或2.5G⼤⼩)的时候要考虑采⽤缓存,或者主从复制,读写分离,异构复制等数据库层次的优化操作。
NoSQL优势在于:⾼性能,⾼拓展,⾼可⽤;缺点是很难保证数据的⼀致性,只能在业务层的代码做约束。其结构为Base模型(基本可⽤,软状态)。
6,能讲讲事务吗?
事务的四⼤特性为:原⼦(事务的操作是原⼦性的),⼀致(数据前后保持⼀致),隔离(事务的操作互不影响),持久(⼀旦持久化则不可回滚)。
事务的隔离级别为:脏读,不可重复读,幻读。
数据库事务的⼜分为:Default(默认级别),uncommit,commit(解决脏读),read(解决不可重复读),Serializable (解决幻读),事务的隔离级别设置得越⾼,数据库的性能就越低,所以⼀般只设置到commit级别。
7,能讲讲你建表的时候会注意哪⼀些吗?
我会注意字段的类型,例如:
⼈类的岁数设置为tinyint,龟的岁数设置为smallint,⾏星的寿命设置为int,宇宙的寿命设置为bigint;
涉及到⾦钱的使⽤decimal,因为fload,double有精度的缺失;
判断的字段的起名为is_xxx;
尽量不适⽤text,除⾮字节数超过了5000,否则都是使⽤varchar;
索引我也不会多建,过多的索引会对查询速度产⽣影响
8,能讲讲索引吗?你是怎么优化⼀条SQL的?
索引常见的有主键索引、普通索引、唯⼀索引、全⽂索引、聚合索引。
聚合索引在使⽤的时候where后字段的顺序尽量与索引的顺序⼀致,否则可能会失效,并且聚合索引不能为null;
索引在使⽤的时候要注意where后字段的类型是否与索引的字段的类型⼀致,不⼀致会失效,例如索引的字段类型是varchar,但是where 后的字段不⽤单引号包起来,这样索引会失效;
不在where后直接参与运算;
⼀条SQL的join不应该超过五条,否则可能会影响查询速度
SQL的优化可以⽤解释计划去分析,主要看以下两列:
type 这是重要的列,显⽰连接使⽤了何种类型。从最好到最差的连接类型为const(最好)、eq_reg、ref(标准)、range(最低要求)、indexhe和ALL
Extra 关于MYSQL如何解析查询的额外信息。这⾥如果出现Using filesort和Using temporary,就要优化了。前者是数据库需要进⾏额外的操作发现如何对返回的⾏排序,后者是MYSQL需要创建⼀个临时表来存储结果,这通常发⽣在对不同的列集进⾏ORDER BY上,⽽不是GROUP BY上
9,能讲讲写SQL的时候的⼀些注意事项吗?
1,不要⽤*号,⽽是查什么字段就写什么字段;
2,⽤>=,<=代替>,<;
3,⽤exists代替in;
4,⽤union代替or;
5,>=,<=不直接写在XML⽂件中,⽽是⽤转义字符代替;
springcloud openfeign用法6,#和$的区别就是#能防⽌SQL注⼊,另⼀个则不能,常⽤语表名;
7,在XML中获取当前时间不能使⽤NOW(),⽽是传时间戳进来;
10,参与过秒杀系统的设计开发吗?能讲讲是怎么做的吗?
秒杀的步骤为:
1,验证时间;
2,输⼊验证码,这⼀步主要是时间换取空间,换取后台代码的执⾏时间;
3,⽤户点击按钮后,按钮变灰,主要是防⽌⽤户重复点击,也只能对‘⼩⽩’起作⽤,其中还有限制IP,限制账号,分析⽤户⾏为等等;4,验证库存,秒杀成功后库存-1,其中使⽤的是乐观锁,主要不认为会产⽣数据的冲突,因为并发量没那么⾼(如果出现商品超卖,就使⽤redis⾃旋锁配合数据库的乐观锁);编程猫体验课老师怎么样
5,⽤户秒杀成功后,但是五分钟内不付款,视为放弃放弃本次优惠,库存+1;
11,能讲讲多线程吗?
在多线程中,可能会出现并发和并⾏。
并⾏:真正意义上的同⼀时间,两个或两个以上的线程争夺资源;
并发:根据CPU的调度算法, 使得⽤户觉得是在同⼀时间出现了争夺资源,但其实不是同⼀时间。
线程的状态有两种sleep和wait。
sleep:不放弃资源,等到时间后会再次执⾏业务代码;
wait:完全放弃资源,除⾮被notify或者notifyAll重新给予资源才会执⾏业务代码。
实现线程的⽅式分为:继承Thread,实现Runnable或Callable接⼝。
Java中单⼀继承多实现,所以⼀般不会继承Thread;Runnable和Callable的区别则是Callable可以捕获到异常。
加锁可以使⽤:threadlocal或synchonized。
threadlocal解决数据的⼀致性问题,因为访问的是镜像副本,不是同⼀个数据源;synchonized解决数据的同步问题。
11,String,StringBuilder,StringBuffer的区别?
String的底层是数组结构,长度⼀旦确定不可改变,出现更改也是创建⼀个新的模型,然后把新的数据装进去,并且指针指向这个地址;StringBuilder是线程不安全的容器,存储的数据超过了其默认的容器⼤⼩则会⾃动扩容;
StringBuffer与StringBuilder机制⼀样,但是StringBuffer是线程安全的容器;
12,你了解的线程安全的容器和线程不安全的容器有哪些?使⽤不安全的容器可能会出现什么问题?要怎么解决?
线程安全的容器:vector,HashTable,ConcurrentHashMap等
线程不安全的容器:ArrayList,HashMap,StringBuilder,LinkList等
使⽤不安全的容器例如:ArrayList,循环插⼊⼀百次记录,ArrayList可能会出现⾓标越界异常。可以通过
Collections.synchronizedList(XXX)把它变成线程安全的容器。
13,Redis的数据类型有⼏种?
五种,分别是List,String,Set,SortSet,Hash。
14,有了解过memcache吗?它和Redis的区别在哪?
1,memcache只能存储KV结构的数据或⾳像⽂件,Redis除了KV数据还有上⾯说的五种可以存;
2,memcache必须设置数据的过期时间,但Redis对数据的过期时间不强制要求设置;
3,在容灾上memcache的数据丢了就没了,Redis可以主从复制
4,Redis可以持久化数据到本地⽂件⾥
15,Session和Cookies有什么区别?
Session的⽣命周期在访问JSP,Servlet等动态资源的时候创建,访问HTML,CSS等静态资源不会创建,除⾮强⾏创建;在关闭浏览器或当前窗⼝消失;服务器会定期清理掉不再活跃的Session,以tomcat为例是每30分钟清理⼀次;
Cookies默认的age为-1,可以修改持久化到本地⽂件,可以存数据。
16,系统报错,你是怎么查⽇志进⾏排查,能举例说明吗?
Linux系统下查询⽇志有tail查询实时⽇志,sed根据时间筛选⽇志。Jenkies在浏览器也可以查询实时⽇志,⽤以复现BUG。腾讯云的⽇志每⼀个只有100M⼤⼩,⼀天只有⼗个⽇志⽂件。根据公司的⽇志架构与BUG的复杂度决定采⽤什么⽅式去查⽇志,能复现的尽量复现,不能复现的查⽇志。让负责该业务的⼈员进⾏BUG的修改,或者协助其修改。
17,有了解分布式吗?
Zookeeper是⼀个分布式协调中⼼。
Dubbo是⼀个⾼性能,轻量级的JAVA的RPC框架,其核⼼分为三类,1:远程调⽤;2,智能容错和负载平衡;3,服务的注册与发现。Dubbo的服务调⽤分为,1,消费者直连⽣产者;2,服务注册到注册中⼼,消费者到注册中⼼请求获取服务,注册中⼼返回服务给消费者,监控中⼼则是监控时间段内的服务调⽤与提供次数等记录。
eureka是SpringCloud的注册中⼼,它有⾃⼰的容错机制,eureka不会移除掉未监听到⼼跳的服务,⽹络波动时返回最近的数据,⽹络恢复正常会获取最新的服务;Dubbo采取过半节点的选举⽅式容错。
18,能说说微服务与SpringMVC的区别吗?
SpringBoot具有内置的服务器,其加载⽅式为:加载所有的Class⽂件,如果有SpringMVC的JAVA⽂件,会加载SpringMVC的容器,当所有⽂件加载完成后,可以直接访问项⽬。
SpringMVC需要配置l⽂件,要配置jsp等页⾯资源,但SpringBoot省略了这部分的配置,因为它是http+rest+API模式,更符合微服务的思想。
19,说⼏个你认识的集成SpringCloud时使⽤的插件?
Feign:动态代理,默认集成Ribbon,具有负载均衡;
Hystrix:断容器,主要是业务是由多个服务组成的时候,某个服务出现异常,为了防⽌‘雪崩’,servlet资源耗尽,会返回给⽤户⼀个fallBack;
结构体数组成员赋值Ribbon:负载均衡;
eureka:起到注册中⼼的作⽤;
Zuul:⽹关;
20,有了解过JDK8以上版本的某些特性吗?能说说?
Steam流,Lambada,LocalDateTime,List.of(),Map.forEach(),switch的新语法;
21,有了解过容器吗?⽐如Docker。
Docker主要由仓库,镜像,容器三部分组成;它们间的关系为,镜像可以pull获取到仓库的资源,push把镜像提交到仓库;镜像通过run 或start创建容器(run是新建容器并启动,start是启动已有的但停⽌的容器),容器通过commit⽣成镜像。
FROM 命令说明镜像来源于哪⾥;
run rm -rf 命令删除容器;
copy 命令把某位置的⽂件拷贝到哪⾥;
还有⼀些其他常⽤的命令,如docker image,docker ps ,docker log 等等
执⾏多段命令可以使⽤DockerFile,DockerFile需要去掉⽂件后缀。
22,有了解数据库的主从复制吗?怎么做到读写分离?
⼀般来说,对数据的修改在主库,读在从库;其原理⼤致为:数据在主库发⽣更改,会有binlog记录本次的操作,当从库知道主库更改了数据,会从binlog拿到这次操作的记录并进⾏同样的操作,所以,每次当主库发⽣了数据的更改,从库也会同步进⾏更改。
个税公式2022函数excel23,说说类加载机制?
类加载的顺序是:
加载–>验证–>准备–>解析–>初始化–>使⽤–>销毁
分别对应:
1,把JAVA⽂件加载成⼆进制数据;
2,验证⽂件的正确性和完整性;
3,为静态变量分配内存;
4,对符号进⾏转义;
5,初始化类,由ClassLoader及其⼦类完成;
6,使⽤这个类;
7,GC
24,String的equals是怎么实现的?
先跟⾃⼰⽐–>再⽐较类型(是不是String类型)–>再⽐较长度–>再⽐较字节;
25,UDP和TCP的区别?
TCP:安全,建⽴请求需要三次握⼿,断开要四次,速度慢,常⽤于视频,下载等;
UDP:不安全,不需要握⼿,速度快,常⽤于发送图⽚,⽂字等。
26,XML可以直接写>=或者<=吗?
最好不要(其实是强制)在XML的SQL中写>=或者<=或者&,要使⽤转义字符
27,对象的引⽤有⼏个级别?
按照⽣命周期从强到弱,分别为:强引⽤、软引⽤、弱引⽤、虚引⽤。
强引⽤对象哪怕JVM内存溢出都不会被JVM回收;
软引⽤对象会在内存不⾜时被回收,所以常⽤于缓存;
弱引⽤对像会在JVM垃圾回收被回收,也可以⽤来做缓存;
虚引⽤对像被回收时间未知,⽣存时间也未知,所以⽤途也是未知。
28,JVM的内存模型有什么?
共有五种,堆、栈、⽅法区、程序计数器、本地⽅法栈
它们的作⽤分别是:
堆:⽤来存储对象本⾝以及数组(数组引⽤是存放在Java栈中的)。堆是被所有线程共享的,在JVM中只有⼀个堆。
栈:Java栈中存放的是⼀个个的栈帧,每个栈帧对应⼀个被调⽤的⽅法。
⽅法区:与堆⼀样,是被线程共享的区域。在⽅法区中,存储了每个类的信息、静态变量、常量以及编译器编译后的代码等。程序计数器:保证程序的正常执⾏次序
本地⽅法栈:与栈类似,区别是栈为执⾏Java⽅法服务的,⽽本地⽅法栈则是为执⾏本地⽅法服务的
29,JVM的内存区域有⼏个?
新域、旧域、永久域
新域:刚创建对象时,其所处的区域;
旧域:被⼀次引⽤后,继续被使⽤,没有被GC的对像所处的区域;
永久域:固定⼤⼩,初始为4M;运⾏程序时,会动态调整⼤⼩以满⾜需求,每次调整,JVM会对堆进⾏⼀次完全的垃圾收集。30,为什么要将变量分配合理的作⽤域?
为了能够更好的进⾏GC
31,什么是缓存的穿透,击穿,雪崩?遇到这三种情况要怎么解决?

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。