政府事业部部门面试
jdk和jre的区别
JDK包含JRE,JRE又包含JVM。
- JDK:JAVA标准开发工具包,他提供了编译,运行JAVA所需要的各种工具和资源,包含JAVA编译器,JAVA运行环境(JRE),以及常用的Java基础类库等,是整个JAVA的核心。
- JRE:是JAVA语言编写程序所必不可少的运行环境,用于执行java字节码文件,不是开发环境,没有包含任何开发工具,知识针对使用java程序用户。
SpringBoot相较于Spring的好处
IO流
按照流的数据流向可以分为:输入流和输出流
按照流中处理的数据单位,可以将其流分为:字节流(InputStream,OutputStream)和字符流(Reader,Writer)
Math.raound(-1.5)等于多少
四舍五入,等于-1。
数据库的三范式
第一范式:确保每一列的原子性,就是每一列都是不可再分的数据单元
第二范式:满足第一范式,第二范式要求每个表只描述一件事情
第三范式:非主键的属性对主键都是直接依赖,而不是间接依赖
以上表既满足第一范式也满足第二范式,非主键字段也完全依赖于主键字段。
但是,院系电话字段,其实是依赖院系字段的。也就是说,院系电话字段是非主键值,而依赖了另一个非主键值-院系。所以就不符合第三范式。
数据库的ACID是什么
Atomicity(原子性):一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,
Consistency(一致性):在事务开始之前和事务结束以后,数据库的完整性没有被破坏。
Isolation(隔离性):数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。
Durability(持久性):事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。
File类中都有哪些方法,随便说几个
File类构造方法:
常用的有三种:
1、File(String pathname):通过路径名创建一个新 File 实例。
2、File(File parent, String child):根据父目录路径File实例和子目录或文件路径创建一个新 File 实例。
3、File(String parent, String child) :根据父目录路径和子目录或文件路径创建一个新 File 实例。
isDirectory() 是否为文件夹
isFile() 是否为文件
getPath() 得到file的路径
getName() 得到最后一层的名字
getParent() 得到去掉最后一层的路径
getParentFile() 得到父类路径的新文件
renameTo() 改名
mkdir() 创建新文件夹,只能创建一层
mkdirs() 创建新文件夹,可以多层
createNewFile() 创建新文件,只能一层
exists() 路径是否存在
delete() 删除文件或者目录(为空的目录)
除了git代码管理工具还有什么?例如SVN
git和svn都是程序员用来管理代码的。如果是一个人开发项目,则用不上,如果是一个团队进行开发的话,则版本控制就尤为重要啦。
一、从原理方面说一下SVN和git的区别
git属于分布式控制系统,SVN属于集中式控制系统
简单来说前者就是以每一台主机都当成一台服务器,而后者则是只有一台服务器来维护和控制代码。其两者区别如图所示。
SVN的管理方法是一台主服务器管理所有主机,这样所有代码全部传输到服务器上统一管理。而git采用单个主机管单个主机的方法,即主机2将主机1中所有的信息和内容拷贝到自己的主机下,而主机3,主机4以此类推。
相比较SVN,git有如下好处:
1、如果一旦出现断电,SVN里面的数据全部消失,但是git则不会。
2、使用SVN时,必须联网,否则不能使用。但是git只要第一次将代码下载到自己的主机上,以后就不用联网也可以查看历史记录什么的了。
二、从应用方面说一下SVN和git的区别
SVN是专门用来维护文档的,而git则是用来维护代码的。等等。。
git.add()
将文件的修改加入暂存区
git.commit()
git仓库分为两种:
- 本地仓库:一种是开发人员自己电脑上的仓库
- 远程仓库:远程服务器上的Git仓库
commit:提交:是将本地文件和版本保存到本地仓库
git.push()
push:推送,将本地仓库文件的版本信息上传到远程仓库
git.pull()
pull:拉取,将远程仓库文件和版本信息下载到本地仓库
SpringCloud了解吗
不了解 哈哈哈!
final
final可以修饰类,方法和属性。
修饰类时:当用final修饰类的时,表明该类不能被其他类所继承。final类中所有的成员方法都会隐式的定义为final方法。
修饰方法时:次方法不能被子类重写,如果父类中的方法的访问权限是private,则子类不能继承该方法,可以重新定义。
修饰属性时:final成员变量表示常量,只能被赋值一次,赋值后其值不再改变。
redis的持久化
redis提供了两种持久化方式(也就是将内存中的数据写入到硬盘里):
RDB(快照):在指定的时间间隔内将内存的数据集快照写入磁盘
优点:适合对大规模的数据进行恢复,比AOF的启动效率高
缺点:在一定的时间间隔内做一次备份,如果redis突然停止,会丢失最后一次快照的修改
AOF(追加文件):以日志的形式记录服务器所处理的每一写和删除操作,以文本的方式记录,可以打开看到详细的操作记录。
优点:(1)更高的安全性,提供了三种同步策略,每秒同步,每修改同步和不同步,相比RDB停止丢失的数据会更少(2)记录所有的修改操作,可以通过文件完成数据的重建
缺点:对于相同数据量而言,AOF文件通常大于RDB文件,恢复时速度要慢
redis中的内存淘汰机制
redis提供六种数据淘汰策略:
- 已经设置过期时间的数据集中,选择最近最少使用的数据进行淘汰
- 已经设置过期时间的数据集中,选择将要过期的进行淘汰
- 已经设置过期时间的数据集中,随机选择进行淘汰
- 当内存不足以写入数据时,选择最近最少使用的数据进行淘汰
- 从数据集中任意选择数据进行淘汰
- 当内存不足以容纳数据时,则抛出异常
4.0新增:
- 已经设置过期时间的数据集中,选择最不经常使用的数据进行淘汰
- 当内存不足时,移除最不经常使用的key
事务隔离
mysql定义了四种隔离级别:
- 读未提交:允许读取未提交的数据,可能会导致脏读,幻读,不可重读读
- 读已提交:允许读取并发事务已经提交的数据,可以阻止脏读,但幻读和不可重复读可能发生
- 可重复读:对同一字段的多次读取结果是一样的,除非被本身的该事务自己修改,可以防止脏读和不可重复读
- 串行化:最高的隔离级别,所有的事务逐个执行。可以防止脏读、幻读和不可重读。
幻读:
SQL 脚本 1 在第一次查询工资为 500 的记录时只有一条,SQL 脚本 2 插入了一条工资为 500 的记录,提交之后;SQL 脚本 1 在同一个事务中再次使用当前读查询发现出现了两条工资为 500 的记录这种就是幻读。
redis中,Jedis
redis中有哪些类型
常用的数据类型:String,List,Set,Hash,Zset
特殊的数据结构:BitMap(通过位数来表示当前的状态)应用用户签到情况,活跃用户情况、hyperLogLog(基数计数概率算法)应用数量巨大的应用场景、Geospatial index(用于存储地理位置信息)应用于附近的人。
redis中的缓存击穿
请求大量不存在的key,导致请求直接到了数据库上,没有经过缓存这一层,。
解决方法:最基本的就是访问不合法的请求时直接抛出异常给客户端,。
(1)缓存无效key:将缓存和无效的key都写入到redis中并设置过期时间,这种方式适合key的变化不频繁的情况,如果恶意攻击,会导致redis缓存大量无效的key。
在java中的代码为:
1 |
|
(2)布隆过滤器
通过他,我们可以非常方便的判断一个给定数据是否存在于海量数据中,需要判断的是key是否合法,
具体的做法:
把所有可能存在的请求的值都存放在布隆过滤器中,当用户请求过来,先判断用户发来的请求的值是否存在于布隆过滤器中。不存在的话,直接返回请求参数错误信息给客户端,存在的话才会走下面的流程。
redis中的缓存雪崩
缓存在同一时间大面积的失效,后面的请求都直接落到了数据库上,造成数据库短时间内承受大量请求
举个例子 :秒杀开始 12 个小时之前,我们统一存放了一批商品到 Redis 中,设置的缓存过期时间也是 12 个小时,那么秒杀开始的时候,这些秒杀的商品的访问直接就失效了。导致的情况就是,相应的请求直接就落到了数据库上,就像雪崩一样可怕。
针对 Redis 服务不可用的情况:
- 采用 Redis 集群,避免单机出现问题整个缓存服务都没办法使用。
- 限流,避免同时处理大量的请求。
针对热点缓存失效的情况:
- 设置不同的失效时间比如随机设置缓存的失效时间。
- 缓存永不失效。
MQ了解吗
不了解
市场上现在常用的消息队列有:RabbitMQ、RocketMQ、Kafka,ActiveMQ
差不多这些~~