快手java一面面经
自我介绍
1.==和equals区别
==是判断两个变量或实例是不是指向同一个内存空间,equals是判断两个变量或实例所指向的内存空间的值是不是相同 ==是指对内存地址进行比较 , equals()是对字符串的内容进行比较 ==指引用是否相同, equals()指的是值是否相同
2.介绍多态
多态是同一个行为具有多个不同表现形式或形态的能力。 多态就是同一个接口,使用不同的实例而执行不同操作, 多态的优点 1. 消除类型之间的耦合关系 2. 可替换性 3. 可扩充性 4. 接口性 5. 灵活性 6. 简化性 多态存在的三个必要条件 继承 重写 父类引用指向子类对象
3.final、finally、finalize的区别
final:java中的关键字,修饰符。 A).如果一个类被声明为final,就意味着它不能再派生出新的子类,不能作为父类被继承。因此,一个类不能同时被声明为abstract抽象类的和final的类。 B).如果将变量或者方法声明为final,可以保证它们在使用中不被改变. 1)被声明为final的变量必须在声明时给定初值,而在以后的引用中只能读取,不可修改。 2)被声明final的方法只能使用,不能重载。 finally:java的一种异常处理机制。 finally是对Java异常处理模型的最佳补充。finally结构使代码总会执行,而不管无异常发生。使用finally可以维护对象的内部状态,并可以清理非内存资源。特别是在关闭数据库连接这方面,如果程序员把数据库连接的close()方法放到finally中,就会大大降低程序出错的几率。 finalize:Java中的一个方法名。 Java技术使用finalize()方法在垃圾收集器将对象从内存中清除出去前,做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没被引用时对这个对象调用的。它是在Object类中定义的,因此所的类都继承了它。子类覆盖finalize()方法以整理系统资源或者执行其他清理工作。finalize()方法是在垃圾收集器删除对象之前对这个对象调用的。4.B树和B+树共同点、区别,优缺点
B树和B+树的区别 这都是由于B+树和B树具有不同的存储结构所造成的区别,以一个m阶树为例。 关键字的数量不同;B+树中分支结点有m个关键字,其叶子结点也有m个,其关键字只是起到了一个索引的作用,虽然B树也有m个子结点,但是其只拥有m-1个关键字。 存储的位置不同;B+树中的数据都存储在叶子结点上,也就是其所有叶子结点的数据组合起来就是完整的数据,但是B树的数据存储在每一个结点中,并不仅仅存储在叶子结点上。 分支结点的构造不同;B+树的分支结点存储着关键字信息和儿子的指针(这里的指针指的是磁盘块的偏移量),也就是说内部结点仅仅包含着索引信息。 查询不同;B树在找到具体的数值以后就结束,而B+树则需要通过索引找到叶子结点中的数据才结束,也就是说B+树的搜索过程中走了一条从根结点到叶子结点的路径,其高度是相同的,相对来说更加的稳定; 区间访问:B+树的叶子结点会按照顺序建立起链状指针,可以进行区间访问; B树的优点 每一个节点都包含key和value,因此经常访问的元素可能离根节点更近,因此访问也更迅速。 B+树的优点 所有的叶子结点使用链表相连,便于区间查找和遍历。B树则需要进行每一层的递归遍历。相邻的元素可能在内存中不相邻,所以缓存命中性没有B+树好。 b+树的中间节点不保存数据,能容纳更多节点元素。 主键索引和非主键索引 非主键索引的叶子节点存放的是主键的值,主键索引的叶子节点存放的是整行数据 了解哪些分布式事务(不了解... ...) 数据库自增id,当id值大于MAXINT时,数据库如何做 前缀索引(不会... ...) 联合索引、最左匹配原则 在查询中我们能用到的索引的是 name name phone name phone province 对于其他顺序,或者其他字段我们不能使用该联合索引,这个就是mysql联合索引原则。索引列越多,通过索引筛选出的数据越少
5.hashmap、hashtable、concurrenthashmap
算法:合并单链表
#include<stdio.h> #include<stdlib.h> //using namespace std; typedef struct Node{ int data; struct Node *next; }Node; Node *CreateH(); Node *CreateH1(); void show(Node *Head); int main(){ Node *Head,*Head1; Head=CreateH(); show(Head); Head1=CreateH1(); show(Head1); return 0; } Node *CreateH(){ int x; Node *Head; Head = (Node *)malloc(sizeof(Node)); Head->next=NULL; Node *r; r=Head; while(scanf("%d",&x)!=EOF){ Node *p = (Node *)malloc(sizeof(Node)); p->data=x; r->next=p; r=p; } r->next=NULL; return Head; } Node *CreateH1(){ int x; Node *Head; Node *p; Head = (Node *)malloc(sizeof(Node)); Head->next=NULL; while(scanf("%d",&x)!=EOF){ p = (Node *)malloc(sizeof(Node)); p->data=x; p->next=Head->next; Head->next=p; } return Head; } void show(Node *Head){ Node *p; p=Head->next; while(p!=NULL){ printf("%d \n",p->data); p=p->next; } }