文章目录
1、CAP理论
分布式环境下(数据分布)要任何时刻保证数据一致性是不可能的,只能采取妥协的方案来保证数据最终一致性。这个也就是著名的CAP定理。
CAP定理是2000年,由 Eric Brewer 提出来的。Brewer认为在分布式的环境下设计和部署系统时,有3个核心的需求,以一种特殊的关系存在。这里的分布式系统说的是在物理上分布的系统,比如我们常见的web系统。
这3个核心的需求是:Consistency,Availability和Partition Tolerance,赋予了该理论另外一个名字 - CAP。
Consistency:一致性,这个和数据库ACID的一致性类似,但这里关注的所有数据节点上的数据一致性和正确性,而数据库的ACID关注的是在在一个事务内,对数据的一些约束。
Availability:可用性,关注的在某个结点的数据是否可用,可以认为某一个节点的系统是否可用,通信故障除外。
Partition Tolerance:分区容忍性,是否可以对数据进行分区。这是考虑到性能和可伸缩性。
CAP 原则指的是,这三个要素最多只能同时实现两点,不可能三者兼顾。
2、Reactor(反应器)模式
基于事件驱动的设计,当有事件触发时,才会调用处理器进行数据处理。使用Reactor模式,对线程的数量进行控制,一个线程处理大量的事件。
3、分布式如何保证一致性
互联网系统大多将强一致性需求转换成最终一致性的需求,并通过系统执行幂等性的保证,保证数据的最终一致性。
4、死锁和饥饿,死锁的解决方法
死锁:互斥、不可剥夺、占用并等待、循环等待
饥饿:指一个进程长时间得不到资源
5、AVL树、平衡树、红黑树、B树
二叉搜索树
左<根<右
- 平均深度
O(logN)
- 插入、删除、查找元素平均时间
O(logN)
- 删除操作
- 叶节点,直接删
- 只有一个儿子,调整这个节点的父指针指向即可
- 两个儿子,找左子树最大值(或者右子树最小值),用那个节点的数据代替删除节点的数据,然后把那个节点递归的删掉
AVL树
- 是二叉搜索树
- 树的深度保证是
O(logN)
- 自带平衡条件
- 左右子树的高度最多相差1
- 高为h,最少的节点数为S(h)=S(h-1)+S(h-2)+1
- 除插入(假设懒惰删除,就是仍然保留在树中,但是做个已删除的标记)外,所有的操作都是
O(logN)
- 插入以后,需要判断还是不是AVL树
B树
M阶的B树:
- 根要么是树叶,要么儿子在2和M之间
- 除根外,所有非叶节点儿子数在0.5M(向上取整)到M之间
- 数据在叶子上,叶子的深度相同
- 每一个内部节点都有着指向儿子的指针(最多M个),以及子树中的最小关键字(第一个子树的最小值不放),关键字值递增
- 插入可能会分裂节点,删除可能会合并节点
用途:数据库系统
红黑树
也是二叉搜索树,插入的节点是红的
- 节点或黑或红
- 根是黑的
- 叶子是黑的(叶子是NIL节点)
- 红节点必有两个黑儿子
- 从根开始到任意叶子节点,路径上黑节点数目相同
最差 O(logN)
6、进程、线程的理解,进程通信,线程通信,线程不安全如何解决
进程间的通信方式:共享内存、信号、信号量、管道、消息队列、套接字
线程通信:锁(互斥锁、条件变量、读写锁)、信号、信号量
多个线程同一时刻对同一个全局变量(同一份资源)做写操作(读操作不会涉及线程安全)时,如果跟我们预期的结果一样,我们就称之为线程安全,反之,线程不安全。
加锁保证安全
7、各种排序算法
冒泡、插入、希尔、选择、归并、桶、堆排、快排
稳定的排序算法:冒泡、插入、归并、桶
8、final的使用
修饰类表示类不不能被继承
修饰方法代表方法不能被子类重写
修饰变量代表是常量
9、String StringBuffer StringBuilder
String的值是不可变的,这就导致每次对String的操作都会生成新的String对象
StringBuffer 和 StringBuilder 类的对象能够被多次的修改,并且不产生新的未使用对象。
StringBuilder 的方法不是线程安全的
(1)如果要操作少量的数据用 String;
(2)多线程操作字符串缓冲区下操作大量数据 StringBuffer;
(3)单线程操作字符串缓冲区下操作大量数据 StringBuilder。
10、HashMap HashTable 1.7 1.8
(1)HashMap线程不安全,HashTable线程安全
(2)HashMap是没有contains方法的,而包括containsValue和containsKey方法;hashtable则保留了contains方法
(3)Hashmap是允许key和value为null值的;HashTable键值对都不能为空
(4)计算hash值方式不同,map 有专门的计算 hash 值的方法,table 直接就是 key 的 hashCode()
(5)HashMap 哈希扩容必须要求为原容量的2倍;Hashtable扩容为原容量2倍加1;
(6)解决hash冲突方式不同:
Java8,HashMap中,当出现冲突时可以:
-
如果冲突数量小于8,则是以链表方式解决冲突。
-
而当冲突大于等于8时,就会将冲突的Entry转换为红黑树进行存储。
-
而又当数量小于6时,则又转化为链表存储。
HashTable中, 都是以链表方式存储。
参考文献
[1]王道数据结构
[2]博客园、CSDN相关文章