华为小准备
1.红黑树:
性质1. 节点是红色或黑色。
性质2. 根节点是黑色。
性质3 每个红色节点的两个子节点都是黑色。(从每个叶子到根的所有路径上不能有两个连续的红色节点)
性质4. 从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。
2.数据库索引:
普通索引;唯一索引(列的值必须唯一,但允许有空值);主键索引(殊的唯一索引,不允许有空值);组合索引。
索引不足:降低更新表的速度;占用磁盘空间的索引文件。
注意事项:索引不会包含有NULL值的列;使用短索引;不要在列上进行运算;不鼓励like;尽量不用使用索引列排序。
3.奇偶排序,给一个数组,让奇数在前面偶数在后面,或者偶数在前面奇数在后面:
先计算出奇数的个数count,然后用双指针来遍历,一个从头遍历到count,一个从数组尾部遍历到count。从前向后找到一个偶数的下标,从后向前找到一个奇数的下标,然后交换对应的值。直到遍历完整个数组。时间复杂度为O(n),空间复杂度为O(1)。
4.堆和栈的概念和区别
5.操作系统中不同的锁:
信号量;互斥量(获取和释放必须是在同一个线程中进行);临界区(进程级别);读写锁(共享或独占);条件变量(通知机制)。
6.B+树:
任意非叶子结点最多只有M个儿子;且M>2;根结点的儿子数为[2, M];除根结点以外的非叶子结点的儿子数为[M/2, M];每个结点存放至少M/2-1(取上整)和至多M-1个关键字(至少2个关键字);非叶子结点的子树指针与关键字个数相同;为所有叶子结点增加一个链指针;所有关键字都在叶子结点出现。
相比B树:非叶子结点相当于是叶子结点的索引(稀疏索引),叶子结点相当于是存储(关键字)数据的数据层;更适合文件索引系统;
7.数据库范式:
第一范式,无重复的域,数据库表的每一列都是不可分割的原子数据项;
第二范式,非码属性必须完全依赖于候选码(在1NF基础上消除非主属性对主码的部分函数依赖);
第三范式,任何非主属性不依赖于其它非主属性(在2NF基础上消除传递依赖);
巴斯-科德范式,在3NF基础上,任何非主属性不能对主键子集依赖(在3NF基础上消除对主码子集的依赖)。
8.栈溢出:
一、局部数组过大。当函数内部的数组过大时,有可能导致堆栈溢出。
二、递归调用层次太多。递归函数在运行时会执行压栈操作,当压栈次数太多时,也会导致堆栈溢出。
三、指针或数组越界。这种情况最常见,例如进行字符串拷贝,或处理用户输入等等。
9.判断Java对象存活的算法
一、引用计数算法
给对象添加一个引用计数器,每当一个地方引用它的时候就将计数器加1,当引用失效的时候就将计数器减1,任何时刻计数器为0的对象都不可再被使用。这种算法虽然简单,但是有个致命的缺点,就是不能适用于相互引用的情况。
二、可达性分析算法
通过一系列称为”GC Roots”的对象作为起始点,从这些节点往下搜索,搜索走过的路径称为引用链(Reference Chain)。当一个对象不在任何引用链上的时候,就表示这个对象不可达,不可用了。
10.垃圾回收算法
一、标记清除算法
标记清除(mark-sweep)算法是现代垃圾回收算法的思想基础。标记-清除算法将垃圾回收分为两个阶段:标记阶段和清除阶段。先标记,再清除。
有2个缺点:效率问题。空间问题。
二、标记整理算法
标记整理算法和标记清除算法类似,不同的是,标记整理算法在标记完对象后,不是直接对可回收对象进行清除,而是先让所有存活的对象都往一端移动,然后再清除掉边界以外的内存。
相对于标记清除算法,标记整理算法解决了内存碎片的问题,但效率不高的问题依然存在。
三、复制算法
复制算法可以解决效率问题。它将可用内存分成大小相等的两块,每次只使用其中的一块,当这一块用完了,就将还存活着的对象复制到另一块上面,然后再把原来半块的对象全部清理掉。这样,每次都是对整个半区进行内存回收,内存分配时也不用考虑内存碎片的情况,按顺序分配即可。
复制算法的优点是效率高,没有内存碎片。但也有2个缺点:
1、浪费一半的内存空间。
2、在对象存活率较高的情况下,会有较多的复制操作,效率会变低。
四、分代收集算法
根据对象存活周期的不同,将内存分为几块,一般是把Java堆分为新生代和老年代,然后根据各个年代的特点采用最适当的收集算法。在新生代中,每次垃圾收集都有大批对象死去,只有少量存活,就选用复制算法。而老年代对象存活率高,必须采用标记清除算法或者标记整理算法来回收内存。
11.优先级
public>protected>默认类型(default)>private
他们之间的区别:
private: Java语言中对访问权限限制的最窄的修饰符,一般称之为“私有的”。被其修饰的属性以及方法只能被该类的对象访问,其子类不能访问,更不能允许跨包访问。
default:即不加任何访问修饰符,通常称为“默认访问权限“或者“包访问权限”。该模式下,只允许在同一个包中进行访问。
protected: 介于public 和 private 之间的一种访问修饰符,一般称之为“保护访问权限”。被其修饰的属性以及方法只能被类本身的方法及子类访问,即使子类在不同的包中也可以访问。
public: Java语言中访问限制最宽的修饰符,一般称之为“公共的”。被其修饰的类、属性以及方法不仅可以跨类访问,而且允许跨包访问