牛客面试题库(2)

文章详细介绍了MVC设计模式的组成和作用,包括模型、视图和控制器。接着,深入讨论了Redis的多种数据类型,如string、list、set、hash和zset及其底层实现。此外,对比了ArrayList和LinkedList的区别,并列举了Java中线程安全的集合。文章还涉及AOP(面向切面编程)和IOC(控制反转)的概念,以及乐观锁和悲观锁在并发控制中的应用。
摘要由CSDN通过智能技术生成

对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包下的集合类大部分不是线程安全的,例如ArrayListHashMapLinkedList,只有少部分线程安全,例如VectorHashTable,它们都是古老的API,是基于synchronized实现的,一般我们可以使用collections工具类的synchronizedxxx()方法可以把非线程安全的集合类包装成线程安全的类

java5之后juc包下提供大量的线程安全类,例如ConcurrentHashMap(降低锁的粒度,1.8使用CAS)、CopyOnWriteArrayList(写时复制)

说说你对AOP的理解

AOP面向切面编程,是spring的两大核心之一,它是一种编程思想,是对OOPorient object program面向对象编程)的补充,它可以对业务逻辑的各个部分进行隔离(与业务无关,但且被业务模块所共同调用),降低代码耦合度,提高代码的可重用性,底层是通过动态代理实现的,应用场景主要是日志、事务

说说你对IOC的理解

IOC控制反转,控制:创建对象的控制权限,反转:把控制权限交给spring,以前我们创建对象使用new,现在我们可以从spring容器取,spring容器维护对象之间的依赖关系,降低耦合度,实现方式是DI,依赖注入,有三种注入方式:构造器、setter、接口注入

请你说说乐观锁和悲观锁

乐观锁:总是假设最好的情况,每次操作数据前不加锁,只有在更新数据时判断数据有没有被人修改过,主要是根据版本号来判断,如果版本号不一致,说明数据已经被其他线程修改过,需要回滚

悲观锁:总是假设最坏的情况,每次操作数据前先加锁

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值