下述内容经搜寻广大平台的面试经历,整理汇合得出,答案来自chatgpt,加黑的地方意味着出现多次。
1.自我介绍
2.介绍项目功能
3.==和equals的区别。八大基本类型(byte,char,int ,long,double,float,boolean,short)
==
是用于比较两个变量的值是否相等。equals()
是用于比较两个对象的内容是否相等。在 Java 中,equals()
方法是用来比较对象的内容是否相等,而对于基本数据类型,equals()
方法与==
是一样的作用。
4.hashmap和hashstable的区别
- 线程安全性:Hashtable是线程安全的,所有的方法都是同步的,而HashMap不是线程安全的,如果需要在多线程环境下使用,可以使用ConcurrentHashMap来代替HashMap。
- null值:Hashtable不允许键或值为null,会抛出NullPointerException异常,而HashMap允许键或值为null。
- 继承关系:Hashtable是Hashtable类的子类,而HashMap是AbstractMap类的子类。
- 迭代器:Hashtable的迭代器是通过Enumeration接口实现的,而HashMap的迭代器是通过Iterator接口实现的。
5.concurrenthashmap的原理
- ConcurrentHashMap 使用分段锁(Segment)来确保线程安全,每个 Segment 有自己的锁,不同 Segment 的数据修改操作可以并发进行,提高了并发性能。
6.lambda表达式怎么写
- Java 8引入的新特性,用于简化代码编写。它可以替代匿名内部类的语法,使代码更加简洁易读。
- (int a, int b) -> a + b
- 这个Lambda表达式表示一个函数,接受两个整数参数a和b,然后返回它们的和。
7.垃圾回收常见的算法
- 常见的垃圾回收算法包括标记清除(Mark and Sweep)、复制(Copying)、标记整理(Mark and Compact)等
8.Linux的两个常见命令:查看内存大小,查看磁盘大小
- 查看内存大小:free -h
- 查看磁盘大小:df -h
9.springboot的常用注解
- @SpringBootApplication: 启动SpringBoot应用的入口注解。
- @Controller, @Service, @Repository: 分别用于标记Controller、Service和DAO层的类。
- @Autowired: 自动装配依赖。
10.redis怎么设置过期时间
使用命令 EXPIRE key seconds 来设置键的过期时间。
11.sql的索引和使用场景
- SQL的索引是用来提高查询效率的数据结构,可以加快数据的检索速度。常见的使用场景包括:
- 当某个字段经常被用作查询条件时,可以为该字段创建索引,提高查询效率。
- 当某个字段经常用来进行排序或分组操作时,也可以为该字段创建索引。
- 在连接操作中,如果连接的字段没有索引,可能会导致性能问题,可以考虑为连接字段创建索引
12给出一张表,id,姓名,性别,年龄,问怎么实现分组查询
- SELECT 性别, COUNT(*) FROM 表名 GROUP BY 性别;
13.给出两张表,一个表中有id和姓名,一个表中有id和年龄,问怎么联合索引。
- 联合索引是指在多个字段上创建一个组合索引,以提高多个字段组合条件查询的效率。在给出的两张表中,可以通过以下SQL语句创建联合索引:
- CREATE INDEX idx_name_age ON 表1(id);
- CREATE INDEX idx_id_name ON 表2(id);
14.乐观锁和悲观锁
- 乐观锁是指在更新数据时,先读取数据,然后在更新时检查数据是否被其他事务修改过,如果没有则更新成功,否则放弃更新并重试。
- 悲观锁是指在操作数据之前先加锁,确保其他事务无法修改数据,操作完成后释放锁
15.mq的使用
MQ(消息队列)用于在不同组件或系统之间传递消息,常见的使用场景包括解耦、异步处理、削峰填谷等。常见的MQ系统有RabbitMQ、Kafka、ActiveMQ等。
16.断点上传的思路
指在网络传输大文件时,如果中断了传输,可以从中断的地方继续传输,常见的实现思路是在客户端和服务端记录已传输的字节数,当传输中断时,下次传输时从中断的位置继续传输。
17.spring、springmvc,springboot的区别
- Spring是一个综合性的框架,提供了依赖注入、AOP、事务管理等功能;Spring MVC是基于Spring的MVC框架,用于Web开发;Spring Boot是用于简化Spring应用开发的框架,提供了自动配置和约定优于配置的特性。
- Spring Boot是一个快速开发框架,提供了自动配置和约定优于配置的方式,开发者只需关注业务逻辑而不用过多配置;而Spring MVC是用于构建Web应用程序的一个模块,需要更多的配置和设置。
- Spring Boot可以快速搭建一个独立的、自包含的应用程序,包括内嵌的服务器,使得应用程序可以直接运行;而Spring MVC通常需要结合其他的容器(如Tomcat)来运行。
- Spring Boot提供了很多开箱即用的功能,如健康检查、监控、日志等,使得开发者更容易实现这些功能;而Spring MVC需要开发者自己配置这些功能。
18.spring事务
Spring事务管理支持声明式事务和编程式事务两种方式,可以通过@Transactional注解或编程式API来实现事务管理,保证数据库操作的一致性。
19.springboot的自动配置
- Spring Boot的自动配置是指Spring Boot根据项目中的依赖和配置自动配置Spring应用程序的特性。通过约定大于配置的方式,可以减少开发人员的配置工作,提高开发效率。
20集合的数据结构有哪些
- List:列表,有序集合,可以重复元素。
- Set:集合,无序集合,不允许重复元素。
- Map:映射,键值对集合。
- Queue:队列,先进先出的数据结构。
- Stack:栈,后进先出的数据结构。
- Linked List:链表,通过指针进行连接的数据结构等。
21.mysql中innoDB的底层原理
- 事务:InnoDB支持ACID事务,采用多版本并发控制(MVCC)来实现事务的隔离性。
- 行级锁:InnoDB使用行级锁进行并发控制,提高了多用户并发操作时的性能。
- 聚簇索引:InnoDB的表数据存储采用聚簇索引,将数据和索引存储在一起,加速数据检索。
- 事务日志:InnoDB采用事务日志(redo log)来保证事务的持久性和恢复能力。
- 缓冲池:InnoDB使用缓冲池(Buffer Pool)来缓存数据,减少对磁盘IO的访问,提高性能。
22.B树和B+树
B树:B树是一种多路平衡查找树,用于实现关系型数据库中的索引结构。B树的特点是每个节点有多个子节点,且每个节点都对应一个区间范围,适合数据库中范围查询操作。
B+树:B+树是在B树的基础上优化而来,所有关键字都在叶子节点上,非叶子节点只存储索引信息,使得范围查询更加高效。B+树通常用于数据库索引。
23.线程池的原理
- 线程池是一种管理和复用线程的机制,其原理包括以下几个方面:
- 线程复用:线程池中的线程可以被重复利用,减少线程创建和销毁的开销。
- 线程管理:线程池可以控制线程的数量,避免创建过多线程导致资源浪费。
- 任务队列:线程池通常包含一个任务队列,用于存放需要执行的任务,线程从队列中获取任务执行。
- 线程调度:线程池会根据线程的状态、任务队列的情况等因素来决定如何调度线程执行任务。
24.讲讲线程,多线程,创建线程的方式(项目中哪些业务场景会用到线程)
- 线程:线程是操作系统能够进行运算调度的最小单位,一个进程可以包含多个线程,各线程之间共享进程的资源。
- 多线程:多线程指的是一个进程内包含多个线程,多线程可以提高程序的并发性和响应速度。
- 创建线程的方式
- 继承Thread类:创建一个类继承Thread类,并重写run()方法。
- 实现Runnable接口:创建一个实现了Runnable接口的类,并将其作为参数传递给Thread类的构造方法。
- 实现Callable接口:创建一个实现了Callable接口的类,并结合ExecutorService实现。
- 并行处理大量数据,提高处理速度。
- 异步执行一些耗时任务,提高系统的响应速度。
- 实现定时任务、轮询等功能。
25.redis的数据结构有哪些,使用场景
- Redis支持的数据结构包括字符串(String)、哈希(Hash)、列表(List)、集合(Set)、有序集合(Sorted Set)、位图(Bitmap)、HyperLogLog等。不同的数据结构适用于不同的场景,例如:
- 字符串:缓存、计数器
- 哈希:存储对象的属性
- 列表:消息队列、最新消息列表
- 集合:关注列表、共同好友
- 有序集合:排行榜、优先队列
- 位图:用户签到、在线状态
- HyperLogLog:基数统计
26.mybatis为什么优化检索
- 使用MyBatis缓存来减少数据库查询次数
- 使用延迟加载来减少不必要的数据加载
- 使用分页查询来限制返回结果集的大小
- 使用动态SQL来减少不必要的条件判断
- 使用MyBatis的一级缓存和二级缓存来提高检索性能
27.数据库为什么要创建索引,加索引的本质是?索引的作用
- 数据库创建索引的主要原因是为了提高查询效率,加快数据检索的速度。索引的本质是一种数据结构,它通过存储数据的排序顺序或者哈希值来加速数据的查找。索引的作用包括:
- 减少查询时需要扫描的数据量
- 加速数据的查找和排序
- 提高数据库的性能和响应速度
28.什么情况下索引不能用
- 索引不能用的情况包括:
- 对于小表,使用索引可能会降低性能
- 查询条件中使用了函数或表达式,无法使用索引
- 对于高基数列(取值多样性很高的列),索引可能不起作用
- 索引列上有大量的更新操作,可能会导致索引失效
29.sql语句中#和$的区别
- 在SQL语句中,#和$通常用作参数的占位符:
- #表示参数是预编译的,可以防止SQL注入,但可能会受到SQL注入攻击
- $表示参数是直接拼接到SQL语句中的,可能会有SQL注入风险,但性能更好
30.什么情况下使用redis
- 需要高性能的缓存解决方案
- 需要存储键值对数据的场景
- 需要实时计数器、排行榜等功能
- 需要发布/订阅消息或实现消息队列
- 需要分布式锁或分布式限流控制
31.事务了解吗,它的原理
事务是一组操作单元,要么全部成功提交,要么全部失败回滚。事务的四个特性为ACID,即原子性、一致性、隔离性和持久性。事务的原理是通过数据库的事务日志和事务管理器来保证数据的一致性和可靠性。
32.springmvc的工作原理,执行流程
- 客户端发起请求,请求被DispatcherServlet拦截
- DispatcherServlet根据请求路径找到对应的HandlerMapping,将请求分发给对应的Controller
- Controller处理请求并返回ModelAndView对象,包含视图名和模型数据
- ViewResolver解析视图名,找到对应的视图模板
- View渲染模型数据并生成
33.事务的四大隔离级别
读未提交(Read Uncommitted)、读提交(Read Committed)、可重复读(Repeatable Read)和串行化(Serializable)。
34.Mysql索引失效形式
- 全表扫描、索引列上有函数操作、索引列不在联合索引的最左侧、使用"!="或"不等于"、模糊查询中使用通配符开头、对索引列进行数学运算等。
35.项目中用到哪些数据结构
可能会用到的数据结构包括数组、链表、栈、队列、树、图、堆、哈希表
36.java中有哪些操作字符串的值,区别是什么?
- Java中操作字符串的方式包括使用"+"连接字符串、使用StringBuffer和StringBuilder类进行字符串拼接。区别在于StringBuffer是线程安全的,而StringBuilder则是非线程安全的。
37.表索引,数据量大怎么办
- 当表索引数据量大时,可以考虑对索引进行优化,使用合适的数据类型、调整索引顺序、添加覆盖索引或者使用分区表等方式来提升查询性能。
38。分布式锁
用于在分布式系统中实现数据的并发访问控制的技术,可以通过ZooKeeper、Redis等工具实现分布式锁
39.CAS算法
CAS(Compare And Swap)算法是一种乐观锁技朧,通过比较并交换内存中的数值来实现并发控制,常用于无锁编程和并发数据结构的实现。
40.ArrayList遍历的几种形式
- 可以通过for循环、forEach循环、迭代器等多种形式进行,选择不同的遍历方式可以根据具体的需求和场景来决定。
41.Springboot声明bean的注解应该怎么写
可以使用@Component、@Service、@Repository等注解进行标记
42.Mybatis-plus做一个查询有哪几种写法
使用selectById、selectList、selectMaps等方法;使用QueryWrapper进行条件查询;自定义SQL语句进行查询等。
43.为什么使用redission来作分布式锁
提供简单易用的API、支持多种分布式锁实现、具有良好的性能等。
44.java的哪些框架
包括Spring框架、Spring Boot、MyBatis等。
45.springboot的启动方式
包括使用java -jar命令直接运行生成的可执行jar包,或者在IDE中运行主应用程序类。
46.springboot的核心注解
@SpringBootApplication、@Controller、@Service、@Repository等。
47.mysql联合查询的几种方式
- 包括使用JOIN语句、子查询、UNION操作符等。
48.list和set的区别
- List是有序集合,允许元素重复;Set是无序集合,不允许元素重复。
49.spring中什么时候用到事务,事务用什么注解
- 在Spring中需要保证一组操作要么全部成功要么全部失败时,需要使用事务。事务通常使用@Transactional注解来标记方法或类。
50.java反射
Java反射是一种机制,允许程序在运行时检查和操作类、对象、方法等的信息,可以通过反射获得类的构造器、字段、方法等信息,并动态调用它们。