对MVC的理解
MVC
是一种设计模式,包括三层,模型层、视图层、控制器层,其中模型层代表数据、视图层代表界面,控制器层代表处理逻辑,是视图和模型之间的桥梁
作用:降低代码耦合度,便于代码的维护
详细的说说redis的数据类型
注意详细
讲解:
- 跳表
skiplist
意思是有索引的列表- 压缩列表
ziplist
,尽量节约内存而设计的双向链表,元素数量小于2
,元素长度小于64
字节时,就使用ziplist
string
:存储字符串
list
:存储有序可重复的元素,底层数据结构ziplist
压缩列表和双向链表
set
:存储无序不可重复的元素,底层数据结构整数数组和hash
hash
:存储键值对,底层数据结构ziplist
压缩列表和hash
zset
::存储有序不可重复的元素,有序是每个元素都添加了一个score
字段,根据score
排序,底层数据结构ziplist
压缩列表和skiplist
跳表
ArrayList和LinkedList区别
数据结构:ArrayList
基于动态数组,LikedList
基于双向链表
查询和修改元素:数组是基于索引的,所以查询和修改效率高,时间复杂度O(1)
,而双向链表需要从头遍历到尾来查找元素,时间复杂度O(n)
添加和删除元素:数组添加元素,需要整体后移后面元素,删除元素需要整体前移后面元素,而双向链表只需更改指针指向
内存:数组只需要存数据,而双向链表除了数据外,还有pre
指针、next
指针的内存
你知道哪些线程安全的集合
java.util
包下的集合类大部分不是线程安全的,例如ArrayList
、HashMap
、LinkedList
,只有少部分线程安全,例如Vector
、HashTable
,它们都是古老的API
,是基于synchronized
实现的,一般我们可以使用collections
工具类的synchronizedxxx()
方法可以把非线程安全的集合类包装成线程安全的类
在java5
之后juc
包下提供大量的线程安全类,例如ConcurrentHashMap
(降低锁的粒度,1.8
使用CAS
)、CopyOnWriteArrayList
(写时复制)
说说你对AOP的理解
AOP
面向切面编程,是spring
的两大核心之一,它是一种编程思想,是对OOP
(orient object program
面向对象编程)的补充,它可以对业务逻辑的各个部分进行隔离(与业务无关,但且被业务模块所共同调用),降低代码耦合度,提高代码的可重用性,底层是通过动态代理实现的,应用场景主要是日志、事务
说说你对IOC的理解
IOC
控制反转,控制:创建对象的控制权限,反转:把控制权限交给spring
,以前我们创建对象使用new
,现在我们可以从spring
容器取,spring
容器维护对象之间的依赖关系,降低耦合度,实现方式是DI
,依赖注入,有三种注入方式:构造器、setter
、接口注入
请你说说乐观锁和悲观锁
乐观锁:总是假设最好的情况,每次操作数据前不加锁,只有在更新数据时判断数据有没有被人修改过,主要是根据版本号来判断,如果版本号不一致,说明数据已经被其他线程修改过,需要回滚
悲观锁:总是假设最坏的情况,每次操作数据前先加锁