快手提前批--Java开发面经
一面
泊松分布下,出现8次的概率已经非常低了
hashmap在jdk1.8中的变化? 如何实现解决死循环? 经常问
参考链接
hashMap很不错的总结
hashMap在Jdk1.7中为何出现死循环?
https://blog.csdn.net/qq_36520235/article/details/86653136
CAS与ABA问题?什么时候出现ABA问题?
空间担保失败
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速度快的原因?
单线程会有什么问题?
然后问io多路复用,epoll模型的过程? 使用什么数据结构
eventpoll结构体
用户态与核心态
拜占庭算法
大数据相关问题,我不会
为什么使用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开发面经的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: PIC16F877A单片机 (中断与定时
- 下一篇: 京东疯狂月薪36k程序员最新Java面试