史上最牛掰的Java面试题月入轻松过万(三)

Java面向对象编程:把问题分解成各个对象,为某个事物在解决整个问题的过程中所发生的行为,面向对象具有,封装、继承、多态的特性。

封装:把类的内部数据隐藏起来,对外提供统一可访问的接口。

继承:子类继承父类,子类也能有自己的行为和方法,子类还能派生子类,java支持单继承

多态:存在继承关系,子类重写父类的方法,父类引用变量指向子类对象

接口和抽象类的区别:

区别1:抽象类体现继承关系,一个类只能单继承

           接口体现实现关系,一个类可以多实现

区别2:抽象是继承,is a的关系

            接口是实现,like a的关系

区别3:抽象类中可以定义非抽象方法,供子类直接使用

             接口的方法都是抽象,接口中的成员都有固定的修饰符

共同点:都是不断抽像出来的抽象的概念

重写和重载的区别:

1.重载:

(1)在本类中方法名相同参数列表不同,参数个数类型顺序不同与修饰符和返回值无关

2.重写:

(1)子类重写父类的方法,方法名相同,参数相同,返回类型相同

常用的集合框架有哪些?

1、collection 顶层接口 里面有集合常用的方法

2、collections 工具类 操作集合的常用方法

3、list集合 ArrayList linkedlist

4、set集合 hashset treeset

5、map集合 hashmap linkedhashmap treemap hashtable

6、queue队列

Java的设计模式:单例模式,工厂模式,代理模式,建造模式,适配器模式


单例模式:保证一个类仅有一个实例,并提供一个访问它的全局访问点。


实现单例模式的方法:懒汉模式、饿汉模式
懒汉模式:在类加载的时候不被初始化,非线程安全可以加锁来解决线程安全问题,需要手动创建
饿汉模式:在类加载的时候就完成了初始化,但是加载比较慢,获取对象比较快,是线程安全的,启动时就创建

数据库的三大范式:

1.字段不可再分

2.非主键字段依赖于主键

3.不能间接依赖主键

Spring

Spring的常用注解:

@Component标注一个普通的Spring Bean类。
@Controller:标注一个控制器组件类。
@Service:标注一个业务层组件类。
@Repository:标注一个dao持久层组件类。

Spring:是针对bean的生命周期进行管理的轻量级容器

Spring中的Bean的生命周期:实例化Bean --> Bean的属性填充 --> 初始化Bean -->销毁Bean 

Spring中bean的作用域:
(1)singleton:默认作用域,单例bean,每个容器中只有一个bean的实例。

(2)prototype:为每一个bean请求创建一个实例。

(3)request:为每一个request请求创建一个实例,在请求完成以后,bean会失效并被垃圾回收器回收。

(4)session:与request范围类似,同一个session会话共享一个实例,不同会话使用不同的实例。

(5)global-session:全局作用域,所有会话共享一个实例。如果想要声明让所有会话共享的存储变量的话,那么这全局变量需要存储在global-session中。

IOC控制反转,把创建对象的控制权给Spring框架进行管理,并且由Spring根据配置文件去创建实例和管理各个实例


IOC的三种注入方式:构造器注入、setter方法注入、P命名空间注入(工厂方式注入)

AOP:面向切面编程,是面向对象的一种补充,将那些与业务无关的行为,全部封装为一个可重用的模块,目的就是减少代码的重复,减低模块间的耦合度,提高性能的可维护性,可用于权限认证、日志、事务处理

Myabtis

mybatis实现分页的几种方式?

借助数组进行分页:

原理:进行数据库查询操作时,获取到数据库中所有满足条件的记录,保存在应用的临时数组中,再通过List的subList方法,获取到满足条件的所有记录。

借助SQL语句进行分页:

实现:在sql语句后面添加limit分页语句。

使用RowBounds对象:

直接使用RowBounds封装起始位置(index)和数目(size)这两个参数传给xml配置文件。直接进行分页。

