Java面试中被问到的问题【持续更新~】

Spring Boot 和 Spring MVC的区别是什么?

答: Spring MVC提供了一种轻度耦合的方式来开发web应用。 Spring MVC是Spring的一个模块,是一个web框架。通过Dispatcher Servlet, ModelAndView 和 View Resolver,使得开发web应用变得很容易。
 
Spring Boot引入自动配置的概念,让项目设置变得很容易。Spring Boot本身并不提供Spring框架的核心特性以及扩展功能,只是用于快速、敏捷地开发新一代基于Spring框架的应用程序。也就是说,它并不是用来替代Spring的解决方案,而是和Spring框架紧密结合用于提升Spring开发者体验的工具。同时它集成了大量常用的第三方库配置(例如Jackson, JDBC, Mongo, Redis, Mail等等),Spring Boot应用中这些第三方库几乎可以零配置的开箱即用(out-of-the-box),大部分的Spring Boot应用都只需要非常少量的配置代码,开发者能够更加专注于业务逻辑。Spring Boot只是承载者,辅助你简化项目搭建过程的。如果承载的是WEB项目,使用Spring MVC作为MVC框架,那么工作流程和你上面描述的是完全一样的,因为这部分工作是Spring MVC做的而不是Spring Boot。对使用者来说,换用Spring Boot以后,项目初始化方法变了,配置文件变了,另外就是不需要单独安装Tomcat这类容器服务器了,maven打出jar包直接跑起来就是个网站,但你最核心的业务逻辑实现与业务流程实现没有任何变化。
 
所以,用最简练的语言概括就是:Spring 是一个“引擎”;Spring MVC 是基于Spring的一个 MVC 框架 ;Spring Boot 是基于Spring4的条件注册的一套快速开发整合包。
 

转载:https://www.zhihu.com/question/64671972/answer/223383505

 

Spring Boot有哪些注解?说得越多越好

答: @SpringBootApplication:包含了@ComponentScan、@Configuration和@EnableAutoConfiguration注解。其中@ComponentScan让Spring Boot扫描到Configuration类并把它加入到程序上下文。
@Configuration: 等同于spring的XML配置文件;
@ComponentScan: 组件扫描,可自动发现和装配一些Bean。
@Controller:注解在类上,表示这是一个控制层bean
@RestController:是@Controller和@ResponseBody的合集,表示这是个控制器bean,并且是将函数的返回值直 接填入HTTP响应体中,是REST风格的控制器。
@Autowired:自动导入。
@Transactional:事务注解
@RequestMapping:映射请求路径
@Value: 注解在变量上,从配置文件中读取
@Repository: 注解在类上,表示这是一个数据访问层bean
@Service:注解在类上,表示这是一个业务层bean
@Component:注解在类上,表示通用bean 
 
 

@RestController 和@Controller有什么区别?

答: @RestController在 Spring MVC 中就是 @Controller 和 @ResponseBody注解的整合。 @RestController注解在Spring4.0版本引入,目的是为了构建Restful Wed服务。
 
扩展: @ResponseBody  该注解用于将Controller的方法返回的对象,通过适当的HttpMessageConverter转换为指定格式后,写入到Response对象的body数据区。
使用此注解此次请求将不再走视图处理器,而是直接将此响应结果写入到输入流中,其效果等同于使用response对象输出指定格式的数据。
 

Redis有哪些数据类型?

答:Redis里面有5种数据类型,分别是String(字符串)、Hash(哈希)、List(列表)、Set(集合)、Zset(Sorted set : 有序集合)
 
扩展:具体的数据类型对比和使用参考: https://blog.csdn.net/qq_38691695/article/details/106292153
 
 

Redis是单线程还是多线程?

答:单线程,采用单线程是为了避免不必要的上下文切换和竞争条件,也不存在多进程或多线程的切换而消耗CPU,不用考虑各种锁的问题。
扩展:为什么是单线程的?
答:1)易于实现:编写多线程程序更加困难,需要为线程添加锁和同步机制。
2)易于部署:单线程应用程序可以部署在至少具有单个CPU内核的任何计算机上。
3)并发性:Redis使用epoll和事件循环来实现并发策略并节省大量时间而无需上下文切换。
4)CPU不再是瓶颈:因为Redis所有操作都是基于内存的,所以机器的内存大小和网络带宽的大小才是限制Redis性能的主要因素。如果需要更高的性能,可以使用集群(多个线程)的方式解决。
 
 
 

