1.jdk和jre的区别
jdk是开发工具包,jdk包含java源码和编译器javac,
内部包含开发和运行环境
jre是运行工具包,为java提供运行环境,编写需要j
dk,运行只需要个jre就行
2.==和equals的区别
== 作用域基本类型和引用类型是不一样的,
基本类型比较的是值,引用类型比较的是地址
equals 在引用类型中若是没有重写Object类时,则默认使用Object类的equals方法,则仍然
利用“==”比较两个对象的内存地址,若是重写Object类的equals方法,则调用子类重写后
的方法可以进行内容或值的比较
equals内部使用的也是==
什么是基本类型:8大基本类型
byte int short long
double float
boolea
char
什么是引用类型:类,接口,数组
3.final的作用(和finallyde区别)
final修饰的方法不能被重写,修饰的类不能被继承,修饰的变量叫常量。不能被修改
修饰的类为最终类,不能被继承
final的好处是提高了性能,在多线程中可以安全的实现共享
finally:是在异常处理中的捕获异常中使用的,往往写在catch之后
finally在异常中往往是关闭物理资源的,如果没有可以不写
4.String是基本类型吗
不是,String是引用类型,是个对象
5.对象的特征有哪些
封装:将事务的属性和功能隐藏起来,只保留特定的方法与外界练习
继承:子类使用父类的属性和方法
多态:同一个函数名,引用不同的对象,所表达的内容不同,输出结果不同,父类引用指向不同的子类
输出结果不同
6.什么是异常
异常:异常就是程序遇到了问题,然后跳出当前程序,然后抛出提醒
编译期异常:在编译期间的异常,必须要进行处理,需要使用try-catch捕获
运行期异常:在运行是的异常,一般不用处理。直接抛出
捕获异常:在方法中进行捕获,此异常必须进行处理
抛出异常:直接抛给方法,对此异常不进行处理
throw:在方法中,是一定会出现的异常,其后只能定义一个异常
throws:在方法名之后,是可能出现的异常,以后可以定义多个异常
7.什么是乐观锁和悲观锁
悲观锁:如其名,在自己执行期间认为其他线程会进来执行,从而在一开始就上了一个锁,只有自己执行完才允许其他线程进行操作。
乐观锁:也是如其名,乐观的认为自己在执行期间其他线程不会进行操作,不会上锁,但在提交前会进行判断有其他程序修改
cas:
8.死锁和活锁的区别
死锁:A占用了b的锁,b占用了a的锁,相互间占用了对方的锁,形成的阻塞状态
怎么防止死锁问题:
尽量使用trylock的方法
设置超时时间,超时可以关闭死锁
尽量不要使用同步代码块
活锁:和死锁恰恰相反,占用了资源又全部释放不执行
9.什么是串行,并行,并发,分布式
串行:在同时要执行两个线程时,当一个线程执行时,要等这个线程执行完毕后,才能执行第二个线程
并行:多个线程在多个cpu上执行时,可同时执行,但当线程数大于cpu时,使用串行
并发:一个cpu执行多个线程,每个线程执行固定的时间,从而实现宏观上的同时执行,通过穿插执行的
串行并发:一个cpu并发多个线程
并行并发:多个cpu并发多个线程
分布式:实际就是将一个系统分成几个系统,然后分成的系统之间还相互联系
多线程:多个线程能同时运行
高并发:高并发就是在一定时间内大量的请求访问
10.说说内部类是什么
内部类:在一个类中定义一个类那么这个类就是内部类
内部类分为:
成员内部类:定义在成员的内部类,往往是在成员变量的位置
可以引用外部类的方法和变量
使用场景:A需要引用B,B同时需要引用A
静态内部类:定义的和成员内部类差不多,在成员内部类钱加静态static
不能直接访问外部类的方法和变量,需要使用new对象,否则只能引用外部类中的 静态
方法和变量
使用场景:A需要引用B,而B不需要引用外部类A
局部内部类:局部内部类定义在外部类的方法中只能在方法中使用
使用场景:只在方法中使用,一次性的
匿名内部类:不需要添加类名class,往往与匿名对象使用
往往使用的是继承其他类或实现接口,不能有构造方法,而且参数要使用final
使用场景:需要实现接口单不需要他的引用
11.this和super的区别:
this:可以引用自己本身类中的数据和方法,也可以引用父类中数据和方法,但不能引用父 类中的构造方法。
super:可以在子类中引用父类数据,方法,构造方法,不能引用本子类的。
12.什么是流,包含什么
流:流是个抽象概念,数据的输入和输出就是流
流可以分成两大类:字符类和字节流,字节流包括字节输入流和字节输出流,字符流包括 字节字符输出流和字节输入流
字节流和字符流的区别:
字节流:以一个字节进行传输,可以对所有数据进行传输
字符流:按两个字节进行传输,只能以二进制的方式传输
序列化和反序列化:serializable
序列化:将java对象转化成二进制的形式
反序列化:将二进制的形式转化会java对象
13.什么是ioc,使用的是什么容器
ioc:控制反转,表示的是对象的创建和管理都要交给spring容器来管理,其实ioc只是一种 理念,真正实现ioc的其实是依赖注入di。
java容器:java容器其实就是一个程序,管理着对象和对象之间的联系,控制着对象的生命 周期。
java容器类:list,arraylist,hash,hashmap,map。。。。。
14.数据库连接池的理解
数据库连接池:数据库连接池就是,在程序初始化后,创建多个对象链接数据库,使用时引 用,不使用时放入到池中。
线程池:池都是一样的概念,创建多个线程到内存中,使用时引用,不使用时放在池中。
使用池的好处:节约了资源,不用每次使用都创建,提高了效率
15.springmvc的工作流程
1.客户向前端控制器发送请求,前端控制器接收请求
2.前端控制器使用url访问处理器映射器,处理映射器将查询的数据返回给前端控制器
3.前端控制器将数据再交给处理器适配器,处理器将数据和视图返还给前端控制器
4.前端控制器将视图交给视图解析器,然后解析完返还给前端控制器
5.前端控制器在吧视图交给视图渲染后,返还给客户
16.事务的四大特性
原子性:就是操作要么全部完成,要么全部失败
一致性:数据修改完成后,数据发生了改变,但数据本质是不变的
隔离性:数据在修改时,数据是相互隔离不受影响的
持久性:数据修改成功后,数据就永久修改了
什么是回滚
回滚:返回到事务开始的数据
回滚点(savepoint):返回到自己设定的点上
什么是脏读,什么是幻读,什么是不可重复读
脏读:一个事务在读取数据时,读取到的数据是其他事务回滚前的脏数据
幻读:一个事务在查询完数据后,另一个事务添加了一事务的数据,从而使一数据第二次查 询比第一次查询的数据多了
不可重复读:一个事务第一次读的数据和第二次读的数据不同(被第二个事务修改了)
17.二十四种设计模式
(理解不了,跳过)
https://blog.csdn.net/weixin_46460843/article/details/118740236
18.常见的数据结构:
栈:遵循的是先进后出的原则,当数据进入后会被放入底部,在进行添加和删除是只能从一 端开始,不能从中间进行
队列:遵循的是先进先出的原则,当数据进入后会被放在顶部,和栈一样是只能在一段进行 增加和删除
数组:在内存开辟一部分空间,用来存储元素,对数据的查找通过下标来查找,特点是查找
快,增删慢
链条:是由一系列的节点(元素)组成,节点包含两大部分,数据域和指针域,链条的特点
是查找缓慢,增删快
红黑树:红黑树本质就是二叉查找树,和二叉查找树的区别就是不会出现由于数据较小,从 而形成链条
19.什么是向上转型和向下转型
属于多态的范畴
向上转型:就是把自己子类看成父类,进行继承后发生重写,重写的数据输出,其他数据输 出还是父类的数据
向下转型:就是指向子类,在发生向上转型后,子类还向引用自己的方法,那么就会使用向 下转型
20.string和stringbuilder
string:string的长度是固定的,每次拼接都会生成新的对象,拼接效率缓慢,对字符串操作 方便
stringbuilder:stringbuilder的长度默认是16,在超出是会进行扩容,所以stringbuilder拼接不 用创建新的对象,一直是同一个,拼接效率快,但对字符串操作不方便
21.抽象类和接口的区别
抽象类通过abstart创建,而接口通过interface创建
抽象类使用extends继承,接口时通过inplanents继承
抽象类能创建main方法,接口不能
抽象类能有构造方法,接口不能
抽象类中中可以有抽象方法还可以有普通方法,接口中只能有抽象方法
22.什么是泛型: notify
泛型:简单的来说就是参数化类型,把他看作是一个参数,可以被不同的类型重用
泛型通配符:在接收时,无法确定数据的数据类型,可以使用?,?就是通配符
泛型通配符的上下限:
泛型的上限:就是父类及其子类的类型,extends
泛型的下限:自己及其父类的类型:super
23.线程的的几种状态(生命周期)
新建状态:创建一个新的线程
就绪状态:线程执行自身的starct(),就进入了就绪状态
运行状态:cpu运行处在就绪状态的线程,且给这个线程一个时间片
阻塞状态:由于一些原因,线程失去了cpu的使用权
等待阻塞:使用wait()方法,使线程处在等待状态
同步阻塞:线程在去使用同步锁时,发现同步锁已经被其他线程占用
其他阻塞:使用了sleep()和join()或发起了io请求
死亡状态:线程执行结束或者发生了异常
24.简单的谈谈java中的内存分配
25.谈谈什么是static
26.什么是方法
方法:方法就是一个具有一定功能的代码块,在使用同一个功能时不用重复的写相同的
代码,只需要使用方法就行
方法的重载:相同方法名,但参数列表不同,实现的功能不同
方法的重写:子类继承父类时,对父类传送过来的数据转变成自己的数据
一大:修饰符子类要比父类大
两同:方法名,参数列表相同
两小:异常,返回值比父类小
递归:引用自身的方法
27.什么时索引,添加索引的好处,添加索引一定会提高效率吗unique
索引:索引本质也是一个表,是对数据表中的一列或者多列的记录,就好比书的目录
索引分类:唯一,普通,主键,组合
索引的优缺点:优:索引可以加快对数据库的查询速度,
缺点:相对的也会减缓增加和删除的效率
索引会占用物理资源
在什么情况下不适用:当无论如何要对表中的数据进行全表查询
数据库的数据很少,浪费资源
要查询的数据是大量重复的,添加索引多余
索引的原理是什么:将数据进行有序的排列,然后通过二分查询进行查询
怎么判断索引是否使用:使用explain查询sql执行计划,看key使用的是哪个索引
什么情况下索引会失效:使用like是第一位不能是%,使用or,null,in都会失效
sql优化会怎么做:首先打开慢查询日志,找到慢查询的表
查看表是否遵循三公式:不可拆分,含有主键,无多余的数据
查看是否有使用字符存储的数据使用varchar代替
尽量不要使用null值,使用默认值代替,例如0
查看表是否规范:不可使用in,or,null,避免使用select *
避免使用子查询
分析sql的索引是否用的上:使用explain查看type是不是全表查询,key使用的那个人索引
rows扫描的行数是不是很大
28.数据库的约束的有哪几种
主键约束:主键约束,唯一,无空值,自增策略
外键约束:用来对外表链接的标准
唯一约束:数据不能有重复的,唯一的
空值约束:数据不能存在空值
默认约束:数据在不进行赋值的情况下,都是默认值
29.数据库的优化有哪些
尽量不要使用*,使用全字段符
在进行添加索引时,不要超过五个索引
多使用explain查询语句
尽量使用小表驱动大表
使用慢查询找出慢查询的表,进行优化
尽量把容易查询的数据放到最后
30.什么是aop
aop:意思是面向切面编程,oop是纵向的,而aop是面向的横向的,对多个对象的相同
功能可以通过aop进行统一的管理。
31.在mybatis中#和$的区别和她们的好处
#相对于$,效率更高,更加安全,前者可以防止sql的注入攻击,而且对传入的数据进行字 符串拼接,而后者可以发生sql的注入攻击,而且不能拼接
32.mybatis的工作原理是什么
首先sqlsessionfactorybuider通过配置文件生成sqlsessionfactory
sqlsessionfactory实例直接开启一个sqlsession
在通过sqlsession获得mapper文件
执行mapper映射的sql文件,完成数据库的crud和事务
关闭sqlsession
33.mybatis的resulttype和resultmap的区别
34.谈谈mybatis的lru的原理和作用
lru:如排队一样,使用最多的数据会被放到最前面,新添加的数据也会放在最前面,使用最少的会被放到最后,lru缓存中会设置一个阈值,当超过阈值会从最后开始删除
35.get和post的区别
get访问服务器时是对获取数据,post向服务器传输数据
get在访问服务器时参数会保存到历史记录,post不会
get在浏览器回返时是无害的,host会多次访问
get传输数据会有长度的限制,post可以传输大量数据
get访问之后是拼接到url后的,post不会
36.什么时sql的攻击注入,如何防止
由于后台的sql语句是拼接的,数据时用户上传的,当用户上传数据时添加了特殊字符和关键字,后台拼接的sql语句会发生变化,从而出现不一样的操作
使用preparedstatement代替statement就可以解决sql注入攻击的问题
37.什么时盒子模型
盒子模型包含四个部分数据区(content),边框(border),外边距(margin),内边距(padding),其中外边距中时边框,边框中时内边距,内边距中时数据区。
38.什么是三次握手
三次握手本质是相互发送报文来确定相互之间是否链接成功
第一次握手:客户端发送syn报文给服务器端,声明自己的序列号isn,此时客户端处在syn-send状态
第二次握手:服务器端收到客户端发送过来的syn报文,将传送过来的syn+1生成ack,表示自己已经收到报文,然后将自己的syn报文和ack报文发给客户端,同时也声明自己的isn,此时服务器状态syn-recv
第三次握手:客户端接收到服务器端的syn后,也将syn+1成ack,也表示自己已经收到,发送ack报文给服务器端,此时状态为established.
为什么三次握手,二次不行吗?
不行,第一次握手是为了确定客户端的发送能力和服务器的接收能力,第二次握手是确定了服务器的接收能力和发送能力金额客户端的发送能力,第三次握手是确定了服务器确定了客户端的接收能力
三次握手都可以携带数据吗?
第一次握手和第二次握手不能携带数据,容易被攻击,第三次握手可以传输数据
什么是四次挥手?
四次挥手本质就是客户端和服务器端进行断开链接的操作
第一次挥手:客户端发送一个fin报文给服务器端,报文中会包含客户端的序列号isn,此时客户端处在fin_wait1状态
第二次挥手:服务器端接收到了客户端的fin报文,回应一个ack报文,并且会将isn+1作为ack的序列号值,表明服务器端收到了报文,此时处在close_wait状态
第三次挥手:如果服务器也想断开链接,服务器向客户端发送fin报文,报文中包含服务器的序列号isn,此时服务器处在last_ack状态
第四次挥手:客户端收到服务端的fin报文后,返回一个ack报文,同时将服务器的序列号值+1作为ack的序列号值,表明客户端接收到了服务器的报文,此时客户端为time_wait状态
客户端在第四次挥手后不会立即变为close状态,需要等待服务器在回应一个报文才会进入close状态
39.src和href的qb
src本质是浏览器的内容,href(超文本引用)本质是资源对外部文档的链接,超链接
40.css选择器有哪些:
通配符选择器: *
类选择器: class
标签选择器: div h
id选择器: id
群组选择器: 多个选择器用逗号隔开
41.http和https的区别
http:是一种超文本传输协议,用于客户端到服务端的一系列操作,专门用来传输html的web内容
https:是一种安全套接字层的http传输协议,是由ssl+http协议构建的,可以实现加密传输和用户认证网络协议
区别:1.http传输是通过明文传输的不安全,https传输是通过加密传输的
2.http域名不需要购买,而https的域名需要购买才能使用
3.http的端口为80,https的端口为443