这个问题可以从三个问题来回答:
- 什么是SpringBoot自动装配?
- SpringBoot是如何实现自动装配的?如何实现按需加载的?
- 如何实现一个Starter?
《MySQL是怎样运行的 —— 从跟上理解MySQL》—— 第一章
MySQL的运行过程是:MySQL服务器程序直接与要存储的数据打交道,多个客户端程序可以连接到这个服务器程序,向服务器程序发送数据变更请求,然后服务器程序根据这些请求,对存储的数据进行相应的处理。
MySQL的日常使用场景:
运行过程中的MySQL服务器程序和客户端程序本质上都是计算机中的进程,其中代表MySQL服务器程序的进程成为MySQL数据库实例(Instance)。
没有特殊说明,JVM都是指HotSpot虚拟机。
常见的面试题:
- 介绍下Java内存区域(运行时数据区)
- Java对象的创建过程(五个重要的步骤)
- 对象的访问定位的两种方式(句柄和直接指针)
作为线程安全的
HashMap
,ConcurrentHashMap的使用频率也是非常高的。相较于JDK7的ConcurrentHashMap,JDK8几乎是重写了ConcurrentHashMap,二者还是有很大的差距的,那就来看看究竟有什么区别吧。
为了保证接口调用的性能、稳定性和可用性,在网关层面通过Redisson的RateLimiter实现限流保护(1s最多请求1次)
我们需要控制用户使用系统的次数,以避免超支。但是限制用户调用次数仍存在一定风险,用户仍有可能疯狂调用来刷量,从而导致系统成本过度消耗。
限流(流量控制):指系统在面临高并发,或者大流量请求的情况下,限制新的请求对系统的访问,从而保证系统的稳定性。限流会导致部分用户请求处理不及时或者被拒绝,影响了用户体验,所以一般需要在系统稳定和用户体验之间选择平衡。
问题:使用系统是需要消耗成本的,用户有可能疯狂刷量
解决方案:
以下内容基于JDK8
HashMap主要用于存放键值对,它基于Hash表的Map接口实现,是非线程安全的。
public class HashMap<K,V> extends AbstractMap<K,V> |
HashMap
可以存放null的key和value,但是null
key只能有一个,null value可以有很多个。
JDK8之前的HashMap由 数组 + 链表组成,其中数组是HashMap的主体,链表主要是为了解决哈希冲突而存在。JDK8之后的HashMap在解决哈希冲突时有了较大的变化,当链表长度大于等于阈值(默认是8)并且当前数组长度大于等于64时,会将链表转化为红黑树,以减少搜索时间。
HashMap默认的初始化大小是16,扩充时新容量为原来的2倍。HashMap总是使用2的幂次方作为哈希表的大小。
以下内容来自JDK8
ArrayList
的底层是数组队列,相当于动态数组(容量能够动态增长)。
接下来从ArrayList的继承链来看看其结构特点,ArrayList
继承了AbstractList
类,实现了List
、RandomAccess
、Cloneable
、Serializable
接口。
public class ArrayList<E> extends AbstractList<E> |
List
接口,表明它是一个列表,支持增删查改等操作,并且可以通过下标进行访问。RandomAccess
接口,表明实现这个的List集合是支持快速随机访问的。即在ArrayList中,我们可以通过元素的需要快速获取元素对象,这就是快速随机访问。(RandomAccess
是一个标志接口)Cloneable
接口,表明它具有拷贝能力,可以进行浅拷贝和深拷贝。Serialzable
接口,表明它可以进行序列化操作,也就是可以将对象转换为字节流进行持久化存储或者网络传输。