【一些面试题】持续更新

springboot

常用注解

参考:https://blog.csdn.net/qq_46138492/article/details/129476788?spm=1001.2014.3001.5502

SpringBootAplication : 用于标识Springboot应用程序的入口类
RestController :自动将返回值转换成json格式
RequestMapping:
GetMapping
postMapping
putMapping
DeleteMapping
RequestParam

springboot配置

先从springboot aplication.run方法开始,aplicationC

springboot 与redis的整合

pom文件

先是配置依赖

application.properties

SpringMVC

视图是view接口,视图的作用是渲染数据,将model中的数据展示给用户。
参考:https://blog.csdn.net/Laura__zhang/article/details/123514549

view

默认有转发视图和重定向视图。

jvm参数

redis

redis过期时间

redis 持久化

RDB 保存redis某一时刻的数据快照
AOF 记录过程,保存到文件中。
RDB 快照就是记录某一个瞬间的内存数据,记录的是实际数据,而 AOF 文件记录的是命令操作的日志,而不是实际的数据

索引

索引失效

尽量全职匹配,是指在使用复合索引时,查询条件要包含索引的所有列,才能最大限度的利用索引
遵循最佳最佳左前缀,查询是从最左边开始查询,不跳过中间索引
不在索引上做任何操作,比如说函数。!=,null都会导致索引失效
like以通配符开头会导致索引失效

索引类型

分为三大类:

数据结构维度:B+树索引、哈希索引、全文索引、R-Tree索引

物理存储维度: 聚集索引、非聚集索引

逻辑维度:主键索引、普通索引、唯一索引、联合索引

聚集索引和非聚集索引

都是采用平衡树作为索引的数据结构
聚集索引存放的物理顺序和列中的顺序一样,一般设置主键索引就为聚集索引。
通过聚集索引一次就能查询到数据,而非聚集索引显示查询到对应主键,在使用主键的值通过聚集索引查询。

回表

如果select所需获得列中有大量的非索引列,索引就需要到表中找到相应的列的信息。

拦截器的实现

1.自定义一个实现了Interceptor接口的类,或者继承抽象类AbstractInterceptor,
继承抽象类HanderInterceptorAdapter
2.在配置文件中注册定义拦截器
3.在需要使用的地方引用拦截器。

基本数据类型

多线程的状态

新建状态:分配了了必要资源,但是还没开始执行
就绪状态:调用start()方法后
运行状态:获取了cpu时间片开始执行
阻塞状态:等待输入输出、等待锁、等待信号量,并释放CPU时间片,等待条件满足进入就绪状态
等待状态: 调用wait,join方法而暂停执行,释放CPU时间片。
休眠状态:调用 sleep()
终止状态:run方法结束。

wait()方法:是Object类方法,可以被任意对象调用。需要notify(),notifyAll()唤醒

join()方法:是Thread类方法,只能被线程调用。

当一个线程对象调用另一个线程对象的join()方法时,调用线程会等待被调用线程执行完后继续执行。

jdk新特性

http状态码

1XX:表示请求已经被接受,继续处理

100 :服务器已经接受到请求的起始部分,客户端可以继续发送请求的剩余部分。

2XX:表示成功

200:服务器正常返回请求的内容

201:服务器已经创建了新的资源

204:请求成功但是服务器没有返回任何内容。

3XX:重定向状态码,表示需要进一步操作以完成请求

301:请求的资源已永久移动到新的URL

302:求的资源暂时移动到新的URL

304:客户端缓存的资源未修改

4XX:客户端错误状态码

400:请求无效,服务器无法理解

401: 请求要求身份验证

404:请求的资源不存在

5XX:服务器错误状态码

500:服务器内部错误,无法完成请求

503:服务器暂时无法处理请求

java中集合如何排序

数组:Arrays.sort

List:

Collections.sort() /不建立新的对象

实现Comparable接口的compareTo方法

Lambda表达式

使用Stream流

常见异常

编译时异常

ClassNotFoundException

运行时异常

算术逻辑异常:例如除数不能为0

空指针异常:未初始化;

数组下标越界: 超出索引范围

类型转换异常 : 将数字类型转换成字符类型;将一个对象投射到一个子类

