【面试】面试复盘

自我介绍、职业规划

...

1、数据库的查询优化

SQL语言–语句优化总结

2、redis的之持久化与非持久化的区别

redis-cli -h localhost -p 6379

redis的持久化有两种模式:
RDB(Redis DataBase):默认开启
此模式,会在redis的相关目录(在redis的命令行模式下可以通过 config get dir 获取)下面存储 dump.rdb 文件,当redis启动的之后就会读取这个配置文件。

优点:RDB对外 redis对外提供的读写服务 影响较小,使得redis的性能更高。相对AOF模式而言,基于RDB模式的数据文件恢复redis的数据更快
缺点:一般来说,RDB数据快照文件,都是每隔5分钟,或者更长时间生成一次,这个时候就得接受一旦redis进程宕机,那么会丢失最近5分钟的数据。


AOF(Append Only File):默认不开启
AOF 可以弥补RDB的数据不一致的问题(RDB可能会丢失5分钟的数据),AOF采用的是日志的形式来记录写操作,并追加到文件中,redis重启之后,就会根据日志文件记录的写指令,从前往后执行一次,从而恢复数据。
开启AOF我们可以在 redis.config 中开启appendonly即可(默认是no,设置yes即可),在 config get dir 得到的目录下回生成 appendonly.aof 文件。AOF 文件可以通过 redis-check-aof --fix appendonly.aof 进行修复。

redis持久化的两个方式:save 、 bgsave
save 的方式,会阻塞主进程,导致客户端临时无法连接redis,等到save结束之后,才会重新连接客户端。
bgsave 是fock一个save子进程,通过这个子进程进行保存操作,等到保存结束后通知主进程,子进程会被杀死,在此期间客户端与redis保持畅通。

触发持久化的条件:
1、执行bgsave命令后
2、执行flushall命令后(Flushall 命令用于清空整个 Redis 服务器的数据)。
3、满足save的规则时
4、退出redis时

3、面向对象的三大特征

封装、继承、多态

4、设计模式(单例模式、工厂模式、原型模式、适配器模式、过滤器模式)

单例模式:(懒汉模式、饿汉模式)
https://www.runoob.com/design-pattern/singleton-pattern.html
懒汉模式:你需要的时候,给你创建(通过一个if语句,判断是不是null,static类型)
饿汉模式:创建创建实例的时候就给你创建了(static类型)

工厂模式:
https://www.runoob.com/design-pattern/factory-pattern.html通过定义一个统一的Interface,多个类进行实现这个interface,用户在创建实例的时候,携带参数,Class 通过你携带的参数进行判断你要创建那个具体的类,用到了类的多态的特性。

原型模式:
https://www.runoob.com/design-pattern/prototype-pattern.html
使得一个抽象父类实现Cloneable接口,父类中定义这一类别该有的属性和方法,同时重写clone方法。并自定义其他类继承这个抽象父类。
我们可以自定义一个loadCache类提前将会被用到的“继承了抽象父类的子类”进行实例化,并保存在Map中,之一Map的key,为了保证唯一性,你可使用子类的hashCode。
这样的话,当用户要对某一个类进行实例化时,可以通过loadCache进行获取。

适配器模式:
https://www.runoob.com/design-pattern/adapter-pattern.html
图片的格式有jpg、png、gif格式,对于不同格式的数据的处理方式不同,我希望一个类可以同时实例上述的三种类型的数据。那么可以使用适配器模式

过滤器模式:
https://www.runoob.com/design-pattern/filter-pattern.html
通过过滤器模式我们可以将一大批类进行分类。比如,具有gender属性的同一类型的类,我们将这一批类存入list中。然后定义一个interface为Filter,其中有filteGenderr方法,使得GetMale类实现这个Filter,其中进行过滤存放一批类的集合,并将符合条件的实例存放在另一个结合中,并返回。此时,对于一个存有一批类的集合,我们通过 GetMale.filterGender(List list)就可以获取到所有的男性实例对象。

5、springboot中如何读取配置文件中的数据

第一种,通过注解@Value进行获取

 @Value("${string.port}")     
 private int intPort;

第二种,通过注解@Configuration、@PropertySource、@ConfigurationProperties

@Configuration
@PropertySource("classpath:config/my.prop")
@ConfigurationProperties(prefix = "aaa")
public class PropConf {

    private String a;
    private String b;
    private String c;

    public String getA() {return a;}
    public void setA(String a) {this.a = a;}
    public String getB() {return b;}
    public void setB(String b) {this.b = b;}
    public String getC() {return c;}
    public void setC(String c) {this.c = c;}
}

6、数据库中的常用函数

数学函数
round(,) : 四舍五入
ceil() : 向上取整
floor() : 向下取整
mod(,) : 取模
rand() : 随机数
sum() :求和
avg() :平均数
min() :最小值
max() :最大值
count() : 计算记录的数量

字符串函数:
concat(字段1,连接符,字段2) : 连接
length() : 获取长度
upper() : 全大写
lower() : 全小写
subString(字段,start_index,len) : 截取子串
trim() :去除前后空格
replace(字段,带替换字符,替换字符):替换

去重 distinct(字段)

7、mybatis中mappering.xml中的标签

8、java中的包装类(int的取值分为)

