1.StringBuffer、StringBuilder、String 之间的区别
String:不可改变字符序列。(适用少量字符串适用) String只能赋值一次,每一次内容发生改变都生成了一个新的对象,然后原有的对象引用新的对象,所以说String本身是不可改变的,每一次改变String的字符串内容,都会在内存创建新的对象,而
每一次生成新的对象都会对系统性能产生影响,这会降低Java虚拟机的工作效率。
StringBuffer:可变字符序列,效率低,线程安全。使用synchronized保证线程安全(适用多线程操作字符串) StringBuffer
的方法使用“synchronized”关键字
进行修饰,这样保证了同时最多只有一个线程可以运行这些方法
StringBuilder:可变字符序列,效率高,线程不安全。(适用 单线程大量字符串操作)
后两者都继承了AbstractStringBuilder,底层都是利用可修改的char[]
每次操作都是对自身对象的操作,不是生成新的对象,其所占的空间会随着字符内容增加而扩充,做大量的修改时,不会因为生成大量的匿名对象而影响系统性能。
2.常量池中的String与堆中的String有什么区别 。
常量池字符串:编译期被确定,保存在。class文件中的数据 创建一个字符串,首先会检查池中是否有值相同的字符串对象,有就返回引用,没有就新建。
堆:通过NEW关键字创建 不会检查字符串常量池,直接在堆中创建,也不会把对象加入池中
3. ==与equels的区别?
==比较的是内存地址
equels 比较的是内容
4. 项目如何打包编译运行,使用maven的命令是什么?
springboot: mvn clean package
SSM|SSH:mvn clean install -DskipTests -P(P后+环境)
5. 实现多线程的方式有几种,且如何实现?
1.继承Thread类 重写run方法 2.实现Runnable接口,重写run方法
3、实现Callable接口,重写call方法(有返回值)
4、使用线程池(有返回值)
6. Mybatis中的#{}与${}的区别?
#:是预编译处理 在与编译期会生成两个?作为占位符 避免sql 注入
$: 字符串替换 在sql中直接显示值 不带引号
7.注解SpringbootApplication的作用是什么?包括哪些注解
包括:1.configurationScan注解(包扫描)2.springbootConfiguration 3.EnableAutoConfiguration
作用:springbootConfiguration: 是springboot的配置类 标识一个可以被组件扫描器扫描的配置类
҇@EnableAutoConfiguration:表示开启自动配置功能也是实现自动化配置的注解,主要借助Impot其中的注解来收集所有符合自动配置条件的bean定义,并加载到IOC容器。
ComponentScan注解:包扫描。@ComponentScan扫描根路径由启动类所在包位置决定
总结:添加组件到IOC容器,自动配置包 将扫描到的包添加到IOC容器中
8.spring常用注解
1.@Autowired 2.@service3.@Bean4.@Configuration5.@Component6.@Repository7@Controller@Aspect
9. 说说@Autowire与@resource的区别?
@Autowire:spring注解 通过类型自动装配
@resource:JDK注解 先通过参数名 而后才是类型
10.什么是事务,事务的特点是什么,事务的隔离级别有哪些?
事务:单个逻辑工作单元执行的一系列操作;
特点:原子性(要么执行,要么不执行)、一致性(事务完成,数据必须保持一致)、隔离性(对数据修改的并发事务是彼此隔离的,不影响其他事务)、持久性(事务完成,对象数据的修改永久保存,事务日志保持事务的永久性)。
隔离级别:读取未提交内容(脏读)、读取提交内容()、可重复读、序列化
11.Volatile关键字的理解?
定义:JVM提供的最轻量级同步机制,
保证线程安全的使用条件:1.对变量的写操作不依赖于当前值 。2.该变量没有包含在具有其他变量的不变式中。
特点:Volatile只保证变量在各个线程之间的可见性,不能保证操作的原子性。 保证每个线程读取的值是最新的,但是在非原子操作过程中,变量的值仍然可能被其他线程改变。
总结:通俗来说,就是只有保证对变量的操作具有原子性,才能保证使用volatile关键字的程序在并发时能够正确执行。 值得注意的是变量自增i++,不具有原子性
12.什么是CAS
定义:没有锁的状态下,在多线程访问的时候,保证线程一致性的情况下去改动某个值。
解决:给要操作的对象加上版本号,操作对象发生改变版本号也更新,那么在进行比较的时候就不光要比对内容是否相同,还需要比对版本是否一致。
13.什么是堆,堆排序了解吗?
堆:
堆是一个树形结构,其实堆的底层是一棵完全二叉树。而完全二叉树是一层一层按照进入的顺序排成的。按照这个特性,我们可以用数组来按照完全二叉树实现堆。
堆排序:利用堆的结构所设计的一种排序算法,近视二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。
14.SOA与ESB的区别?
SOA:面向服务架构
特点:侧重业务 一个业务服务和业务流程作为模块开发,将基础服务抽离出来共享,达到一定程度的可复用性。
ESB:企业服务总线
特点:从SOA发展过来,多个系统中的服务调用者和服务网提供者解耦。
15.序列化与反序列化?
序列化:把对象转换成字节序列的过程称为序列化。
反序列化:把字节序列恢复为对象的过程称为反序列化。
16.什么是RPC?
RPC:称为远程过程调用,通过网络向远程计算机调用服务。
17.redis持久化机制?
持久化过程:fork一个子进程,子进程负责将数据集写入临时文件由于OS的写时复制机制父子进程会共享相同的物理界面,当父进程处理写请求时OS会为
父进程创建页面副本,所以子进程地址空间的数据实际上就是一个快照,写入成功之后在替换之前的文件,用二进制压缩存储。
1.RDB持久化:RDB持久化是把当前进程数据生成快照保存到硬盘分过程,触发RDB持久化的过程分为手动触发和自动触发。
RDB触发机制:
a.save: save相关配置 save m n 表示m秒内数据集存在n次修改时,自动触发bgsave。
b.如果从节点执行全量复制操作,主节点自动执行bgsave生成RDB文件并发送给从节点。
c.执行debug reload 命令重新加载redis时,也会自动触发save操作。
d.默认情况下执行shutdown命令,如果没有开启AOF持久化功能则自动执行bgsave。
PS:bgsave是主流的触发RDB持久化方式。
优点:只有一个备份文件dump.rdb,方便持久化备份
容灾性好,一个文件可以保存到其他存储介质。
性能最大化,fork出子进程完成写操作,让主进程继续处理命令,所以是IO最大化
数据集偏大,RDB启动效率会比AOF更高
缺点
数据安全性低 、 数据集较大,可能导致整个服务停止。
2.AOF持久化:AOF持久化是以日志的形式记录每一个增删操作,会将所有的增删操作通过write函数追加到文件中。AOF的出现是弥补RDB的不足(数据不一致)所以它采用日志的形式来记录每个写操作,并追加到文件中。redis重启会通过执行文件中保存的写命令在内存中重建整个数据库内容。与快照持久化相比 AOF
的实时性更好,因此已成为主流的持久化方案
redis fork出子进程,子进程根据内存的快照,往临时文件中写入重建数据库状态指令,父进程继续处理请求,当子进程将快照内容写入到临时文件中则发信号通知父进程将缓存中的写操作也写入到临时文件,最后使用临时文件替代旧 备份文件进行重命名。
AOF持久化方式:a.appendfsync always: 每次有数据修改发生时都会写入AOF文件。
b.appendfsync everysec :每秒同步一次,将多个写命令同步到硬盘。
c.appendfsync no:让操作系统决定何时同步。
优点:1.数据安全性更高 2.解决数据一致性问题。 3.AOF机制的rewrite模式。
缺点: 1.AOF文件比RDB大 且恢复速度慢 2.数据集较大时,比RDB启动效率低 根据数据同步的策略不同,AOF在运行效率上往往会慢于RDB
总结:根据两种持久化方案 最佳选择还是采用混合持久化方案,开启混合持久化后 AOF重写日志时会将RDB持久化的内容写到AOF文件开头,于是redis在重启时 可以先加载RDB的内容,在对增量的AOF日志进行重放,提升redis 重启的效率。
18. Synchroinzed锁的原理?
作用:保证方法或者代码块在运行时,同一时刻只有一个方法可以进入到临界区,同时还可以保证共享变量的内存可见性。
原理:JAVA每个对象都有一个监视器锁, 当监视器锁被占用时就会处于锁定状态。
线程获取监视器锁的过程如下:
1.监视器锁的进入数为0,则线程进入监视器锁,然后设置进入数为1,该线程即为监视器锁的所有者。
2.如果监视器锁被该线程占用,只是重新进入,则进入监视器锁的进入数+1
3.如果其他线程占有该监视器锁,则该线程进入阻塞状态,直到监视器锁的进入数为0
PS:锁的状态总共有4种 无锁状态、偏向锁、轻量级锁和重量级锁。 监视器锁依赖于操作系统底层的互斥锁实现