面试JAVA常被问到的问题(持续更新中)

面试 专栏收录该内容
4 篇文章 0 订阅

引言

有的面试会被问到有没有写博客,这时候我尴尬,不知道怎么回答,所以这篇文章仅仅是把我面试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的所有信息,例如:是否懒加载,是否单例,是否抽象类,是否私有类等等。

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的优化可以用解释计划去分析,一条SQL的查询速度标准是ref级别,最低要求是range级别,最好能达到cons级别。

9,能讲讲写SQL的时候的一些注意事项吗?

1,不要用*号,而是查什么字段就写什么字段;
2,用>=,<=代替>,<;
3,用exists代替in;
4,用union代替or;
5,>=,<=不直接写在XML文件中,而是用转义字符代替;
6,#和$的区别就是#能防止SQL注入,另一个则不能,常用语表名;
7,在XML中获取当前时间不能使用NOW(),而是传时间戳进来;

10,参与过秒杀系统的设计开发吗?能讲讲是怎么做的吗?

秒杀的步骤为:
1,验证时间;
2,输入验证码,这一步主要是时间换取空间,换取后台代码的执行时间;
3,用户点击按钮后,按钮变灰,主要是防止用户重复点击,也只能对‘小白’起作用,其中还有限制IP,限制账号,分析用户行为等等;
4,验证库存,秒杀成功后库存-1,其中使用的是乐观锁,主要不认为会产生数据的冲突,因为并发量没那么高;
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需要配置web.xml文件,要配置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拿到这次操作的记录并进行同样的操作,所以,每次当主库发生了数据的更改,从库也会同步进行更改。

23,说说类加载机制?

类加载的顺序是:
加载–>验证–>准备–>解析–>初始化–>使用–>销毁

分别对应:
1,把JAVA文件加载成二进制数据;
2,验证文件的正确性和完整性;
3,为静态变量分配内存;
4,对符号进行转义;
5,初始化类,由ClassLoader及其子类完成;
6,使用这个类;
7,GC

24,String的equals是怎么实现的?

先跟自己比–>再比较类型(是不是String类型)–>再比较长度–>再比较字节;

25,UDP和TCP的区别?

TCP:安全,建立请求需要三次握手,断开要四次,速度慢,常用于视频,下载等;
UDP:不安全,不需要握手,速度快,常用于发送图片,文字等。

26,XML可以直接写>=或者<=吗?

最好不要(其实是强制)在XML的SQL中写>=或者<=或者&,要使用转义字符
在这里插入图片描述

持续更新中…

最后:祝大家开开心心每一天

  • 6
    点赞
  • 0
    评论
  • 37
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值