0%

快手一面

快手

自我介绍
做的项目哪个最满意?
项目难点是什么?怎么解决的?
HashMap和TreeMap的区别?

1、HashMap无序,TreeMap有序。

2、HashMap重写了equals()方法和hashcode()方法,这使得HashMap中两个相等的映射返回相同的哈希值;

TreeMap则是实现了SortedMap接口,使其有序。

3、HashMap的工作效率更高,而TreeMap则是基于树的增删查改。更推荐使用HashMap。

4、HashMap基于数组+链表+红黑树(jdk1.8之后)实现,TreeMap是基于红黑树实现。

5、两者都不是线性安全的。

TreeMap怎么实现排序的?

TreeMap实现SortMap接口,能够把它保存的记录根据键排序,默认是按键值的升序排序,也可以指定排序的比较器。当用Iterator遍历TreeMap时,得到的记录是排过序的。

HashMap怎么扩容的?
操作系统线程和java线程区别?有什么联系吗?
用户态和内核态的区别?怎么切换?

由于需要限制不同的程序之间的访问能力, 防止他们获取别的程序的内存数据, 或者获取外围设备的数据, 并发送到网络, CPU划分出两个权限等级 — 用户态内核态

——内核态: CPU可以访问内存所有数据, 包括外围设备, 例如硬盘, 网卡.

——用户态: 只能受限的访问内存, 且不允许访问外围设备. 占用CPU的能力被剥夺, CPU资源可以被其他程序获取

——用户态和内核态的切换

所有用户程序都是运行在用户态的, 但是有时候程序确实需要做一些内核态的事情,

例如从硬盘读取数据, 或者从键盘获取输入等. 而唯一可以做这些事情的就是操作系统, 所以此时程序就需要先操作系统请求以程序的名义来执行这些操作.

这时需要一个这样的机制: 用户态程序切换到内核态, 但是不能控制在内核态中执行的指令

这种机制叫系统调用,

他们的工作流程如下:

——用户态程序将一些数据值放在寄存器中, 或者使用参数创建一个堆栈(stack frame), 以此表明需要操作系统提供的服务.

——用户态程序执行陷阱指令

——CPU切换到内核态, 并跳到位于内存指定位置的指令, 这些指令是操作系统的一部分, 他们具有内存保护, 不可被用户态程序访问

——这些指令称之为陷阱(trap)或者系统调用处理器(system call handler). 他们会读取程序放入内存的数据参数, 并执行程序请求的服务

——系统调用完成后, 操作系统会重置CPU为用户态并返回系统调用的结果

有哪几种锁?java中怎么使用的?
linux命令 有一个文件里面5列数据(姓名、年龄、电话、头像、地址),查找查找年龄为20的记录记录数量?
UDP和TCP区别?
TCP可靠性怎么实现的?
UDP要怎么做才能做到可靠性传输?

传输层无法保证数据的可靠传输,只能通过应用层来实现了。实现的方式可以参照tcp可靠性传输的方式,只是实现不在传输层,实现转移到了应用层。
最简单的方式是在应用层模仿传输层TCP的可靠性传输。下面不考虑拥塞处理,可靠UDP的简单设计。

1、添加seq/ack机制,确保数据发送到对端
2、添加发送和接收缓冲区,主要是用户超时重传。
3、添加超时重传机制。
详细说明:送端发送数据时,生成一个随机seq=x,然后每一片按照数据大小分配seq。数据到达接收端后接收端放入缓存,并发送一个ack=x的包,表示对方已经收到了数据。发送端收到了ack包后,删除缓冲区对应的数据。时间到后,定时任务检查是否需要重传数据。

下面分别介绍三种使用UDP进行可靠数据传输的协议:

RUDP

RTP

UDT

简单来讲,要使用UDP来构建可靠的面向连接的数据传输,就要实现类似于TCP协议的超时重传,有序接受,应答确认,滑动窗口流量控制等机制,等于说要在传输层的上一层(或者直接在应用层)实现TCP协议的可靠数据传输机制,比如使用UDP数据包+序列号,UDP数据包+时间戳等方法,在服务器端进行应答确认机制,这样就会保证不可靠的UDP协议进行可靠的数据传输

把Ip地址转成整数输出

输入:127.0.0.1

输出:4261412865(应该是这个)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import java.util.Scanner;

public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
String str=sc.next();
String[] arr=str.split("\\.");
long res=0;
for(int i=0;i<3;i++){
res+=Long.valueOf(arr[i])*(2<<(8*(3-i)));
}
res+=Long.valueOf(arr[3]);
System.out.println(res);
}
}
一个文件每行是用户访问快手的一个url记录,上亿条记录,找出访问快手次数最多的前20个用户;
------------- THE END! THANKS! -------------