Java
1、Java中的八大基本类型
答:byte、char、short、int、long、float、double、boolean
2、==与equals的区别
答:==是内存地址比较,equals是值比较。
equals取决于是否在类中被实现,如果实现了则是值比较,如果没实现则是内存地址比较。
3、Java面对对象的四大特征
答:封装、继承、多态、抽象
封装:尽可能的隐藏内部的细节,只保留对外的接口与外部发生联系。
继承:使已存在的类作为基础,在基础之上建立新类,新类可以增加数据和功能,也可以使用父类的功能。
多态:一个接口或基类的多种不同实现方式。分为编译时多态(主要指方法的重载)与运行时多态(主要指动态绑定)
4、抽象与接口的区别
答:接口是抽象的集合。抽象类中可以有非抽象方法,而接口不能。
抽象类是被子类继承的,接口类是被实现的。
5、重写与重载的区别
答:重载方法名必须相同,参数列表必须不同,返回类型可以相同也可以不同。
重载发生在同一个类中。
重写发生在父类与子类中。
6、解释修饰符
答:public可以被任何来源访问
protected不能被其他包访问
未修饰不能被子类和其他包访问
private只能被当前类访问
7、Java支持多继承吗
答:不支持多继承,但可以被多个接口实现
8、解释序列化和反序列化
答:系列化是将Java对象转化为字节序列的过程
反序列化是将字节序列转化为Java对象的过程
9、Exception与Error的区别
答:都是Throwable的子类
Exception表示程序需要捕获或需要处理的异常,可以处理的问题
Error表示系统级错误,不能处理,只能退出运行。
10、异常有哪几种
答:异常分为受检查异常和不受检查异常
受检查异常的基类是Exception
不受检查异常的基类是RuntimeException
11、Java集合框架
答:Java集合类主要由俩个根接口Collection和Map派生出来。
Collection派生了:List、Set、Queue
12、List、Map、Set的区别
答:List是有序集合,数据可以重复
Map是键值对存储,数据可以重复
Set是无序存储,数据不可以重复
13、ArrayList与LinkList的区别
答:ArrayList底层使用数组的数据结构,LinkList底层使用链表的数据结构
随机访问时,ArrayList优于LinkList
新增或删除操作时,LinkList优于ArrayList
14、ArrayList与Vector的区别
答:Vector类的所有方法都是同步的,ArrayList不是同步的
15、什么是HashMap
答:HashMap是一个散列表,是键值对存储的。
HashMap线程不安全。允许键和值为null。
16、HashMap的底层原理
答:基于hashing的原理,采用数组+链表/红黑树的数据结构
通过put和get来存储和获取对象。
put时先对键做一个hashCode计算得到bucket数组来存储对象。
get时获取bucket的位置,再通过equals方法找到正确的键值对。
17、HashMap与HashTable的区别
答:HashMap线程是不安全的,HashTable是线程安全的
HashMap允许键和值为空,HashTable不允许
HashTable的效率不如HashMap
18、HashMap与HashSet的区别
答:HashMap是键值对存储,HashSet仅存储对象
HashMap是不允许有重复的键,HashSet是不允许有重复的值
HashMap是使用键来计算hashCode值,HashSet是使用对象来计算hashCode值
19、final、finally与finalize的区别
答:final用来修饰类、方法、变量,使其不能被改变
finally作为异常处理的一部分,只能在try/catch语句中使用,并且最终一定被执行
finalize是Object中的方法,垃圾回收器准备释放内存的时候,会先调用finalize
20、JDK和JRE的区别
答:JRE是java运行时环境而JDK是java开发工具包,JDK包含JRE。
21、String、StringBuffer和StringBuffder的区别
答:运行速度:StringBuilder > StringBuffer > String
线程安全:StringBuilder线程是不安全的、StringBuffer是线程安全的
22、Volatile关键字的作用
答:保持内存可见性
JVM
1、什么是JVM
答:JVM是Java虚拟机,任何平台只要装有针对该平台的Java虚拟机,字节码文件就可以在该平台上运行。
JVM位于操作系统之上,于软件同级。
2、JVM内存结构
答:堆、栈、程序计数器、方法区、本地方法栈
3、类加载器机制
答:虚拟机把描述类的数据从class字节码文件加载到内存,并对数据进行检验,转换解析和初始化,最终形成可以被虚拟机
直接使用的Java类型
4、类的加载过程
答:加载--验证--准备--解析--初始化--使用--卸载
5、双亲委派机制
答:当一个类加载的过程中,它首先不会去加载,而是委托给自己的父加载器去加载,父加载器又委托给自己的父加载器。
因此所有的类加载都会委托给顶层的父类,即根启动器(Bootstrap Classloader)进行加载,然后父加载器自己无法完成
这个加载请求,子加载器才会尝试自己去加载。当所有子加载器都不能加载,则报ClassNotFound
6、解释Native修饰符
答:当一个方法用Native修饰,说明在Java的作用范围达不到了,需要调用底层C语言的库
7、什么情况下发生栈内存溢出
答:如果线程请求的栈深度大于虚拟机所允许的最大深度,就会抛出StackOverflowError异常。可能是类中一些死循环导致的
8、JVM内存为什么要分成新生区、老年区、永久区
答:新生区是类诞生和成长,甚至死亡的地方
老年区是存放新生区存活下来的对象,不容易被清除
永久区是存储Java运行时需要的一些环境
9、新生代中为什么要分为伊甸园区和幸存者区
答:如果没有幸存者区,伊甸园区每次轻GC都会把存活下来的对象放到老年区,这样老年区很快就会被填满。
有幸存者区,就会减少被送到老年区的对象,只有经历15次重GC才会被送到老年区。
10、为什么要设置俩个幸存者区
答:为了解决复制算法产生的碎片。
11、对象如何晋升到老年区
答:当伊甸园区满时,触发一次轻GC,把存活下来的对象放进幸存者区
当幸存者区的对象经历15次GC后则会进入老年区。
12、列举几种JVM参数
答:-Xms8m:设置初始堆的大小为8m
-Xmx8m:设置最大堆的大小为8m
-XX:+PrintGCDetails:输出形式
13、GC涉及的算法
答:复制算法、标记清除算法、标记整理算法
复制算法:划分俩个区域,每次只使用一个区域,当垃圾回收时,将使用中的对象复制到另一个区域
标记清除算法:标记所有被引用的对象,清除所有未被引用的对象
标记整理算法:标记所有被引用的对象,清除所有未被引用的对象,将标记的对象压缩到一个堆中
线程与锁
1、什么是线程
答:线程是操作系统能够进行运算调度的最小单位
2、线程与进程的区别
答:进程是执行的应用程序,而线程是进程的一部分。
一个进程包含多个线程,但一个线程只能属于一个进程。
3、创建线程的方式
答:实现Runnable接口,实现run方法,启动线程
继承Thread类,重写run方法,启动线程
实现Callable接口,重写call方法
使用线程池
4、线程的状态
答:创建---就绪---运行---等待---超时等待---死亡
5、Thread中run()与start()的区别
答:start方法是真正意义上的多线程,而run方法是多线程的线程体
6、什么是锁
答:将某种资源私有化的一种方法
7、锁有几种
答:synchronized、重入锁、读写锁
8、锁的升级机制
答:无锁---偏向锁---轻锁---重锁
无锁:没有对资源进行锁定
偏向锁:对象的代码一直被同一个线程访问
轻锁:在偏向锁基础上被第二个线程访问
重锁:当一个线程获取锁时,其他线程都处于一个等待状态
9、synchronized的用法
答:在非静态方法上:锁对象
在静态方法上:锁类
在代码块中:锁指定对象
10、乐观锁和悲观锁
答:乐观锁:就是假设不会发生冲突,只在提交的时候检查是否违反数据完整性。主要读多写少
悲观锁:就是假设每次拿数据都会发生冲突,拿数据的时候都会去检查是否违反数据完整性。主要读少写多
11、什么是死锁
答:俩个进程都在等待对方执行完毕才能继续下去执行,结果就发生了死锁
12、sleep与wait的区别
答:sleep来自Thread,wait来自Object
sleep没有释放锁,而wait释放了锁
JavaWeb
1、什么是Servlet
答:Servlet是用来处理客服端请求并产生动态网页内容的Java类。
2、Servlet有几种形式
答:实现Servlet接口
继承GenericServlet,重写servlet方法
继承HttpServlet,重写doGet和doPost方法
3、Servlet的生命周期
答:加载、实例化、初始化、处理请求、销毁。
4、get和post的区别
答:get是用来从服务器上获取数据,而post是用来向服务器传递数据
get是不安全的,因为传输过程中,数据被放在请求的URL上
5、传统JavaWeb开发流程
答:前端JSP访问后端Servlet,Servlet--Service--Dao--获取数据库数据
6、什么是cookie
答:cookie是Web服务器发送给浏览器的一块信息,浏览器会在本地文件中存储cookie。
7、session与cookie的区别
答:cookie数据存放在浏览器上,session数据存放在服务器上。
8、状态码表示的意思
答:200:请求成功
300:转发或重定向
401:未授权
404:找不到资源
500:服务器错误
MySQL
1、数据库的ACID特性
答:ACID指事务的:原子性、一致性、隔离性、持久性。
2、常见的SQL优化
答:在表中建立索引,优先考虑where、group by使用到的字段。
尽量避免使用select *,因为会返回无用字段降低查询效率。
3、SQL语句
答:查找最新一条数据:order by 字段 desc limit 1
模糊查询:%表示0或多个字符 _表示单个字符 []表示包括括号内的字符
A表中所有字段,B表中部分字段连查:left join
B表中所有字段,A表中部分字段连查:right join
4、什么是索引
答:索引是帮助MySQL高效获取数据的数据结构。
5、索引的四大分类
答:主键索引(primary key):唯一的标识,主键不可重复,只能有一列作为主键
唯一索引(unique key):避免重复的列出现
常规索引(key):默认的
全文索引(fulltext):快速定位数据
6、什么时候该使用索引
答:数据量大的时候,加在常用来查询的字段上。
7、导致索引失效的语句
答:使用like关键字时,%放在前面索引不起作用,只有%不在第一位置,索引才会生效
尽量避免在where子句中使用!=或><操作符,否则引擎将会放弃使用索引而进行全表扫描
尽量避免在where子句中对字段进行函数操作,否则引擎将会放弃使用索引而进行全表扫描
8、俩表联查的几种方法
答:join
在where条件后的 in 再写一个查询语句
在where条件后的 EXISTS 再写一个查询语句
9、#{}与${}的区别
答:#{}是预编译处理、${}是字符串替换
#{}更安全,可以防止SQL注入
10、MyBatis是如何进行分页
答:MyBatis使用RowBounds对象进行分页,它是针对ResultSet结果集执行的内存分页,而非物理分页。
11、MyBatis动态SQL
答:MyBatis动态SQL可以在Xml映射文件内,以标签的形式编写动态SQL,通过完成逻辑判断并动态拼接sql。
MyBatis提供九种SQL标签:trim、where、set、foreach、if、choose、when、otherwise、bind
12、MyBatis多表查询的使用
答:在XML映射文件中,使用resultMap标签。如果字段中有对象,可以在resultMap内使用collection标签。
使用association标签,嵌套XML映射文件中其他查询语句,只要填入对应的id。
13、mybatis的执行流程
答:实例化SqlSessionFactoryBuilder,创建SqlSessionFactory
通过SqlSessionFactory创建SqlSession
通过sqlsession执行数据库操作
调用session.commit()提交事务
关闭sqlsession
14、mybatis事务
答:编程式事务和声明式事务
编程式事务:需要在代码中,进行事务的管理。
声明式事务:类似AOP的应用,代码是横切进去的,不影响原有代码。
15、为什么需要事务
答:如果不配置事务,可能存在数据提交不一致的情况。我们需要保证数据的ACID原则。
16、mybatis与mybatis-plus的区别
答:mybatis-plus在mybatis基础上做了增强,却不做改变。
mybatis-plus使用过程中可以减少mybatis中的CRUD的编写
提高了开发效率,弥补了mybatis的不足
Spring
1、Spring七大模块
答:Core(核心模块)、AOP、ORM、DAO、Web、Context、WebMVC
2、IOC与AOP
答:IOC控制反转:A类与B类存在联系,B类想获取A类的对象,需要主动创建。有了SpringIOC之后,就是将对象的创建权交给Spring容器,
由容器控制程序之间的依赖关系,这样B类想获取A类的对象,就是由Spring容器给予获得。
AOP面向切面编程:可以把几个类中共有的代码,提取到一个切片中,等到需要时再切入到指定对象的指定位置中去,从而改变原有的行为。
提高代码可用性、降低代码量、提高开发效率。AOP有三种应用场景:使用SpringAPI提供的接口、自定义类、注解。
3、IOC有什么作用
答:管理对象的创建和依赖关系的维护。
解耦
4、SpringMVC的执行流程
答:用户发送请求时会经过一个前端控制器(DispatcherServlet),前端控制器会根据请求找映射器,然后返回给前端控制器,
前端控制器再请求适配器执行,适配器再找到具体的控制器,控制器返回一个ModelAndView给前端控制器,
前端控制器将ModelAndView发送给视图解析器,视图解析器返回对应的View给用户。
5、SpringBoot自动装配原理
答:SpringBoot所有的自动配置都是在启动的时候被扫描并加载。扫描spring.factories所有的自动配置类都在这里面,但是不一定生效,
要判断条件是否成立,只要导入了对应的starter,就会有对应的启动器,有了启动器,我们装配就会生效。然后就配置成功了!
6、SpringBoot三大核心注解
答:Configuration、EnableAutoConfiguration、ComponentScan
Configuration:配置组件
EnableAutoConfiguration:开启自动配置
ComponentScan:开启组件扫描
6、SpringBoot中涉及的涉及模式
答:涉及了九种涉及模式。分别是:
抽象工厂、工厂方法、单例模式、适配器模式、装饰器模式、代理模式、观察者模式、策略模式、模板方法模式。
7、说自己有使用过的设计模式
答:单例模式:保证一个类仅有一个实例,并提供一个访问它的全局访问点,Spring中的bean默认都是单例的
代理模式:为其他对象提供一种代理,以控制对这个对象的访问,Spring中的AOP就是类似的原理
8、Spring、SpringMVC、SpringBoot联系与区别
答:Spring框架就像一个家族,衍生出很多例如SpringMVC、SpringBoot等,但它们的基础都是Spring的IOC和AOP
SpringMVC是Spring的一个模块式的web框架,围绕DispatcherServlet。
SpringBoot为了简化Spring的配置流程,约定优于配置。
TCP/IP
1、什么是三次握手
答:客户端向服务器发送SYN同步报文段,请求建立连接
服务器确认收到客户端的连接请求,表示同意向客户端建立连接
客户端收到服务器端的确认请求后,确认同步报文段,确认连接。
2、什么是四次挥手
答:A端向B端发送FIN结束报文段,准备关闭连接
B端确认A端FIN结束报文段,表示已经收到关闭连接请求
B端向A端发送FIN结束报文段,准备关闭连接
A端确认B端FIN结束报文段,A端退出连接
3、为什么要进行三次握手
答:同步初始化与序列、防止重复连接
4、TCP与UDP的区别
答:TCP是面向连接的协议,也就是说,在收发数据前,必须和对方建立可靠的连接,类似场景如:打电话
UDP是一个非连接协议,传输数据时不建立连接,类似场景如:发信息
5、HTTP与HTTPS的区别
答:HTTP是超文本传输协议,信息是明文传输的,HTTPS是加密传输协议,因为在HTTP为基础上加入了SSL层。
HTTP端口为:80 HTTPS端口为:443
6、网络分层架构,简要说明
答:物理层、数据链路层、网络层、传输层、会话层、表示层、应用层
物理层:为数据端设备提供原始比特流的传输通路
数据链路层:在通信的实体间建立数据链路连接
网络层:为数据在结点之间传输创建逻辑链路,并分组转发数据
传输层:提供应用进程之间的逻辑通信
会话层:建立端连接并提供访问验证和会话管理
表示层:提供数据格式转换服务
应用层:访问网络服务的接口
算法
1、冒泡排序
答:重复比较相邻的俩个元素。每次外层循环完,最后一个数都是最大的。内层循环则是置换相邻的俩个数
2、选择排序
答:分为无序区和有序去,每次循环把无序区最小的数添加至有序区
3、插入排序
答:取出第一个元素放入有序区,将无序区的下一个元素,与有序区的对比,放到对应的位置
4、归并排序
答:把序列分为若干组,每个数字分一组。将若干个组俩俩合并比较,直至合成为一组
5、快速排序
答:选定一个数为中心轴,将无序区中所有小于这个数的放在右边,将无序区中所有大于这个数的放在左边
分别对左右子序列重复操作。
Linux
Redis
1、什么是Redis
答:远程字典服务
2、为什么要用Redis
答:因为在数据量大的时候,我们查询每次都要去访问数据库,而有了redis,就可以把数据放在缓存中
每次只要访问缓存即可,大大提高了系统访问的效率。
3、什么时候用Redis
答:不需要实时更新但是又极其消耗数据库的数据
在某个时刻访问量极大而且更新也很频繁的数据
4、Redis事务
答:通过multi指令开启事务,之后命令入队,使用exec执行事务
5、Redis是单线程还是多线程,为什么
答:单线程。Redis是将所有的数据存放在内存中的,所以说使用单线程去操作效率就是最高的。
6、Redis的基本数据类型
答:String、List、Set、Hash、Zset
7、什么是Redis持久化
答:持久化就是把内存的数据写到磁盘中去,防止服务宕机了内存数据丢失。
8、持久化的机制是什么
答:RDB和AOF。默认是RDB
RDB:类似于快照,按照redis.conf配置文件中的设置自动保存。
AOF:通过记录redis的命令去记录数据库的变更,然后持久化到文件中