1. int与Integer的区别
int是基本数据类型,Integer是int的封装类,是引用类型。int默认值是0,而Integer默认值是null。
2. 重载和重写的区别
重写:其实就是在子类中把父类本身的方法重新写一遍,方法名、参数列表、返回类型必须相同,重写方法的访问修饰符一点要大于被重写方法的访问修饰符(public > protected > default > private)。
重载:在一个类中,方法名相同,参数类型不同,参数个数不同,参数顺序不同都称为重载,与返回值无关。
3. String、StringBuffer、StringBuilder三者的区别
String:String的值是不可变的,每次对String操作都会生成新的String对象,效率低,浪费内存空间。
StringBuffer:StringBuffer是可变类,任何对它指向的字符串的操作都不会产生新的对象,线程安全,多线程操作字符串。
StringBuilder:StringBuilder是可变类,线程不安全,单线程操作字符串,速度较快。
4. Redis是什么
redis是非关系型数据库,一般和其他数据库搭配使用,比如mysql,为了减轻后端数据库的压力。
redis可以把mysql中经常被查询的数据缓存起来,比如热点数据,这样当用户来访问的时候,会直接从redis中获取数据,如果redis中不存在再到mysql查找,从而减低了数据的读取压力。
5. Redis缓存穿透
介绍:缓存穿透是指当用户查询某个数据时,redis中不存在该数据,此时就会去持久层数据库mysql中查找,结果发现mysql也不存在,mysql只能返回一个空对象,代表此次查询失败,如果请求非常多或有人恶意请求攻击就会给mysql数据库造成很大压力,甚至崩溃。
解决方案:
- 缓存空对象:当mysql返回空对象时,redis将该对象缓存起来,同时设置一个过期时间。当用户再次发起请求时,就会从redis中拿到一个空对象,用户的请求被阻断在了缓存层,从而保护了后端数据库。
- 布隆过滤器:将用户可能会访问的热点数据的key存储在布隆过滤器中(也称缓存预热),当用户请求时会经过布隆过滤器,布隆过滤器会判断请求的key是否存在,若不存在则被拒绝,否则将继续执行查询,先前往缓存查询,缓存没有的话再前往数据库中查询。
缓存预热:是系统启动时,提前将相关的数据加载到redis缓存中,避免了用户请求时再去加载。
6. 缓存击穿
介绍:缓存击穿是指用户查询的时候缓存不存在,但是后端数据库却存在,一般是由缓存中key过期导致的。比如一个热点数据的key,无时无刻都在接受大量的并发访问,某一时刻这个key突然失效了,就会导致大量的并发请求进入后端数据库,导致压力瞬间增加。
解决方案:
- 改变过期时间:设置热点数据永不过期。
- 分布式锁:上锁:当我们通过key去查询数据时,首先查询缓存,如果没有,就通过分布式锁进行加锁,第一个获取锁的进程进入后端数据库查询,并将查询结果缓存到redis中;解锁:当其他进程发现锁被某个进行占用时,就进入等待状态,直至解锁后,其余进程再依次访问被缓存的key。
解决方案的比较:
- 永远不过期:由于没有设置真正的过期时间,实际上已经不存在热点key产生的一系列危害,但是会存在数据不一致的情况。
- 互斥锁:存在一定的隐患,如果构建缓存过程中出现问题或者时间比较长可能存在存在死锁和线程池阻塞的风险,但是这种方法能够较好的降低后端存储负载并在一致性上做的比较好。
7. 缓存雪崩
介绍:缓存雪崩是指缓存中大批量的key同时过期,而此时数据访问量又非常大,从而导致后端数据库压力突然暴增,甚至会挂掉。
解决方案:
- 处理过期:可以采用热点数据永不过期的方法,来减少大批量的key同时过期,再者就是为key设置随机过期时间,避免key集中过期。
- redis高可用:一台redis可能会因为雪崩而挂掉,那么可以多增几台redis,搭建集群,如果一台挂掉之后,其他的还可以继续工作。
8. drop和delete的区别
drop:删除结构和数据
删除数据库:drop database 数据库名
删除表:drop table 表名
删除表中某个字段:drop table 表名 drop 字段名
delete:删除数据
删除某个表name为张三的数据:delete from 表名 where name=‘张三’
9. Mysql的几种索引
mysql目前主要有以下4种索引类型:
FULLTEXT:全文索引,目前只有MISAM引擎支持
HASH:以键值对的形势很适合做索引,即只在“=”和“in”条件下高效,对于范围查询、排序及组合索引仍然效率不高。
BTREE:将索引值按一定的算法存入一个树形的数据结构中(二叉数),查询从树的入口root开始,依次遍历node,获取leaf.
RTREE:支持该类型的存储引擎有:MyISAM、BDb、InnoDb、NDb、Archive
索引种类:
普通索引:仅加速查询
唯一索引:加速查询+列值唯一(可以为null)
主键索引:加速查询+列值唯一(不可以为null)+表中只有一个
组合索引:多列值组成一个索引,专门用于组合搜索,其效率大于索引并和
全文索引:对文本的内容进行分词,进行搜索
10. Java中8大基本数据类型
整数类型:byte、short、int、long
浮点类型:float、double
字符型:char
布尔型:boolean
11. Java中引用数据类型
类(class)、接口(interface)、数组([])
12. ==和equest的区别
==:基本数据类型比较的是值,引用数据类型比较的是内存地址
equals:没有重写的equals方法比较的是地址值,重写的equals方法比较的是对象中的属性的内容
13. SpringBoot的核心注解
@SpringBootApplication 放在启动启动类上,主要包含了以下3个注解:
@SpringBootConfiguration:组合了@Configuration注解,实现配置文件的功能
@EnableAutoConfiguration:打开自动配置的功能,也可以关闭某个自动配置的选项。
@ComponentScan:spring组件扫描功能。
常用注解
@Controller:用于定义控制器类,通常配合注解@RequestMapping
@RestController:用于标注控制层组件,是@ResponseBody和Controller的合集
@Service:用户修饰service层的组件
@RequestMapping:提供路由信息,负责URL到Controlle中的具体函数的映射,该注解包含6个属性:params、headers、value、method、从速么事、produces
@ResponseBody:表示该方法的返回结果直接写入HTTP response body中,一般在一般获取数据时使用,用于构建restful的api。
14. JDK、JRE和JVM的关系
jdk:jdk是提供给Java开发人员使用的开发工具,jdk包括了jre,而jre包括了jvm
jre:jre包括jvm和Java程序所需的核心类库等,核心类库主要是java.lang包:包含了运行Java程序必不可少的系统类,如基本数据类型、基本数学函数、字符串处理、线程、异常处理类。
jvm:jvm是java虚拟机,java程序需要运行在虚拟机上,不同的平台有自己的虚拟机,因此Java语音可以实现跨平台。
15. throw和throws的区别
throw:用在方法内部,只能用于抛出一种异常,用来抛出方法或代码块中的异常,受查异常和非受查异常都可以抛出。
throws:用在方法声明上,可以抛出多个异常,用来标识该方法抛出的异常列表。方法用throws标识了可能抛出的异常列表,调用该方法的方法中必须包含可处理异常代码,否则也要在方法签名中用throws关键字声明相应的异常。
16. final、fianlly、finalize有什么区别
final:final可以修饰类、变量、方法、修饰类表示该类不能被继承,修饰方法表示该方法不能被重写,修饰变量表示该变量是一个常量不能被重新覆盖。
finally:finally一般用于try-catch代码块中,finally代码块中不管是否出现异常改代码块都会执行,一般用来存放一些关闭资源的代码。
finalize:finalize是一个方法,属于object类的一个方法,而object类是所有类的父类,Java中允许使用finalize()方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。
17. Mysql的四种隔离级别
读未提交:第一个事务更新了一份数据,第二个事务此时读取了同一个数据,第一个RollBack了操作,则第二个事务所读取的数据就是不正确的,读到了为提交的事务。会出现脏读,不可重复读,幻读。
读提交:一个事务只能看见已经提交的事务所作的改变。会出现不可重复读,幻读
可重复读:mysql默认事务隔离级别,确保同一事务的多个实例在并发读取数据时,会看到同样的数据。会出现幻读。
可串行化:最高的隔离级别,通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。他是在每个读的数据行上加上共享锁。缺点:可能导致大量的超时现象和锁竞争。
18. Java序列化和反序列化
序列化:将堆内存中的java对象数据通过某个方式存储到磁盘文件中,或者传递给其他的网络阶段,通常是指将数据结构或对象转化成二进制的工程。
实现方式之一:实现Serializable接口,使用IO流中的对象流可以实现序列化操作,将对象保存到文件。
反序列化:将磁盘文件的数据或者网络节点上的对象数据恢复成java对象模型的过程(java对象数据),也就是将序列化过程中所生成的二进制串转换成数据结构或者对象的过程。
19. Wait和Sleep的区别
Wait方法:必须放在同步控制方法和同步代码块,wait方法可以调用notify和notifyAll方法,不需要捕获异常。
Sleep方法:可以放在任何地方,sleep方法必须捕获异常,在sleep的过程中,有可能被其他对象调用它的interrupt方法产生interruptedException,由于sleep不会释放锁标志,容易导致死锁问题的发生。
20. 运行SpringBoot的几种方式
打包用命令或者放到容器运行、用maven/gradle插件运行、执行main方法
21. SpringBoot中解决跨域问题
可以通过实现WebMvcConfigurer接口重写addCorsMappings方法解决跨域问题,需要在类上加上@Configuration注解。
22. final的用法
final关键字可以用来修饰类、方法和变量(成员变量和局部变量)
final修饰类:则该类不可以被继承
final修饰方法:则该方法不能被重写,private修饰的方法会被隐式的指定成fianl。使用final修饰方法的原因:1.将方法锁定,不能被重写;2.效率较高,java中会将final修饰的方法转为内嵌调用。
final修饰变量:如果使用final修饰基本变量,数值被初始化之后就不能再更改了,如果修饰的是引用类型变量,初始化后就不能指向另一个对象了。
23. ArrayList和LinkedList的区别
ArrayList是基于数组实现的,LinkedList是基于双链表实现的。
随机访问get和set,ArrayList优于LinkedList,,因为LinkedList要移动指针
对于增删操作,LinKedListy要优于ArrayList,因为ArrayList要移动数据。
相同点:都是线程不安全的,可以使用Collections.synchronizedList()方法保证线程的安全性,存储是有序的,可以重复,新增元素存储末尾处。
24. 创建线程池的四种方式
NewCacheThreadPool:创建一个可缓存线程池,如果线程长度超过处理需要,可灵活回收空闲线程,若无可回收则新建线程。
NewFixedThreadPool:创建一个定长线程池,支持定时及周期性任务执行。
NewScheduledThreadPool:创建一个定长线程池,支持定时及周期性任务执行。
newSingleThreadExecutor:创建一个单线程化的线程池。
25. Java中常用的包
java.io包:包括:文件读写、标准设备输出等,Java中io是以流为基础进行输入输出的,所有数据被串行化写入输出流,或者从输入流读入。
java.sql包:数据库连接包,实现jdbc的类库。动态地安装不同驱动程序来访问不同数据源。
java.util包:实用工具包:Scanner、Date、LinkedList、Hashtable、Calendar、Stack、TreeSet。
java.awt包:是一个软件包,包含用于创建用户界面和绘制图像的所有分类。
java.net包:网络功能包,包含执行与网络相关的操作的类。
java.math包:提供用于执行任意精度整数算法(BigInteger)和任意精度小数算法(BigDecimal)的类。
26. Java中常用的类
String:字符串类,有length()和subString()方法等
System:系统输出如:system.out.print();
StringBuilder:字符串工具类 有append()和insert()方法等
Thread:线程类
Math:数据工具类,有random()和min()方法等
ArrayList:底层用数组实现的集合 有add()和clear()方法等
Scanner:简单文本扫描器
File:目录或文件操作类
27. 单例模式是什么
保证整个系统中的一个类只有一个对象的实现就叫单例模式
28. 使用单例模式的优点
节省公共资源,方便控制
29. 几种单例模式的区别
饿汉模式:先把对象实例创建好,等需要的时候之间返回创建好的对象,造成资源浪费
懒汉模式:先不创建类的对象实例,等需要的时候再创建,防止造成资源浪费
懒汉模式在并发下可能出现的问题
因为并发问题导致类被实例化多次,所以懒汉模式需要加上锁synchronized(类名.class)来控制类只允许被实例化一次。缺点:加锁的方法会严重影响性能。
30. java.sql包下常用的接口和类
DriverManager类:负责管理JDBC驱动程序,使用JDBC驱动程序之前,必须先将驱动程序加载并向DriverManager注册后才可以使用,同时提供方法来建立与数据库的连接。
Connection接口:负责维护JSP、Java数据库程序和数据库之间的连接。
Statement类:通过Statement类所提供的方法,可以利用标准的sql命令,对数据库直接进行增、删或改操作。
PreparedStatement接口、CallableStatement接口、DatabaseMetaData接口
ResultSet接口:负责存储数据库查询的结果,并提供一系列方法对数据库进行增、删、改操作。
ResultSetData类:保存了所有ResultSet类对象中关于字段的信息,提供许多方法来获得这些信息。
Exceptions类:包括SQLexception、SQLWarning、DataTruncation、BatchUpdateException
31. Java类加载机制
类加载机制就是Java虚拟机将编译后的class文件加载到内存中,进行校验、转换、解析和初始化,到最终的使用。
类加载的生命周期:加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化(Initialization)、使用(Using)、卸载(Unloading)等阶段。
类加载的几个重要阶段:加载、验证、准备、解析、初始化。