面试题临时准备

==与equals的区别

首先介绍一下==号:
①它常用于比较数值类型,不做多解释。
②当它用于比较**对象**时,它比较的是个**对象**的**地址值**。

equals:
从源码知道,equals()方法存在于Object类中,然而,源码中底层也是用的==号来实现的。但是通过学习,咱们都知道,java大多数类,都是重写了equals方法。
**重写后的equals()方法一般都是比较两个对象的值**(可以去看源码)。
**如果没有重写equals()方法,那么底层也是通过 (等等号)来实现的。**

当你想去比较相等时:
①如果是**数值型**使用==号
②当比较**字符串**是否相等时,需要使用equals

String是否可以被继承?为什么?

不可以,String是final修饰的。

String、StringBuffer、StringBuilder之间关系

String    
String的值是不可变的,这就导致每次对String的操作都会生成新的String对象,不仅效率低下,而且浪费大量优先的内存空间(不可变)

StringBuffer    
 StringBuffer是可变类,和线程安全的字符串操作类,任何对它指向的字符串的操作都不会产生新的对象。每个StringBuffer对象都有一定的缓冲区容量,当字符串大小没有超过容量时,不会分配新的容量,当字符串大小超过容量时,会自动增加容量 (可变   线程安全   多线程操作字符串  )
 
StringBuilder(可变类,速度更快   可变   线程不安全   单线程操作字符串)

常用线程池:

newCachedThreadPool、newFixedThreadPool、newSingleThreadExecutor、newScheduleThreadPool

线程池机制(为什么用线程池?)

1、降低资源消耗。通过重复利用已创建的线程降低线程创建、销毁线程造成的消耗。

2、提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。

3、提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配、调优和监控

多线程中的wait与sleep区别?

sleep和wait都是用来进行线程控制,他们最大本质的区别是:
            sleep()不释放同步锁,wait()释放同步锁.   
            sleep(milliseconds)可以用时间指定来使他自动醒过来,如果时间不到你只能调用interreput()来强行打断;
            wait()可以用notify()直接唤起.
深拷贝(深拷贝方法clone())
浅拷贝
Student stu1 = new Student(); 
stu1.setNumber(12345); 
Student stu2 = stu1; 

单例模式

特点:
类构造器私有
持有自己类型的属性
对外提供获取实例的静态方法

单例模式的五种写法
懒汉式:
在这里插入图片描述
饿汉式:
在这里插入图片描述
双检锁:
在这里插入图片描述
静态内部类:
在这里插入图片描述
枚举:
在这里插入图片描述
String s = new String(“abc”)生成了几个对象?

String s = new String(“abc”)生成了2个对象
String s = “abc”生成了1个对象

Spring:
IOC与DI

控制反转(Inversion of Control),不是什么技术,而是一种设计思想。
即创建被调用的实例不是由调用者完成,而是由Spring容器完成,并注入调用者。
IOC和DI有什么关系呢?其实它们是同一个概念的不同角度描述,由于控制反转概念比较含糊(可能只是理解为容器控制对象这一个层面,很难让人想到谁来维护对象关系),所以2004年大师级人物Martin Fowler又给出了一个新的名字:“依赖注入”,相对IOC 而言,“依赖注入”明确描述了“被注入对象依赖IOC容器配置依赖对象”。

AOP:

AOP就是将程序功能中的频繁出现或者与主业务逻辑代码相关度不高的代码抽离出来,通过切面编程的方式在想要调用的时候引入调用的思想。

这种思想的实现机制在Spring中便是应用了java的动态代理和java的反射。在实际编程中,我们通常会遇到一些交叉业务逻辑(比如:日志,事务,安全等等),这是我们就可以封装一个封面,然后注入到目标对象(具体的业务逻辑)中去。

很多方法都会抛出异常信息,这是我们就可以写一个拦截器,在这个类中实现记录错误日志的功能,再在Spring的xml配置文件中配置一个对这些要记录日志的方法的AOP拦截器,在这个方法执行后调用这个拦截器来记录日志。这样就不用每次抛出异常都要手动的去单独处理记录,提高了程序的内聚性。这种在调用某个方法之前/后想要自动执行一系列自定义操作的就是AOP思想。

Spring事务的理解

Spring支持编程式事务管理以及声明式事务管理两种方式
1. 编程式事务管理
编程式事务管理是侵入性事务管理,使用TransactionTemplate或者直接使用PlatformTransactionManager,对于编程式事务管理,Spring推荐使用TransactionTemplate。

2. 声明式事务管理
声明式事务管理建立在AOP之上,其本质是对方法前后进行拦截,然后在目标方法开始之前创建或者加入一个事务,执行完目标方法之后根据执行的情况提交或者回滚。

SpringMVC的 理解
在这里插入图片描述

Mybatis

Mybatis 是一个半 ORM(对象关系映射)框架,它内部封装了 JDBC,
开发时只需要关注 SQL 语句本身
MyBatis 可以使用 XML 或注解来配置和映射原生信息
Mybaits 的优点
基于 SQL 语句编程,相当灵活
很好的与各种数据库兼容
能够与 Spring 很好的集成
提供映射标签,支持对象与数据库的 ORM 字段关系映射;提供对象关系映射标签,支持对象关系组件维护
MyBatis 框架的缺点
SQL 语句的编写工作量较大,尤其当字段多.关联表多时
SQL 语句依赖于数据库,导致数据库移植性差,不能随意更换数据库
 MyBatis 与 Hibernate 有哪些不同?
