欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程语言 > java >内容正文

java

快手提前批--Java开发面经

发布时间:2024/1/8 java 43 豆豆
生活随笔 收集整理的这篇文章主要介绍了 快手提前批--Java开发面经 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

一面

泊松分布下,出现8次的概率已经非常低了

hashmap在jdk1.8中的变化? 如何实现解决死循环? 经常问
参考链接
hashMap很不错的总结

1.8还有4点主要的优化: 1:数组+链表改成了数组+链表或红黑树;: 2:链表的插入方式从头插法改成了尾插法,简单说就是插入时,如果数组位置上已经有元素,1.7将新元素放到数组中,原始节点作为新节点的后继节点,1.8遍历链表,将元素放置到链表的最后; 3:扩容的时候1.7需要对原数组中的元素进行重新hash定位在新数组的位置,1.8采用更简单的判断逻辑,位置不变或索引+旧容量大小; 4:在插入时,1.7先判断是否需要扩容,再插入,1.8先进行插入,插入完成再判断是否需要扩容;jdk1.7中:put过程中的resize方法在调用transfer方法的时候导致的死锁 多线程同时put时,如果同时触发了rehash操作,会导致HashMap中的链表中出现循环节点,进而使得后面get的时候,会死循环get(key)方法时获取key的hash值,计算hash&(n-1)得到在链表数组中的位置

hashMap在Jdk1.7中为何出现死循环?
https://blog.csdn.net/qq_36520235/article/details/86653136

CAS与ABA问题?什么时候出现ABA问题?
空间担保失败

空间分配担保: 当出现大量对象在Minor GC后仍然存活时,就需要老年代进行分配担保,把survivor无法容纳的对象直接进入到老年代中,前提是老年代本身还有容纳这些对象的剩余空间 把每一次回收晋升到老年代对象容量的平均值作为参考,与老年代的剩余空间进行比较,如果老年代空间不足(担保失败),需要进行Full GC(回收新生代与老年代)

Cms的过程,四个过程
Cms与G1的区别 不会的面经中有
G1收集器有什么特点?哪些会stop the world?

让三个线程顺序执行的方法,一直问,很多很多

join() countdownLatch wait()notify() 使用线程池 将所有线程放入一个阻塞队列 ,保证顺序输出 通过一个ReentrantLock和三个conditon实现 synchronized+一个状态变量 信号量

零拷贝

mmap: 通过内存映射,将文件映射到内核缓冲区,同时,用户空间可以共享内核空间的数据。这样,在进行网络传输时,就可以减少内核空间到用户空间的拷贝次数sendFile:数据被 DMA 引擎从文件复制到内核缓冲区,然后调动 write 方法时,从内核缓冲区进入到 Socket,这时,是没有上下文切换的,因为在一个用户空间。最后,数据从 Socket 缓冲区进入到协议栈。区别: mmap 适合小数据量读写,sendFile 适合大文件传输。 mmap 需要 4 次上下文切换,3 次数据拷贝;sendFile 需要 3 次上下文切换,最少 2 次数据拷贝。 sendFile 可以利用 DMA 方式,减少 CPU 拷贝,mmap 则不能(必须从内核拷贝到 Socket 缓冲区)。

内存映射文件

内存映射文件,是指文件和内存逻辑地址映射起来。 mmap()返回一个指针ptr,可以通过指针进行读写,而不必通过read()或者write() ptr指向一个逻辑地址,需要MMU把逻辑地址转换成物理地址。

mmap,和 read,write的区别,mmap减少了哪一次拷贝?

1:mmap是一种内存映射文件的方法,即将一个文件映射到进程的地址空间,实现文件磁盘地址和进程地址空间之间的映射 2:进程就可以使用指针读写这一段内存,而系统会自动回写脏页面到对应的文件磁盘上,不必再调用read,write等系统调用函数。 相反,内核空间对这段地址区域的修改也直接反映到用户空间,从而可以实现不同进程间的文件共享区别: 系统调用read(), 读文件时需要先将文件页从磁盘拷贝到页缓存中,由于页缓存处在内核空间,不能被用户进程直接寻址,所以还需要将页缓存中数据页再次拷贝到内存对应的用户空间中。 这样,通过了两次数据拷贝过程,才能完成进程对文件内容的获取任务。 write() 写操作也是一样,也是需要两次数据拷贝而使用mmap操作文件中,创建新的虚拟内存区域和建立文件磁盘地址和虚拟内存区域映射这两步,没有任何文件拷贝操作。 而之后访问数据时发现内存中并无数据而发起的缺页异常过程,可以通过已经建立好的映射关系,只使用一次数据拷贝,就从磁盘中将数据传入内存的用户空间中,供进程使用。

