数据库
left join 、right join、 inner join 用法
- left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录
- right join(右联接) 返回包括右表中的所有记录和左表中联结字段相等的记录
- inner join(等值连接) 只返回两个表中联结字段相等的行
https://blog.csdn.net/fanhl111/article/details/89891539
数据库事务的理解
原子性(Atomicity):事务作为一个整体被执行,包含在其中的对数据库的操作要么全部被执行,要么都不执行。
一致性(Consistency):事务应确保数据库的状态从一个一致状态转变为另一个一致状态。一致状态的含义是数据库中的数据应满足完整性约束。
隔离性(Isolation):多个事务并发执行时,一个事务的执行不应影响其他事务的执行。
持久性(Durability):一个事务一旦提交,他对数据库的修改应该永久保存在数据库中。
https://www.cnblogs.com/takumicx/p/9998844.html
事物的隔离级别
① Serializable (串行化):可避免脏读、不可重复读、幻读的发生。
② Repeatable read (可重复读):可避免脏读、不可重复读的发生。
③ Read committed (读已提交):可避免脏读的发生。
④ Read uncommitted (读未提交):最低级别,任何情况都无法保证。
https://www.cnblogs.com/fjdingsd/p/5273008.html
数据库的三大范式
第一范式(1NF)
原子性:保证每一列不可再分
第二范式(2NF)
前提:满足第一范式
每张表只描述一件事情
第三范式(3NF)
前提:满足第一和第二范式
确保数据表中的每一列数据都和主键直接相关,不能间接相关
https://www.cnblogs.com/wsg25/p/9615100.html
MySQL和Oracle的区别
mysql和oracle的区别有:1、Oracle数据库是一个对象关系数据库管理系统,要收费;MySQL是一个开源的关系数据库管理系统,是免费的;2、数据库安全性的区别;3、对象名称的区别;4、临时表处理方式上的区别等等。
https://www.php.cn/mysql-tutorials-413588.html
https://www.cnblogs.com/bailing80/p/11440927.html
数据库有哪些索引
聚集索引,非聚集索引,联合索引
https://www.cnblogs.com/wwxzdl/p/11116446.html
索引的优点和缺点
索引的作用:创建索引能够大大的提高系统的性能
索引的-优点:
①通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性
②大大加快数据的检索速度,这也是创建索引的最主要原因
③加快表与表之间的连接,在实现数据的参考完整性方面特别有意义
④在使用分组和排序,子句进行数据检索时,同样可以显著减少查询中分组和排序的时间
⑤通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。
索引的缺点
1.创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。
2.索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,那么需要的空间就会更大。
3.当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度。
https://blog.csdn.net/qq_40606397/article/details/101360795
索引的作用以及代价是什么
作用:
与目录在书籍中的作用类似,都是用来提高查找信息的速度。索引提高数据库的性能,不用加内存,不用修改程序,不用调sql,只要执行正确的create index ,查询的速度就可以提高成百上千倍。因此索引的价值在于提高一个海量数据的检索速度。
代价:
查询速度提高是以数据修改操作(插入、更新、删除)的速度为代价的,这些写操作,增加了大量的IO。另外索引还会在硬盘上占用相当大的空间。(以空间换时间)
https://blog.csdn.net/weixin_43683907/article/details/98362412
Java基础
抽象类和接口的区别
- 抽象类只能单继承,但是一个类可以实现多个接口
- 抽象类里面可以有普通方法和抽象方法,接口里面的方法只能是public abstract的
- 抽象类的成员变量可以是各种类型的,接口里只能是public static final的
深入一点:抽象类和接口的目的不一样,抽象类是为了代码复用,是对类本质的抽象;接口是为了对类的行为进行约束,是对类行为进行抽象
JDK和JRE的区别
JDK:Java Development Kit 的简称,Java 开发工具包,提供了 Java 的开发环境和运行环境。
JRE:Java Runtime Environment 的简称,Java 运行环境,为 Java 的运行提供了所需环境。
具体来说 JDK 包含 JRE,同时还包含了编译 Java 源码的编译器 Javac,还包含了很多 Java程序调试和分析的工具。简单来说:运行 Java 程序,只需安装 JRE ,编写 Java 程序,需要安装 JDK。
int和integer的区别
Java是一种近乎纯洁的面向对象语言,为了方便引入了基本数据类型,但是每一种基本数据类型对应一个包装类型,从Java5开始引入了自动装箱拆箱机制,二者可以相互转换
原始类型 | 包装类型 |
---|---|
boolean | Boolean |
char | Character |
byte | Byte |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
public class AutoUnboxingTest {
public static void main(String[] args) {
Integer a=new Integer(3);
//将3自动装箱成Integer类型
Integer b=3;
int c=3;
//false 两个引用没有引用同一对象
System.out.println(a==b);
//true a自动拆箱成int类型再和b比较
System.out.println(a==c);
}
}
maven依赖冲突怎么解决
- 首先查看报错信息,如果出现NoSuchMethodError,ClassNotFoundException等信息证明出现了依赖冲突
- 查看报错信息确定那个jar包冲突了,如: org.springframework.core
- 然后查看pom文件
如果改完pom文件还不能解决问题,我会打开左边的external libraries直接查看jar包,删掉重复的jar包
介绍一下锁
我所知道的锁:
- 悲观锁:悲观锁认为自己在使用数据的时候一定有别的线程来修改数据,因此在获取数据的时候会先加锁,确保数据不会被别的线程修改;java中synchronized关键字和Lock的实现类都是悲观锁
- 悲观锁适合写操作多的场景,先加锁可以保证写操作时数据正确
- 乐观锁认为自己在使用数据时不会有别的线程修改数据,所以不会添加锁,只是在更新数据的时候去判断之前有没有别的线程更新了这个数据
- 乐观锁适合读操作多的场景,不加锁的特点能够使其读操作的性能大幅提升
https://www.cnblogs.com/jyroy/p/11365935.html
Synchronized实现原理及和Lock的区别
https://www.cnblogs.com/fanBlog/p/11323407.html
spring注入方式
1.构造器注入
2.setter注入
3.接口注入
Springboot比spring有哪些改进或区别
SpringBoot能够对Spring的缺点进行改善和优化,基于约定大于配置的思想,可以让开发人员不必在配置和逻辑业务之间进行思维的切换,全身心投入到逻辑业务的代码编写中,从而大大提高了开发效率
SpringBoot的特点
- 为给予Spring的开发提供更快的入门体验。
- 开箱即用,没有代码生成,也无需XML配置。同时也可以修改默认值来满足特定的需求。
- 提供了一些大型项目中常见的非功能性特性,如嵌入式服务器、安全、指标,健康监测等
- SpringBoot不是对Spring功能上的增强,而是提供了一种快速使用Spring的方式。
SpringbootApplication有哪些注解
- @SpringBootConfiguration
- @EnableAutoConfiguration
- @ComponentScan
Java元注解有哪些
- @Target 用来定义你的注解将应用于什么地方(例如是一个方法或者一个域)
- @Retention 用来定义该注解在哪一个级别可用,在源代码中(SOURCE)、类文件中(CLASS)或者运行时(RUNTIME)
- @Documented 将此注解包含在 javadoc 中 ,它代表着此注解会被javadoc工具提取成文档。在doc文档中的内容会因为此注解的信息内容不同而不同。相当与@see,@param 等。
- @Inherited 允许子类继承父类中的注解。
SpringCloud是什么
Spring Cloud是一个微服务框架的规范,注意,只是规范,他不是任何具体的框架
Spring Bean的加载流程
https://www.bilibili.com/video/BV1Eb4y1R7zd?p=37
https://www.cnblogs.com/wyq178/p/11415877.html
进程和线程的区别
进程:指在系统中正在运行的一个应用程序;程序一旦运行就是进程;进程——资源分配的最小单位。
线程:系统分配处理器时间资源的基本单元,或者说进程之内独立执行的一个单元执行流。线程——程序执行的最小单位。
https://www.cnblogs.com/coder-programming/p/10595804.html
Tomcat配置文件配置过哪些选项
- 可以配置端口号
- 可以配置主机名称
- 默认的主机名
- 默认的网站存放位置
https://www.cnblogs.com/senhelpa-vivo/p/11341132.html
哪种map可以保存读写顺序,按照存取的顺序去遍历
LinkedHashMap
可以用来实现LRU算法
哪种map是线程安全的
- HashTable
- SynchronizedMap
- ConcurrentHashMap - 推荐
https://www.cnblogs.com/yaowen/p/9634368.html
实现多线程有以下四种方式:
- 继承Thread类
- 实现Runnable接口
- 实现Callable接口
- 线程池:提供了一个线程队列,队列中保存着所有等待状态的线程。避免了创建与销毁额外开销,提高了响应的速度。
https://zhuanlan.zhihu.com/p/151407057
多线程开发的工具类有哪些
https://blog.csdn.net/sixabs/article/details/98471709
谈谈操作系统视角下的内存回收过程
https://blog.csdn.net/self_realian/article/details/107061874
用户态与内核态
https://www.cnblogs.com/maxigang/p/9041080.html
Java类加载器
- BootStrapClassLoader是ExtClassLoader的父类加载器,叫启动类加载器 - 加载存放JAVA_HOME\lib中的jar文件
- ExtClassLoader 扩展类加载器,是AppClassLoader的父类加载器 - 加载JAVA_HOME\lib\ext中的jar文件
- AppClassLoader应用程序类加载器 - 加载用户类路径classpath下的jar文件,默认的类加载器
关于二级缓存
二级缓存是 mapper 映射级别的缓存,多个 SqlSession 去操作同一个 Mapper 映射的 sql 语句,多个 SqlSession可以共用二级缓存,二级缓存是跨 SqlSession 的
https://blog.csdn.net/itcastedu/article/details/107650047
https://blog.csdn.net/prestigeding/article/details/100085568
map接口下面有哪些实现类
HashMap,HashTable,ConcurrentHashMap,TreeMap,LinkedHashMap,weakHashMap
Java有哪些集合类型
1、List列表:有序的,可重复的;
2、Queue队列:有序,可重复的;
3、Set集合:不可重复;
4、Map映射:无序,键唯一,值不唯一。
TCP和UDP的区别
https://blog.csdn.net/weixin_39218743/article/details/88818069
TCP和UDP都是传输层协议
1、TCP面向连接(如打电话要先拨号建立连接);UDP是无连接的,即发送数据之前不需要建立连接
2、TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保证可靠交付
3、TCP面向字节流,实际上是TCP把数据看成一连串无结构的字节流;UDP是面向报文的,UDP没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如IP电话,实时视频会议等)
4、每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信
5、TCP首部开销20字节;UDP的首部开销小,只有8个字节
6、TCP的逻辑通信信道是全双工的可靠信道,UDP则是不可靠信道
https://www.cnblogs.com/williamjie/p/9390164.html
网络攻击的种类
https://blog.csdn.net/qq_42036203/article/details/99830112?utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-1.no_search_link&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-1.no_search_link
Java线程状态有哪些
新建(new)、就绪(runnable)、运行(running)、阻塞(blocked)、死亡(dead)
https://www.cnblogs.com/nongzihong/p/10512822.html
https://blog.csdn.net/mccand1234/article/details/51526552
线程怎么进入阻塞态
下面几个行为,会引起线程阻塞。
- 主动调用 sleep 方法。时间到了会进入就绪状态
- 主动调用 suspend 方法。主动调用 resume 方法,会进入就绪状态
- 调用了阻塞式 IO 方法。调用完成后,会进入就绪状态。
- 试图获取锁。成功的获取锁之后,会进入就绪状态。
- 线程在等待某个通知。其它线程发出通知后,会进入就绪状态
https://blog.csdn.net/weixin_41101173/article/details/79679300
线程间的通信方式
https://blog.csdn.net/jisuanji12306/article/details/86363390
死锁产生的四个必要条件和避免
https://blog.csdn.net/guaiguaihenguai/article/details/80303835
操作系统用户态和内核态
ArrayList和LinkedList的区别
- ArrayList是实现了基于动态数组的数据结构,而LinkedList是基于链表的数据结构;
- 对于随机访问get和set,ArrayList要优于LinkedList,因为LinkedList要移动指针;
- 对于添加和删除操作add和remove,一般大家都会说LinkedList要比ArrayList快,因为ArrayList要移动数据。但是实际情况并非这样,对于添加或删除,LinkedList和ArrayList并不能明确说明谁快谁慢
https://blog.csdn.net/eson_15/article/details/51145788
doGET()和doPost()方法的区别
https://www.cnblogs.com/phpper/p/9127553.html
HTTP方法/HTTP状态码