面试遇到问题

文章目录

1、 MySQL有哪些索引,什么情况下索引会失效
  1. 普通索引: 基本的索引类型,没有唯一性的限制,允许为NULL值。 可以通过ALTER TABLE table_name ADD INDEX index_name (column);创建普通索引 可以通过ALTER TABLE table_name ADD INDEX
    index_name(column1, column2, column3);创建组合索引
  2. 唯一索引:数据列不允许重复,允许为NULL值,一个表允许多个列创建唯一索引。
    可以通过 ALTER TABLE table_name ADD UNIQUE (column); 创建唯一索引
    可以通过 ALTER TABLE table_name ADD UNIQUE (column1,column2); 创建唯一组合索引
  3. 主键索引: 数据列不允许重复,不允许为NULL,一个表只能有一个主键。
  4. 组合索引: 为了进一步榨取 MySQL 的效率,就要考虑建立组合索引。即将数据库表中的多个字段联合起来作为一个组合索引。

索引具体采用了哪些数据结构

  • Hash索引
    Hash底层采用哈希表,是一种以key-value存储的数据结构,多个数据在存储关系上是没有任何关系的,对于区间查询是无法通过索引查询的,需要全表查询。
  • B+ Tree索引
    是一种多路平衡树,节点是天然有序的(左子节点小于父节点,父节点小于右子节点),所以对范围查询是不需要做全表查询。
    InnoDB 默认的是B+树。

B+ Tree 叶子节点存储的是什么?

  • 存储了整行数据的主键索引,也被称为聚簇索引,所有数据记录节点都是按照键值大小顺序存放在同一层的叶子节点上
    在这里插入图片描述
    索引的查看
  • SHOW INDEX FROM <表名>

索引失效场景

1、条件字段原因

  • 单字段索引,WHERE条件使用多字段(含带索引的字段),例如 SELECT * FROM student WHERE name =‘张三’ AND addr = '北京市’语句,如果name有索引而addr没索引,那么SQL语句不会使用索引。
  • 多字段索引,违反最佳左前缀原则。例如,student表如果建立了(name,addr,age)这样的索引,WHERE后的第一个查询条件一定要是name,索引才会生效。

2、<>、NOT、in、not exists

当查询条件为等值或范围查询时,索引可以根据查询条件去找对应的条目。否则,索引定位困难(结合我们查字典的例子去理解),执行计划此时可能更倾向于全表扫描,这类的查询条件有:<>、NOT、in、not
exists

3、查询条件中使用OR

如果条件中有or,即使其中有条件带索引也不会使用(因此SQL语句中要尽量避免使用OR)。要想使用OR,又想让索引生效,只能将OR条件中的每个列都加上索引。

4、查询条件使用LIKE通配符

SQL语句中,使用后置通配符会走索引,例如查询姓张的学生(SELECT * FROM student WHERE name LIKE
‘张%’),而前置通配符(SELECT * FROM student WHERE name LIKE
‘%东’)会导致索引失效而进行全表扫描。

5、索引列上做操作(计算,函数,(自动或者手动)类型装换)

  • 在索引列上使用函数:例如select * from student where upper(name)=‘ZHANGFEI’;会导致索引失效,而select * from student where name=upper(‘ZHANGFEI’);是会使用索引的。
  • 在索引列上计算:例如select * from student where age-1=17;

6、索引列数据类型不匹配

例如,如果age字段有索引且类型为字符串(一般不会这么定义,此处只是举例)但条件值为非字符串,索引失效,例如SELECT * FROM
student WHERE age=18会导致索引失效。

7、索引列使用IS NOT NULL或者IS NULL可能会导致无法使用索引

B-tree索引IS NULL不会使用索引,IS NOT NULL会使用,位图索引IS NULL、IS NOT NULL都会使用索引。

2、Linux怎么使用命令打包,怎么切换配置文件 ,怎么修改配置文件,怎么查看日志,查看进程
3、broatscript,yml,的加载优先顺序

broatscript优先于yml加载
原理:

  • broatscript.yml 用于程序的上下文引导阶段,可以理解成系统级别的参数,一般情况下很少变动
  • application.yml 用来定义应用级别,如果搭配 spring-cloud-config ,可以使用application.yml里面定义的文件实现动态替换。
4、springBooot启动时,怎么先初始化一些数据,只执行一次。
  • 实现CommandLineRunner接口 会在所有Spring
    Beans初始化之后,SpringApplication.run()之前执行,@Component
    @Order(1) 顺序大小执行
5、springcloud的常用组件
6、熔断参数,怎么设置

在这里插入图片描述

在这里插入图片描述

7、缓存穿透,雪崩怎么解决

答:

8、MQ消息怎么保证不丢失

答:

  • 消息持久化:交换机持久化,队列持久化,消息持久化
  • ACK确认机制:
  • 设置集群镜像模式
  • 消息补偿机制
9、分布式环境下,怎么保证幂等性
  • 分布式锁
