首页 存档 技术 查看内容

Android开发核心36计,送给刷不完leetcode的你

2018-3-30 13:00 |来自: 互联网 380 0

摘要: 截止到4月2日的今天 许多互联网校招/实习的网申都截止了 相信大家的简历已经都躺在系统里等待“临幸”了 那么技术岗的同学 你的leetcode刷完了么 什么没刷完!?虽然很想对你犯一个白眼 但逆行君是一个不离不弃的 ...

截止到4月2日的今天

许多互联网校招/实习的网申都截止了

相信大家的简历已经都躺在系统里等待“临幸”了


那么技术岗的同学

你的leetcode刷完了么


什么没刷完!?

虽然很想对你犯一个白眼

但逆行君是一个不离不弃的公众号


目标Android开发的你

请收下这份核心“三十六计”


逆行君说

下面为大家总结的Android开发“三十六计(题)”,如果大家准备面试Android开发岗,是一定要不择手段的搞清楚的。

但有两点需要注意:

1、这些问题对于大家的面试,是“必要不充分条件”,可以作为时间紧急情况下的应急之选。但想要在面试中“不动如山”,还是要多多刷题。

2、逆行君为大家奉上的参考答案只是一家之言,大家在阅读时还是要结合网上的其他详解以及源码,多听多看。


PS.虽然是面向Android开发,但也有一部分计算机基础和Java语言的内容


第一部分:计算机网络


一、ICMP协议是什么


(1) ICMP协议全称Internet Control Message Protocol,即Internet控制报文协议。
(2)是TCP/IP协议的一个子族,网络层。
(3)用于在计算机、路由器之间传递控制消息,如网络通不通、主机是否可达、路由是否可用等等。
(4)ping命令即基于ICMP协议。
(5)路由跟踪的Tracert等命令也基于ICMP

二、DNS协议是什么


(1)DNS全称Domain Name System,即域名系统,一个用于映射域名和IP地址的分布式系统。
(2)DNS请求使用UDP协议,但本身属于应用层协议。

三、堆和栈的区别


(1)堆和栈在数据结构和编程语言实现里的意思不一样。
(2)作为数据结构,栈是后入先出的线性结构;堆是一个树,父节点总是大于(或者总是小于)子节点,用于实现优先队列。
(3)但在编程语言实现、运行时环境、虚拟机的语境下,栈(调用栈)是维护嵌套函数调用状态的结构,主要是保存局部变量的值和返回地址;堆是动态内存分配的空间,生存期超出函数的范围,结构根据具体的分配算法以及垃圾回收算法而不同。

四、TCP和UDP的区别


(1)TCP是传输控制协议,面向字节流,提供拥塞控制功能;UDP是用户数据报协议,面向报文,尽最大努力交付数据;
(2)TCP是面向连接的协议,UDP是面向非连接的协议。
(3)TCP是传输可靠型协议,UDP是传输不可靠型协议。
(4)TCP的速度较慢,UDP的速度较快。

五、TCP拥塞控制逻辑


(1)主要由拥塞窗口cwnd实现,具体逻辑主要包括慢启动、快速重传和快速恢复等。
(2)慢启动:窗口一开始很小(一般为1)但是很快地(指数级)增长上来,直到达到慢启动门限。
(3)快速重传:TCP利用3个相同的ACK来判定数据包丢失,开始快去重传
(4)快速启动:重传后的慢启动

六、TCP为什么断开连接要四次握手?


(1)TCP是全双工的,每一个方向都必须单独进行开关,所以需要四次握手。而建立连接时发起者A的两个方向是默认打开的,B可以省去一个通知A打开的请求,所以只需要三次握手。


第二部分:Java基础


一、HashMap和HashTable的区别


(1)HashMap是线程不安全的,HashTable是线程安全的,所以HashTable通常要比HashMap慢。
(2) HashMap的迭代器是fast-fail的,即当迭代时HashMap的结构被改变了,会抛出ConcurrentModificationException,而HashTable则不会。
(3)HashMap不保证随着时间的推移Map中元素的次序是不变的。
(4)HashMap的主键可以为null。

