来自:动脑学院-安卓面试突破专题课程
Android 基础与底层机制
- 数据库的操作类型有哪些,如何导入外部数据库?(Ricky)
- 是否使用过本地广播,和全局广播有什么差别?(Ricky)
- 是否使用过 IntentService,作用是什么, AIDL 解决了什么问题? (小米) (Ricky)
- Activity、 Window、 View 三者的差别, fragment 的特点?(360)(Ricky)
- 描述一次网络请求的流程(新浪)(Jason)
- Handler、 Thread 和 HandlerThread 的差别(小米)(Jason)
- 低版本 SDK 实现高版本 api(小米)(Ricky)
- launch mode 应用场景(百度、小米、乐视)(Ricky)
- touch 事件传递流程(小米)(Ricky)
- view 绘制流程(百度)(Ricky)
- 什么情况导致内存泄漏(美团)(Ricky)
- ANR 定位和修正(Ricky)
- 什么情况导致 oom(乐视、美团)(Ricky)
- Android Service 与 Activity 之间通信的几种方式(Ricky)
- Android 各个版本 API 的区别(Ricky)
- 如何保证一个后台服务不被杀死,比较省电的方式是什么?(百度)(Ricky)
- Requestlayout, onlayout, onDraw, DrawChild 区别与联系(猎豹)(Ricky)
- invalidate()和 postInvalidate() 的区别及使用(百度)(Ricky)
- Android 动画框架实现原理(Ricky)
- Android 为每个应用程序分配的内存大小是多少?(美团)(Ricky)
- Android View 刷新机制(百度、美团)(Ricky)
- LinearLayout 对比 RelativeLayout(百度)(Ricky)
- 优化自定义 view(百度、乐视、小米)(Ricky)
- ContentProvider(乐视)(Ricky)
- fragment 生命周期(Ricky)
- volley 解析(美团、乐视)(Ricky)
- Android Glide 源码解析(Ricky)
- Android 属性动画特性(乐视、小米)(Ricky)
- Handler 机制及底层实现(Danny)
- Binder 机制及底层实现(Danny)
Java 基础
- 接口的意义(百度)(Jason)
1、重要性:在Java语言中, abstract class 和interface 是支持抽象类定义的两种机制。正是由于这两种机制的存在,才赋予了Java强大的 面向对象能力。
2、简单、规范性:如果一个项目比较庞大,那么就需要一个能理清所有业务的架构师来定义一些主要的接口,这些接口不仅告诉开发人员你需要实现那些业务,而且也将命名规范限制住了(防止一些开发人员随便命名导致别的程序员无法看明白)。
3、维护、拓展性:比如你要做一个画板程序,其中里面有一个面板类,主要负责绘画功能,然后你就这样定义了这个类。可是在不久将来,你突然发现这个类满足不了你了,然后你又要重新设计这个类,更糟糕是你可能要放弃这个类,那么其他地方可能有引用他,这样修改起来很麻烦。
如果你一开始定义一个接口,把绘制功能放在接口里,然后定义类时实现这个接口,然后你只要用这个接口去引用实现它的类就行了,以后要换的话只不过是引用另一个类而已,这样就达到维护、拓展的方便性。
4、安全、严密性:接口是实现软件松耦合的重要手段,它描叙了系统对外的所有服务,而不涉及任何具体的实现细节。这样就比较安全、严密一些(一般软件服务商考虑的比较多)。
- 抽象类的意义(乐视)(Jason)
抽象类往往用来表征对问题领域进行分析、设计中得出的抽象概念,是对一系列看上去不同,但是本质上相同的具体概念的抽象。具体分析如下:
1.因为抽象类不能实例化对象,所以必须要有子类来实现它之后才能使用。这样就可以把一些具有相同属性和方法的组件进行抽象,这样更有利于代码和程序的维护。
2.当又有一个具有相似的组件产生时,只需要实现该抽象类就可以获得该抽象类的那些属性和方法。
- 内部类的作用(百度,乐视) (Jason)
定义:放在一个类的内部的类我们就叫内部类。
作用:
1.内部类可以很好的实现隐藏,一般的非内部类,是不允许有 private 与protected权限的,但内部类可以
2.内部类拥有外围类的所有元素的访问权限
3.可是实现多重继承
4.可以避免修改接口而实现同一个类中两种同名方法的调用。
- 父类的静态方法能否被子类重写,为什么?(猎豹)(Jason)
父类的静态方法是不能被子类重写的,其实重写只能适用于实例方法,不能用于静态方法,对于上面这种静态方法而言,我们应该称之为隐藏。
Java静态方法形式上可以重写,但从本质上来说不是Java的重写。因为静态方法只与类相关,不与具体实现相关。声明的是什么类,则引用相应类的静态方法(本来静态无需声明,可以直接引用)。并且static方法不是后期绑定的,它在编译期就绑定了。换句话说,这个方法不会进行多态的判断,只与声明的类有关。
-
举 1-2 个排序算法,并使用 java 代码实现(美团)(Danny)
-
列举 java 的集合和继承关系(百度、美团)(Jason)
-
java 虚拟机的特性(百度、乐视)(Jason)
-
哪些情况下的对象会被垃圾回收机制处理掉(乐视、美团、小米)(Jason)
(1)超出对象的引用句柄的作用域时,这个引用句柄引用的对象就变成垃圾。
(2)没有超出对象的引用句柄的作用域时,给这个引用句柄赋值为空时,这个引用句柄引用的对象就变成垃圾。
(3)创建匿名对象时,匿名对象用完以后即成垃圾。
- 进程和线程的区别(猎豹)(Jason)
进程和线程都是一个时间段的描述,是CPU工作时间段的描述,不过是颗粒大小不同。
- 简而言之,一个程序至少有一个进程,一个进程至少有一个线程.
- 线程的划分尺度小于进程,使得多线程程序的并发性高。
- 另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。
- 线程在执行过程中与进程还是有区别的。每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。
- 从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配。这就是进程和线程的重要区别。
- Java 中==和 equals 的区别, equals 和 hashCode 的区别(乐视)(Jason)
- ArrayList 和 HashMap 的实现原理(美团,百度)(Danny)
- java 中 int char long 各占多少字节数(Jason)
- java int 与 integer 的区别(Jason)
- string stringbuffer stringbuilder 区别(小米、乐视、百度)(Jason)
- Java 多态(乐视)(Jason)
- 什么导致线程阻塞(58、美团)(Jason)
- 抽象类接口区别(360)(Jason)
- 容器类之间的区别(乐视、美团)(Jason)
- Java 中 HashMap 和 HashTable 的区别(乐视、小米)(Danny)
- ArrayMap VS HashMap(Danny)
数据结构与算法
- 堆和栈在内存中的区别是什么(数据结构方面以及实际实现方面) (Danny)
- 最快的排序算法是哪个?给阿里 2 万多名员工按年龄排序应该选择哪个算法?堆和树
的区别;写出快排代码;链表逆序代码(阿里)(Danny) - 求 1000 以内的水仙花数以及 40 亿以内的水仙花数(百度)(Danny)
- 子串包含问题(KMP 算法)写代码实现(Danny)
- 万亿级别的两个 URL 文件 A 和 B,如何求出 A 和 B 的差集 C,(Bit 映射->hash 分组->多文(Danny)
件读写效率->磁盘寻址以及应用层面对寻址的优化) (Danny) - 蚁群算法与蒙特卡洛算法(Danny)
- 写出你所知道的排序算法及时空复杂度,稳定性(小米)(Danny)
其他
- 死锁的四个必要条件(Jason)
1)互斥条件,即某个资源在一段时间内只能由一个线程占有,不能同时被两个或两个以上的线程占有
2)不可抢占条件,线程所获得的资源在未使用完毕之前,资源申请者不能强行地从资源占有者手中夺取资源,而只能由该资源的占有者线程自行释放
3)占有且申请条件,线程至少已经占有一个资源,但又申请新的资源;由于该资源已被另外线程占有,此时该线程阻塞;但是,它在等待新资源之时,仍继续占用已占有的资源。
4)循环等待条件,存在一个线程等待序列{P1,P2,...,Pn},其中P1等待P2所占有的某一资源,P2等待P3所占有的某一源,......,而Pn等待P1所占有的的某一资源,形成一个线程循环等待环
解决死锁的办法:加锁顺序,死锁检测
- 常见编码方式; utf-8 编码中的中文占几个字节;数字几个字节(Jason)
一个utf8数字占1个字节,一个utf8英文字母占1个字节,少数是汉字每个占用3个字节,多数占用4个字节。
- 实现一个 Json 解析器(可以通过正则提高速度) (Jason)
String json = "{name:\"jason\",father:\"jason\",age:18}";
//name:"jason"
//age:18
//\"\\w+\" 字符串属性
Pattern p = Pattern.compile("\\w+:(\"\\w+\"|\\d*)");
Matcher m = p.matcher(json);
while(m.find()){
String text = m.group();
int dotPos= text.indexOf(":");
String key = text.substring(0, dotPos);
String value = text.substring(dotPos+1, text.length());
//替换字符串的开始结束的双引号
value = value.replaceAll("^\\\"|\\\"$", "");
System.out.println(key);
System.out.println(value);
}
-
Android App 的设计架构: MVC,MVP,MVVM 与架构经验谈(搜狐)(Jason)
-
写出观察者模式的代码(Jason)
触发联动 -
TCP 的 3 次握手和四次挥手; TCP 与 UDP 的区别(Jason)
http://blog.csdn.net/whuslei/article/details/6667471
1、TCP面向连接(如打电话要先拨号建立连接);UDP是无连接的,即发送数据之前不需要建立连接
2、TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保证可靠交付
3、TCP面向字节流,实际上是TCP把数据看成一连串无结构的字节流;UDP是面向报文的
UDP没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如IP电话,实时视频会议等)
4、每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信
5、TCP首部开销20字节;UDP的首部开销小,只有8个字节
6、TCP的逻辑通信信道是全双工的可靠信道,UDP则是不可靠信道
- HTTP 协议; HTTP1.0 与 2.0 的区别;HTTP 报文结构(Jason)
- HTTP 与 HTTPS 的区别以及如何实现安全性(Jason)
网友评论