小厂一面30问
- Redis除了存储数据外还能实现什么功能?
除了存储数据外,Redis还可以实现数据的缓存、分布式锁、消息队列、计数器等功能。Redis还支持事务、Lua脚本、发布/订阅等高级功能。
- HashMap的底层原理是什么?
HashMap是通过数组和链表(或红黑树)实现的。当我们向HashMap中put一个键值对时,首先会根据键的hashcode值计算出它在数组中的索引位置,然后将值存储在对应的链表(或红黑树)中。当产生哈希冲突时,会在链表(或红黑树)中继续寻找对应的值。
- HashMap的put是怎么存储数据的,哈希冲突怎么解决的?
当我们向HashMap中put一个键值对时,首先会根据键的hashcode值计算出它在数组中的索引位置,然后将值存储在对应的链表(或红黑树)中。当产生哈希冲突时,会在链表(或红黑树)中继续寻找对应的值。哈希冲突解决的方式是,当链表中元素个数大于等于8时,将链表转化为红黑树,否则继续在链表中寻找。
- HashMap不是线程安全的,那有什么是线程安全的?
ConcurrentHashMap是线程安全的HashMap实现。
- ConcurrentHashMap是怎么实现的线程安全?
ConcurrentHashMap通过分段锁的方式实现线程安全,将整个HashMap分为多个Segment,每个Segment维护一个HashTable,每个Segment只对自己的HashTable进行操作,可以有效地提高并发性能。
- HashMap初始容量大小是多少?
HashMap的初始容量大小是16。
- HashMap怎么实现的扩容?
当HashMap中的元素数量达到容量的75%时,就会触发扩容操作,即将容量扩大为原来的两倍,并重新构建哈希表。
- HashMap为什么每次扩容为2的n次方?
HashMap每次扩容为2的n次方是为了让元素在哈希表中分布更加均匀。
- Java8有什么新特性?
Java8的新特性包括Lambda表达式、函数式接口、Stream API、默认方法、新的Date/Time API等。
- Java中有哪些语法糖?
Java中的语法糖包括自动装箱/拆箱、泛型、foreach循环、变长参数、枚举、注解等。
- foreach和for有什么区别?
foreach循环是用来遍历集合或数组的简化语法,它不需要我们定义一个计数器或索引变量,可以直接遍历每一个元素。而for循环则需要我们手动定义计数器或索引变量,并通过循环来遍历集合或数组。
- foreach底层是怎么实现的?
foreach底层是通过迭代器实现的,它会自动调用集合或数组的iterator()方法获取一个迭代器,然后使用迭代器进行遍历。
- MySQL的事务有哪些?
MySQL中的事务包括四个基本操作:ACID,即原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability)。
- MySQL事务中隔离性是怎么实现的?
MySQL中的隔离性是通过锁和MVCC(多版本并发控制)实现的,不同程度的隔离级别使用不同的实现方式。锁实现了串行化执行,而MVCC实现了读写分离,多版本并发控制,可以提高并发性能。
- 能讲讲MVCC具体怎么实现事务的隔离性的?
MVCC是MySQL中实现事务隔离性的一种方式,它通过在每行记录中保存多个版本来实现。当进行读操作时,会根据事务启动时的时间戳和版本号来选择符合要求的记录版本,从而实现读操作不会被写操作影响的隔离性。当进行写操作时,会将新版本的记录插入到对应的行中,并将旧版本的记录标记为删除,从而实现更新操作不会影响到其他事务读取旧版本数据的隔离性。
- ReadView具体是保存了什么数据?
ReadView是MySQL中实现MVCC的一种机制,它保存了当前事务开始执行时的系统版本号和所有活跃事务的ID列表。在事务执行过程中,ReadView会根据这些信息来判断当前事务是否可见其他事务的修改。
-
InnoDB存储引擎有什么好处?
InnoDB存储引擎具有以下优点:
- 支持事务和行级锁,可以实现高并发和数据一致性。
- 支持MVCC,可以提高读写性能。
- 支持外键约束,可以保证数据的完整性。
- 支持在线热备份和恢复,可以提高数据可用性。
-
如果要查询前1-5条数据,在B+树中是怎么进行查找的?
在B+树中,数据是按照键值大小有序地存储在叶子节点上。如果要查询前1-5条数据,可以先定位到最左边的叶子节点,然后从左往右依次扫描叶子节点,取出前5个数据即可。
- MySQL中除了InnoDB以外还有什么存储引擎?
MySQL中还有MyISAM、Memory、CSV等多个存储引擎。
- MyISAM与InnoDB的区别,有什么优点?
MyISAM和InnoDB在存储方式、锁机制、事务支持等方面有很大的区别。MyISAM适合于读多写少的场景,不支持事务和行级锁,但是具有快速读取和空间占用小的优点;InnoDB适合于高并发、事务严格要求一致性的场景,支持事务和行级锁,但是具有写入慢、空间占用大的缺点。
- MySQL中有什么锁?
MySQL中有共享锁(S锁)、排他锁(X锁)、意向共享锁(IS锁)、意向排他锁(IX锁)等多种锁。
- 间隙锁是锁的什么数据?
间隙锁是针对B+树中的间隙(即不存在的数据)进行的锁定,它是InnoDB实现MVCC的一种方式,可以避免幻读的问题。
26、在查看某次查询索引时一般看的什么
在查看某次查询索引时一般要看索引是否被正确地使用,可以通过explain命令查看查询计划、索引类型、扫描行数、是否使用了索引等信息。
27、说一下对分布式锁的理解
分布式锁是在分布式系统中实现锁管理的一种方式,它可以保证在分布式系统中的多个节点同时对共享资源进行操作时,只有一个节点能够获得锁,并且在操作完成之后释放锁,从而保证数据的一致性和正确性。
28、说一下什么是线程池
线程池是一种用于管理和复用线程的机制,它可以在应用程序中预先创建一定数量的线程,并将它们保存在一个线程池中,以便根据需要动态地分配线程来处理任务。
29、线程池怎么创建
创建线程池可以使用Java中的Executors工具类提供的静态方法来创建,例如newFixedThreadPool、newCachedThreadPool等方法。
30、创建线程池时主要设置什么属性
创建线程池时主要要设置线程池的核心线程数、最大线程数、线程空闲时间、任务队列等属性。
31、线程池一般可以用在什么情况下
线程池一般可以用在需要频繁创建和销毁线程的场景,例如高并发的网络服务器、大规模数据处理等。
32、springcloud中 你熟悉什么
在Spring Cloud中,我比较熟悉的是服务注册与发现组件Eureka、配置中心组件Config、负载均衡组件Ribbon、断路器组件Hystrix等。
33、nacos是什么,主要实现什么功能
Nacos是阿里巴巴开源的一个服务注册中心和配置中心,主要实现了服务的注册、发现、配置管理等功能。
34、SpringBoot中 请求进来时mapping是怎么处理的,底层是怎么实现的(如Getmapping是怎么处理请求的)
在Spring Boot中,请求进来时mapping是通过Spring MVC框架来处理的。底层实现是通过反射机制来扫描所有的Controller类和方法,并将它们映射到对应的URL上,当请求进来时,会根据请求的URL和HTTP方法来匹配对应的Controller方法,然后执行该方法,并将返回结果封装成HTTP响应返回给客户端。Getmapping是通过RequestMappingHandlerMapping类的getMappingForMethod方法来处理的,该方法会根据方法上的GetMapping注解和请求的URL来匹配对应的方法。