二、SoftReference和WeakReference的区别


(1)SoftReference只有当JVM即将OutOfMemory时才会被回收。
(2)WeakReference只要GC就会被回收。

三、HashMap冲突后的处理方法


(1)开放地址法:又称再散列法,如果散列值p1冲突了,则基于p1再生成另一个地址p2,以此类推;常用再散列函数如线性探测、二次探测和伪随机数序列等。
(2)链地址法:Java8中一个链长度超过8会转化为红黑树,减少查找时间。

四、equal()方法重写时要注意的点


(1)判断对象非空
(2)自反性、对称性、传递性、一致性

五、new String()


(1)输出为:true,false
(2)String是final类,编译期指定的字符串会指向字符串池中的对象。
(3)运行时生成的String类会先在heap中建立一个对象,同时去字符串池中寻找这个字符串,如果没有则创建一个。


六、Java优先级队列的实现原理


(1) PriorityQueue使用优先级堆实现
(2)使用堆排序算法进行快速调整

七、Java虚拟机GC的原理


(1)JVM的GC采用根搜索算法。
(2)GC Roots一般有四种:栈帧的本地变量表中引用的对象,方法区中的静态成员,方法区中的常量引用的对象(final全局变量),本地方法栈JNI方法引用的对象。
(3)现代GC回收算法主要有三种:标记-清除算法,复制算法和标记-整理算法。
(4)标记清除算法缺点是效率比较低,容易出现内存碎片,一般很少用到。
(5)复制算法缺点是浪费内存多,不适用于大对象和存活时间长的对象,一般用于新生代对象的GC。(6)标记整理算法克服了内存碎片,但缺点仍是效率不高,一般用于老年代对象的GC。
(7)HotSpot虚拟机默认Eden和Survivor的比例是8比1,老年代使用标记整理算法,新生代使用复制算法。
(8)Survivor空间不够时大对象会直接进入老年代。
(9)当一个对象不可达时会调用finalize()方法,但是仅调用一次。

八、Java堆和栈的区别


(1)所有对象实例都是在Java堆上分配内存
(2)方法区用于存放ClassLoader加载的类的相关信息,包括类、静态变量和常量,String常量池也在方法区内。
(3)Java栈存放方法调用时的局部变量、方法操作、方法出口与方法执行的相关信息,无限递归调用会撑爆Java栈。

九、Java三大特性


(1)封装,继承,多态

十、Java的可变参数


(1)适用于参数个数不确定,类型确定时。
(2)只能出现在参数列表的最后。
(3)Java把可变参数当做数组处理。

十一、String为什么要设计成不变的


(1)字符串不变时,字符串池才有可能实现,运行时能节约很多堆空间。
(2)字符串不变,就不用考虑多线程同步问题,是线程安全的。
(3)类加载器要用到字符串,字符串不变性提供了安全性,保证正确的类被加载。
(4)字符串不变hashcode就能被缓存,作为HashMap的键要比其他对象速度快。

十二、如何理解String的不变性


(1)所有在编译期间确定的字符串都会在常量池中。
(2)new String("**")会在堆中创建对象。
(3)string.intern()会根据字符串内容去常量池中寻找并返回相同内容的字符串,如果没有则先创建。

十二、Java用擦除实现范型的原因


(1)纯技术角度考虑,Java实现类似C 模板的范型是相当简单的,Java不仅在2014年的Poject Valhalla的Model1中实现过,在更早的1996年的实验语言Pizza中也实现过。
(2)Java强调二进制向后兼容性,即低版本编译器生成的class文件要能在高版本的JRE上运行。
(3)要保持兼容性的情况下在没有范型的基础上实现范型有两种思路:一是需要范型的类型(主要是容器类Collections)原有的不变,然后平行地加一套范型版本;二是让所有需要范型的类型原地范型化。
(4)C#在1.1至1.2时选择了第一条路,Java在1.4至1.5时选择了第二条。
(5)第一个原因是C#在1.1时代码并不多,整个体系都在微软的控制下,变更比较容易,而Java1.4时已经有大量生产代码用于生产环境,如果新功能需要做大量源码级的修改,会大大影响新功能的普及。
(6)第二个原因是,Java1.1至1.2时推翻过一次容器类的设计(Vector、HashTable),如果再加一套范型化的容器类画面实在太美。