数字格式化异常 :将String类中的非数字内容转换成数字;超出转换类型的数值范围

switch btye long ,String

支持 byte,String 不支持long

因为switch底层使用的是int型来进行判断的,即使是枚举、String类型,最终也是转变成int型。由于long型表示范围大于int型,因此不支持long类型。

构造方法是否可以被重写

构造方法不能重写但是可以重载。

重写方法名一致。而类的构造方法和类名一致。如果子类可以重写父类的构造方法,那么子类和父类的类名是一致的。这是错误的。

jdk jre 的区别

jdk是整个java的核心,包括了jre(java运行环境),Java开发工具,Java基础类库。
面向人群不同:JDK是给程序员使用的,JRE是提供给运行java程序的用户使用的
安装目录不同:
如果安装JDK,电脑会有两套JRE,一套是JDK中的JRE,位于 \jre 目录下。另外一套是JRE自己的,在下载安装时默认位于 C:\Program Files\Java\jre目录下。

Git

git init 初始化

git add 添加

git commit - m 提交到本地仓库

git log 查看提交历史记录

git checkout . 恢复所有修改

git checkout file 恢复单个文件

工作目录——暂存区域——本地仓库

Session Cookie

cookie + 数据库
数据库

保存到session

Session区域中为每个用户划分了独属区域。
SessionId保存到cookie返回给浏览器
浏览器记下sessionid,每次请求携带所有cookie(cookie是k-v结构)

保存到cookie

发送到后台,有个setCookie的操作。
去结算。(登录后再同步到数据库)

抽象类、接口

1.定义的关键字不同 interface abstract
2.子类继承和实现的关键字不同 extends impl
3.类型扩展不同:抽象类是单基础,接口是多继承
4.方法访问控制符 :抽象类无限制,只是抽象类中的抽象方法不能用private修饰;而接口有限制,接口默认的是public 控制符
5. 属性方法控制符:抽象类无限制,而接口有限制,接口默认的是public控制符。
6.
7.

hashmap

是线程安全的吗?举例

从两个方面考虑:操作的原子性和内存的可见性。
原子性意味着不可分割,也就是说多个不可分割的操作同时只能被一个线程执行。
内存的可见性:一个线程对共享变量进行了修改,其他的线程不能立刻看到共享变量的最新值。
https://zhuanlan.zhihu.com/p/374510765

hashmap和hashtable的区别

继承的父类不同
hashmap是线程不安全的
hashtable是线程安全的
hashmap没有contains方法
hashtable有cintains方法
hashmap允许key value为null
hashtable不允许键值对为空
计算hash值方法不同:hashmap是先调用hashcode再进行异或
hashtable是计算key的hashcode(_)
扩容方法不同:
hashmap哈希扩容必须要求为原容量的2倍,而且一定是2的幂次倍扩容的结果,而且每次扩容时,原来数组中的元素依次重新计算存放位置,并重新插入。
而hashtable扩容为原容量的2倍加1
hashmap会树化和退化
hashtable是以链表的形式存储的。

底层

hashset底层是hashmap
hashmap底层是数组+链表,JDK8后加了红黑树。(只有当链表中元素的个数大于8,并且数组的长度大于等于64时才会将链表转为红黑树)

树化和退化

hashmap的实现中,当链表的长度超过阈值(默认为8)的时候就换转化为红黑树,当低于6的时候红黑树就会退化为链表,减少了时间与空间。

如何实现线程安全的map

使用读写锁
使用synchronized关键词,但是性能差
使用volatile关键字 :可见性、禁止指令重拍、不保证原子性。

synchronized

是一种悲观锁。具有同步功能,是一种互斥锁。
他的机制是在读取数据前先获取锁。

修饰普通方法和修饰静态方法

修饰普通方法:锁对象是this对象。
在一个synchronized修饰的普通方法中,如果使用不同的对象去访问,那么结果可能是不会同步的。
修饰静态方法; 锁的对象是class字节码文件对象
在一个synchronized修饰的静态方法中,如果使用不同的对象去访问,那么结果是同步的

版本号机制