使用PageHelper插件:

原理实现:因为注册了PageHelper插件,它会在原生的sql后面加上limit,然后调用它的startPage方法实现分页。

Mybatis的9种动态sql标签:trim | if | where | set | foreach | when | choose | bind | otherwise

mybatis一级缓存和二级缓存的区别?

  • 一级缓存(本地缓存)

一级缓存

1.mybatis一级缓存是SqlSession级别的缓存
2.在操作数据库的时候需要构造sqlsession对象,在对象中有一个数据结构(HashMap)用于存储数据。
3.不同的Sqlsession之间的缓存数据区域是互相不影响的,是独立的
4.一级缓存是框架默认为我们开启的,我们不需要做任何配置

  • 二级缓存(全局缓存)

二级缓存是mapper级别的缓存,多个Sqlsession去操作一个mapper.xml语句,多个sqlseesion共用一个二级缓存,

mybatis中如何返回增加时的主键

首先我们要确保主键是自增的,然后只需要在insert方法里添加useGeneratedKeyskeyproperty两个属性。
1.useGeneratedKeys="true"属性设置该insert语句返回主键值。
2.
 keyproperty=“id” 属性设置该主键对应的实体的属性。

#{}和${}的区别是什么?

#{}是预编译处理(底层使用的是PreparedStatement),防止sql注入;${}是字符串替换。

SpringMVC

SpringMVC:是一轻量级Web框架、把复杂的web应用分成逻辑清晰的几部分,M(model)--模型层、V(View)--视图层、C(Controller)--控制器层

SpringMVC的常用注解:

@Controller:声明该类为SpringMVC中的控制器类
@RequestMapping:用于请求的路径映射
@Resource:和Autowired差不多,按照name来找,没找到就按照type类型来找
@Autowired:完成自动装配的工作,按照类型type来注解
@PathVariable: 可以将 URL 中占位符参数绑定到控制器处理方法的入参中
@requestParam:url必须带有参数
@ResponseBody:将controller方法返回对象转化为json响应给客户。

@RequestBody:实现接收 http请求的json数据,将json数据转换为java对象。
 

SpringMVC的请求流程:

1、首先用户发送请求到前端控制器,然后委托请求给处理器

2、页面控制器接收到请求后,进行功能处理,处理完毕后返回一个模型数据

3、前端控制器收回控制权,选择相应的视图进行渲染,并把模型数据传入以便视图渲染

4、前端控制器再次收回控制权,将响应返回给用户

SpringBoot

springboot和springmvc的区别:

spring boot只是一个配置工具,整合工具,辅助工具.

springmvc是框架,项目中实际运行的代码

SpringBoot和SpringCloud的区别?

1.SpringBoot专注于快速开发单个微服务,SpringCloud是将SpringBoot开发的一个个单体微服务整合并管理起来,它是关注全局的服务治理框架(RPC远程调用技术、服务治理等);

2.SpringBoot可以离开SpringCloud独立使用开发项目,但是SpringCloud离不开SpringBoot,属于依赖的关系。

用过哪些Springboot的启动器:

1)spring-boot-starter 这是Spring Boot的核心启动器,包含了自动配置、日志和YAML

2)spring-boot-starter-amqp 通过spring-rabbit来支持AMQP协议。

3)spring-boot-starter-aop 支持面向方面的编程即AOP.

4)spring-boot-starter-jdbc 支持JDBC数据库。

5)spring-boot-starter-log4j 支持Log4J日志框架。

SpringBoot:用来简化spring应用的初始搭建以及开发过程 使用特定的方式来进行配置(properties或yml文件)、简化maven配置


Springboot 有哪些优点
-快速创建独立运行的spring项目与主流框架集成
-使用嵌入式的servlet容器,应用无需打包成war包
-大量的自动配置,简化开发,也可修改默认值