ByteShortIntegerLongFloatDoubleBooleanCharacter

9、String转int,int转String的方法,以及可能会出现的异常

String转int:
Integer.valueOf(str):Integer
Integer.parseInt(str):int

异常:
formnull

11、如何保证mysql与redis之间的数据一致性问题

我一般会先进行存储redis,然后设置一个定时任务,去更新数据库,这样的话会导保证数据的最终一致性,当然对于一些实时一致性的数据会进行同步更新。

12、ArrayList与LinkList的区别于联系,以及二者的优缺点

一个是用数组实现的,一个使用链表实现的。
如果数据需要频繁的进行更新,建议使用ArrayList,因为ArrayList可以通过索引快速的获取目标元素。而LinkList需要通过遍历获取指定的元素。ArrayList的效率要高于LinkList

如果如需进行平凡的删除(任意),那么建议使用LinkList,因为这样会节省大量的内存。

当然上述只是进行总体的概括, 一些细节或者特殊需求还是要根据情况而定。

13、HashMap的分类以及实现原理

HashMap 、TreeMap
HashMap是使用数组+链表实现的
Tree是使用红黑树实现的

14 、set的分类以及实现原理

HashSet 、TreeSet
HashSet底层使用HashMap实现,使用了数组和链表实现。
TreeSet使用TreeMap实现,使用了红黑树数据结构。

15、IO流的分类

IO流的分类与应用选择
在这里插入图片描述

设置字符集:
new OutputStreamWriter(new FileOutputStream(new File("")),"UTf-8")
new InputStreamReader(new FileInputStream(new File("")), "UTF-8")

16、elasticsearch中的结构

_index:相等于Mysql中的库

_type:相当于mysql中库中的表

_id:记录数

_score:相当于权重

17、rabbitmq的应用

异步处理:当项目中使用的rabbitmq后,把消息推送给后并不会等待对方接收后才进行下一步,所以是异步的,具体应用:发送注册邮件、发送注册短信

应用解耦:MQ可以作为中间件,订单系统写入消息到MQ,库存系统去订阅MQ中的的消息。
在这里插入图片描述

流量削峰:秒杀活动,一般会因为流量过大,导致应用挂掉,为了解决这个问题,一般在应用前端加入MQ。用户的请求,服务器收到之后,首先写入MQ,假如消息队列长度超过最大值,则直接抛弃用户请求或跳转到错误页面。

跨语言开发:MQ作为中间件支持多语言访问,在跨语言开发中,可以利用MQ作为消息管道,处理多语言之间的数据交互问题。

18、二叉搜索树的优缺点

19、队列和栈的应用场景

队列:比如有些任务很耗时但不得不做,那么你可能放在一个队列里,使用一个线程每一次从队列里取出一个并执行。
:浏览器的后退功能是典型的栈应用

20、AJax与Axios特点

Ajax本身适用于MVC模式,不太符合前端的MVVM的模式。

JQuery整个项目太大,单纯使用ajax却要引入整个JQuery非常的不合理

axios是通过promise实现对ajax技术的一种封装,就像jQuery实现ajax封装一样。

简单来说: ajax技术实现了网页的局部数据刷新,axios实现了对ajax的封装。axios是ajax ,ajax不止axios。

21、Spring5中的依赖注入(DI)和反向控制(IOC)

【Spring】IOC(控制反转)和DI(依赖注入)的深度总结

IOC是一种程序设计思想,在传统的javaSE中我们想要获取一个对象,需要手动去new一个,从我们的角度来说这属于一个正向。二反向控制是我们一个一个的类交给spring容器(IOC容器)管理,类的实例化有Spring容器去负责。至于spring容器是如何实现实例化对象的——在javaSE中我们知道反射是可以控制类的实例化与执行类中的方法的,所以Spring容器实例化对象其实是通过反射实现的。

至于DI,因为IOC是反向控制,IOC控制什么——控制一个一个的对象,这些对象不是凭空出现的,而是我们进行注入的一个一个的Bean——DI。

一句话总结,IOC是一种设计模式,而DI更像是一种实现这种模式的方式。

22、阐述一下你对 “面向对象” 的理解

从思想上而言:面向对象是对现实事物的抽象化,常言 “万物皆对象”,现实生活中的一个一个实体对应着面向对象语言中的一个一个的实体类。

从代码上而言:面向对象与面向过程的区别,面向对象通过把 方法和变量 进行封装 将原本抽象作用的实体进行了具体的封装,通过对象之间的继承使得一组具有相同特性的实体产生了联系。

23、JVM的了解

https://blog.csdn.net/m0_45067620/article/details/123720463

24、Nginx中的反向代理、负载均衡

https://blog.csdn.net/m0_45067620/article/details/123901829

23、myBatis中的xxxMapper.xml中常用的标签

https://blog.csdn.net/m0_45067620/article/details/118104608

select

update

insert

delete

where

choose

set

foreach

24、参与的项目中的技术栈以及一些细节

一般会根据自己负责项目中的一些内容展开讯问【功能的实现原理、技术栈中的一些应用(例如:如何实现缓存数据库的数据的同步)、相关技术栈的特点一些(如:redis中持久化的模式(AOF、RDB)并说明二者的优缺点)】

25、八大基本数据类型以及对应的包装类

略...

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值