Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

https://www.v2ex.com/t/558634 面试F&Q #3

Open
dooonabe opened this issue Apr 25, 2019 · 3 comments
Open

https://www.v2ex.com/t/558634 面试F&Q #3

dooonabe opened this issue Apr 25, 2019 · 3 comments

Comments

@dooonabe
Copy link
Owner

dooonabe commented Apr 25, 2019

蚂蚁金服财富事业群一面

TreeSet与HashSet区别

观察两者的构造方法

java.util.HashSet

private transient HashMap<E,Object> map;
public HashSet() {
    map = new HashMap<>();
}
public HashSet(int initialCapacity, float loadFactor) {
    map = new HashMap<>(initialCapacity, loadFactor);
}

java.util.TreeSet

private transient NavigableMap<E,Object> m;
TreeSet(NavigableMap<E,Object> m) {
    this.m = m;
}
public TreeSet() {
    this(new TreeMap<E,Object>());
}

发现问题可以转化为:TreeMap与HashMap的区别。

  • TreeMap

TreeMap存储结构为树,增删查的时间复杂度为O(logn)并且成员按照Comparable或者Comparator定义的顺序进行排序。
Comparable与Comparator

  • HashMap

HashMap使用哈希函数控制元素的索引位置,增删查时间复杂度为O(1),但是当开发者存入的键元素为自定义类时,要记得重写equalshashCode这两个方法,因为hashCode的返回值为哈希函数的输入值。

HashMap如何解决冲突, 扩容机制是什么

使用链表和红黑树处理哈希冲突。

ConcurrentHashMap如何实现高并发

ConcurrentHashMap是线程安全的HashMap,解决了HashMap并发put丢失数据和扩容死循环的缺陷。
ConcurrentHashMap基于非阻塞同步,也就是CPU的CAS指令实现初始化与某些情况下的put操作(另一些情况下的put还是synchronized实现线程安全)线程安全。

线程池平常怎么用

Executors提供的不同执行机制都会存在OOM的问题,开发者需要自己定义安全的执行机制。

多个线程等待到某一节点然后统一放行的实现方式

CountDownLatch,CyclicBarrier可以达到这样的功能。

数据库索引结构

MySQL InnoDB: B+ Tree

select * from t where a=? and b>? order by c limit 100 如何加索引

MySQL InnoDB:

  1. 确认表有主键字段
  2. add index(a,b,c)

什么是聚簇索引和非聚簇索引

Clustered Indexs: MySQL InnoDB会为表的主键字段创建聚簇索引,在底层结构的叶子节点中会记录完整的表记录。
Secondary Indexs: 非主键字段的索引被称为非聚簇索引,当使用非聚簇索引时,首先找到符合条件的主键字段的值,之后使用聚簇索引查询出完整的表记录。

Redis 里的 CAP 是怎样的

Redis单节点模式满足CA(不涉及网络分区)
Redis哨兵模式满足CA
Redis Cluster模式满足AP

如何理解幂等?项目中接口的幂等是如何做的?

If it cannot tolerate the occasional
duplicates (e.g., if they would trigger non-idempotent operations), it can filter them out using unique identifiers in the records, which are often needed anyway to name corresponding application entities such as web documents. ——《The Google File System》

作者最早是在这篇论文中看到了幂等这个词语,意思是过滤重复数据。幂等的实现方式是以实际业务为基础的,对于不同的业务有不同的实现方式。

两个有序的 list,求交集

retainAll可以实现集合交集的计算

@dooonabe
Copy link
Owner Author

dooonabe commented Apr 25, 2019

蚂蚁金服财富二面(两次电话面试)

第一次电面

解释下乐观锁和悲观锁

悲观锁又叫阻塞同步,思路是防患于未然。因为异步可能会产生问题,所以要彻底杜绝异步。

乐观锁也叫非阻塞同步,因为异步不一定会产生冲突,当真正产生异步问题时再同步执行。

JVM怎样判断对象是否应该被回收

理论:对象是否有GCROOT(对象的可达路径),如果没有那么就要被回收。

实际:不同型号版本的虚拟机有自己的实现算法。

反射能获得类里面方法的名称吗? 参数名称呢? 参数类型呢?

动态代理的实现方式, CGLib和JDK的代理有什么区别

分布式锁有哪些主流实现方式? Redis和ZK锁有什么区别

ThreadLocal

ThreadLocal是实现无同步方案的途径。如果一个变量要被多线程访问,可以使用volatile关键字声明它为“易变的”;如果一个变量要被某个线程独享,那么可以使用java.lang.ThreadLocal类来实现线程本地存储功能。

设计秒杀系统要考虑哪些点

从性能角度上如何保证秒杀系统稳定

A,B系统转账如何保证分布式数据一致性

使用分布式锁

你有什么想问的

组里中午、晚上几点就餐?组里的同事会一起吃饭吗?

第二次电面

简单介绍下自己的近况

对Kafka了解吗? Kafka消息的事务性怎么实现的

关于Kafka消息的事务性

Kafka Producer:有三种ack层级,分别是不确认,分区主节点确认,分区所有节点确认
kafka Consumer: 开发者保证ack,参考JStormAcker机制

假设事务提交的消息没有发到broker上面,会怎么处理

Kafka生产者开启最高等级的ack开关

分布式事务一致性如何保证

不同业务不同的保证手段