10、SQL调优
11、MySQL事务

一致性是有原子性,隔离性,持久性保证

  • 原子性:由Undo log保证,Undo log 会保存每次变更之前的数据记录,发生错误时回滚
  • 隔离性:由MVVC 和lock保证
  • 持久性:由Redo Log 保证,每次真正修改数据之前,都会将记录写入Redo Log中,只有Redo Log写入成功,才会真正的写入到B+树中,如果提交之前断电,通过Redo Log 恢复记录。
12、Zookpper与Eureka区别?
  • Zookeeper保证CP
  • Eureka保证AP
13、JVM的内存模型
14、jvm的垃圾回收几种方式
15、创建对象的几种方式
  • 使用new关键字

  • 使用反射机制创建对象,使用Class类的newInstance方法
    Class heroClass = Class.forName(“yunche.test.Hello”);
    Hello h =(Hello) heroClass.newInstance();
    h.sayWorld();

  • 采用clone

  • 采用序列化机制,使用序列化时,要实现实现Serializable接口,将一个对象序列化到磁盘上,而采用反序列化可以将磁盘上的对象信息转化到内存中。

16、问到了JFinal框架(第一份工作)
17、springcloud的几种组件
18、mybatis的批量插入(数据量很多,怎么优化,时间上会快速多少)
19、分布式锁的几种实现方式
  • 基于数据库
  • 基于缓存环境,redis
  • 基于zookeeper
20、怎么实现并发
21、常见的集合
22、复制一个对象有几种实现方式?
  • Beanutils
  • 实现clone接口
23、分别有哪些锁,如果不用锁怎么实现线程并发安全

使用CAS无锁

24、悲观锁和乐观锁的区别?
25、JVM调优参数

介绍JVM 的常用配置参数信息:

-vmargs : 说明后面是设置Jvm的参数

-Xms128m : Jvm最初始时分配的堆内存,可以与-Xmx设置为相同,可以避免内存回收后重新分配内存。

-Xmx512m : Jvm最大分配的堆内存

-XX:PermSize= :初始分配的非堆内存

-XX:MaxPermSize= :设置最大持久代大小

-XX:NewRatio=4 :设置年轻代与老年代的比例。年轻代:老年代=1:4

-XX:SurvivorRatio=8 :设置年轻代中伊甸园区与两个保留区比例。伊甸园区:两个保留区=1:8

-XX:MaxInlineSize=1024 :设置方法内联的子节数,即当方法间调用时子方法小于这个字节数时,会将子方法直接内联(复制)到上一级方法中,直接执行。

26、mybatis,hibernate,区别
27、ArrayList与linkedList,存储数据,哪个节省空间

LinkedList的占用空间更大,因为每个节点要维护指向前后地址的两个节点,但也不是绝对,如果刚好数据量超过ArrayList默认的临时值时,ArrayList占用的空间也是不小的,因为扩容的原因会浪费将近原来数组一半的容量,不过,因为ArrayList的数组变量是用transient关键字修饰的,如果集合本身需要做序列化操作的话,ArrayList这部分多余的空间不会被序列化。

28、可重入锁,不可重入,公平,非公平
  • 什么是 “可重入”,可重入就是说某个线程已经获得某个锁,可以再次获取锁而不会出现死锁
  • 可重入锁:synchronized,ReentrantLock

公平锁要维护一个队列,后来的线程要加锁,即使锁空闲,也要先检查有没有其他线程在
wait,如果有自己要挂起,加到队列后面,然后唤醒队列最前面的线程。这种情况下相比较非公平锁多了一次挂起和唤醒

线程切换的开销,其实就是非公平锁效率高于公平锁的原因,因为非公平锁减少了线程挂起的几率,后来的线程有一定几率逃离被挂起的开销。

29、List为什么循环遍历时不能移除元素

线程遍历时不能修改元素,这里我们的modCount++了,并发修改抛出异常

30、version,乐观锁怎么实现()

update xxx,version+1 where xxxx and version=x

31、cloassLoader加载
32、redis,点赞怎么实现
33、volatile原理
  • 1)保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量的值,这新值对其他线程来说是立即可见的。
  • 2)禁止进行指令重排序。
34、AOP,动态代理怎么实现
35、ThreadLocal是什么,及场景?

场景:1

  • 方便同一个线程使用同一个对象
  • 线程间数据隔离(每个线程使用自己线程里的局部变量,各个线程互不影响)
  • 获取数据库连接,Session,关联ID,
36、Ribbon和Feign的区别?

Ribbon都是调用其他服务的,但方式不同。 启动类注解不同,Ribbon是@RibbonClient
feign的是@EnableFeignClients
服务指定的位置不同,Ribbon是在@RibbonClient注解上声明,Feign则是在定义抽象方法的接口中使用@FeignClient声明。
调用方式不同,Ribbon需要自己构建http请求,模拟http请求然后使用RestTemplate发送给其他服务,步骤相当繁琐。Feign需要将调用的方法定义成抽象方法即可。

