面试题随记

静态变量和实例变量的区别
语法上的区别:静态变量前面需要加 static 关键字,而实例变量不需要。
运行时区别:实例变量属于某一个类的属性,如果要使用必须创建该类的实例来引用,而静态变量属于整个类,只要程序加载了该类的字节码,就可直接使用。

什么是多态?
多态首先是建立在继承的基础上的,先有继承才能有多态。多态是指不同的子类在继承父类后分别都重写覆盖了父类的方法,即父类同一个方法,在继承的子类中表现出不同的形式。多态成立的另一个条件是在创建子类时候必须使用父类new子类的方式。

多态(Polymorphism)按字面的意思就是“多种状态”。在面向对象语言中,接口的多种不同的实现方式即为多态。引用Charlie Calverts对多态的描述——多态性是允许你将父对象设置成为一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作(摘自“Delphi4 编程技术内幕”)。

Get和Post的区别:
https://www.cnblogs.com/logsharing/p/8448446.html

HashMap中put方法的流程?
在这里插入图片描述
ConcurrentHashMap
在这里插入图片描述
在这里插入图片描述

MySQL为什么要使用B+树索引?
首先,B+树能够减少磁盘IO次数,提高效率。数据查询的时间主要依赖于磁盘IO的次数,二叉树深度越大,查找的次数越多,性能越差。(又矮又胖)

B+树的查询效率更加稳定,因为数据都放在叶子节点,不像B树,B树查询的数据可能不在叶子结点,也可能在,这样就会造成查询的效率不稳定。
B+树能提高范围查询的效率,因为叶子节点指向下一个叶子节点

B+树与B树的不同:
B+树非叶子节点不存在数据只存索引,B树非叶子节点存储数据
B+树查询效率更高。B+树使用双向链表串连所有叶子节点,区间查询效率更高(因为所有数据都在B+树的叶子节点,扫描数据库 只需扫一遍叶子结点就行了),但是B树则需要通过中序遍历才能完成查询范围的查找。
B+树查询效率更稳定。B+树每次都必须查询到叶子节点才能找到数据,而B树查询的数据可能不在叶子节点,也可能在,这样就会造成查询的效率的不稳定
B+树的磁盘读写代价更小。B+树的内部节点并没有指向关键字具体信息的指针,因此其内部节点相对B树更小,通常B+树矮更胖,高度小查询产生的I/O更少。
B+树是B树的改进,简单地说是:只有叶子节点才存数据,非叶子节点是存储的指针;所有叶子节点构成一个有序链表
B+树的内部节点并没有指向关键字具体信息的指针,因此其内部节点相对B树更小,如果把所有同一内部节点的关键字存放在同一盘块中,那么盘块所能容纳的关键字数量也越多,一次性读入内存的需要查找的关键字也就越多,相对IO读写次数就降低了

Java内存模型:(被问2,3次了,每次都不会)
参考文章
JVM定义了一组规则,通过这组规则来决定一个线程对共享变量的写入何时对另一个线程可见,这组规则也称为Java内存模型(即JMM),JMM是围绕着程序执行的原子性、有序性、可见性展开的,

1.你现在线上的MySQL数据库是哪个版本?什么存储引擎?

5.6 InnoDB

2.该版本的索引的底层采用的是什么数据结构?(这里回答不上来就pass了,重点是想聊下面的B+树)

B+树

3.那么你知道为什么采用B+树吗?

B+树更为矮胖,可以减少磁盘I/O的次数(查找次数等于树的深度),而磁盘I/O是最大的时间开销

B+树所有数据都在叶子节点,由于有链表结构(叶子节点从小到大顺序两两相连),只需要找到首尾,通过链表就能把所有数据取出来,在做范围查找的时候效率更高

4.B+树和Hash索引比较起来有什么优缺点吗?

Hash索引在不存在hash碰撞的情况下,只需一次读取,查询复杂度为O(1),比B+数快

Hash索引是无序的,只适用于等值查询,而不能用于范围查询,也不具备排序性。根据hash索引查询出来的数据,还要再次进行排序

B+树索引的复杂度等于树的高度,一般为3-5次IO。B+树子节点上的数据是排过序的,可以用于范围查找

数据库的多列索引中,只能用B+数索引

5.最后,谈谈最左前缀匹配?

在创建多列索引时,根据业务需求,where子句使用最频繁的一列放到最左边,因为mysql索引查询会遵循最左前缀匹配的原则,在检索数据时从联合索引的最左边开始匹配。当我们创建一个联合索引的时候,如(key1,key2,key3),相当于创建了(key1),(key1,key2)和(key1,key2,key3)三个索引,这就是最左匹配原则。

为什么mysql索引使用B+树?而不是红黑树?
https://www.cnblogs.com/jiading/articles/12571642.html
使用B+树而不是B数的原因
B+树节点大小更小,一次IO读入的节点数更多
B+树的数据都在叶子节点中,遍历和区间访问性能大幅提高
B+树查询效率稳定
(数据都在叶子结点,遍历和区间访问性能高,查询效率稳定,树低,一次IO读入节点数更多)
使用B+树而不是AVL树、红黑树的原因
B+树的树高比AVL树、红黑树低,IO次数少
(B+树树高比较低,IO次数少,查询效率稳定)

线程越多越好吗?
不是,线程多了可以提高程序并行执行的速度,但是并不是越多越好,其中,每个线程都要占用内存,多线程就意味着更多的内存资源被占用,其二,从微观上讲,一个cpu不是同时执行两个线程的,他是轮流执行的,所以线程太多,cpu必须不断的在各个线程间快回更换执行,线程间的切换无意间消耗了许多时间,所以cpu有效利用率反而是下降的

进程和线程的区别与联系?
进程是系统进行资源分配和调度的基本单位
线程是操作系统可识别的最小执行和调度的基本单位
一个进程至少包含一个线程,可以有多个线程

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值