发表时间:2022-03-25来源:网络
今天给大家分享一下 Java 的面试,因为发现在网上有很多题目都是没有答案的,故吐血整理 Java 面试题大全,希望对大家有帮助~
1、mysql 索引是怎么实现的?
索引是一种高效获取数据的存储结构,例:B+ 树、hash、 二叉、 红黑。
索引是满足某种特定查找算法的数据结构,而这些数据结构会以某种方式指向数据,从而实现高效查找数据。具体来说 mysql 中的索引,不同的数据引擎实现有所不同,但目前主流的数据库引擎的索引都是 B+ 树实现的,B+ 树的搜索效率,可以达到二分法的性能,找到数据区域之后就找到完整的数据结构了,所有索引的性能也是更好的。
2、redis 支持的数据类型有哪些?
redis 支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset ( sorted set:有序集合)
3、说一下类加载的执行过程
加载:根据查找路径找到对应的class文件然后导入;检查:检查加载class文件的正确性;准备:给类中的静态变量分配内存空间;解析:虚拟机将常量池中的符号引用替换成直接引用的过程。符号引用就理解为一个标示,而在直接引用直接指向内存中的地址;初始化:对静态变量和静态代码块执行初始化工作。4、说一下 jvm 有哪些垃圾回收算法
标记-清除算法:标记无用对象,然后进行清除回收。缺点就是效率不高,无法清除垃圾碎片。
标记-整理算法:标记无用对象,让所有存活的对象都向一端移动,然后直接清除掉端边界以外的内存。
复制算法:按照容量划分二个大小相等的内存区域,当一块用完的时候将活着的对象复制到另外一块上,然后再把已使用的内存空间一次清理掉。缺点就是内存使用率不高,只有原来的一半。
分代算法:根据对象存活周期的不同将内存划分为几块,一般是新生代和老年代,新生代基本采用复制算法,老年代采用标记整理算法。
5、说一下jvm的主要组成部分?及其作用?