Redis速度快的原因?
单线程会有什么问题?

单进程单线程弊端 无法发挥多核CPU性能,不过可以通过在单机开多个Redis实例来完善;

然后问io多路复用,epoll模型的过程? 使用什么数据结构
eventpoll结构体

用户态与核心态
拜占庭算法

拜占庭问题又叫拜占庭将军问题,讨论的是允许存在少数节点作恶(消息可能被伪造)场景下的如何达成共识问题。 拜占庭容错(Byzantine Fault Tolerant,BFT)讨论的是容忍拜占庭错误的共识算法

大数据相关问题,我不会
为什么使用B+树?
覆盖索引

性别上建索引会用到吗? 重复度超过30%不会走索引
ACID特性
幻影读
bin log/ redo log的区别

算法,最长回文子串

数据服务部门,做大数据的

java技术栈,spring, spring cloud, mysql, redis,卡夫卡,然后还有大数据的开发的工具,比如hadoop啥的

9.3 二面

Spring
Servlet的生命周期
ArrayList插入元素时其他元素怎么移动?
LinkedHashMap的实现,这次加深了理解了
Java中乐观锁悲观锁,各自怎么实现?有什么优缺点?
Mysql中的语句

算法:计数器
int calculate(String exp)
exp = “3-125+34*5”

正整数 ±*

#coding=utf-8 import sys #str = raw_input() import collectionsdef mul(exp):res = 0i = 0stack = []while i < len(exp):if '0'<=exp[i]<='9':start = iwhile i < len(exp) and '0' <= exp[i] <= '9':i += 1stack.append(int(exp[start: i]))i -= 1else:if len(stack) >= 2:res *= (stack.pop() * stack.pop())i += 1return resexp = '9*2*3*2' print(mul(exp))def calculate(exp):s1 = exp.split('+') # "3-12*5, 3*4*5"s2 = []for s in s1:s3 = s.split('-') # 3 12*5, 3*4*5s2.append(s3)mapp = collections.defaultdict()for ex in s2:if '*' in ex:mapp[ex] = mul(ex)for key, value in mapp: # 3-60+60exp.replace(key, value)res = 0i = 0sign = [1]while i < len(exp):if '0'<=exp[i]<='9':start = iwhile i < len(exp) and '0' <= exp[i] <= '9':i += 1res += (sign.pop()* int(exp[start: i]))i -= 1elif exp[i] == '+':sign.append(1)elif exp[i] == '-':sign.append(-1)i += 1return res

重写了一下!

def calExp(strs):if not strs: return []stack1 = []stack2 = []i = 0while i < len(strs):if '0' <= strs[i] <= '9':start = iwhile i < len(strs) and '0' <= strs[i] <= '9':i += 1num = int(strs[start:i])stack1.append(num)i -= 1elif strs[i] == '+' or strs[i] == '-':stack2.append(strs[i])elif strs[i] == '*':pre = stack1.pop()i = i + 1start = iwhile i < len(strs) and '0' <= strs[i] <= '9':i += 1#print(start, i)cur = int(strs[start: i])print(start, i, cur)stack1.append(pre*cur)i -= 1i += 1stack1.reverse()stack2.reverse()while stack1 and stack2:first = stack1.pop()second = stack1.pop()op = stack2.pop()if op == '+':stack1.append(first + second)else:stack1.append(first - second)return stack1[0]strs = '90+8*3*40-9-19+23' res = calExp(strs) print(res)''' 90+8*3*40-9-19+23数字 stack1 = [90, 8] 操作 stack2 = [+]'''

总结

以上是生活随笔为你收集整理的快手提前批--Java开发面经的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。