十万个为什么--十八罗汉

夜. 2022-09-13 11:23:27 10370 0 0 0

1、hashmap的扩容机制什么?
(1)底层数据存储结构是数组+链表+红黑树
(2)数组的默认长度为16
(3)负载因子为0.75,也就是说当使用容量达到总长度的四分之三时,触发扩容,新的数组长度为原数组长度的2倍。
(4)当key发生hash碰撞时,产生链表。当链表的长度大于8并且数组长度大于64时,产生红黑树。
(5)容量小于64,链表长度大于等于8也会触发一次扩容。
2、MYSQL的事务隔离级别有哪些?默认是什么级别?
(1)read_uncommitted(读未提交)
(2)read_commited(读已提交)
(3)repeatable_read(可重复读)
(4)serlalizable(串行化)
图片alt
(1)脏读:事务A读到了事务B还没有提交的数据
(2)不可重复度(虚读):在同一个事务中前后多次,读出来的数据内容不一致。
(3)幻读:在一个事务里面的操作中发现了未被操作的数据。(前后多次读取,数据总量不一致,常发生在添加 或者 删除)
3、什么是CAP理论?
特点
(1)Consistency(一致性)
数据一致更新,所有数据的变化都是同步的
(2)Availability(可用性)
在集群中一部分节点故障后,集群整体是否还能响应客户端的读写请求
(3)Partition tolerance(分区容忍性)

原理
(1)CAP目标:某个节点的故障,并不影响整个系统的运行
(2)CAP原理:任何分布式系统只可同时满足二点,没法三者兼顾,既然一个分布式系统无法同时满足一致性、可用性、分区容错性三个特点, 所以我们就需要抛弃一样;
4、线程有哪些状态?
图片alt
5、start和run有什么区别?
(1)start()方法来启动线程,真正实现了多线程运行。这时无需等待 run 方法体代码执行完毕,可以直接继续执行下面的代码。
(2)通过调用 Thread 类的 start()方法来启动一个线程, 这时此线程是处于就绪状态, 并没有运行。
(3)方法 run()称为线程体,它包含了要执行的这个线程的内容,线程就进入了运行状态,开始运行 run 函数当中的代码。 Run 方法运行结束, 此线程终止。然后 CPU 再调度其它线程。
6、数据库的索引都有哪些类型?
(1)主键索引:是一种特殊的唯一索引,在一张表中只能定义一个主键索引。
(2)唯一索引:唯一索引,不允许被索引列数据重复,可以为null,比如:学号,身份证号,手机号,用户名等都可以创建唯一索引。
(3)单值索引:允许被索引列的数据重复,性能比唯一索引,主键索引要差。
(4)复合索引:复合索引和单值索引的区别就是一个复合索引可以包含多个列。
7、mysql的存储引擎有哪些?有什么区别?
(1)InnoDB存储引擎:提供了良好的事务处理、崩溃修复能力和并发控制。缺点是读写效率较差,占用的数据空间相对较大。
(2)MyISAM存储引擎:优势在于占用空间小,处理速度快。缺点是不支持事务的完整性和并发性。
(3)MEMORY存储引擎:数据读写速度快。缺点是如果重启或者关机,所有数据都会消失。
8、索引的最左侧匹配原则
(1)查询条件中必须要包含最左侧的索引列。
(2)查询条件中索引列要连续,中间不能断开。
9、哪些情况会导致索引失效?
(1)查询条件中索引列使用了函数,比如日期转换,字符串处理,计算,统计等等,会导致索引失效。
(2)模糊查询like以%号开头会导致索引失效。
(3)范围查询可能会导致索引失效,in,or,is null,<>等。
(4)如果数据库中存储的数据很少,mysql的执行引擎认为全表扫描会比索引扫描更快,就不会再去查索引了。
(5)复合索引要遵循最左侧匹配原则,查询条件中如果没有最左侧列会导致索引失效。
10、公平锁和非公平锁有什么区别?
公平锁:多个线程按照申请锁的顺序去获得锁,线程会直接进入队列去排队,永远都是队列的第一位才能得到锁。
优点:所有的线程都能得到资源,不会饿死在队列中。
缺点:吞吐量会下降很多,队列里面除了第一个线程,其他的线程都会阻塞,cpu唤醒阻塞线程的开销会很大。
非公平锁:多个线程去获取锁的时候,会直接去尝试获取,获取不到,再去进入等待队列,如果能获取到,就直接获取到锁。
优点:可以减少CPU唤醒线程的开销,整体的吞吐效率会高点,CPU也不必取唤醒所有线程,会减少唤起线程的数量。
缺点:你们可能也发现了,这样可能导致队列中间的线程一直获取不到锁或者长时间获取不到锁,导致饿死。