介绍一下Redis的集群。

答:Redis 集群是一个提供在多个Redis节点之间共享数据的程序集。
Redis 集群并不支持同时处理多个键的 Redis 命令,因为这需要在多个节点间移动数据,这样会降低redis集群的性能,在高负载的情况下可能会导致不可预料的错误。
Redis 集群通过分区来提供一定程度的可用性,即使集群中有一部分节点失效或者无法进行通讯, 集群也可以继续处理命令请求。
 
扩展: Redis 集群的优势
答: 1.缓存永不宕机:启动集群,永远让集群的一部分起作用。主节点失效了子节点能迅速改变角色成为主节点,整个集群的部分节点失败或者不可达的情况下能够继续处理命令;
2.迅速恢复数据:持久化数据,能在宕机后迅速解决数据丢失的问题;
3.Redis可以使用所有机器的内存,变相扩展性能;
4.使Redis的计算能力通过简单地增加服务器得到成倍提升,Redis的网络带宽也会随着计算机和网卡的增加而成倍增长;
5.Redis集群没有中心节点,不会因为某个节点成为整个集群的性能瓶颈;
6.异步处理数据,实现快速读写。
 

 

Java里面有哪些基本数据类型?

答:Java语言提供了8种基本数据类型,byte、short、int、long、float、double、char、boolean。这些数据类型不是对象,而是Java语言中不同于类的特殊类型,这些基本类型在变量声明后就会立刻分配内存空间。
扩展:其它数据类型都是引用类型,例如类,接口,数组等。引用数据类型类似于C++的引用或指针的概念,它们以特殊的方式指向对象实体,这些变量在声明时不会分配内存空间,只是存储了一个内存地址而已。
 

数据类型

字节长度

范围

默认值

包装类

int

4

(-231~231-1)

0

Integer

short

2

[-32768,32767]

0

Short

long

8

(-263~263-1)

OL或01

Long

byte

1

[-128,127]

0

Byte

float

4

32位IEEE754单精度范围

0.0F或0.0f

Float

double

8

64位IEEE754双精度范围

0.0

Double

char

2

Unicode[0,65536]

u0000

Character

boolean

1

true或false

false

Boolean

 

如何排查服务器CPU占满的情况?

答:首先登陆服务器执行top命令,查看CPU占用情况,因为Java是单进程多线程的,因此找到Java的进程的PID,执行top  -Hp PID(具体进程的PID数值),找到线程占用率最高的PID,
通过$printf %x PID命令将线程转换成16进制,再通过jstack命令查找栈信息,从而定位具体到某个Java类中的行数代码,分析源码解决问题。
 
 
 

如何处理磁盘占满的情况?

