蚂蚁集团 后端 面经
1、个人介绍
2、聊项目
3、Java 常用集合类?
(继承collection的set、list、queue;继承map的map)
4、1.8 hashmap底层原理?
HashMap由数组(键值对entry组成的数组主干)+ 链表(元素太多时为解决哈希冲突数组的一个元素上多个entry组成的链表)+ 红黑树(当链表的元素个数达到8链表存储改为红黑树存储)进行数据的存储。
5、红黑树?
红黑树,是一种二叉查找树,在每个结点上增加一个存储位表示结点的颜色,可以是Red或Black。 通过任何一条从根到叶子的路径上各个结点着色方式的限制,红黑树确保没有一条路径会比其他路径长出俩倍,因而是接近平衡的。
6、二叉查找树?
具有下列性质:
(1) 若它的左子树不空,则左子树上所有结点的值均小于它的根节点的值;
(2)若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
(3)它的左、右子树也分别为二叉查找树。
二叉搜索树作为一种经典的数据结构,它既有链表的快速插入与删除操作的特点,又有数组快速查找的优势;所以应用十分广泛,例如在文件系统和数据库系统一般会采用这种数据结构进行高效率的排序与检索操作。
7、平衡二叉树?
平衡二叉搜索树,又被称为AVL树,且具有以下性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。
8、满二叉树?
除最后一层无任何子节点外,每一层上的所有结点都有两个子结点的二叉树。
9、完全二叉树?
一棵深度为k的有n个结点的二叉树,对树中的结点按从上至下、从左到右的顺序进行编号,如果编号为i(1≤i≤n)的结点与man二叉树中编号为i的结点在二叉树中的位置相同,则这棵二叉树称为完全二叉树。
10、hashmap 是线程安全的吗?
hashmap并发执行put操作时,可能会导致形成循环链表,引起死循环。hashmap是非线程安全的。
11、什么是线程安全,什么是线程不安全?
线程安全:在拥有共享数据的多条线程并行执行的程序中,线程安全的代码会通过同步机制保证各个线程都可以正常且正确的执行,不会出现数据污染等意外情况。
非线程安全:在运行中不提供数据访问保护,这就可能导致多个线程先后更改数据,最后所得的数据是脏数据。
12、如何将 hashmap 变成线程安全?
通过Collections.synchronizedmap()封装所有不安全的hashmap方法
13、sychronized 、lock的区别?
(1)synchronized是java关键字,lock是一个java类
(2)synchronized无法判断获取锁的状态,lock可以判断是否获得到锁
(3)synchronized自动释放锁,lock必须要手动释放锁,否则会出现死锁状态
(4)当有两个线程1、2时,线程1获得锁但是出现了阻塞,此时synchronized方式会让线程2持续等待,造成损失,lock方式不一定会一直等待,可能会使用trylock方法尝试获取锁
(5)synchronized可重入、不可以中断、非公平,lock可重入、可以判断锁、可以自己设置公平还是非公平,在ReentrantLock方法中加入参数,默认是非公平
(6)synchronized适合锁少量代码同步问题,lock适合锁大量代码同步问题
14、volatile?
volatile关键字为域变量的访问提供了一种免锁机制,使用volatile修饰域相当于告诉虚拟机该域可能会被其他线程更新,因此每次使用该域就要重新计算,而不是使用寄存器中的值。需要注意的是,volatile不会提供任何原子操作,它也不能用来修饰final类型的变量。
12、介绍一下线程池的核心参数?
(1)核心线程数
(2)最大线程数
(3)空闲线程存活时间
(4)队列
(5)线程创建工厂
(6)拒绝策略
13、线程池处理过程?
(1)判断核心线程池是否已满,没满则创建一个新的工作线程来执行任务。
(2)判断任务队列是否已满,没满则将新提交的任务添加在工作队列。
(3)判断整个线程池是否已满,没满则创建一个新的工作线程来执行任务,已满则执行饱和(拒绝)策略。
14、说一下阻塞队列?
阻塞队列:从名字可以看出,他也是队列的一种,那么他肯定是一个先进先出(FIFO)的数据结构。与普通队列不同的是,他支持两个附加操作,即阻塞添加和阻塞删除方法。
- 阻塞添加:当阻塞队列是满时,往队列里添加元素的操作将被阻塞。
- 阻塞移除:当阻塞队列是空时,从队列中获取元素/删除元素的操作将被阻塞。
BlockingQueue是一个接口,它的实现类有ArrayBlockingQueue、DelayQueue、 LinkedBlockingQueue、PriorityBlockingQueue、SynchronousQueue等。它们的区别主要体现在存 储结构上或对元素操作上的不同,但是对于put与take操作的原理是类似的。
15、反问
#软件开发2023笔面经#