Mybatis和hibernate不同,它不完全是一个ORM框架,因为MyBatis需要程序员自己编写 Sql 语句
Mybatis 直接编写原生态 SQL,可以严格控制 SQL 执行性能,灵活度高
Hibernate 对象/关系映射能力强,数据库无关性好,如果用 Hibernate 开发可以节省很多代码,提高效率。
#{}和${}的区别是什么
	#{}是预编译处理,${}是字符串替换。
	
	Mybatis 在处理#{}时,会将 sql 中的#{}替换为?号,调用PreparedStatement 的 set 方法来赋值
	Mybatis 在处理${}时,就是把${}替换成变量的值。
	
	***使用#{}可以有效的防止 SQL 注入,提高系统安全性。***
Mybatis 是如何将SQL 执行结果封装为目标对象并返回的
    第一种是使用<resultMap>标签,逐一定义数据库列名和对象属性名之间的映射关系
    第二种是使用<resultType>标签和 SQL 列的别名功能,将列的别名书写为对象属性名
Mybatis 动态 SQL 有什么用?执行原理?有哪些动sql
	以标签的形式编写动态 sq,执行原理是根据表达式的值 完成逻辑判断并动态拼接 sql 的功能。
	trim | where | set | foreach | if | choose | when | otherwise | bind
select|insert|updae|delete 标签之外,还有哪些标签?
<resultMap>.<parameterMap>.<sql>.<include>.<selectKey>,<sql>,<include>
 MyBatis 实现一对一有几种方式
	 在 resultMap 里面配置 association 节点配置一对一的类就可以完成;
	resultMap 里面的 collection 节点配置一对多的类就可以完成
 Mybatis 是否支持延迟加载
 lazyLoadingEnabled=true|false。
 Mybatis 的一级.二级缓存
 1)一级缓存: 基于 PerpetualCache 的 HashMap 本地缓存,其存储作
用域为 Session,当 Session flush 或 close 之后,该 Session 中的所有
Cache 就将清空,默认打开一级缓存且不能关闭。 
2)二级缓存与一级缓存其机制相同,默认也是采用 PerpetualCache,
HashMap 存储,不同在于其存储作用域为 Mapper(Namespace),并且可自
定义存储源,如 Ehcache。默认不打开二级缓存,要手动开启二级缓存,使用
二级缓存属性类需要实现Serializable序列化接口(可用来保存对象的状态),可在
它的映射文件中配置<cache/> ;
3)对于缓存数据更新机制,当某一个作用域(一级缓存 Session/二级缓存
Namespaces)的进行了 C/U/D 操作后,默认该作用域下所有 select 中的缓存
将被 clear
 Mybatis 的 Xml 映射文件中,不同的 Xml 映射文件,id 是否可以重复
 不同的 Xml 映射文件,如果配置了 namespace,那么 id 可以重复;如果没有配置 namespace,那么 id 不能重复;
 原因就是 namespace+id

SQL查询调优:

1、根据查询条件建立索引
2、不使用count(*),使用count(字段)
3、可以使用视图
4、WHERE子句中过滤最大数据的条件放到最后
5、From子句中数据最少的表放最后

SQL插入调优。
批量插入
Mybatis中可以通过 foreach标签实现。

事务:

简单来说事务就是一系列操作,要成功都成功,不成功都不成功。回退到初始状态。
数据库事务(Database Transaction)

对docker与nginx有了解吗

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。

Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。

springboot中怎么开启事务

1 在入口类使用注解@EnableTransactionManagement开启事务
2 在访问数据库的service方法上添加注解@Transactional即可

式系统中数据表怎么存储视频,图片的地址

Nginx反向代理方式实现,数据库中存储地址时需要带IP,端口目前不确定是否需要带上。

中间件产品:

消息中间件MQ,也称之为消息队列,分为点对点和发布/订阅模式,常用于异步通信,主要组成:
1)Broker
消息服务器,作为server提供消息核心服务
2)Producer
消息生产者,业务的发起方,负责生产消息传输给broker,
3)Consumer
消息消费者,业务的处理方,负责从broker获取消息并进行业务逻辑处理
4)Topic
主题,发布订阅模式下的消息统一汇集地,不同生产者向topic发送消息,由MQ服务器分发到不同的订阅者,实现消息的       广播
5)Queue
队列,PTP模式下,特定生产者向特定queue发送消息,消费者订阅特定的queue完成指定消息的接收
6)Message
消息体,根据不同通信协议定义的固定格式进行编码的数据包,来封装业务数据,实现消息的传输

微服务:

Spring Cloud微服务架构是对现有成熟框架”Spring Boot化”的封装和抽象,提供一系列封装好的包括服务注册中心(Spring Cloud Eureka)、配置中心(Spring Cloud Config)、服务网关(Spring Cloud gateway)、鉴权中心等。
服务注册中心,微服务核心之一,提供注册服务,整合微服务。
配置中心,微服务核心之一,为各服务提供灵活的文件配置。
鉴权中心,微服务核心之一,提供权限认定服务。
网关中心,微服务核心之一,提供路由和过滤器功能,是各种服务的统一入口。

相对独立的子系统或功能模块,与其他系统/模块弱耦合的,可以划分为独立的微服务。

负载均衡时一台服务器异常,如何处理?

Spring Cloud Eureka本身是高可用,在一台服务器异常时,会通过融断机制,返回设定的提示信息。
之后会将所有请求转到另一台服务器上。
同时会定时去检查异常服务器是否恢复,如果恢复则重新接入,进行负载均衡。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值