版本号机制是在数据表中加上一个version字段来实现的,表示数据被修改的次数。当执行写操作并且成功写入时,version +1。当线程A要更新数据时,在读取数据的同时,也会读取version值。在提交更新时,只有读取的version值和当前数据库中的version值相等时才会更新。

可重入锁 ReentrantLock的底层原理实现

ReetrantLock底层使用了CAS和AQS队列的实现。

乐观锁

实现方法

版本号机制和CSA

CAS

需要读写的内存值V
进行比较的值 A
拟写入的新值 B

动态代理

JDK动态代理

利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理。

CGlib动态代理

利用ASM(开源的Java字节码编辑库,操作字节码)开源包,将代理对象类的class文件加载进来,通过修改其字节码生成子类来处理。

区别

1.JDK代理使用的是反射机制实现aop的动态代理,CGLIB代理使用字节码处理框架asm,通过修改字节码生成子类。所以jdk动态代理的方式创建代理对象效率较高,执行效率较低,cglib创建效率较低,执行效率高;
2.JDK动态代理机制是委托机制,具体说动态实现接口类,在动态生成的实现类里面委托hanlder去调用原始实现类方法,CGLIB则使用的继承机制,具体说被代理类和代理类是继承关系,所以代理类是可以赋值给被代理类的,如果被代理类有接口,那么代理类也可以赋值给接口。
————————————————
版权声明:本文为CSDN博主「编码小农」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_36759405/article/details/82770422

springbean

默认是单例的吗

是。
单例的bean只有第一次会创建新的bean,后面会复用该bean,所以不会频繁的创建对象。
原型的bean每次都会创建新的。

单例bean的优势/劣势

优势:减少了新生成实例的消耗、减少了jvm垃圾回收、可以快速获取到bean
劣势: 不能做到线程安全

什么时候用多例bean

之所以用单例,是没必要每个请求建立一个新的对象,消耗CPU和内存,提高性能
之所以用多例,是为了防止并发问题。即一个请求改变了对象的状态,此时对象又处理另一个请求,而之前请求对对象状态的改变会导致对象对另一个请求做出错误的处理。

数据库设计

字段冗余设计

订单表中有商品信息(商品名)
:查多改少的场景,适合用字段冗余。
在订单表中,有订单号信息和商品信息。一般是将订单表和商品表关联。但是查看订单的操作频繁,可以 用字段冗余去简化数据库查询。

BigDecial

舍入模式

round_up :进位制:不管保留数字后面是大是小 (0 除外) 都会进 1。结果会向原点的反方向对齐,正数向正无穷方向对齐,负数向负无穷方向对齐。
round_down:舍去制,截断操作,后面所有数字直接去除。结果会向原点方向对齐。
round_half_up :根据保留数字后一位 >=5 进行四舍五入。如果舍弃部分的最高位大于等于 5,向原点反方向对齐,否则向原点方向对齐。
round_half_down :根据保留数字后一位 >5 进行五舍六入。如果舍弃部分的最高位大于 5,向原点反方向对齐,否则向原点方向对齐。这种模式也就是我们常说的 “五舍六入”。
round_ceiling : 向正无穷方向对齐,转换为正无穷方向最接近的数值。如果为正数,行为和 ROUND_UP 一样;如果为负数,行为和 ROUND_DOWN 一样。此模式不会减少数值大小。
round_floor :向负无穷方向对齐。如果为正数,行为和 ROUND_DOWN 一样;如果为负数,行为和 ROUND_UP 一样。此模式不会增加数值大小。
round_half_even : 四舍六入五成双,如果舍弃部分的最高位大于等于六,或等于五并且前一位是奇数,向原点反方向对齐,否则向原点方向对齐。
如果舍弃部分左边的数字为奇数,则作 ROUND_HALF_UP;如果为偶数,则作 ROUND_HALF_DOWN。

round_unnecessary :断言请求的操作具有精确的结果,因此不需要舍入。如果对获得非精确结果的操作指定此舍入模式,则抛出 ArithmeticException。
参考:https://blog.csdn.net/piaoranyuji/article/details/116594403

雪花算法优缺点

优点:
系统环境ID不重复
生成效率高
保证基本有序递增(时间戳)
不依赖于第三方库
缺点:依赖于服务器时间,服务器时钟回拨时可能会生成重复的ID

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值