答:执行 du -s -h ./*看下目录的占用情况,找到无用的大文件进行删除,释放使用大文件内容的相关进程,重启服务。
 
 
 

介绍一下Spring IOC 和AOP?

答: IoC是一个容器,在Spring中,它会认为一切Java资源都是Java Bean,容器的目标就是管理这些Bean和它们之间的关系。所以在Spring IoC里面装载的各种Bean,也可以理解为Java的各种资源,
包括Java Bean的创建、事件、行为等,他们由IoC容器管理。
AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是OOP(面向对象编程)的延续,是软件开发中的一个热点, 也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
 

 

 

BeanFactory 和 FactoryBean有什么区别?

答:BeanFactory是个Factory,也就是IOC容器或对象工厂, BeanFactory是接口,提供了IOC容器最基本的形式,给具体的IOC容器的实现提供了规范。
FactoryBean是个Bean。 FactoryBean也是接口,为IOC容器中Bean的实现提供了更加灵活的方式,FactoryBean在IOC容器的基础上给Bean的实现加上了一个简单工厂模式和装饰模式, 我们可以在getObject()方法中灵活配置。
 
 
 

请简单叙述一下Bean的生命周期?

答: 在传统的Java应用中,bean的生命周期很简单,使用Java关键字 new 进行Bean 的实例化,然后该Bean 就能够使用了。一旦bean不再被使用,则由Java自动进行垃圾回收。
相比之下,Spring管理Bean的生命周期就复杂多了,

Bean 的生命周期:
    1.Spring启动,查找并加载需要被Spring管理的bean,进行Bean的实例化
    2.Bean实例化后对将Bean的引入和值注入到Bean的属性中
    3.如果Bean实现了BeanNameAware接口的话,Spring将Bean的Id传递给setBeanName()方法
    4.如果Bean实现了BeanFactoryAware接口的话,Spring将调用setBeanFactory()方法,将BeanFactory容器实例传入
    5.如果Bean实现了ApplicationContextAware接口的话,Spring将调用Bean的setApplicationContext()方法,将bean所在应用上下文引用传入进来。
    6.如果Bean实现了BeanPostProcessor接口,Spring就将调用他们的postProcessBeforeInitialization()方法。
    7.如果Bean 实现了InitializingBean接口,Spring将调用他们的afterPropertiesSet()方法。类似的,如果bean使用init-method声明了初始化方法,该方法也会被调用
    8.如果Bean 实现了BeanPostProcessor接口,Spring就将调用他们的postProcessAfterInitialization()方法。
    9.此时,Bean已经准备就绪,可以被应用程序使用了。他们将一直驻留在应用上下文中,直到应用上下文被销毁。
    10.如果bean实现了DisposableBean接口,Spring将调用它的destory()接口方法,同样,如果bean使用了destory-method 声明销毁方法,该方法也会被调用。
 
 
 

MyBatis分页怎么做的?

答:方式1:使用Map进行包装数据实现分页功能。
       方式2:使用RowBounds来实现分页功能。
 
 
 

你觉得你最满意的项目是什么?你在里面大致做了些什么工作?在这个项目中你遇到了什么难点?

答:根据实际情况回答。
 
 

阐述一下MySQL语句调优?

答: 1.适当选择Inner join和左连接,右连接,子查询。
2.建立索引,加快查询性能.
3.limit千万级分页的时候优化。
4.尽量避免Select * 命令
5.尽量不要使用BY RAND()命令
6.利用limit 1取得唯一行
7.尽量少排序
8.尽量少OR
9.尽量用union all 代替union
10.避免类型转换
11.不要在列上进行运算
12.尽量不要使用NOT IN和<>操作
13.使用批量插入节省交互(最好是使用存储过程)
14. 锁定表
15.对多表关联的查询,建立视图
 
 
 

JVM调优有哪些参数?

答: 在JVM启动参数中,可以设置跟内存、垃圾回收相关的一些参数设置,默认情况不做任何设置JVM会工作的很好,但对一些配置很好的Server和具体的应用必须仔细调优才能获得最佳性能。
 
 
 

你有写过自定义的注解吗?应该怎么实现自定义的注解?

答: java.lang.annotation中提供了元注解,可以使用这些注解来定义自己的注解。主要使用的是Target和Retention注解
 
 
 

你了解哪些算法?

答:冒泡排序算法、选择排序算法、插入排序算法、等等
 
 
 

你了解哪些数据结构?

答:常用的数据结构有数组(Array)、栈(Stack)、队列(Queue)、链表(Linked List)、树(Tree)、图(Graph)、堆(Heap)、散列表(Hash)
 
 
 

描述一下红黑树?

答: R-B Tree,全称是Red-Black Tree,又称为“红黑树”,它一种特殊的二叉查找树。红黑树的每个节点上都有存储位表示节点的颜色,可以是红(Red)或黑(Black)。
红黑树的特性:
(1)每个节点或者是黑色,或者是红色。
(2)根节点是黑色。
(3)每个叶子节点(NIL)是黑色。 [注意:这里叶子节点,是指为空(NIL或NULL)的叶子节点!]
(4)如果一个节点是红色的,则它的子节点必须是黑色的。
(5)从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑节点。
注意:
   (01) 特性(3)中的叶子节点,是只为空(NIL或null)的节点。
   (02) 特性(5),确保没有一条路径会比其他路径长出俩倍。因而,红黑树是相对是接近平衡的二叉树。
 
 

谈谈对高可用的理解。

答: 所谓高可用性指的是系统如何保证比较高的服务可用率,在出现故障时如何应对,包括及时发现、故障转移、尽快从故障中恢复等等。
 
 
 

【持续更新中,如有问题,欢迎评论指正补充,点一点关注,不迷路】 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值