11、sleep和wait有什么区别?
(1)对于 sleep()方法,我们首先要知道该方法是属于 Thread 类中的。而 wait()方法,则是属于Object 类中的。
(2)sleep()方法导致了程序暂停执行指定的时间,让出 cpu 该其他线程,但是他的监控状态依然保持者,当指定的时间到了又会自动恢复运行状态。
(3)在调用 sleep()方法的过程中,线程不会释放对象锁。
(4)而当调用 wait()方法的时候,线程会放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象调用 notify() 方法后本线程才进入对象锁定池准备获取对象锁进入运行状态。
(5)wait():当线程等待状态为真,其他程序申请线程时,该线程会释放线程锁;如果该线程调用notify()方法,本线程 会进入对象锁定池准备,获取对象锁进入运行状态。
(6)sleep():程序暂停执行指定的时间,释放cpu资源,在调用sleep()方法的过程中,线程不会释放对象锁。当指定时间到了,就会自动恢复运行状态。
12、Redis的基本数据类型有哪些?
(1)String(字符串)
(2)Hash(哈希)
(3)List(列表)
(4)Set(集合)
(5)zset(sorted set:有序集合)
它还有三种特殊的数据结构类型
Geospatial
Hyperloglog
Bitmap
13、Redis的持久化方式有哪些?什么区别?
(1)RDB:全量备份,节省磁盘空间,恢复速度快。但是可能会丢失数据。
(2)AOF:日志增量备份,数据保存完整。但是整体的恢复效率低,占空间。
(3)如果数据比较敏感的情况下,建议两个都开启。如果只是做纯缓存,数据不敏感,可以都不开启。
(4)默认开启的时RDB,通常使用默认就行,对于一些数据敏感的场景全部开启,不建议单独使用AOF,AOF在高频读写情况下可能会出现bug。
14、RabbitMQ有哪些工作模式?
简单工作模式(Work)
发布订阅模式(Fanout)
路由模式(Routing)
主题模式(Topic)
15、mybatis中#和$有啥区别?
两者在 MyBatis 中都可以作为 SQL 的参数占位符,在处理方式上不同
·#{}:在解析 SQL 的时候会将其替换成 ? 占位符,然后通过 JDBC 的 PreparedStatement 对象添加参数值,这里会进行预编译处理,可以有效地防止 SQL 注入,提高系统的安全性
·${}:在 MyBatis 中带有该占位符的 SQL 片段会被解析成动态 SQL 语句,根据入参直接替换掉这个值,然后执行数据库相关操作,存在 SQL注入 的安全性问题
16、Spring事务传播机制有哪些?
spring事务的传播行为说的是,当多个事务同时存在的时候,spring如何处理这些事务的行为。

(1)PROPAGATION_REQUIRED:如果当前没有事务,就创建一个新事务,如果当前存在事务,就加入该事务,该设置是最常用的设置。
(2)PROPAGATION_SUPPORTS:支持当前事务,如果当前存在事务,就加入该事务,如果当前不存在事务,就以非事务执行。
(3)PROPAGATION_MANDATORY:支持当前事务,如果当前存在事务,就加入该事务,如果当前不存在事务,就抛出异常。
(4)PROPAGATION_REQUIRES_NEW:创建新事务,无论当前存不存在事务,都创建新事务。
(5)PROPAGATION_NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
(6)PROPAGATION_NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。
(7)PROPAGATION_NESTED:如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则按REQUIRED属性执行。
17、RabbitMQ中的主题模式中,routingkey中的#和*有什么区别?
·#号标识0个字符、1个字符、多个字符
·号表示1个或者多个字符
18、数据库的索引结构有哪些?
Mysql支持多种索引结构类型,哈希表,全文索引,B-Tree,B+Tree等。
(1)哈希表:只有memory存储引擎下支持哈希索引,底层哈希表,存储原理和HashMap类似。
(2)全文索引:MyISAM支持全文索引,生成全文索引非常消耗时间和空间,所以一般不会通过数据库做全文索引,通过sorl或es搜索引擎解决。
(3)B-Tree:B-Tree是多路查找树,每个节点保存索引值和数据。
(4)B+Tree:B-Tree的优化,数据保存到叶子节点,非叶子节点存储数据的地址。