类加载器会把 java 代码转换成字节码,运行时数据区在把字节码加载到内存中,而字节码文件只是 JVM 的一套指令集规范,并不能直接交给底层操作系统去执行,因此需要特定的命令解析器执行引擎,将字节码翻译成底层系统指令,再交由 CPU 去执行,而这个过程中需要调用本地库接口来实现整个程序的功能。
6、说一下 jvm 运行时数据区?
jvm 运行时数据区分一下 5 个部分:
程序计数器:当前线程所执行的字节码的行号指示器,字节码解析器的工作是通过改变这个计数器的值,来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能、都需要依赖这个计数器来完成;java 虚拟机栈:用于存储局部变量表、操作数栈、动态链接、方法出口等信息;本地方法栈:与虚拟机栈的作用是一样的,只不过虚拟机栈是服务 java 方法的,而本地方法栈是为虚拟机调用 Native 方法服务的;java 堆:java 虚拟机内存最大的一块,是被所有线程共享的,几乎所有的对象实例都在这里分配内存;方法区:用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译后的代码等数据。7、说一下堆栈的区别?
功能方面:堆是用来存放对象的,栈时用来执行程序的共享性:堆是线程共享的,栈是线程私有的空间大小:堆大小远远大于栈8、队列和栈是什么?有什么区别?
队列和栈都是被用来预存储数据的。
队列允许先进先出检索元素,但也有例外情况,Deque(双端队列)接口允许从两端检索元素。栈对元素进行后进先出检索。
9、说一下类加载的执行过程?
类加载分为以下5个步骤:
加载:根据查找路径找到对应的 class 文件然后导入;检查:检查加载 class 文件的正确性;准备:给类中的静态变量分配内存空间;解析:虚拟机将常量池中的符号引用替换成直接引用的过程。符号引用就理解为一个标示,而在直接引用直接指向内存中的地址;初始化:对静态变量和静态代码块执行初始化工作。10、说一下 jvm 有哪些垃圾回收器?
Serial (新生代):最早的单线程串行垃圾回收器Serial Old (年老代):Serial 垃圾回收器的老年版本,同样也是单线程的,可以作为 CMS 垃圾回收器的备选方案。Paralle Scavenge (新生代):是 Serial 的多线程版本。ParNew (新生代):Paralle Scavenge 和 ParNew 收集器类似,是多线程的,但Paralle Scavenge 是吞吐量优先的收集器,可以牺牲等待时间换取系统的吞吐量。Parallel Old (年老代):Paralle 的老生代版本,Paralle 使用的是复制的内存回收算法,Paralle Old 使用的是标记-整理的内存回收算法。CMS (年老代):一种以获得最短停顿时间为目标的收集器,非常使用 B/S 系统。G1:一种兼顾吞吐量和停顿时间的 GC 实现,是 JDK9 以后的默认 GC 选项。11、新生代垃圾回收器和老生代垃圾回收器都有哪些?有什么区别?
新生代垃圾回收器一般采用的是复制算法,复制算法的优点是效率高,缺点是内存利用率低;老年代回收器一般采用的是标记-整理的算法进行垃圾回收。
12、简述分代垃圾回收器是怎么工作的?
分代回收器有两个分区:老生代和新生代,新生代默认的空间占总空间的 1/3,老生代的默认占比是 2/3。
新生代使用的是复制算法,新生代里有3个分区:Eden、To Survivor、From Survivor,它们的默认占比是 8:1:1,它的执行流程如下:
1、把 Eden+From Survivor 存活的对象放入 To Survivor 区;2、清空 Eden 和 From Survivor 分区;3、From Survivor 和 To Survivor 分区交换,From Survivor 变 To Survivor,To Survivor 变 From Survivor。
每次在 From Survivor 到 To Survivor 移动时都存活的对象,年龄就 +1,当年龄达到15 时,升级为老生代。对象也会直接进入老生代。
老生代当空间占用到达某个值之后就会触发全局垃圾收回,一般使用标记整理的执行算法。以上这些循环往复就构成了整个分代垃圾回收的整体执行流程。
13、char和varchar的区别是什么?
都是用来存储字符串的,只是他们的保存方式不一样。char 有固定的长度,而 varchar 属于可变长的字符类型。char 是一种固定长度的类型,varchar 则是一种可变长度的类型,它们的区别是: char (M) M 取值可以为 0~255 之间类型的数据列里,每个值都占用 M 个字节,如果某个长度小于 M,MySQL 就会在它的右边用空格字符补足.在 varchar (M) 类型的数据列里,每个值只占用刚好够用的字节再加上一个用来记录其长度的字节(即总长度为 L+1 字节)。
从存储空间考虑 varchar 比较合适;从效率上考虑 char 比较合适。
14、float 和 double 的区别是什么?
float 最多可以存储 8 位小数,并在内存中占 4 字节double 最多可以存储 16 位小数,并在内存中占 8 字节15、mysql 的内连接、左连接、右连接有什么区别?
select * from t_address
idnameaddress1张三金融港一路2李四金融港二路3王五金融港三路
select * from t_age
idnameage4张三185李四206赵六21内连接:innerjoin;获取两个表中字段匹配关系的记录select a.name,a.age,b.address from t_age a INNER JOIN t_address b on a.name=b.name;nameageaddress张三18金融港一路李四20金融港二路
左连接:leftjoin;获取左表所有记录,即使右表没有对应匹配的记录select a.name,a.age,b.address from t_age a LEFT JOIN t_address b on a.name=b.name;
nameageaddress张三18金融港一路李四20金融港二路赵六21NULL
右连接:rightjoin;与 LEFT JOIN 相反,用于获取右表所有记录,即使左表没有对应匹配的记录select b.name,a.age,b.address from t_age a RIGHT JOIN t_address b on a.name=b.name;
nameageaddress张三18金融港一路李四20金融港二路王五NULL金融港三路
16、mysql索引是怎么实现的?
索引是一种高效获取数据的存储结构,例:B+树、hash、 二叉、 红黑。
索引是满足某种特定查找算法的数据结构,而这些数据结构会以某种方式指向数据,从而实现高效查找数据。具体来说 mysql 中的索引,不同的数据引擎实现有所不同,但目前主流的数据库引擎的索引都是 B+ 树实现的,B+ 树的搜索效率,可以达到二分法的性能,找到数据区域之后就找到完整的数据结构了,所有索引的性能也是更好的。
17、怎么验证 mysql 的索引是否有效?
explain select * from table where index =1;
18、说一下ACID是什么?
事务是由一组 SQL 语句组成的逻辑处理单元,事务具有以下 4 个属性,通常简称为事务的 ACID 属性:
原子性(Atomicity):事务是一个原子操作单元,其对数据的修改,要么全都执行,要么全都不执行。19、一张自增表里面总共有 7 条数据,删除了最后 2 条数据,重启 mysql 数据库,又插入了一条数据,此时 id 是几?
表类型如果是 MyISAM,那 id 就是 8;表类型如果是 InnoDB,那 id 就是 6。InnoDB 表只会把自增主键的最大值 id 记录在内存中,所以重启之后会导致最大 id 丢失。
下面是两个表类型的简单对比:
表类型功能对比MyISAM 表InnoDB 表事务处理不支持支持数据行锁定不支持,只有表锁定支持外键约束不支持支持表空间大小相对小相对大,最大是 2 倍全文索引支持不支持COUNT 问题无执行 COUNT (*) 查询时,速度慢。
20、说一下 mysql 常用的引擎?
MyIASM 引擎:mysql 的默认引擎,但不提供事务的支持,也不支持行级锁和外键。因此当执行插入和更新语句的时,即执行写操作的时候需要锁定这个表,所以会导致效率会降低。不过和 InnoDB 不同的是,MyIASM 引擎是保存了表的行数,于是进行当进行 select count(*) from table 语句时,可以直接的读取已保存的值而不需要进行扫描全表。
所以,如果表的读操作远远多余写操作时,并且不需要支持事务的支持的,可以将 MyIASM 作为数据库引擎的首选。
InnoDB 引擎:提供了对数据库 ACID 事务的支持,并且还提供了行级锁和外键的约束,它的设计的目标就是处理大数据容量的数据库系统。mysql 运行的时候,InnoDB 会在内存中建立缓冲池,用于缓冲数据和索引。但是该引擎不支持全文搜索,同时启动也比较慢,它是不会保存表的行数的。
所以当进行 select count (*) from table 指令的时候,需要进行扫描全表。由于锁的粒度小,写操作是不会锁定全表的,所以在并发度较高的场景下使用会提升效率。
21、说一下 mysql 的行锁和表锁?
MyIASM 只支持表锁,InnoDB 支持表锁和行锁,默认为行锁。
表级锁:开销小,加锁快,不会出现死锁。锁粒度大,发生锁冲突的概率最高,并发量最低。
行级锁:开销大,加锁慢,会出现死锁。锁粒度小,发生锁冲突的概率最小,并发量最高。
InnoDB的行锁是针对索引加的锁,不是针对记录加的锁。并且该索引不能失效,否则都会从行锁升级为表锁
22、说一下观锁和悲观锁?
乐观锁:每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在提交更新的时候会判断一下在此期间别人有没有去更新这个数据。
悲观锁:每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻止,直到这个锁被释放。
数据库的乐观锁需要自己实现,在表里面添加一个 version 字段,每次修改成功加 1,这样每次修改的时候先对比一下,自己拥有的 version 和数据库现在的 version 是否一致,如果不一致就不修改,这样就实现了乐观锁。
23、mysql 问题排查都有哪些手段?
使用 show processlist 命令查看当前所有连接信息;使用 explain 命令查询 sql 语句执行计划;开启慢查询日志,查看慢查询 sql。24、如何做 mysql 的性能优化?
为搜索字段创建索引;避免使用 select *;垂直分割分表(垂直分割是一种把数据库中的表按列变成几张表的方法,这样可以降低表的复杂度和字段的数目,从而达到优化的目的。);选择正确的存储引擎。25、redis 是什么?都有哪些使用场景?
Redis 是一个使用 C 语言开发的高速缓存数据库。
Redis 使用场景:
记录帖子点赞数、点击数、评论数;缓存近期热帖;缓存文章详情信息;记录用户会话信息。26、redis有哪些功能?
数据缓存功能;分布式锁的功能;支持数据持久化;支持事务;支持消息队列。27、redis 和 memecache 有什么区别?
1、存储方式不同:memcache 把数据全部存在内存之中,断电后会挂掉,数据不能超过内存大小;redis 有部分存在硬盘上,这样才能保证数据的持久性;2、数据支持类型:memcache 对数据类型支持相对简单,redis 有复杂的数据类型;3、使用底层模型不同:它们之间底层实现方式,以及与客户端之间通信的应用协议不一样,redis 自己构建了 VM 机制,因为一般的系统调用系统函数的话,会浪费一点的时间去移动和请求;4、value 值大小不同:redis 最大可以达到 1gb,memcache 只能达到 1mb。
28、redis 为什么是单线程?
因为 cpu 不是 redis 瓶颈,redis 瓶颈最有可能是机器内存或者网络宽带,既然单线程容易实现,而且 cpu 又不会成为瓶颈,那就顺利成章地采用单线程的方案了。关于 redis 性能,官方网站也有,普通笔记本轻松处理每秒几十万的请求。而且单线程并不代表就慢,nginx (反向代理服务器)和 nodejs 也都是高性能单线程代表。
29、什么是缓存穿透?怎么解决?
缓存穿透,是指查询一个数据库一定不存在的数据。正常的使用缓存流程大致是,数据查询先进行缓存查询,如果 key 不存在或者 key 已经过期,再对数据库进行查询,并把查询到的对象,放进缓存。如果数据库查询对象为空,则不放进缓存。
最简单粗暴的解决方案是一个查询返回的数据是空(不管是数据不存在,还是系统故障),我们就把这个空结果进行缓存,但它的过期时间会很短,最长不超过 5 分钟。缓存雪崩,是指在某一个时间段,缓存集中过期失效。缓存击穿,是指一个 key 非常热点,在不停的扛着大并发,大并发集中对这一个点进行访问,当这个 key 在失效的瞬间,持续的大并发就穿破缓存,直接请求数据库,就像在一个屏障上凿开了一个洞。
30、jedis 和 redisson 有哪些区别?
jedis:提供了比较全面的 redis 命令的支持。
redisson:实现了分布式和可扩展性的 java 数据结构,与 jedis 相比 redisson 的功能相对简单,不支持排序、事务、管道、分区等redis特性。
31、怎么保证缓存和数据库数据的一致性?
第一种方案:1、合理设置缓存的过期时间;2、新增、更改、删除数据库操作时同步更新 redis。
第二中方案:1、读 Redis:热数据基本都在 Redis;2、写 MySQL:增删改都是操作 MySQL;3、更新 Redis 数据:MySQ 的数据操作 binlog,来更新到 Redis。
32、redis 持久化有几种方式?
redis 提供两种方式进行持久化,一种是 RDB 持久化(原理是将 Reids 在内存中的数据库记录定时 dump 到磁盘上的 RDB 持久化),另外一种是 AOF(append only file)持久化(原理是将 Reids 的操作日志以追加的方式写入文件)。
RDB 持久化是指在指定的时间间隔内将内存中的数据集快照写入磁盘,实际操作过程是 fork 一个子进程,先将数据集写入临时文件,写入成功后,再替换之前的文件,用二进制压缩存储。
AOF 持久化以日志的形式记录服务器所处理的每一个写、删除操作,查询操作不会记录,以文本的方式记录,可以打开文件看到详细的操作记录。
33、redis怎么实现分布式锁?
redis 分布式锁其实就是在系统里面占一个“坑”,其他程序也要占“坑”的时候,占用成功了就可以继续执行,失败了就只能放弃或稍后重试。占“坑”一般使用 setnx (set if not exists) 指令,只允许被一个程序占有,使用完调用 del 释放锁。
34、redis分布式锁有什么缺陷?
redis 分布式锁不能解决超时的问题,分布式锁有一个超时时间,程序的执行如果超出了锁的超时时间就会出现问题。
35、redis如何做内存优化?
尽量使用 redis 的散列表,把相关的信息放到散列表里面存储,而不是把每个字段单独存储,这样可以有效的减少内存使用。比如将 web 系统的用户对象,应该放到散列表里面再整体存储到 redis,而不是把用户的姓名、年龄、密码、邮箱等字段分别设置 key 进行存储。
36、redis淘汰策略有哪些?
1、 volatile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰
2、volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰
3、volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰
4、allkeys-lru:从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰
5、allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰
6、no-enviction(驱逐):禁止驱逐数据
更多更全Java面试资料包~可以找我要
上一篇:面试题(二)
皓盘云建最新版下载v9.0 安卓版
53.38MB |商务办公
ris云客移动销售系统最新版下载v1.1.25 安卓手机版
42.71M |商务办公
粤语翻译帮app下载v1.1.1 安卓版
60.01MB |生活服务
人生笔记app官方版下载v1.19.4 安卓版
125.88MB |系统工具
萝卜笔记app下载v1.1.6 安卓版
46.29MB |生活服务
贯联商户端app下载v6.1.8 安卓版
12.54MB |商务办公
jotmo笔记app下载v2.30.0 安卓版
50.06MB |系统工具
鑫钜出行共享汽车app下载v1.5.2
44.7M |生活服务
2022-03-26
2022-03-26
2022-03-26
2022-03-26
2022-03-26
2022-03-26
2022-03-26
2022-03-26
2022-02-15
2022-02-14