目录
18、哈希表(Hash Table)和哈希映射(HashMap) 区别
一、mysql数据库
1、关系型数据库和非关系型数据库的区别
- 存储方式:关系型数据库只能以表格形式存储;非关系型数据库可以以文档、键值对以及图进行存储
- 扩展性:关系型数据库可以纵向扩展,但是由于成本高以及存在性能瓶颈,所以扩展性不好;非关系型数据库可以横向扩展,扩展性好。
- 具体举例:关系型数据库有mysql、oracle、sql server;非关系型数据库redis、hbase、MongoDB
2、mysql如何优化
- 语句优化:尽量避免在where语句中对字段进行函数操作和计算;尽量使用join代替子查询。
- 索引优化:mysql在高频查询字段,唯一性约束字段以及排序分组字段采用索引优化;索引优化分为单值索引、唯一索引、复合索引、主键索引;在违反左前缀、数据类型不匹配时失效。
3、mysql日志是什么
- mysql日志是数据库运行期间各种状态信息的重要记录。包括错误日志、查询日志等。
- 错误日志:数据库运行期间出现的问题警告
- 查询日志:数据库运行期间记录客户端查询记录
4、mysql主从复制是什么?如何保证数据一致性
- 将master复制到slave
- 使用同步半同步复制;定期备份主节点数据,并在从节点进行恢复测试;定期使用校验工具
5、b树和b+树的区别,mysql索引为什么采用b+树
- 性能高:b+树数据只保存在叶子结点,层高相同的情况下,B+树能存储更多的数据
- 查找效率高:查找过程只需要在叶子节点上进行
- 数据稳定:B+树所有数据都存储在叶子节点,数据的插入、删除和更新等操作不会改变数据的相对位置
- 范围查询有优势:有数据记录都存储在叶子节点上,且叶子节点同时还维护了一条双向链表,这大大提高了范围查询的效率。
二、redis数据库
1、Redis相对于mysql的优势
- 提供更丰富的数据结构:如哈希、集合、位图、列表。
- 基于内存存储,速度更快
- 单线程,避免了线程切换和线程上下文切换,效率更高,更适合缓存
2、redis过期键
- Redis 中的过期键是指设置了过期时间的键。当这些键的过期时间到达时,它们会被 Redis 自动删除,以释放内存空间。分为惰性过期、定期过期。
- 惰性过期:访问时判断是否过期,过期清除。节省CPU浪费。
- 定期过期:每隔一定时间判断是否过期,过期删除。
3、引入缓存的好处
- 加快访问速度:缓存通常使用内存来存储数据,这使得数据访问速度非常快
- 支持复杂查询:缓存可以用于存储复杂的查询结果
- 改善用户体验:响应时间减少,用户不用等太长时间
三、mybatis
1、mybatis是什么,优缺点
- mybatis是一种流行的java对象关系映射框架,它将对象映射到关系型数据库中
- 优点:可以与多种数据库和web框架集成;提供了高效的缓存机制;使用简洁的xml或注释清晰表达SQL语句
- 缺点:配置复杂;对于小型项目优势不明显
2、jdbc相对于mybatis的劣势
- 复杂度高:涉及大量低级操作,如数据库连接、预编译语句。
- 手动编码:每次与数据库交互都需要编写sql语句
- 数据绑定:开发者需要将数据绑定在SQL查询中,比较繁琐还容易导致SQL注入安全问题
3、#{}和${}的区别
- #{}采用预编译的方式处理sql语句的参数
- ${}直接将参数替换到sql语句
四、计算机网络
1、tcp和udp区别
- tcp:面向连接,可靠,提供数据确认和重传机制,头部开销大,用于文件传输,web浏览
- udp:无连接,不可靠,不提供数据确认和重传机制,头部开销少,用于在线视频音频,网络游戏。
tcp需要建立连接,关闭连接,有助于确保数据传输的安全性和可靠性。Udp不需要,使其更高效
2、三次握手、四次挥手
- 客户端向服务器端发送syn
- 服务器端收到syn后,向客户端发送syn-ack
- 客户端收到syn-ack后,向服务器端发送ack
- 客户端向服务器端发送fin
- 服务器端收到fin后,检查是否处理完数据,没有处理完,发送ack,处理完发送fin,表示可以断开连接
- 客户端收到fin后,发送ack,表示客户端也会断开连接
3、为什么是三次握手,不是两次或更多次
如果采用两次握手,可能存在一种情况,就是客户端没有发送数据而服务器端已经准备好接收数据,这会造成资源浪费。
TCP建立连接之所以不是更多次,而是采用三次握手,主要是因为这一机制已经足够满足TCP连接建立的需求,并且具有高效性和可靠性。
4、http和https的区别
- https更安全,它是运行在ssl或者tls加密层上,这些加密层运行在tcp上;而http直接运行tcp上。
- https由于加密过程,其开销更大
- https还涉及服务器身份验证,确保客户端连接的是预期网站
5、osi七层模型和tcp/ip五层模型
- 物理层、数据链路层、网络层、传输层、会话层、表示层、应用层
- 网络接口层、互联网层、传输层、互联网协议安全层、应用层
6、cookie和session的区别
- cookie存储在客户端,大小有限制不超过4kb,只能用ASCII编码,安全性低
- session存储在服务器端,大小不限制,编码不限制,安全性高
- cookie可以设置过期时间,session依据对话持续时间
五、spring
1、spring三件套
- spring core:提供ioc(控制反转)容器,该容器负责对象的创建、配置以及生命周期管理,它可以通过依赖注入,将对象依赖关系自动注入需要的地方。
- spring aop(面向切面):允许开发者在不修改源码的情况下,对程序进行增强
- spring mvc:Spring MVC(Model-View-Controller)是Spring框架的一个模块,用于构建基于Java的Web应用程序。
2、spring mvc和springboot区别
- SpringBoot是一个快速开发的框架,能过快速整合第三方框架,整合的基本原理是Maven依赖关系,Maven的集成,完全采用注解化,简化XML配置,内嵌HTTP服务器(Tomcate,jetty),默认嵌入Tomcat,最终以Java应用程序进行执行。
- Spring MVC(Model-View-Controller)是Spring框架的一个模块,用于构建基于Java的Web应用程序,无需中间层来整合,用于替代Servlet。
3、springboot优缺点
- 快速启动:内置了Tomcat、servlet等,通过main方法直接启动
- 易于集成
- 广泛的社区支持
- 性能不好,在高并发高负载情况下,性能受到影响
- 冲突和不兼容:项目通常包含大量依赖项,依赖项之间容易产生冲突和版本不兼容问题。
六、锁
1、什么是死锁,产生条件,如何预防
- 多个进程或线程因争夺资源而陷入僵局,无法继续执行。
- 互斥,占有等待,不可剥夺,循环等待
- 破坏占有等待,破坏不可剥夺,破坏循环等待
2、乐观锁,悲观锁
- 乐观锁:事务执行期间,不会有其他事务对共享资源进行修改,用于并发量不大、数据冲突较少
- 悲观锁:事务执行期间,可能有其他事务对共享资源进行修改,用于并发量大、数据冲突多
3、分布式锁
是指分布式环境下,为了保证多个进程(可能部署在不同的机器上)并发访问同一个临界资源时,同一时刻只有一个进程能够访问该资源,从而避免数据冲突和不一致。
七、java基础
1、 Java对比c++优势
- 自动内存管理,引入垃圾回收机制
- 可以跨平台执行,通过jvm实现
- 丰富的开发工具库
- 良好的社区生态
2、 面向对象三大特性
- 封装:把数据和程序绑定,通过接口调用
- 继承:继承已有类,创建新类
- 多态:允许同一个接口调用不同实现,通过方法重载和重写实现
3、重载和重写
- 重载:重载是指在同一个类中定义多个具有相同名称但参数列表不同的方法。同一类,方法名相同,参数不同,返回值可以不同
- 重写:重写是指在子类中重新定义一个与父类中同名、同参数列表的方法。不同类,方法名,参数,返回值相同
4、常见异常
- 空指针
- 数组越界
- 文件未找到
- SQL异常
5、get、post
- get从 服务器获取数据,需要发送参数,不安全,如查询操作
- post向服务器发送数据,不需要参数,安全,如删除
6、状态码
- 1xx:表示请求已接收,需要继续处理100
- 2xx:表示请求已被成功接收200
- 3xx:重定向,301请求的资源永久移入新的url,302请求的资源临时移入新的url
- 4xx:客户端错误404notfound
7、equal和==
- ==用于判断基础类型的值,和引用类型的地址
- equal用于判断引用类型的值
8、 抽象类和接口
- 抽象类,一次只能继承一个抽象类,它不能实例化,可以使用抽象方法
- 接口,一个类可以实现多个接口,只能包含静态常量,不能被实例化
9、java最顶级的父类
object
10、Hashcode
哈希冲突:对象不同时,返回的哈希对象可能相同
11、Final
- 修饰的类是最终类,不能被继承
- 修饰的方法不能被重写
- 当
final
修饰一个变量时,表示这个变量的值一旦被赋予就不可改变
12、Java有没有指针
Java指针被隐藏了,由jvm操作
13、类和对象的关系
类是对象到模版,是对象的抽象;对象是类的具体,是类的实例
14、 隐式转换与显式转换
- 隐式转换:大范围变量接收小范围的数据
- 显式转换:大类型数据强制赋给小类型数据
15、 jvm,jdk,jre
- Jvm:Java虚拟机(包括寄存器,堆栈,处理器)
- Jdk:Java开发工具包,包括jre、类库、开发工具包
- Jre:Java运行环境,包括jvm和解释器
16、 final、finally、finalize的区别
- final见11
finally
是Java异常处理机制的一部分,与try
和catch
块一起使用,且无论是否发生异常都会被执行finalize
是Object
类的一个方法,用于在垃圾收集器决定回收对象之前调用该方法。
17、list、set、map区别
- List 是一个有序集合,允许元素重复
- Set 是一个无序集合,不允许元素重复。
- Map 是一个键值对集合,键(Key)必须唯一,值(Value)可以重复。
18、哈希表(Hash Table)和哈希映射(HashMap) 区别
- 哈希表是线程安全的,不允许键或值为null,适用于需要线程安全且不介意性能开销的场景。
- 哈希映射不是线程安全的,允许键(Key)和值(Value)为null,适用于需要快速存储、检索和操作键值对数据的场景。