十三、如何定义一个Annotation


(1)public @inte**ce CustomAnnotation{}
(2)元注解Target、Retention、Documented、Inherited
(3)域 public String name() **ult "xx";

十四、volatile关键字的作用


(1)volatile只能用来域变量上,作用是保证变量的可见性和读写操作的有序性。
(2)Java执行“int x = new Object()”时有三个步骤:1在栈帧中给x变量分配空间;2在堆中初始化Object;3将x指向Object。JVM不能保证其中2、3步的执行顺序,在多线程并发情况下x不为null时这个对象不一定初始化完成了,而volatile关键字正是用来保证这一点的,即读操作一定在写操作完成之后。
(3)volatile不是被设计用来多线程同步的,最常用的场景是懒加载双重检查的单例模式。
(4)在JVM的实现中,volatile要比synchronized轻量,消耗资源更少。

十五、notify了一个锁,wait的地方一定会被唤醒继续执行吗?


1. 如果只有一个线程在wait,那么是的。
2. 如果有多个线程在同时wait同一个锁,那么唤醒哪一个线程与JVM的实现有关,不能保证某个线程一定会被唤醒。


第三部分:Android基础


一、触摸事件的分发


(1)触摸事件的处理涉及三个方法:dispatchTouchEvent()、onInterceptEvent()、onTouchEvent()
(2)从Activity的dispatch开始传递,如果没有拦截,则一直传递到子view。
(3)如果子View没有消费事件,事件会向上传递,这时父Group才可以消费事件。
(4)如果子View没有消费DOWN事件(没有返回 true),后续事件都不会再传递进来,直到下一次DOWN。
(5)OnTouchListener的处理优先级高于onTouchEvent()

二、Handler.postDelay()的原理


答案较长,请点击此网址http://www.dss886.com/2016/08/17/01/(或点击“阅读原文”)


三、Fragment的生命周期


四、Gson的原理


(1)如果使用默认的new Gson()对象,则采用反射来进行json的解析。
(2)如果使用GsonBuilder来创建,并使用自定义的TypeAdapter,则会用自定义的TypeAdapter来解析json字符串。

五、Serializable和Parcelable的区别


(1)S是Java的序列化方案,P是Android的
(2)S在序列化的时候会产生大量的临时变量,导致频繁GC,P则不会。因此在内存中使用时(如网络中传递或进程间传递)推荐使用P。
(3)P被设计为IPC通信数据序列化方案,不适用于保存在磁盘上,此时应用S。
(4)S只需要继承Serializable接口即可,P则需要重写writeToParcel方法、重写describeContents方法、实例化Parcelable.Creator。

六、一个Activity启动另外一个Activity并返回的生命周期调用


(1)A.onCreate()
(2)A.onStart()
(3)A.onResume()
(4)启动B
(5)A.onPause()
(6)B.onCreate()
(7)B.onStart()
(8)B.onResume()
(9)A.onStop()
(10)返回A
(11)B.onPause()

(12)A.onRestart()
(13)A.onStart()
(14)A.onResume()
(15)B.onStop()
(16)B.onDestory()

七、startService和bindService的区别


(1)startService启动的Service在调用者自己退出而没有调用stopService时会继续在后台运行。
(2)bindService启动的Service生命周期会和调用者绑定,调用者退出时Service也会调用unBind()-

声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系 [邮箱地址] 删除

路过

雷人

握手

鲜花

鸡蛋

相关分类

返回顶部