头x扒历史
1 . HTTP请求过程,浏览器中输入一个网址后做了哪些工作
1.DNS域名解析;
2.建立TCP连接;
3.发送HTTP请求;
4.服务器处理请求;
5.返回响应结果;
6.关闭TCP连接;
2.TCP和UDP分别是怎样的协议
3.写算法判断一个long数组是另一个long数组的子数组
4.查找一个有序序列中第一个出现的0(二分查找)
public class FindFirstOne {
//参数:数组a,低位low,高位a.length-1
//返回第一个1出现的位置
//如果全是0,返回数组长度
public static int find(int[] a,int low,int high) {
int flag=0;
while(high-low>1) { //当low,high相邻时,结束 可以知道,low永远在high的左边
int mid=(low+high)/2;
if(a[mid]==1) {
high=mid;
}else {
low=mid;
}
}
if(a[low]==1) return low;
if(a[high]==1) return high;
return a.length;
}
public static void main(String[] args) {
int[] a= {0,1,1,1,1}; //最好多举例,演示几遍就清楚了
int f=find(a,0,a.length-1);
System.out.println(f);
}
}
网络资料111
1.activity launchmode中single task和single instance的区别,以及各自的使用场景。
singletask如果栈中有,则顶掉上面的所有activity对象,复用这个。
singleinstance单独的栈存储,如设置页面、播放页面、闹钟页面等需要确认为全局唯一复用的
2.aidl的实现原理,通过aidl生成的.java文件中都有哪些成员,各自的作用。
安卓接口定义语言,进程间通讯,使用binder驱动实现。binder驱动可以将客户端和服务端的共享内存区域数据互相传递并负责唤醒。stub类和接口,实现共享区域数据互通。
3.Looper,Handler,MessageQueue的原理,Looper如何保证每个线程只有一个。
handler发送消息入队设置callback(this),处理消息
looper轮询queue中消息,创建时同时创建queue,内有静态集合,存储了thread和looper映射。prepare时就会存进去。
queue入队消息存储消息
4.用数组实现栈,考虑如何在O(1)时间内获得栈的最小值。
public class Stack{
Object[] data = new Object[size];
int top=-1;
public object peek(){
data[top];
public void add(object obj){
top++;
data{top}=obj;
}
publci obj pop(){
return data[top--]
}
}
}
https://blog.csdn.net/shou_zheng/article/details/63681038
5.Object中定义了哪些方法。 equals一般如何实现,实现equals()时候还需要实现哪些方法,为什么。
如果不实现hashcode,hashmap put的时候,判断虽然equal和==相同,但hash不同,会无法替换值,而走了createentry方法。
6.synchronized和lock的区别。
一个是关键字 一个是类。少量、大量。状态不可判断、可判断。获得锁后wait后,另外一个线程必须等待。lock不用
7.如何判断两个链表是否有交点。
两个链表的交点的问题,需要考虑链表是否包含环。①都不包含环:只需要看两个链表的最后一个节点是否相同,复杂度O(L1+L2);②一个链表有环,另一个没有环,则两个链表必然不想交;③两个链表都有环,找到一个链表环中的一个点,判断是否在另一个链表上。
- 判断是否有环: 两个指针分别从起点开始遍历,一个每次一步,一个每次两步,若两个指针有相遇的时候,则表示有环,因为如果存在环,快的指针肯定会在环中与慢的指针相遇,就像分针和秒针一样
- 找出环的起点:在1的基础上,从两个指针相遇的点处,每次一步移动一个指针,直到指针转了一圈回来,这样就可以知道环的大小C。之后,两个指针从链表起点出发,每次一步,让其中一个指针先走C步,则两个指针相遇的点就是环的起点。
8.activity与fragment生命周期的关系。
9.kotlin中var和val的区别,lateinit和lazy的区别。
10.从activity a启动activity b,二者生命周期如何变化,为何是这种顺序。
11.手写二叉树层序遍历。
https://blog.csdn.net/snow_7/article/details/51815787
12.手写在数组指定位置插入元素,后续元素向后顺延,考虑数组长度和数组容量间的关系,长度等于容量时需要重新分配更大的内存。
https://www.cnblogs.com/jcong/p/5252644.html
13.如何实现通讯录搜索的功能(通过输入汉字查找姓名,通过号码查找姓名)。
14.java内部类可以访问外部类的field,如何做到的。
1 编译器自动为内部类添加一个成员变量, 这个成员变量的类型和外部类的类型相同, 这个成员变量就是指向外部类对象的引用;
2 编译器自动为内部类的构造方法添加一个参数, 参数的类型是外部类的类型, 在构造方法内部使用这个参数为1中添加的成员变量赋值;
3 在调用内部类的构造函数初始化内部类对象时, 会默认传入外部类的引用。
https://blog.csdn.net/zhangjg_blog/article/details/20000769
15.设计一个应用的登录系统。
16.微信通讯录增删改设计(本地和服务端)。
17.java中的线程和操作系统的线程区别。
18.如何保证js代码只运行在一个手机应用中。
网络资料222
进去先做题,做了套Android相关题目,基础知识,不是很难,接着面试,面了两面,算法,计算机网络,Android基础,Java基础。
面试官的问题:
Http请求优化
线程加锁等
写二分查找
100万个数中找出最大的100个数:http://www.cnblogs.com/nzbbody/p/3576894.html
多线程和socket:https://www.cnblogs.com/m97i/p/7801978.html
https://www.nowcoder.com/discuss/37273
https://www.kanzhun.com/gsmsh10845144.html
http://www.jianshu.com/p/ff0c7215a600
https://www.jianshu.com/p/9719ca9bf58a
https://www.sohu.com/a/231838405_99960938
https://blog.csdn.net/Amazing_Mark/article/details/52823129