Java
0.有看过JDK源码吗?
1.简单说一下有IO流
I/O流 分为字节流和字符流,字节流有InputStem和OutputStream,字符流有Writer和Reader
字节流一般用于传输文本信息,字符流一般用于传输视频信息
2.String、StringBuffer和StringBuilder的区别
String是一个final字符数组,引用的对象不能被改变,定义以后不能进行增删改,每次操作都会产生一个新的对象
StringBuffer和StringBuilder底层都是可变的字符数组,StringBuffer是增加同步锁,所以是线程安全的,StringBuilder则是非线程安全的
3.++变量和变量++有什么区别?哪个是先赋值后运算?
++变量: 先自加再使用
变量++: 先使用再自加
++变量和变量++对于非内置数据类型 ++变量效率高一点 ,i++不是原子操作,线程不安全
4.==和equals的区别
==:比较的是变量(栈)内存中存放的对象的(堆)地址,用来判断两个对象的地址是否是相同
equals:比较的是两个对象的内容是否是相等的
5.重写和重载的区别? 重载的参数名不同重载吗?
重写:子类把父类的方法重写一遍,方法名,参数列表,返回类型必须相同
重载:一个类中,同名的方法有不同的参数列表,参数类型,个数,顺序不同
参数名不同不是重载
6.反射的实现方式有哪几种?
反射就是程序运行的时候,能够知道任意一个类的所有属性和方法,其他对象也能调用它的任意方法,这种动态获取的信息以及动态调用对象的方法功能称为Java语言的反射机制。
JDBC就是典型的反射
1.Class.forName(“类的路径”)
2.类名.class
3.对象名.getClass()
4.基本类型的包装类,可以调用包装类的Type属性来获取包装类的Class对象
7.Java方法传参是值传递还是引用传递
值传递
8.Java创建对象的集中方式
1、new创建对象 2、通过反射机制 3、采用clone机制 4、通过序列化机制
9.抽象类和接口的区别
1、抽象类要被子类继承,接口要被类实现
2、接口只能做方法声明,抽象类中可以作方法声明,也可以做方法实现
3、接口里定义的变量只能是公共的静态的常量,抽象类中的变量是普通变量。
4、抽象类可以有具体的方法和属性,接口只能有抽象方法和不可变常量。
10.面向对象的特性
1、抽象:把现实世界中的某一类东西,提取出来,用程序代码表示,抽象出来的一般叫做类或者接口。
2、封装:是把过程和数据包围起来,对数据的访问只能通过已定义的界面。如私有变量,用set,get方法获取。
3、继承:
4、多态:指允许不同类的对象对同一消息做出响应。
JVM篇
1.JVM内存模型
JVM定义了不同运行时数据区,他们是用来执行应用程序的。某些区域跟随JVM启动及销毁,另一些区域的数据是线程独立的,随着线程创建和销毁。JVM内存分为线程私有区和线程共享区。
2.JVM性能调优
1、设置堆内存的大小 2、设定新生代大小 3、设定垃圾回收器
3.JVM类的加载机制
加载–>链接–>初始化–>使用–>卸载
加载:通过类的完全限定名,查找字节码文件,利用字节码文件创建Class对象。
链接:将符号引用代替为直接引用
初始化:静态块的初始化,静态变量的赋值。主动引用时才会初始化
使用:实例化
卸载:GC
加载机制-双亲委派模式
加载器加载类时,先把请求委托给自己的父类加载器执行,直到顶层的启动器加载器,父类加载器加载成功则返回,不则子类加载。优点:避免了重复加载
4.介绍一下Java虚拟机的垃圾回收机制
Java里,虚拟机会自动释放一个对象的内存,不需要程序员手动释放。JVM有个垃圾回收线程,当虚拟机空闲或者堆内存不足时,才会触发执行,将没有被引用的对象添加到回收的集合中,进行回收。GC最基础的算法有三种
1、标记-清除法:首先标记所有要回收的对象,标记完成后统一回收。2、复制算法:将内存分为容量相当的两块,每次使用一块,当其中一块内存用完,就将还存活的对象复制到另一块上面,然后把已经使用过的内存空间一次性清理掉。3、标记-压缩法:和标记清除法相似,区别是让所有存活的对象都向一边移动,减少内存碎片。4、分代回收算法:把java堆分为老年代和新生代,各自采用最适合的收集算法。年轻代:标记-复制法 老年代:标记-清除法
5.介绍一下JVM运行的数据区域
1、程序计数器:很小的内存空间,运行Java方法时,存储正在执行的Java字节码地址,运行本地方法时,存储为空。
2、Java虚拟机栈:每个方法执行的同时会产生一个栈帧,用于存储局部变量表,操作数栈,动态链接,方法返回地址
3、本地方法栈:
4、堆:存放对象实例,也是垃圾回收器主要的管理工具,由于采用分代回收算法,所以还可以细分为:新生代和老年代
5、方法区:各个线程共享的内存区域,它用于存储已被虚拟机加载的类信息、常量、静态变量。
多线程&并发
1.线程的状态,创建线程的方式
创建线程的方法:
1、继承Thread类
2、实现Runable接口 不会返回结果
3、实现Callable接口通过FutureTask包装器来创建Thread线程 可以返回结果
线程的状态6种
初始状态-等待状态-运行状态-阻塞状态-终止状态-超时等待状态(可以在指定的时间自行返回)
2.什么是死锁
是指多个进程在运行过程中因争夺有限的资源而造成的一种僵局,当进程处于这种僵持状态时,若无外力作用,它们都将无法再向前推进
3.怎样解除死锁
最简单的是
1.再分配够足够的资源分配给死锁进程
2.终止一个或者多个死锁进程,直至打破循环。
还可以通过
1、预防死锁: 提前制定协议,破坏产生死锁的必要条件:请求保持条件,不可抢占条件,循环等待条件
2、避免死锁: 银行家算法
3、检测死锁:
4、解除死锁
数据结构
1.HashMap原理,产生Hash冲突怎么解决
1、拉链法:每个节点有个next指针,被分配到同一个索引的多个节点可以用单线链表存储
2、开放地址发:一旦产生了冲突,就寻找下一个空的散列地址
3、再哈希法,有多个哈希函数,当发生冲突是,使用第二个等哈希函数,直到没有冲突。
2.ArrayList和LinkList是什么
LinkList:是一个双向链表,增加删除比ArrayList有更好的性能,查找弱于ArrayList。
ArrayList:可以看做是能够自动增长容量的数组,底层实现是一个数组
3.HashMap和HashTable的区别
1、父类不同,HashMap继承了AbstractMap类,HashTable继承了Dictionary
2、对外的接口不同,HashTable比HashMap多提供了elements()和contains()两个方法
3、对null的支持不同,Hashtable:key和value都不能为null。HashMap:只能有一个Key可以为空,value可以为空。
4、安全性不同,HashTable是线程安全的,HashMap是线程不安全的,所以HashMap效率高。
5、计算hash值得方法不同
6、初始容量和每次扩容容量不同
4.List,set和Map的区别,set的数据是无序的吗,List呢?
set:存储一组唯一,无序的对象。检索能力较差,插入删除效率比较高,插入删除不会引起位置变化(TreeSet,HashSet)
list:存储一组不唯一,有序的对象。和数组类似,可以动态增长,查找效率比较高,插入删除比较差
Map:存储一组键值对象,提供键到值得映射
SSM
1.SpringMVC的工作原理
1、客户端发出HTTP请求到前端控制器(DispatcherServlet)
2、前端控制器调用处理器映射器(HandlerMapping)
3、处理器映射器找到对应的处理器对象,返回给前端控制器
4、前段控制器调用处理器适配器(HandlerAdapter)
5、处理器适配器经过适配调用具体的处理器(conntroller)
6、control处理具体业务逻辑后,返回给数据(ModelAndView)给处理器适配器,然后给前端控制器
7、前段控制器将数据交给视图解析器(ViewReslover)
8、视图解析器解析后具体的view交给前端控制器
9、前端控制器渲染视图,返回给用户
2.Spring和SpringMVC的常用注解
@RequestMapping:用于处理请求地址的映射
@RequestBody:接受HTTP请求的Json数据,将JSON数据转换为Java对象
@ResponseBody:将controller方法返回的对象转化为Json对象相应给客户
@Controller:控制类
@Service:业务类
@Repository:Dao类
@Component:被标注的类将由spring容器管理
@Autowired:由Spring提供用于Bean的注入
@Configuration:声明当前类为配置类
@Aspect:声明一个切面
@Around:定义环绕增强
@Pointcut:定义切入点
3.依赖注入有几种方式
构造方法注入
setter方法注入
接口注入
4.Mybatis的常用注解
@Mapper
@Select
@Insert@Delete@Update
@Results、@Result、@ResultMap:解决实体类名称和数据库名称不一致的问题
5.Mybatis传参时候#{}和${}的区别
#{}是预处理,KaTeX parse error: Expected 'EOF', got '#' at position 23: …串代替 Mybatis在处理 #̲{}时,会将sql中的#{}替…{}时,就是把${}替换成变量的值
6.项目的打包方式是jar还是war
SSM 是war包 ,SpringBoot是jar包
7.解释一下AOP和IOC
IOC和AOP是Spring框架的灵魂。
IOC就是典型的工厂模式,通过sessionFactory去注入实例。AOP就是典型的代理模式
IOC:控制翻转/依赖注入。
将对象交给Spring容器管理,只用在配置文件中配置相应的Bean和属性,spring容器启动的时候会把bean初始化好,然后分配给需要的类,就不用再类里面new对象了
AOP:面向切面编程。
在程序中添加交叉业务逻辑,封装成一个切面,然后注入到目标对象中。实现AOP的技术有两大类:一、是动态代理技术,利用截取消息的方式,对消息进行封装,取代原有对象行为的执行。二、是静态织入的方式,引入特定的语法,从而使编译器在编译期间织入有关代码。
代理模式:特征是代理类和委托类有同样的借口,代理类主要负责委托类预处理消息,过滤信息,把消息发给委托类,以及事后处理信息。代理类本身不处理方法,通过调用委托类对象的相关方法,提供服务。
8、Spring支持的bean的作用域
Spring容器中的 bean 可以分为5个范围
1、singleton:默认,每个容器只有一个bean的实例
2、prototype:为每个bean请求提供一个实例
3、request:为每个网络请求创建一个实例,在请求完成以后,bean会失效并被垃圾回收器回收
4、session:与request范围类似,确保每个session中有一个bean的实例,在session过期后,bean随之消失
5、global-session:全局作用域,
9、Spring基于xml注入bean的几种方式
set方法注入
构造器注入
静态方法注入
实例工厂注入
10.Spring的中的事务
SpringBoot和SpringCloud
1.Springboot的工作原理
1、创建模块
2、实体类的开发(导入Lombok依赖,添加@Data)
3、数据层的开发(导入Mybatis-plus、Druid数据源)
4、
2.SpringBoot的优点
独立运行:内嵌了Tomcat、Jetty容器,不用打成war包,打成Jar包就可以了
简化配置:spring-boot-starter-web自动依赖了其他组件,避免了版本冲突,减少了maven配置
3.SpringBoot的核心注解是哪个?有哪些组成?
SpringBootApplication:启动类注解
@SpringBootConfiguration:标注是配置类,会被扫描加载到IOC容器中
@EnableAutoConfiguration:打开,或关闭自动配置的功能
@ComponentScan:扫描默认包下面的符合条件的组件并加载
3.SpringCloud常见的组件有哪些??
注册中心:EureKa、Nacos
负载均衡:Ribbon
远程调用:OpenFeign
组件网关:Gateway
服务保护:Sentinel
服务配置管理组件:Nacos
Mysql
1.知道索引吗,事务?
事务:就是将一系列数据操作绑定成一个整体进行统一管理。要成功都成功,要失败都失败,ACID原子性,一致性,隔离性,持久性
索引:对数据库表中一个或者多个列的值进行排序的结构,建立索引有助于快速获取信息,不用扫描整个表。
2.修改语句的完整的语句结构,修改表的两个字段怎么修改?
修改表字段
ALTER TABLE 表名 CHANGE 原字段名 新字段名 数据类型[属性]
ALTER TABLE 表名 ADD 字段名 数据类型[属性]
ALTER TABLE 表名 DROP 字段名
ALTER TABLE 表名 ADD CONSTRAINT 主键名 PRIMARY KEY 表名(主键字段)
Alter table 表名 modify column 字段 类型(长度);
更新记录
UPDATE 表名 SET 列名 = 更新值[WHERE 更新条件]
3.插入语句的完整的语句结构
INSERT INTO 表名 [(字段名列表)] values (值列表)
INSERT INTO 表名 [(字段名列表)] values (值列表1) (值列表2)
4.删除数据记录
DELETE 表名 WHERE 条件
TRUNCATE TABLE 表名 删除所有数据
5.Mysql的数据类型
1、整数类型
TINYINt,SMALLINT,MEDIUMINT,INT,BIGINT 1 2 3 4 8
2、实数类型
FLOAT,DOUBLE,DECIMAL
3、字符串类型
VARCHAR,CHAR,TEXT,BLOB
4、枚举类型
ENUM
5、日期和时间类型
timestamp
6.Mysql常用的搜索引擎
InnnoDB:在事务处理上有优势,即支持提交,回滚和崩溃回复能力,比MyISAM占用更多的磁盘空间。适合进行频繁更新,删除操作,对并发要求较高,支持事务的系统,支持外键。
MyISAM:不支持事务,不支持外键约束,访问速度较快,适合以查询为主的系统。
7.Mysql的表的优化
限定数据范围
读/写分离
垂直分区
水平分区
8.索引什么时候会失效
1、如果条件中有or,即使其中有条件带索引也不会使用
2、对于多列索引,不是使用的第一部分(第一个),则不会使用索引
3、like查询是以%开头
4、如果列类型是字符串,那一定要在条件中将数据使用引号引用起来,否则不使用索引
5、如果mysql估计使用全表扫描要比使用索引快,则不使用索引
9.什么是内连接、左外连接、右外连接
内连接:匹配两个表中相关联的记录
左外连接:除了匹配两个表中相关联的记录外,还会匹配左表中剩余的记录
右外连接:除了匹配两个表中相关联的记录外,还会匹配右表中剩余的记录
Linux指令
1.查看文件内容的命令有哪些?
vi 文件名 查看/修改
cat 文件名 查看
more 文件名 分页显示文件内容
tail 文件名 查看尾部内荣
head 文件名 查看头部内荣
2.创建文件和文件夹的命令,修改文件权限
mkdir 创建文件夹
touch 创建文件
chmod
3.查找文件是否存在的命令
find /-name mysql
where is mysql
4.编写文件的命令
vim
5.移动,复制,删除,查找某个文件的命令
mv cp rm find/local 文件名
7.查看所有进程,查看所有进程的信息
ps -ef
ps -ef | grep pid
8.查看IP地址和接口信息
ifconfig
9.查看网络连通
netstat
10.查看磁盘使用空间
df -h
设计模式和算法
1.了解哪几个设计模式
1、工厂模式
2、单例模式
3、代理模式
4、模板模式
5、观察者模式
2.解释一下工厂模式
这里是引用
3.解释一个单例模式,饿汉式和懒汉式
这里是引用
4.工厂模式哪个是接口哪个是工厂
这里是引用
5.介绍一下排序算法,Java sort 是用的哪些排序算法
这里是引用
6.写一下冒泡算法
这里是引用
7.KMP算法
这里是引用
项目
1.视频功能的前后端流程
2.视频功能传递了哪些参数
3.Vue用过吗?
4.了解,用过MQ消息队列吗?
网络
1.Http协议
使用了TCP协议,保证了数据的可靠性。端口号是80
是无状态的,同城使用cookie+数据库的方式来跟踪用户的活动
既可以使用持久链接,也可以使用非持久连接
有请求报文和响应报文
2.TCP/IP模型有多少层
4层:应用层(应用层+表示层+会话层),传输层(传输层),网际层(网络层),网络接口层(数据链路层+物理层)
3.TCP和UDP的区别? TCP和UDP的应用场景?举几个例子
这里是引用
4.介绍一下websocket,websocket是基于什么传过去?
这里是引用
Redis
1.用过Redis吗?
git和svn
1.用过git吗
用过