二阶段提交解释下

如果本地事务超时会怎样处理? 一阶段都可以commit, 二阶段的时候协调器发送全局提交的消息,这个时候消息发送失败了会怎么处理?

TCC 对异常流是如何操作的

为什么要看开源代码

当然不是为了应付面试!当然是为了站在巨人的肩上。

最终一致性如何实现的

有没有遇到过死锁,A 往 B 转钱,B 往 A 转钱同时的会死锁吗? 如何解决死锁?

死锁产生的四个条件:

  • 资源一次只能被一个线程占有
  • 线程请求其他资源时,不释放当前占有的资源
  • 线程占有的资源不会被系统剥夺
  • 不同线程对资源的占有形成了环状关系

那么解决死锁,只需要破坏上述四个条件中的一个就可以了。

设计一个全局唯一流水号

设计幂等方案防止重复提交

大数相加

工厂方法模式一般如何实现

继承父类,实现生产方法。

单例模式

其他的设计模式

模板方法模式,策略模式

再答一下上次的秒杀系统

写金融类的系统有什么需要关注的地方

  • 金额的精确位数,金额的加减操作,谨防溢出

非功能性的设计关注那些

安全性、可靠性、互操作性、健壮性

你有什么想问的

组里今年去旅游过吗?去了哪里?

@dooonabe
Copy link
Owner Author

dooonabe commented Apr 25, 2019

蚂蚁金服国际事业群一面

简单介绍下自己和项目

你觉得项目里最大的挑战是什么

理解客户需求,适应客户需求的变化。

为什么选择用Kakfa

  • 吞吐量高
  • Kafka与CDH结合好

对Kafka的了解

生产者,消费者,消费者组,主题,发布订阅,消息确认等。

Kafka消息如何顺序

Kafka主题每个分区内是有序的,但是分区间并不保证有顺。开发者可以将需要保证顺序的数据发送到同一分区中。
例如:将同一用户的数据发送到同一个分区。

讲讲 dubbo 的基本原理

JVM 调优

  • 选择合适的GC收集器
  • jstat -gcutil lvmid 观察YGC FGC的频率,适当调大堆大小。
  • jstack lvmid 观察是否有locked状态的线程,优化代码

频繁YGC如何排查

  • 频繁YGC说明程序会产生大量朝生夕死的对象。
  • jstat -gcutil lvmid观察YGC的频率有多高,同时也要观察FGC的情况,确定问题真的存在。
  • jmap -dump:live,format=b,file=20190606stock-consumer lvmid
  • 通过命令或者jvisualvm观察堆内对象的大小以及占用量,判断是哪个对象
  • 思考哪段代码会有循环产生对象的情况
  • 注意生产程序的堆快照往往很大,会操作不变,开发者可以在本地使用较少的堆大小,快速复现情况,观察堆内对象情况

如何知道哪些对象需要被回收,GCROOT有哪些

栈和堆有什么区别,什么时候会压栈

虚拟机栈与本地方法栈都是线程私有的,堆存放对象是线程共用的。
方法调入调出时会发生出栈入栈。

HashMap如何实现,为什么会变红黑树,如何扩容

HashMap数据结构为数组与链表或者红黑树(自平衡二叉树)。当hash冲突时会形成链表。当链表的长度超过TREEIFY_THRESHOLD时,链表会转化为红黑树结构,因为链表的查询时间复杂度为O(n),红黑树的查询时间复杂度为O(logn)。
扩容时机:当HashMap的负载超过DEFAULT_LOAD_FACTOR*DEFAULT_INITIAL_CAPACITY时,会自动触发扩容。首先容量会扩大为最接近2倍的2的n次幂,其次原本的每个slot数据会重新计算slot值,JDK1.8使用位运算加速了这个过程。

你有什么想问的

公司餐厅怎么样?

@dooonabe
Copy link
Owner Author

dooonabe commented Apr 25, 2019

蚂蚁金服财富三面

如何提前发现你的数据有问题,而不是等到用户反馈才知道

设置数据量的每天变化阈值,当数据量变化超过阈值时,触发监控通知。

如何防止超卖

为什么要用 Redis

Redis的读写速度为11W/S

有没有QPS

如何部署

发生过丢消息的情况吗, 为什么会丢失,Kakfa如何保证消息不丢失

项目的过程中哪个点比较难

程序的性能。

项目中为什么要用 ThreadLocal 去做租户的隔离

项目有什么缺点

100 亿行数据,每个数字32位,取最小的的数字

  • 使用spark-shell,读取文件,排序,返回排序结果。

有没有碰到特别难的事情,如何解决的

业界中间件有什么了解吗,讲一个你深度理解原理的

高并发的问题有遇到过吗,分布式锁是排他的,如何提升存储效率

有没有遇到过很大的流量

Kafka除了可以解耦架构,还可以用来做异步存储,化解瞬间高流量。

描述产生一次FullGC的整个过程

  • 对象在新生代度过了很多次YGC之后会进入老年代
  • 程序生成大对象时,因为新生代存不下,所以对象会直接进入老年代
  • 对象进入老年代时,如果发现老年代空间不足,会触发一次FGC
  • 不同GC收集器会使用不同的垃圾回收过程,一般情况下老年代的回收会采用标记-整理算法

平时通过什么来提升自己

站在巨人的肩上,U2 is best!

你有什么问题

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant