2022 12月12日 每日面试题

简介: 2022 12月12日 每日面试题

正文开始 ----------


2022 12月12日 每日面试题

1、简单介绍Spring

1.Spring框架包含众多模块,如Core、Testing、Data Access、Web Servlet等,其中Core是整个Spring框架的核心模块。Core模块提供了IoC容器、AOP功能、数据绑定、类型转换等一系列的基础功能,而这些功能以及其他模块的功能都是建立在IoC和AOP之上的,所以IoC和AOP是Spring框架的核心。


2.IOC(Inversion of Control)是控制反转的意思,这是一种面向对象编程的设计思想。在不采用这种思想的情况下,我们需要自己维护对象与对象之间的依赖关系,很容易造成对象之间的耦合度过高,在一个大型的项目中这十分的不利于代码的维护。IoC则可以解决这种问题,它可以帮我们维护对象与对象之间的依赖关系,降低对象之间的耦合度。


说到IOC就不得不说DI(Dependency Injection),DI是依赖注入的意思,它是IoC实现的实现方式,就是说IoC是通过DI来实现的。由于IoC这个词汇比较抽象而DI却更直观,所以很多时候我们就用DI来代替它,在很多时候我们简单地将IoC和DI划等号,这是一种习惯。而实现依赖注入的关键是IoC容器,它的本质就是一个工厂。

AOP(Aspect Oriented Programing)是面向切面编程思想,这种思想是对OOP的补充,它可以在OOP的基础上进一步提高编程的效率。简单来说,它可以统一解决一批组件的共性需求(如权限检查、记录日志、事务管理等)。在AOP思想下,我们可以将解决共性需求的代码独立出来,然后通过配置的方式,声明这些代码在什么地方、什么时机调用。当满足调用条件时,AOP会将该业务代码织入到我们指定的位置,从而统一解决了问题,又不需要修改这一批组件的代码。

2、介绍一下MyBatis的缓存机制

一级缓存也称为本地缓存,它默认启用且不能关闭。一级缓存存在于于SqlSession的生命周期中,即它是SqlSession级别的缓存。在同一个 SqlSession 中查询时,MyBatis 会把执行的方法和参数通过算法生成缓存的键值,将键值和查询结果存入一个Map对象中。如果同一个SqlSession 中执行的方法和参数完全一致,那么通过算法会生成相同的键值,当Map缓存对象中己经存在该键值时,则会返回缓存中的对象。

二级缓存存在于SqlSessionFactory 的生命周期中,即它是SqlSessionFactory级别的缓存。若想使用二级缓存,需要在如下两处进行配置:

在MyBatis 的全局配置settings 中有一个参数cacheEnabled,这个参数是二级缓存的全局开关,默认值是true ,初始状态为启用状态。

MyBatis 的二级缓存是和命名空间绑定的,即二级缓存需要配置在Mapper.xml 映射文件中。在保证二级缓存的全局配置开启的情况下,给Mapper.xml 开启二级缓存需要在Mapper. xml 中添加如下代码: 二级缓存具有如下效果: - 映射语句文件中的所有SELECT 语句将会被缓存。

映射语句文件中的所有时INSERT 、UPDATE 、DELETE 语句会刷新缓存

3、请你说说String类,以及new

String类是Java最常用的API,它包含了大量处理字符串的方法,比较常用的有:

char charAt(int index):返回指定索引处的字符;

String substring(int beginIndex, int endIndex):从此字符串中截取出一部分子字符串;

String[] split(String regex):以指定的规则将此字符串分割成数组;

String trim():删除字符串前导和后置的空格;

int indexOf(String str):返回子串在此字符串首次出现的索引;

int lastIndexOf(String str):返回子串在此字符串最后出现的索引;

boolean startsWith(String prefix):判断此字符串是否以指定的前缀开头;

boolean endsWith(String suffix):判断此字符串是否以指定的后缀结尾;

String toUpperCase():将此字符串中所有的字符大写;

String toLowerCase():将此字符串中所有的字符小写;

String replaceFirst(String regex, String replacement):用指定字符串替换第一个匹配的子

String replaceAll(String regex, String replacement):用指定字符串替换所有的匹配的子串。

String类是由final修饰的,所以他不能被继承。 创建字符串有两种方式,一种是使用字符串直接量,另一种是使

new关键字,当使用字符串直接量的方式来创建字符串时,JVM会使用常量池来管理这个字符串,当使用new关键字来创建字符串时,JVM会先使用常量池来管理字符串直接量,再调用String类的构造器来创建一个新的String对象,新创建的String对象会被保存在堆内存中。对比来说,采用new的方式会多创建出一个对象来,占用了更多的内存 ,所以建议采用直接量的方式来创建字符串。

4、说说你对ArrayList的理解

ArrayList是基于数组实现的,它的内部封装了一个Object[]数组。 通过默认构造器创建容器时,该数组先被初始化为空数组,之后在首次添加数据时再将其初始化成长度为10的数组。我们也可以使用有参构造器来创建容器,并通过参数来显式指定数组的容量,届时该数组被初始化为指定容量的数组。

如果向ArrayList中添加数据会造成超出数组长度限制,则会触发自动扩容,然后再添加数据。扩容就是数组拷贝,将旧数组中的数据拷贝到新数组里,而新数组的长度为原来长度的1.5倍。 ArrayList支持缩容,但不会自动缩容,即便是ArrayList中只剩下少量数据时也不会主动缩容。

如果我们希望缩减ArrayList的容量,则需要自己调用它的trimToSize()方法,届时数组将按照元素的实际个数进行缩减。

5、HashMap的实现原理

HashMap 基于 Hash 算法实现的,我们通过 put(key,value)存储,get(key)来获取。当传入 key 时,HashMap 会根据 key. hashCode() 计算出 hash 值,根据 hash 值将 value 保存在 bucket 里。当计算出的 hash 值相同时,我们称之为 hash 冲突,HashMap 的做法是用链表和红黑树存储相同 hash 值的 value。当 hash 冲突的个数比较少时,使用链表否则使用红黑树。


6、HashSet的实现原理

HashSet 是基于 HashMap 实现的,HashSet 底层使用 HashMap 来保存所有元素,因此 HashSet 的实现比较简单,相关 HashSet 的操作,基本上都是直接调用底层 HashMap 的相关方法来完成,HashSet 不允许重复的值。


7、ThreadLocal 是什么?有哪些使用场景?

ThreadLocal 为每个使用该变量的线程提供独立的变量副本,所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本。


ThreadLocal 的经典使用场景是数据库连接和 session 管理等。


8、说一下 synchronized 底层实现原理?

ynchronized 是由一对 monitorenter/monitorexit 指令实现的,monitor 对象是同步的基本实现单元。在 Java 6 之前,monitor 的实现完全是依靠操作系统内部的互斥锁,因为需要进行用户态到内核态的切换,所以同步操作是一个无差别的重量级操作,性能也很低。但在 Java 6 的时候,Java 虚拟机 对此进行了大刀阔斧地改进,提供了三种不同的 monitor 实现,也就是常说的三种不同的锁:偏向锁(Biased Locking)、轻量级锁和重量级锁,大大改进了其性能。


9、深拷贝和浅拷贝的区别是什么 ?

浅克隆:当对象被复制时只复制它本身和其中包含的值类型的成员变量,而引用类型的成员对象并没有复制。

深克隆:除了对象本身被复制外,对象所包含的所有成员变量也将复制。

10、Session的工作原理

session 的工作原理是客户端登录完成之后,服务器会创建对应的 session,session 创建完之后,会把 session 的 id 发送给客户端,客户端再存储到浏览器中。这样客户端每次访问服务器时,都会带着 sessionid,服务器拿到 sessionid 之后,在内存找到与之对应的 session 这样就可以正常工作了。


目录
相关文章
|
NoSQL Java 编译器
面试题30天打卡-day26
面试题30天打卡-day26
48 0
|
Java 关系型数据库 MySQL
面试题30天打卡-day03
面试题30天打卡-day03
27 0
|
JavaScript 前端开发 Java
面试题30天打卡-day05
面试题30天打卡-day05
43 0
|
消息中间件 存储 NoSQL
面试题30天打卡-day23
面试题30天打卡-day23
34 0
|
Java 数据库连接 数据库
面试题30天打卡-day06
面试题30天打卡-day06
41 0
|
存储 缓存 NoSQL
面试题30天打卡-day19
面试题30天打卡-day19
38 0
|
NoSQL 前端开发 Java
面试题30天打卡-day12
面试题30天打卡-day12
40 0
|
缓存 Dubbo Java
面试题30天打卡-day16
面试题30天打卡-day16
39 0
|
前端开发 Java 数据库
面试题30天打卡-day01
面试题30天打卡-day01
54 0
|
前端开发 JavaScript 安全
面试题大全
前端面试题大全(更新中…)
168 0