面试题系列(1)

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相关文章

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值