37、String,StringBuffer,StringBuilder区别
38、Eureka的介绍
39、springcloud 的消息总线

它广播的消息会被所有在注册中心的微服务实例监听和消费,也称消息总线。 SpringCloud中也有对应的解决方案,SpringCloud Bus 将分布式的节点用轻量的消息代理连接起来,可以很容易搭建消息总线,配合SpringCloud config 实现微服务应用配置信息的动态更新。

40、BeanFactory,applicationContext的区别
41、SQL优化,对于not in(怎么调优)
42、#{},${}区别?
43、spring的AOP,IOC
44、手写冒泡排序
// 冒泡排序
    @Test
    public void maoPaoT(){
        int[] array = {1,23,46,78,90,434,4};
        for (int i = 0; i < array.length; i++) {
            for (int j = 0; j < array.length - i - 1; j++) {
                if(array[j] > array[j+1]){
                    int temp = array[j];
                    array[j] = array[j+1];
                    array[j+1] = temp;
                }
            }
        }
        System.out.println(Arrays.toString(array));
    }
45、如果数据库字段varchar类型,长度要边长,怎么解决
46、写单例的懒汉模式,饿汉模式
  • 懒汉模式:在用的时候才创建对象实例,不用的时候是不会创建对象实例的
  • 饿汉模式:在类加载的时候,就创建对象,不具备延迟加载 的特性
    使用场景
  • 网站的计数器
  • 数据库连接池
  • 读取配置文件中的类
47、js的数组合并
  • for循环遍历其中一个数组,把该数组中的所有元素依次push到另外一个数组中
  • concat方法,连接两个或更多的数组,并返回结果,let arr3 = arr1.concat(arr2);//arr3=[1,2,3,4,5,6];
48、spring的隔离级别
  • 默认级别defulat
  • 读已提交
  • 读未提交
  • 可重复读
  • 序列化
49、两个多线程怎么让它成为一个线程
50、数据库连接的参数
url: jdbc:mysql://localhost:3306/XX?useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&useSSL=false
  • allowMultiQueries=true:1.可以在sql语句后携带分号,实现多语句执行。2.可以执行批处理,同时发出多个SQL语句。
  • &characterEncoding=utf-8,指定字符的编码
  • useSSL=false:ssl协议,是否进行SSL连接
51、hashTable,HashMap区别
52、Eureak和nacos区别?
53、非对称加密

公钥加密,私钥解密

54、性能调优
55、怎么查看CPU使用率
  • 1.1 首先使用命令:top,定位到占用CPU高的进程PID
  • 1.2 使用命令:top -Hp pid ,查看该进程下哪个线程CPU占有最高
56、多线程的几个参数,怎么去去设置几个参数,多线程的使用
57、NIO,BIO,AIO有什么区别?
  • NIO:同步阻塞
  • BIO:同步非阻塞
  • AIO:异步非阻塞

49、HashMap底层的实现原理?

58、简要分析下atomic的原理?

采用CAS算法,自旋重试,直到成功

59、Kafa,ActiveMq,RabbitMq,RocketMQ有什么优缺点
60、redis常见的性能问题有哪些?该如何解决?
  • 主服务器写内存快照,会阻塞主线程的工作,当快照比较大时对性能影响是非常大的,会间断性暂停服务,所以主服务器最好不要写内存快照。

  • Redis 主从复制的性能问题,为了主从复制的速度和连接的稳定性,主从库最好在同一个局域网内。

61、常用MOngoDB集群搭建方案及优缺点?
62、简要描述RocketMQ常用集群部署模式及优缺点?
63、简单分享下您的性能调优?
  • 硬件调优
  • 操作系统
  • 应用程序
64、简单分享下您的高并发方案
  • 硬件方面
  • 软件方面
  • 使用不同主机分流
65、 spring怎么解决循环依赖引用的对象
66、查询平均成绩大于60分的学生成绩学号,及成绩
67、springcloud与dubbo区别 ?
68、hashMap,hashTable区别?
69、常见的数据结构
70、CurrentHashMap 使用场景
71、redis使用场景,数据类型
72、Mq的场景
73、分布式事务怎么实现?
74、 springcloud的组件
75、静态变量与成员变量的区别?
  • 生命周期不同
  • 调用方式不同
  • 存储位置不同
  • 所属范围
76、springboot的几个关键注解,及springboot的启动流程
77、springcloud怎么实现负载均衡?
78、eureka注册中心原理
79、实现多线程的几种形式,线程池用的是哪种?有什么特点
80、Linux怎么查看日志,日志存储在哪?
81、Set是否有序?ZSet是否有序?
82、MQ之间的区别
83、springcloud的注册中心区别?
84、springcloud的各个组件
85、redis使用
86、缓存穿透,怎么解决
87、认证Sequraty
88、zuul和gateway的区别
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值