Springboot自动配置的原理:
在Spring程序main方法中 添加@SpringBootApplication或者@EnableAutoConfiguration
Spring Boot 的核心注解:@SpringBootApplication
@EnableAutoConfiguration:打开自动配置的功能
@SpringBootConfiguration:组合了 @Configuration 注解,实现配置文件的功能

yaml和properties的区别

格式不同:yaml有缩进

优先级不同:properties>yaml

执行顺序不同:yaml>properties

MybatisPlus:是一个 MyBatis的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生

Spring Cloud:是一系列框架的集合,利用了Springboot的便携性对分布式的基础组件进行开发


Spring Cloud的优缺点
优点:
组件丰富,功能齐全;
微服务是跨平台,适用于任何语言
服务拆分细,耦合度低

缺点:
成本高


Spring Cloud的组成:服务注册与发现、服务网关、客户端负载均衡、服务调用、熔断限流、分布式统一配置管理
Naocs:服务注册与发现
Sentinel:是分布式服务架构的高可用流量防护组件,主要以流量为切入点,从限流、熔断降级、系统负载保护等多个维度来帮助开发者保障微服务的稳定性。
Gateway:网关服务,用来保护、增强和控制对于 API 服务的访问。
OpenFeign:实现负载均衡并且可调用其他服务
Xxl-Job:任务调度,可用来发送短信,统计账单,每隔多久执行一次等等.....

SQL调优:
1.在 group by 后面增加 order by null 就可以防止排序
2.可以使用连接来替代子查询
3.在 where 及 order by 涉及的列上建立索引
4.应尽量避免在 where 子句中对字段进行 null 值判断

Nginx:是一个轻量级高性能的反向代理Web服务器
正向代理和反向代理
正向代理:一个人发送一个请求直接就到了目标服务器上
反向代理:请求统一被Ngin接收,按照一定的规矩分发给后端的业务处理服务器进行处理了

负载均衡5中配置模式:
1.轮询:每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。
2.weight(权重):指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。
3.ip_hash(访问 ip 的 hash 结果分配):每个请求按访问 ip 的 hash 结果分配,这样每个访客固定访问一个后端服务器。
4.fair(响应时间):按后端服务器的响应时间来分配请求,响应时间短的优先分配。
5.url_hash(按访问url的hash):按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。

动静分离:静态页面与动态页面分开不同系统访问的架构设计方法。

RabbitMQ
1、什么是 rabbitmq
采用 AMQP 高级消息队列协议的一种消息队列技术,最大的特点就是消费并不需要确保提供方存在,实现了服务之间的高度解耦
2、为什么要使用 rabbitmq
(1)在分布式系统下具备异步,削峰,负载均衡等一系列高级功能;

(2)拥有持久化的机制,进程消息,队列中的信息也可以保存下来。

(3)实现消费者和生产者之间的解耦。

(4)对于高并发场景下,利用消息队列可以使得同步访问变为串行访问达到一定量的限流,利于数据库的操作。

(5)可以使用消息队列达到异步下单的效果,排队中,后台进行逻辑下单

3、使用 RabbitMQ 有什么好处?
(1)服务间高度解耦

(2)异步通信性能高

(3)流量削峰
4、Linux操作系统的常用命令
1.目录操作命令:mkdir、rmdir、cd、pwd

mkdir:创建目录

rmdir:删除目录(只能删除空目录)

cd:切换当前目录(改变当前目录)

pwd:显示当前目录的路径

2.文件操作命令:cat、touch、cp、mv、rm、diff
cat:显示文件,还可以连接两个或多个文件,形成新的文件

touch:修改文件的访问时间,如果文件不存在,则可以创建该文件

cp:复制文件或目录

mv:移动文件或目录,还可以重命名

rm:删除一个目录中的一个或多个文件

diff:逐行比较两个文本文件,列出其不同之处

5.Docker容器的常用命令
1、新建并启动容器:docker run
2、容器日志:docker logs
3、删除容器:docker rm
4、启动、重启、终止容器:docker start stop restart

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值