常见题集锦

java

Java基础

switch能否用string做参数

object有哪些公用方法:equals和==,hashcode,clone,wait,notify等

String、StringBuffer与StringBuilder的区别。

try catch finally,try里有return,finally还执行么?

Excption与Error包结构。

Override和Overload的含义与区别。

Interface与abstract类的区别。

Static class 与non static class的区别。

foreach与正常for循环效率对比。

反射机制

String类内部实现,能否改变String对象内容,String源码

Java1.7与1.8新特性。

java集合

java集合框架的结构

list,set,map接口

哪些是线程安全,哪些不安全

hashmap能否用null作为键或值

hashmap源码

快速失败与安全失败

arraylist,linkedlist底层实现区别,如何扩容

treemap,hashmap,linkedhashmap区别和特点,底层实现的区别

如何解决不安全的集合的安全性问题

Jvm虚拟机

强软弱虚四种引用

java内存分区

java的个内存分区在什么情况下内存溢出

java垃圾回收机制,垃圾收集算法特点及工作在哪一代,分代收集策略,如何判断一个对象该被回收了,java对象实现如何自救,java的垃圾收集器,内存分配与回收及分配担保

java的类加载机制,类加载的5个步骤,类加载器

Java并发

线程生命周期

java如何使用多线程(runnable和Thread)

stop,resume,suspend的缺点

终止线程有哪些方法

守护线程

synchronize关键字和wait,notify,notifyAll

lock与condition,Java中的几种不同锁

线程死锁情景

消费者生产者模型

volatile关键字,是否保证原子性,优缺点

ThreadLocal的特点和使用

单例模式和多线程

SimpleDateFormat的安全性问题

java的并发容器包Concurrent。阻塞队列,CopyOnWriteList等

ConcurrentHashMap的源理

java的线程池原理和自带的四大线程池

Executor框架

Android

Android基础

五种布局的特点和效率对比

Activity的生命周期和缓存

Fragment的生命周期

Service的两种启动方式,如何保证一个Service不被杀死

广播注册的两种方式的区别

如何安全的退出一个已经开启多个activity的APP

Android的进程优先级

Asset目录与res目录的区别

ANR问题,force close问题,activity,service,broadcast各自超过多少秒报ANR

Activity启动模式,intent匹配规则

Android反编译

JNI和native方法

Android系统的有哪些安全机制

Android新特性有哪些(5.0 6.0 7.0)

Dalvik和ART区别

Android屏幕适配有哪些方法

Android View相关

View事件体系,滑动冲突

View绘制原理,性能问题(view绘制间隔16ms,60fps),measure,layout,draw三大过程

如何避免overdraw

自定义View相关知识,下拉刷新的实现

Android动画分类和各自特点

View和SurfaceView的区别

Android性能优化

APK瘦身的办法

ListView的源码和如何优化Listview

Android如何获取Crash信息

ANR日志分析

Android动态加载,如何解决方法数越界

Android怎么加速启动Activity

Android内存泄漏问题,内存泄漏分析工具

Android内存溢出问题,图片的三级缓存

Android framework和底层原理

Android系统开机过程

Zygote和System进程的启动过程

Activity的启动过程

Android的消息机制,Handler原理

AsyncTask源码,优缺点

HandlerThread和IntentService的原理和特点

Android的IPC机制

AIDL原理

Binder机制原理

ActivityManagerService

Android框架和源码

项目各个细节熟练,熟悉项目用到的框架源码

Volley

xUtils

okHttp

UniversalImageLoader

RxJava



本人面的Android岗位。由于基本都是内推的,所以没有刷过那些变态的笔试题。也算比较幸运

准备阶段:在校招开始之前,刷了一个月的Leetcode,看了一周的计算机网络,一周的操作系统,一周的Java编程思想,一周Android相关的知识。自己之前有专门整理过项目遇到的坑,所以这一块没怎么花时间。

具体用书:

  • 操作系统:《现代操作系统》、《Operating Systems: ThreeEasyPieces

  • 计算机网络:《TCP/IP卷一》、王道考研的计算机网络分册

  • Android:《Android小工》、《Android开发艺术探索》

  • Java:《Java编程思想》、《effective java》

背景交代完毕。就开始面试啦

校招最开始的就是百度啦

一面

总共面了四道算法

  • 3sum & 3sum-closet

  • Search Insert Position

  • Trapping Rain Water 这一道题卡住了,面试官就让我先写个快排压压惊,然后压完继续这个题。蛋疼

辛亏最后写出来了。一面就这样过去了

二面

面试官看我简历写了C++,就先开始问我C++了

  • 指针和引用的区别

  • STL 内存分配方式

  • 仿函数有什么用,和函数指针有什么不同,哪个效率高

  • 虚函数的作用,优点

  • 进程线程的区别

  • select和epoll区别,select为什么慢

  • TCP UDP的不同 TCP三次握手

接着就是聊Android项目遇到的坑了~

三面是总监面就问了两个问题

  • 一个如何维持一个长连接

  • 如何实现进程保活

腾讯

一面

  • 一开始就让写了个快速排序

  • Recover Binary Search Tree(Leetcode)

  • 项目中有没有见过内存泄漏?为什么会产生?怎么解决的?

  • Handler的原理

  • Binder的原理

  • String、StringBuilder、StringBuffer

二面

  • Binder的原理

  • Binder里面引用计数的原理

  • Binder底层为什么用红黑树,红黑树的原理知道吗

  • JVM分区,分别解释

  • 垃圾回收器的分类及优缺点

  • Retrofit的原理,为什么不用volley

  • 为什么选用Glide,原理?

  • LruCache的原理

网易

一面

  • TCP/IP分层

  • Android系统框架

  • synchronized和锁区别

  • handler和asyncTast的区别,然后让我自己设计线程池怎么做

  • Fragment好处,碰到过什么bug,怎么解决的

  • java的四种引用的区别

  • 最后让写了一个约瑟夫环问题的代码

二面

  • 为什么选用Realm,原理是什么

  • Binder的原理

  • HashMap && HashTable && ConcurrentHashMap

  • 红黑树的原理

  • 如何设计一个网络加载框架

  • volatile关键字的原理

华为

一面

  • Android四大组件的理解(这个扯了十多分钟)

  • ContentProvider的启动过程

  • Activity的四种启动模式,用过哪一种,为什么要用

  • Service和InentService的区别

  • View的事件分发和绘制原理

  • 如何解决滑动冲突


一面:1.先是自我介绍
           2.通过中序后序求前序,与运算
           3.展示一下自己的项目
           4.接着问了是否用过 volley,果断没有,说用过Retrofit,毕竟现在都是MVP+Retrofit+RXJava,然后就让讲下MVP
           5.多进程通信的方式(这个就比较模式化了,面试官也知道基本用不上)
           6.广播的使用
           7.Handler机制,以及具体的使用情况
           8.讨论了一下各个框架的使用
           大致就是这些了,比较简单,估计是因为我主要是带着面试官在讲把,所以没来得及问其他的,大概面了40分钟吧,直接就告诉我去二面。
二面:1.同样先是自我介绍 ,感觉这个的话面试官也不是太在意,我就讲了个学校就跟他扯到别的上去了
           2.让做了个简单的题目,又和面试官争论了下我的写法时间复杂度的问题。
           3.让介绍下最得意的项目,这个就是装x了,随便讲。
           4.AIDL,广播的种类
           5.如何解决app卡顿的问题,用到哪些工具
           6.OSI模型,TCP三次握手四次挥手(这个我简历上写了,所以问了)


1、进程怎么保活?
2、为一个程序生成一串唯一的数字,怎么做?(PID)
3、了解UML吗?
4、写一个SQL,查找出学生表中成绩最高的学生姓名和成绩?


1.说你最有成就感的项目
2.view的绘制流程
3.多线程和handler结合使用要注意什么
(我没get到他的点,他想要的答案是当activity隐藏或者销毁的时候要注意handler的任务取消之类的)
4.四大组件是在主线程运行的吗
5.sqlite的相关的,我不熟直接说不会
6.下载大文件要注意的事情
(我还是没get到他的点,我扯了一大堆网络不好,断点续传之类的,他实际想要的回答是注意防止OOM)

Androd:
Android的启动流程、四大组件、listview的运用于优化、MVP、两个activity怎么传输数据,intent是怎么实现传输数据的,闹钟怎么实现。

Java:Java有几种不同的编码格式各有什么特点不同、file、线程安全、overload和override、JAVA内存机制、垃圾回收怎么实现。

计算机网络:简要说一下七层协议、如果出现了两个端使用路由器进行连接,这时候路由器突然断电了接下来会出现什么情况。

数据结构:队列、栈、哈希存储与冲突处理。

算法:一个10G的数据,里面每条包含了用户的ID和用户访问的网址(有各种各样的网址),给出一个N,求访问某个网址如(www.nowcoder.com)最大次数的前N个用户的ID。(可能描述不是很到位)。

android的原生实现和混合HTML5开发有什么不同、即时通讯在后台如何保证通信的顺序、sqlite的三种用法(啊?HR说是缓存存储、内存存储和缓存内存结合?啊?)、如果开发一款唱吧这样的APP如何保证不同的手机收录到的声音音质是差不多的(比如两个品牌的手机在同一个位置录音一台录的声音比较大另一台比较小,那怎么保证两台得到的音频数据能够相近呢?)


1.问了关于string ,stringbuilder,stringbuffer区别。 
2.问了一下四种引用,记反了软引用和弱引用,还是太长时间没有关注这些基础,只过于关注那么多比较显逼格的东西了。 
3.集合相关 
4.然后就是切入到了Android,说fragment,该怎么用,比如实现类似微信的那种滑动,讲了一下fragment的滑动以及底部状态的切换。之后又问了怎么保存view的数据,当时以为就是回调生命周期的方法时保存数据,面试官就给我讲了一下现在常用了的将顶层的view作为变量然后传递引用,之后切换回来的时候直接在oncreateview里面进行判断即可。还是实践经历太少,懂的东西不多啊 
5.然后好像让写了一个单例模式,写的时候有点紧张,好几处犯了点错,写完了也讨论了一些单例模式的写法。 
6.然后就是算法,剑指offer上面的一道题,旋转有序的数组,找出最大的那个数。但是太长时间没看,不太记得了...尴尬 
7.之后两个栈实现队列。也是剑指offer的原题 
8.泛型,没用过,不怎么了解。


基础无外乎几部分:语言(C/C++或java),操作系统,TCP/IP,数据结构与算法,再加上你所熟悉的领域。这里面其实有很多东西,各大面试宝典都有列举。

在这只列举了Android客户端所需要的和我面试中所遇到的知识点,尽量做到全面,如果你掌握了以下知识点,去面android客户端应该得心应手。

J2SE基础

1.九种基本数据类型的大小,以及他们的封装类。

2.Switch能否用string做参数?

3.equals与==的区别。

4.Object有哪些公用方法?

5.Java的四种引用,强弱软虚,用到的场景。

6.Hashcode的作用。

7.ArrayList、LinkedList、Vector的区别。

8.String、StringBuffer与StringBuilder的区别。

9.Map、Set、List、Queue、Stack的特点与用法。

10.HashMap和HashTable的区别。

11.HashMap和ConcurrentHashMap的区别,HashMap的底层源码。

12.TreeMap、HashMap、LindedHashMap的区别。

13.Collection包结构,与Collections的区别。

14.try catch finally,try里有return,finally还执行么?

15.Excption与Error包结构。OOM你遇到过哪些情况,SOF你遇到过哪些情况。

16.Java面向对象的三个特征与含义。

17.Override和Overload的含义去区别。

18.Interface与abstract类的区别。

19.Static class 与non static class的区别。

20.java多态的实现原理。

21.实现多线程的两种方法:Thread与Runable。

22.线程同步的方法:sychronized、lock、reentrantLock等。

23.锁的等级:方法锁、对象锁、类锁。

24.写出生产者消费者模式。

25.ThreadLocal的设计理念与作用。

26.ThreadPool用法与优势。

27.Concurrent包里的其他东西:ArrayBlockingQueue、CountDownLatch等等。

28.wait()和sleep()的区别。

29.foreach与正常for循环效率对比。

30.Java IO与NIO。

31.反射的作用于原理。

32.泛型常用特点,List能否转为List

33.解析XML的几种方式的原理与特点:DOM、SAX、PULL。

34.Java与C++对比。

35.Java1.7与1.8新特性。

36.设计模式:单例、工厂、适配器、责任链、观察者等等。

37.JNI的使用。

Java里有很多很杂的东西,有时候需要你阅读源码,大多数可能书里面讲的不是太清楚,需要你在网上寻找答案。

推荐书籍:《java核心技术卷I》《Thinking in java》《java并发编程》《effictive java》《大话设计模式》

JVM

1.内存模型以及分区,需要详细到每个区放什么。

2.堆里面的分区:Eden,survival from to,老年代,各自的特点。

3.对象创建方法,对象的内存分配,对象的访问定位。

4.GC的两种判定方法:引用计数与引用链。

5.GC的三种收集方法:标记清除、标记整理、复制算法的原理与特点,分别用在什么地方,如果让你优化收集方法,有什么思路?

6.GC收集器有哪些?CMS收集器与G1收集器的特点。

7.Minor GC与Full GC分别在什么时候发生?

8.几种常用的内存调试工具:jmap、jstack、jconsole。

9.类加载的五个过程:加载、验证、准备、解析、初始化。

10.双亲委派模型:Bootstrap ClassLoader、Extension ClassLoader、ApplicationClassLoader。

11.分派:静态分派与动态分派。

JVM过去过来就问了这么些问题,没怎么变,内存模型和GC算法这块问得比较多,可以在网上多找几篇博客来看看。

推荐书籍:《深入理解java虚拟机》

操作系统

1.进程和线程的区别。

2.死锁的必要条件,怎么处理死锁。

3.Window内存管理方式:段存储,页存储,段页存储。

4.进程的几种状态。

5.IPC几种通信方式。

6.什么是虚拟内存。

7.虚拟地址、逻辑地址、线性地址、物理地址的区别。

因为是做android的这一块问得比较少一点,还有可能上我简历上没有写操作系统的原因。

推荐书籍:《深入理解现代操作系统》

TCP/IP

1.OSI与TCP/IP各层的结构与功能,都有哪些协议。

2.TCP与UDP的区别。

3.TCP报文结构。

4.TCP的三次握手与四次挥手过程,各个状态名称与含义,TIMEWAIT的作用。

5.TCP拥塞控制。

6.TCP滑动窗口与回退N针协议。

7.Http的报文结构。

8.Http的状态码含义。

9.Http request的几种类型。

10.Http1.1和Http1.0的区别

11.Http怎么处理长连接。

12.Cookie与Session的作用于原理。

13.电脑上访问一个网页,整个过程是怎么样的:DNS、HTTP、TCP、OSPF、IP、ARP。

14.Ping的整个过程。ICMP报文是什么。

15.C/S模式下使用socket通信,几个关键函数。

16.IP地址分类。

17.路由器与交换机区别。

网络其实大体分为两块,一个TCP协议,一个HTTP协议,只要把这两块以及相关协议搞清楚,一般问题不大。

推荐书籍:《TCP/IP协议族》

数据结构与算法

1.链表与数组。

2.队列和栈,出栈与入栈。

3.链表的删除、插入、反向。

4.字符串操作。

5.Hash表的hash函数,冲突解决方法有哪些。

6.各种排序:冒泡、选择、插入、希尔、归并、快排、堆排、桶排、基数的原理、平均时间复杂度、最坏时间复杂度、空间复杂度、是否稳定。

7.快排的partition函数与归并的Merge函数。

8.对冒泡与快排的改进。

9.二分查找,与变种二分查找。

10.二叉树、B+树、AVL树、红黑树、哈夫曼树。

11.二叉树的前中后续遍历:递归与非递归写法,层序遍历算法。

12.图的BFS与DFS算法,最小生成树prim算法与最短路径Dijkstra算法。

13.KMP算法。

14.排列组合问题。

15.动态规划、贪心算法、分治算法。(一般不会问到)

16.大数据处理:类似10亿条数据找出最大的1000个数.........等等

算法的话其实是个重点,因为最后都是要你写代码,所以算法还是需要花不少时间准备,这里有太多算法题,写不全,我的建议是没事多在OJ上刷刷题(牛客网、leetcode等),剑指offer上的算法要能理解并自己写出来,编程之美也推荐看一看。

推荐书籍:《大话数据结构》《剑指offer》《编程之美》

Android

1.Activity与Fragment的生命周期。

2.Acitivty的四中启动模式与特点。

3.Activity缓存方法。

4.Service的生命周期,两种启动方法,有什么区别。

5.怎么保证service不被杀死。

6.广播的两种注册方法,有什么区别。

7.Intent的使用方法,可以传递哪些数据类型。

8.ContentProvider使用方法。

9.Thread、AsycTask、IntentService的使用场景与特点。

10.五种布局:FrameLayoutLinearLayoutAbsoluteLayoutRelativeLayoutTableLayout各自特点及绘制效率对比。

11.Android的数据存储形式。

12.Sqlite的基本操作。

13.Android中的MVC模式。

14.Merge、ViewStub的作用。

15.Json有什么优劣势。

16.动画有哪两类,各有什么特点?

17.Handler、Loop消息队列模型,各部分的作用。

18.怎样退出终止App。

19.Asset目录与res目录的区别。

20.Android怎么加速启动Activity。

21.Android内存优化方法:ListView优化,及时关闭资源,图片缓存等等。

22.Android中弱引用与软引用的应用场景。

23.Bitmap的四中属性,与每种属性队形的大小。

24.View与View Group分类。自定义View过程:onMeasure()、onLayout()、onDraw()。

25.Touch事件分发机制。

26.Android长连接,怎么处理心跳机制。

27.Zygote的启动过程。

28.Android IPC:Binder原理。

29.你用过什么框架,是否看过源码,是否知道底层原理。

30.Android5.0、6.0新特性。

Android的话,多是一些项目中的实践,使用多了,自然就知道了,还有就是多逛逛一些名人的博客,书上能讲到的东西不多。另外android底层的东西,有时间的话可以多了解一下,加分项。

推荐书籍:《疯狂android讲义》《深入理解android》

其他综合性的书籍也需要阅读,推荐:《程序员面试笔试宝典》《程序员面试金典》。另外“牛客网www.newcoder.com”是个好地方,里面有各种面试笔试题,也有自己在线的OJ,强烈推荐,还有左程云老师的算法视屏课(已经出书了),反正我看了之后对我帮助很大(这不是植入广告)。


  J2SE基础
       1.泛型相关知识,比如能否List = new ArrayList; 或者 List< String > = new ArrayList< Object >;为什么可以或者不可以。
       2. ConcurrentHashMap 和HashTable的区别。
       3.引用类型
       对于java来说,一定要能灵活运用设计模式,不说每个,至少常用的一定要能写。
       操作系统
       1.为什么内存快,外存慢。(腾讯二面问题)
       TCP/IP
       酷壳有两篇文章,总结的非常好。
        Android(我偏向framework,下面主要补充系统问题)
       1.进程有哪些通信方式
       2.ListView优化方案
       3.service和线程的关系
       4.looper是线程级别还是进程级别
       5.activity1启动activity2的过程,是否可以在新的进程里面,如果在新的进程里面 流程 有什么不同。启动按返回系统的调度。
       6.广播的注册方式,信息是保存在哪里,发送广播是如何回调广播接收者。
       7.app安装过程,每次开机是否会重新安装所有的app
       8.Android系统为系统安全性做什么事情
       9.zygote和systemservice的关系
       10.为什么zygote死掉后会重新启动
       11.界面的绘制过程
       12.开机画面有几个,分别是什么时候显示和暂停


三、项目

关于项目,这部分每个人的所做的项目不同,所以不能具体的讲。项目不再与好与不好,在于你会不会包装,有时候一个很low的项目也能包装成比较高大上的项目,多用一些专业名词,突出关键字,能使面试官能比较容易抓住重点。在聊项目的过程中,其实你的整个介绍应该是有一个大体的逻辑,这个时候是在考验你的表达与叙述能力,所以好好准备很重要。

面试官喜欢问的问题无非就几个点:

1.XXX(某个比较重要的点)是怎么实现的?

2.你在项目中遇到的最大的困难是什么,怎么解决的?

3.项目某个部分考虑的不够全面,如果XXXX,你怎么优化?

4.XXX(一个新功能)需要实现,你有什么思路?

其实你应该能够预料到面试官要问的地方,请提前准备好,如果被问到没有准备到的地方,也不要紧张,一定要说出自己的想法,对不对都不是关键,主要是有自己的想法,另外,你应该对你的项目整体框架和你做的部分足够熟悉。

四、其他

你应该问的问题

面试里,最后面完之后一般面试官都会问你,你有没有什么要问他的。其实这个问题是有考究的,问好了其实是有加分的,一般不要问薪资,主要应该是:关于公司的、技术和自身成长的。

以下是我常问的几个问题,如果需要可以参考:

1.贵公司一向以XXX著称,能不能说明一下公司这方面的特点?

2.贵公司XXX业务发展很好,这是公司发展的重点么?

3.对技术和业务怎么看?

4.贵公司一般的团队是多大,几个人负责一个产品或者业务?

5.贵公司的开发中是否会使用到一些最新技术?

6.对新人有没有什么培训,会不会安排导师?

7.对Full Stack怎么看?

8.你觉得我有哪些需要提高的地方?


1、有没有上线的app项目  
2、activity四种启动模式
3、有没有使用过Android的开源库,或者开源控件

1、java基础知识(时间太久,记不清具体问题)
2、Android基础问题(同上)
3、启动一个应用的流程
4、单例模式需要注意的地方
5、怎么让一个service不死掉,一直运行
        内推二面,现场面(总共一个小时)
1、一进去首先就拿了一个化简字符串的题目让我写出化简结果,类似于或和非的两个操作
2、写完,问如果让我设计一个结构来存储这个结构,怎么做
3、让我用算法来实习这个化简你怎么实现,说下思路
4、然后开始问项目,说你们的系统和Android有什么区别(实习内容可以理解为深度定制的Android)
5、说一下打开一个activity的过程,
6.、平时学习是通过什么途径
7、后来考了个算法,要写代码        
8、详细询问平时工作的内容
9、让我设计一个Android的下载模块

1、你学的最好的科目是什么?答数据结构
2、你用过你学的数据结构吗?说一个你觉得你用的最好的最经典的例子        
3、bindle底层怎么实现的
4、对Android虚拟机了解吗?说下你知道的。

之后就是Android相关的问题,问到了Handler机制,Binder机制,Binder机制讲的比较浅。讲了四个主要的组成部分,然后将这张图画出来,讲了讲之间的使用关系,也没有深入到相应的C层进行分析(关键是自己看不懂C层),面试官的评价应该是还可以。以后如果问到,大家不是很精通这套机制的也可以照着这个说一遍(不同的面试官不一样)。
           

其他的一些问题记不太清了,感觉就是比较基础的,学好Android基础之后应该就没什么问题了。
最后就是考察手写代码的能力了,这次比较幸运,说的两道题都比教简单(都是剑指Offer的原题),
第一题就是在O(1)的时间内删除一个节点,这个主要思想就是如果该结点不是尾结点,那么就只需要将后一个结点的值拷贝过来,删除后一个结点即可,如果为尾结点还是只能顺序查找的情况,当然还要考虑只有一个结点的情况。
第二道题是求最大子数组的和,思想剑指Offer上面说的很清楚了,所以这里就简单的提一下。curSum小于0的时候,就只需要将curSum赋值为array[i]即可,否则加上array[i]。这道题也不是很难。


CVTE

一面:

1.       自我介绍

2.       项目点为什么要用view不用fragment?同样fragment可以解决缓存(用了view,并且设了map作为缓存,为了模拟activity栈重制了新的栈来实现相同的回退功能,需要处理连续点击和多次点击的问题,还需要解决连续点view,缓存增大而oom

3.       用了什么设计模式?为什么要这么用?(举例了观察者+工厂)

4.       谈一下Collection包:hashmap底层实现,用了什么方法解决hash冲突(基于jdk版本),具体是如何实现(jdk1.5链表头插还是尾插),为什么不安全?如何变得安全(concurrent包下集合类),concurrentHashmap实现原理是?

5.       Executor框架说说你的理解?

6.       结束一条Thread有什么方法?interrupt底层实现有看过吗?线程的状态是怎么样的?如果给你实现会怎么样做?

7.       Ionio有没有了解?

8.       现在需要在四大组件中传数据?如何传,方法有哪些(需要自己再具体说什么情况)?

9.       缓存算法除了lru还认识哪种?

10.   Java中有内存泄露吗?是怎么样的情景?为什么不用循环计数?

11.   ANR产生原因?怎么定位?

12.   ContextImpl的源码使用的设计模式?为什么你认为其中有外观?

13.   评价一下我的表现?有什么技术点需要补充?

二面:

1.       上次一面的时间是什么时候了?(半个月前)

2.       做的最深的项目?解决了什么问题?

3.       情景题,在一个app中,只有在一张activity,所有功能业务逻辑在里面实现,现在报ANR,你会怎么做?(代码层面:耗时操作(UI、网络、数据库),工具层面:tracecrashHandle

4.       不停在new一个很大数组,初始化它,然后又把referencenull,这样子手机会不会卡?(这个问题还没很深研究,当时答了内存抖动+stop the world

5.       Jvm 自动内存管理、如何实现对象的自我救赎?

6.       Android系统启动流程?

7.       有没有看过业界APK反编译源码?

8.       平时看什么书?

9.       评价一下我,技术团队有用到什么开源框架?有没有自己放出开源?

三面HR

1.       有点起了我老底的味道,我还以为是来查水表。

 

        

四面(现场,这是唯一一次有3个面试官来面,其中一个是一面的面试官):

1.       描述项目,当时是用了什么架构?还认识哪些架构?如何改造?

2.       当时为什么要用Observer

3.       obverseruml类图+代码实现,原生jdk中观察者模式有哪些缺陷?

4.       还有用了哪些设计模式?(工厂)

5.       有见过其他的设计模式吗?(当时说了一个责任链和重说一面的contextimple

6.       实现一个链表的插入(4分钟计时)

7.       判断链表有环

8.       单例模式DCLviolate起什么作用?为什么要sync .class而不是this?(3分钟计时)

 

 

网易杭研:

一面:

1.       自我介绍

2.       AndroidClassLoaderjava中有什么关系和区别?

3.       熟不熟jvm,说一下Jvm的自动内存管理?

4.       语言基础,String类可以被继承吗?为什么?

5.       Final能修饰什么?(当时我说classfieldmethod,他说还有吗?然后又叫我不要在意,后来回想起,应该是问到我在参数里面要不要用final,接下来是因为匿名内部类)

6.       Java中有内存泄露吗?(先说本质,再结合handler+匿名内部类)当时如何分析的?

7.       描述下Aidl?觉得aidl有什么缺陷(这里在这个问题上回答有欠缺)

8.       评价一下我,如果顺利进网易,需要往技术栈加什么点尽快投入业务?

二面:

1.       用过什么开源,举一个例子?(volley

2.       Activity生命周期?情景:现在在一张act1点了新的act2,周期如何?

3.       ActlaunchMode,有没有结合项目用过(自己的程序锁和微信的PC端登陆对比,不过我现在又发现,应该大约估计可能是动态加载的一个缺陷,如果有找到相关信息,请务必跟我说。具体问题就是,当在PC端登录时,Android终端的微信会跳出,即使wechattask不是在fore,当按下确认,返回的是wechat,而不是自己先前的app

4.       View的绘制原理,有没有用canvas自己画过ui

5.       以后想做Android什么方向?(中间件+SDK

6.       怎么看待前端和后端?

7.       如果学前端会如何学?

8.       优缺点?兴趣?

9.       想不想来杭州?

10.   评价一下我?往技术栈加什么?

三面HR:常规问题(10分钟,这个男hr是最爽快的)

1.  为什么想来网易?

2.  有投其他公司吗?

3.  网易最吸引你的是什么?

4.  想来杭州吗?

5.  评价一下我?

        

 

 

腾讯(被挂)

一面:

1.       自我介绍

2.       项目描述

3.       如何保证资金流安全?(这里没答好,直接把我挂了,先前并没有考虑过这个问题,面了这么多次也没有被问这个点,导致雪崩)

4.       Oom是如何解决?

5.       除了软引用还知道什么引用?

6.       Jvm自动内存管理(什么时候触发gc)?

7.       有什么要补充:(跟他讲了动态加载还有一个底层源码)

8.       根据面试过程,有什么建议给我?(我当时就觉得很有可能就挂了,所以就问建议)

 

二面(一面之后当晚我查到被挂,心态没有调整好,但是2天后又把我复活了,然后又挂了):

1.  自我介绍

2.  你是怎么准备面试的?

3.  做过什么项目?项目思路是?

4.  平时有什么兴趣?

5.  自己写的工具类和uil相比,如何?

6.  后续就是讲了他自己对移动端发展的看法,受教很多。

7.  现在有个机会可以对刚毕业的自己说些话,你会跟他说什么?

 

 

腾讯SNG:

一面:

1.       自我介绍

2.       动态加载主要问题

3.       插件化

4.       Assetmanager获取资源原理和资源获取原理

5.       项目Oom异常解决方案+用户体验优化方案

6.       Touch传递机制+listview滑动冲突

7.       Volley底层实现

8.       为什么不能用volley请求大数据

9.       后续流程如何走?

 

二面:

1.       自我介绍

2.       android学习时间

3.       为什么不考研

4.       Smali语句学习情况+反编译

5.       如何捕获插屏广告?如果广告是嵌入在应用主流程内如何处理(只讲了如何捕获launch下的activity,嵌套在主流程逻辑内的想不到,问了提示也没回答)

6.       Jvm的自动内存管理

7.       Jvm中软、虚引用的区别

8.       Java nio的认识

9.       Tcp三次握手,tcpudp的区别

10.   Volley底层实现+设计模式理解

11.   Imageloader缓存策略

12.   后续流程如何走?

13.   sng目前在android端遇到什么问题?(他回答是机型适配问题)

14.   对我的建议是?

 

HR面:

1.       之前参加校招吗?

2.       这个月又如何准备?

3.       谈谈优势?

4.       腾讯哪里吸引你?

5.       以后会在什么部门?是不是一二面面试官带我?

 

 

 

 

 

唯品会:

一面:

1.       项目如何解决oom?响应速度是怎么优化?电量消耗如何优化?

2.       描述一下Aidlandroid ipc?(binder机制没跟他讲得很深)

3.       屏幕适配使用的方案?有没有辅助的工具帮助?(hyviewer

4.       如何分析内存泄露?(代码+工具traceview+mat

5.       ANR呢?(我忘记了trace

6.       View树绘制?如何优化布局?

7.       事件传递原理?

8.       uil的框架如何设计?有没有用过glide?(结合了fresco的分析)

9.       Volleyokhttp底层实现(也讲了okio),为什么说okhttp高效?

10.   Listview的优化(同一布局,左为bm,右为text)?

11.   Apk瘦身可以关注什么点?(这里忘记了说so库,然而他也不会)

12.   评价一下我

 

二面:

1.       这里的项目的描述的xml,你项目不是native的?

2.       有没有接触hybridwebapp?怎么看待?

3.       有用到什么设计模式吗?开源框架呢?

4.       HotFixXposed的一些小应用(没有深入,只是讲了动态加载原理和需要解决的问题,也说了dynamicloadApkmulti分包还有Xposed中的hook

5.       以后想如何发展?

6.       唯品会会如何培养新人?是不是由你带我?目前唯品会用到什么技术点跟我技术栈相关?

 

三面HR50+年纪面试官,素质差,不尊重面试者,具体可以搜知乎):

1.       对公司的看法?

2.       为什么主页不设搜索栏?

 

 

 

 

 

百度:

一面:

1.  自我介绍

2.  讲一下动态加载技术点?

3.  对目前移动圈的看法?

4.  android的开始时间?

5.  适配优化屏幕适配接触到什么方法?

6.  Binder机制(只深入到framework

7.  View树绘制+事件分发

8.  海量字符串(他给我的样例如下:ABCDE,ACD,BCDF,EF),如何插入数据库使冗余度最低?Trie+不知道什么遍历,第一次见,数据库存的是3个字段,字母,该字母第一次遍历的序号,该字母第二次遍历的序号。可以做到时间复杂度ON),至今都没想出来……如果有人看过类似的题请务必告诉我。)

二面:

1.       不用除号实现除法(一开始需要考虑小数,后来面试官说降低难度先整数,然后优化大数的情况,确认了两次思路)

2.       Contextimpl源码,几种context的区别

3.       如何实现通讯?Binder机制(我只将了aidlframework层面,面试官把/dev/binder也讲了,受教,被人教做大人,后来吹比发现他是做C驱动开发)

4.       一个数组,找出只重复一次的元素,并且返回下标是最小的。时间复杂度要求ON+O1)(一开始只想到了ON+ON),后来问了提示,可以实现到ON+O1),但是空间复杂度上去了,然后他给出最优解)。

 

三面:

1.       高校教育和培训班看法?

2.       C++java的区别?后来我转到面向过程和面向对象,结合uil

3.       Ios有接触过吗?学习成本问题吗?

4.       Android项目简单描述非技术角度?(动态加载)动态加载的优点,面向开发者和面向用户角度?其中我答到了65535方法会爆,然后他说小伙子太年轻,naive

5.       以后有什么规划?

6.       高级工程师所需责任?

7.       了解android什么新技术?(hybrid,这里答得不好,应该往移动端统一角度来答)

8.       N根绳子,质量不均匀,并且燃烧速度不均,但是每一条烧1h,现在需要测量出1H+15min。(cracking改题)

9.       优缺点

10.   兴趣

11.   最后给我看了一下他对65535方法数的研究,我也是醉了。

12.   个人点评?负责哪个部门?是不是以后你带我?

13.   百度200亿O2O你觉得前景如何?会对你带的部门产品线有什么影响?

14.   如何看待今年互联网的资本寒冬?

 

 

蘑菇街:

一面:

1  自我介绍

2  在项目中为什么要用动态加载?最大的问题是什么?怎么解决资源管理问题(这里我一直以为AssetManager是服务,然后又被面试官教做大人,简单来说就是装逼然后失败了)

3  Binder机制说一下(由applicationframeworkkernel基本讲了一下要点,但是电面实在是很影响表述没有画图,他最后也听得很蛋疼)

4  Android源码看了多少G?说一下(举了contextimpl

5  屏幕适配接触到什么方法?

6  java内存泄露是怎么样的?(本质+handler例子)

7  Handler机制?

8  情景题,把handlerstatic,里面需要对一个view更新,会不会内存泄露?(可达性分析)

9  UI接触得多吗?有没有用过canvas画过图?

10.   事件分发?如果有一个interr,会……(这里我听不是很清楚,电话信号,然后我就把整个事件分发原理说了一下,然后他说我讲错,我也是醉)

11. 个人评价?会不会有下一面?(问这个因为觉得装逼失败,非常有可能被刷,他告诉我可能一周后,结果二面就马上国庆1号面)

 

二面:

1.       自我介绍

2.       android多久?

3.       怎么学习?

4.       项目里面遇到什么难题,选一个讲一下?(动态加载,还有一面被教人教做大人的过程)

5.       平时有什么兴趣?

6.       Volley底层实现?(okhttp没问)

7.       自己写的图片加载工具类谈一下?(结合uil谈了一下)

8.       有没有了解新技术?了解到哪些?讲一下?(hybrid+react+个人看法)

9.       动态加载还遇到什么困难?(结合了dexposed 其他一些热补丁聊了一下)

10.   个人点评

11.   蘑菇街目前android团队架构

12.   目前有哪些android技术难题所遇到过?

13.   目前用了哪些开源?我还需要接触哪些?(hotpatch + xposed,个人认为主要还是受手淘影响,估计内部框架也是比较类似)

14.   怎么培训新人,以后是不是你来带我?

 

三面:(个人感觉是真的专业HR

1.       自己介绍面向非技术

2.       谈一下优缺点,为什么有这个优点?如何体现?

3.       为什么想来蘑菇街?

4.       目前手头有多少offer?薪资?

5.       蘑菇街跟百度网易对比最吸引你?地点杭州有没有问题?

6.       蘑菇街offer会不会调岗?

7.       怎么带新人?mentor制?

 

 

 

 

 

 

 

 

应对策略:

         非技术准备:

1广度容易量化,深度难以量化;广度:写过爬虫之类,项目里面有用到某个技术;深度,针对面试官或者公司整体来进行评估难以量化。如熟悉TCP/IP协议簇熟悉JVM”,“熟悉”一词难以针对各公司统一衡量,有的是GC算法的原理,有的公司却需要手写GC算法的伪代码实现

2、本科生和研究生,要求一样;没有优劣势。

3、电话面试有一定的影响,一是普通话流利清晰程度,第二就是不能画图说明。

         4、技术(Android研发)角度和自身经历,技术难度:明星创业公司>BAT+360>一线互联网>=一线工业公司>创业公司(没有面过华为中兴和国企)。

         5、内推,不等于走后门,不会降低要求,只是公司提前抢人。(公司内高级别的员工内推就除外,学院也有这个资源)。

         6笔试分数是淘汰工具,面基础水平还有面试官的评价,才是择优,对后面的面试影响会比较大

         7、分配好体力和精力,坚持锻炼

         8校园学生组织经历不重要(面向技术)

 

         技术准备:

1CS基础:网络,操作系统,数据库,编译原理,C/C++

2、算法和数据结构,需要刷题

3、语言基础(擅长的语言的特性,例如javaio,并发,集合);

4Android机制体系(其他研发类岗位我觉得也是相同);

5、竞赛准备(算法比赛里的奖牌,ACMTopcoder ,蓝桥杯,阿里天池,编程之美,还有几个算法网站的排名,leetcode)和实习经历(一线公司实习经验)



J2EE 部分:

1.Switch能否用string做参数?

在 Java 7 之前, switch 只能支持 byte 、 short 、 char 、 int 或者其对应的封装类以及 Enum 类型。在 Java 7 中, String 支持被加上了。

2. equals与==的区别:

==是判断两个变量或实例是不是指向同一个内存空间 equals是判断两个变量或实例所指向的内存空间的值是不是相同

3. Object有哪些公用方法?

  • 方法equals测试的是两个对象是否相等
  • 方法clone进行对象拷贝
  • 方法getClass返回和当前对象相关的Class对象
  • 方法notify,notifyall,wait都是用来对给定对象进行线程同步的

5. 实际开发中软引用或者弱引用的使用场景:

利用软引用和弱引用解决OOM问题:用一个HashMap来保存图片的路径和相应图片对象关联的软引用之间的映射关系,在内存不足时,JVM会自动回收这些缓存图片对象所占用的空间,从而有效地避免了OOM的问题 通过软可及对象重获方法实现Java对象的高速缓存:比如我们创建了一Employee的类,如果每次需要查询一个雇员的信息。哪怕是几秒中之前刚刚查询过的,都要重新构建一个实例,这是需要消耗很多时间的。我们可以通过软引用和 HashMap 的结合,先是保存引用方面:以软引用的方式对一个Employee对象的实例进行引用并保存该引用到HashMap 上,key 为此雇员的 id,value为这个对象的软引用,另一方面是取出引用,缓存中是否有该Employee实例的软引用,如果有,从软引用中取得。如果没有软引用,或者从软引用中得到的实例是null,重新构建一个实例,并保存对这个新建实例的软引用

6. Hashcode的作用,与 equal 有什么区别

同样用于鉴定2个对象是否相等的,java集合中有 list 和 set 两类,其中 set不允许元素重复实现,那个这个不允许重复实现的方法,如果用 equal 去比较的话,如果存在1000个元素,你 new 一个新的元素出来,需要去调用1000次 equal 去逐个和他们比较是否是同一个对象,这样会大大降低效率。hashcode实际上是返回对象的存储地址,如果这个位置上没有元素,就把元素直接存储在上面,如果这个位置上已经存在元素,这个时候才去调用equal方法与新元素进行比较,相同的话就不存了,散列到其他地址上

7. String、StringBuffer与StringBuilder的区别

String 类型和 StringBuffer 类型的主要性能区别其实在于 String 是不可变的对象 StringBuffer和StringBuilder底层是 char[]数组实现的 StringBuffer是线程安全的,而StringBuilder是线程不安全的

8. Override和Overload的含义去区别

Overload顾名思义是重新加载,它可以表现类的多态性,可以是函数里面可以有相同的函数名但是参数名、返回值、类型不能相同;或者说可以改变参数、类型、返回值但是函数名字依然不变。 Override顾名思义就是ride(重写)的意思,在子类继承父类的时候子类中可以定义某方法与其父类有相同的名称和参数,当子类在调用这一函数时自动调用子类的方法,而父类相当于被覆盖(重写)了。

9. 抽象类和接口的区别

一个类只能继承单个类,但是可以实现多个接口 接口强调特定功能的实现,而抽象类强调所属关系 抽象类中的所有方法并不一定要是抽象的,你可以选择在抽象类中实现一些基本的方法。而接口要求所有的方法都必须是抽象的

10.解析XML的几种方式的原理与特点:DOM、SAX、PULL

  • DOM:消耗内存:先把xml文档都读到内存中,然后再用DOM API来访问树形结构,并获取数据。这个写起来很简单,但是很消耗内存。要是数据过大,手机不够牛逼,可能手机直接死机
  • SAX:解析效率高,占用内存少,基于事件驱动的:更加简单地说就是对文档进行顺序扫描,当扫描到文档(document)开始与结束、元素(element)开始与结束、文档(document)结束等地方时通知事件处理函数,由事件处理函数做相应动作,然后继续同样的扫描,直至文档结束。
  • SAX:与 SAX 类似,也是基于事件驱动,我们可以调用它的next()方法,来获取下一个解析事件(就是开始文档,结束文档,开始标签,结束标签),当处于某个元素时可以调用XmlPullParser的getAttributte()方法来获取属性的值,也可调用它的nextText()获取本节点的值。

    11.wait()和sleep()的区别

  • sleep来自Thread类,和wait来自Object类
  • 调用sleep()方法的过程中,线程不会释放对象锁。而 调用 wait 方法线程会释放对象锁
  • sleep睡眠后不出让系统资源,wait让出系统资源其他线程可以占用CPU
  • sleep(milliseconds)需要指定一个睡眠时间,时间一到会自动唤醒

13.JAVA多态的实现原理

抽象的来讲,多态的意思就是同一消息可以根据发送对象的不同而采用多种不同的行为方式。(发送消息就是函数调用) 实现的原理是动态绑定,程序调用的方法在运行期才动态绑定,追溯源码可以发现,JVM 通过参数的自动转型来找到合适的办法。

14.JAVA 垃圾回收与内存分配策略

14.1 垃圾回收是什么?

就是释放那些不再持有引用的对象的内存

14.2怎么判断一个对象是否需要收集?

  • 引用计数(最简单古老的方法):指将资源(可以是对象、内存或磁盘空间等等)的被引用次数保存起来,当被引用次数变为零时就将其释放的过程
    • 对象引用遍历(现在大多数 jvm 使用的方法):对象引用遍历从一组对象开始,沿着整个对象图上的每条链接,递归确定可到达(reachable)的对象。如果某对象不能从这些根对象的一个(至少一个)到达,则将它作为垃圾收集
    • 引用计数缺陷:引用计数无法解决循环引用问题:假设对象A,B都已经被实例化,让A=B,B=A,除此之外这两个对象再无任何引用,此时计数器的值就永远不可能为0,但是引用计数器无法通知gc回收他们

14.3 Java的四种引用的区别

  • 强引用:如果一个对象具有强引用,它就不会被垃圾回收器回收。即使当前内存空间不足,JVM 也不会回收它,而是抛出 OutOfMemoryError 错误,使程序异常终止。如果想中断强引用和某个对象之间的关联,可以显式地将引用赋值为null,这样一来的话,JVM在合适的时间就会回收该对象
  • 软引用:在使用软引用时,如果内存的空间足够,软引用就能继续被使用,而不会被垃圾回收器回收,只有在内存不足时,软引用才会被垃圾回收器回收。
  • 弱引用:具有弱引用的对象拥有的生命周期更短暂。因为当 JVM 进行垃圾回收,一旦发现弱引用对象,无论当前内存空间是否充足,都会将弱引用回收。不过由于垃圾回收器是一个优先级较低的线程,所以并不一定能迅速发现弱引用对象
  • 虚引用:顾名思义,就是形同虚设,如果一个对象仅持有虚引用,那么它相当于没有引用,在任何时候都可能被垃圾回收器回收。

14.4 介绍垃圾回收机制

  • 标记回收法:遍历对象图并且记录可到达的对象,以便删除不可到达的对象,一般使用单线程工作并且可能产生内存碎片
  • 标记-压缩回收法:前期与第一种方法相同,只是多了一步,将所有的存活对象压缩到内存的一端,这样内存碎片就可以合成一大块可再利用的内存区域,提高了内存利用率
  • 复制回收法:把现有内存空间分成两部分,gc运行时,它把可到达对象复制到另一半空间,再清空正在使用的空间的全部对象。这种方法适用于短生存期的对象,持续复制长生存期的对象则导致效率降低。
  • 分代回收发:把内存空间分为两个或者多个域,如年轻代和老年代,年轻代的特点是对象会很快被回收,因此在年轻代使用效率比较高的算法。当一个对象经过几次回收后依然存活,对象就会被放入称为老年的内存空间,老年代则采取标记-压缩算法

14.5 JAVA 中堆和栈的区别

  • 基本数据类型比变量和对象的引用都是在栈分配的
  • 堆内存用来存放由new创建的对象和数组
  • 类变量(static修饰的变量),程序在一加载的时候就在堆中为类变量分配内存,堆中的内存地址存放在栈中
  • 实例变量:当你使用java关键字new的时候,系统在堆中开辟并不一定是连续的空间分配给变量,是根据零散的堆内存地址,通过哈希算法换算为一长串数字以表征这个变量在堆中的"物理位置”,实例变量的生命周期--当实例变量的引用丢失后,将被GC(垃圾回收器)列入可回收“名单”中,但并不是马上就释放堆中内存
  • 局部变量: 由声明在某方法,或某代码段里(比如for循环),执行到它的时候在栈中开辟内存,当局部变量一但脱离作用域,内存立即释放

15. Java 集合系列问题

15.1 ArrayList、LinkedList、Vector的区别

  • ArrayList 和Vector底层是采用数组方式存储数据,Vector由于使用了synchronized方法(线程安全)所以性能上比ArrayList要差
  • LinkedList使用双向链表实现存储,随机存取比较慢
  • HashMap的底层源码实现:当我们往HashMap中put元素的时候,先根据key的hashCode重新计算hash值,根据hash值得到这个元素在数组中的位置(即下标),如果数组该位置上已经存放有其他元素了,那么在这个位置上的元素将以链表的形式存放,新加入的放在链头,最先加入的放在链尾。如果数组该位置上没有元素,就直接将该元素放到此数组中的该位置上。
  • Fail-Fast机制:在使用迭代器的过程中有其他线程修改了map,那么将抛出ConcurrentModificationException,这就是所谓fail-fast机制。这一机制在源码中的实现是通过modCount域,modCount顾名思义就是修改次数,对HashMap内容的修改都将增加这个值,那么在迭代器初始化过程中会将这个值赋给迭代器的expectedModCount。在迭代过程中,判断modCount跟expectedModCount是否相等,如果不相等就表示已经有其他线程修改了Map

    15.2 HashMap和 HashTable 的区别

    HashTable比较老,是基于Dictionary 类实现的,HashTable 则是基于 Map接口实现的 HashTable 是线程安全的, HashMap 则是线程不安全的 HashMap可以让你将空值作为一个表的条目的key或value

17.什么事反射,在哪里需要用到?

18. 什么是线程池,线程池的作用是什么

答:线程池的基本思想还是一种对象池的思想,开辟一块内存空间,里面存放了众多(未死亡)的线程,池中线程执行调度由池管理器来处理。当有线程任务时,从池中取一个,执行完成后线程对象归池,这样可以避免反复创建线程对象所带来的性能开销,节省了系统的资源。就好比原来去食堂打饭是每个人看谁抢的赢,谁先抢到谁先吃,有了线程吃之后,就是排好队形,今天我跟你关系好,你先来吃饭。比如:一个应用要和网络打交道,有很多步骤需要访问网络,为了不阻塞主线程,每个步骤都创建个线程,在线程中和网络交互,用线程池就变的简单,线程池是对线程的一种封装,让线程用起来更加简便,只需要创一个线程池,把这些步骤像任务一样放进线程池,在程序销毁时只要调用线程池的销毁函数即可。

单个线程的弊端:a. 每次new Thread新建对象性能差b. 线程缺乏统一管理,可能无限制新建线程,相互之间竞争,及可能占用过多系统资源导致死机或者OOM,c. 缺乏更多功能,如定时执行、定期执行、线程中断。

java提供的四种线程池的好处在于:a. 重用存在的线程,减少对象创建、消亡的开销,性能佳。b. 可有效控制最大并发线程数,提高系统资源的使用率,同时避免过多资源竞争,避免堵塞。c. 提供定时执行、定期执行、单线程、并发数控制等功能。

2、Java 线程池

Java通过Executors提供四种线程池,分别为:

newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。

newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。

newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行。

newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。

(1). newCachedThreadPool

创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。线程池为无限大,当执行第二个任务时第一个任务已经完成,会复用执行第一个任务的线程,而不用每次新建线程。

(2). newFixedThreadPool

创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。

(3) newScheduledThreadPool

创建一个定长线程池,支持定时及周期性任务执行。ScheduledExecutorService比Timer更安全,功能更强大

(4)、newSingleThreadExecutor

创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行

Android部分(给出重点部分):

1. Activity 系列问题

1.1 绘制Activity生命周期流程图

enter image description here

1.2 介绍下不同场景下Activity生命周期的变化过程

  • 启动Activity: onCreate()--->onStart()--->onResume(),Activity进入运行状态。
  • Activity退居后台: 当前Activity转到新的Activity界面或按Home键回到主屏: onPause()--->onStop(),进入停滞状态。
  • Activity返回前台: onRestart()--->onStart()--->onResume(),再次回到运行状态。
  • Activity退居后台,且系统内存不足, 系统会杀死这个后台状态的Activity,若再次回到这个Activity,则会走onCreate()-->onStart()--->onResume()
  • 锁定屏与解锁屏幕 只会调用onPause(),而不会调用onStop方法,开屏后则调用onResume()

1.3 内存不足时系统会杀掉后台的Activity,若需要进行一些临时状态的保存,在哪个方法进行?

Activity的 onSaveInstanceState() 和 onRestoreInstanceState()并不是生命周期方法,它们不同于 onCreate()、onPause()等生命周期方法,它们并不一定会被触发。当应用遇到意外情况(如:内存不足、用户直接按Home键)由系统销毁一个Activity,onSaveInstanceState() 会被调用。但是当用户主动去销毁一个Activity时,例如在应用中按返回键,onSaveInstanceState()就不会被调用。除非该activity是被用户主动销毁的,通常onSaveInstanceState()只适合用于保存一些临时性的状态,而onPause()适合用于数据的持久化保存。

1.4 onSaveInstanceState()被执行的场景有哪些:

系统不知道你按下HOME后要运行多少其他的程序,自然也不知道activity A是否会被销毁,因此系统都会调用onSaveInstanceState(),让用户有机会保存某些非永久性的数据。以下几种情况的分析都遵循该原则

  1. 当用户按下HOME键时
  2. 长按HOME键,选择运行其他的程序时
  3. 锁屏时
  4. 从activity A中启动一个新的activity时
  5. 屏幕方向切换时

1.5 介绍Activity的几中启动模式,并简单说说自己的理解或者使用场景

2. Service系列问题

2.1 注册Service需要注意什么

Service还是运行在主线程当中的,所以如果需要执行一些复杂的逻辑操作,最好在服务的内部手动创建子线程进行处理,否则会出现UI线程被阻塞的问题

2.2 Service与Activity怎么实现通信

方法一:

  1. 添加一个继承Binder的内部类,并添加相应的逻辑方法
  2. 重写Service的onBind方法,返回我们刚刚定义的那个内部类实例
  3. Activity中创建一个ServiceConnection的匿名内部类,并且重写里面的onServiceConnected方法和onServiceDisconnected方法,这两个方法分别会在活动与服务成功绑定以及解除绑定的时候调用,在onServiceConnected方法中,我们可以得到一个刚才那个service的binder对象,通过对这个binder对象进行向下转型,得到我们那个自定义的Binder实例,有了这个实例,做可以调用这个实例里面的具体方法进行需要的操作了

方法二 通过BroadCast(广播)的形式 当我们的进度发生变化的时候我们发送一条广播,然后在Activity的注册广播接收器,接收到广播之后更新视图

2.3 介绍源码中binder机制

2.4 IntentService与Service的区别

IntentService是Service的子类,是一个异步的,会自动停止的服务,很好解决了传统的Service中处理完耗时操作忘记停止并销毁Service的问题

  • 会创建独立的worker线程来处理所有的Intent请求;
  • 会创建独立的worker线程来处理onHandleIntent()方法实现的代码,无需处理多线程问题;
  • 所有请求处理完成后,IntentService会自动停止,无需调用stopSelf()方法停止Service;
  • 为Service的onBind()提供默认实现,返回null;
  • 为Service的onStartCommand提供默认实现,将请求Intent添加到队列中;
  • IntentService不会阻塞UI线程,而普通Serveice会导致ANR异常
  • Intentservice若未执行完成上一次的任务,将不会新开一个线程,是等待之前的任务完成后,再执行新的任务,等任务完成后再次调用stopSelf()

3. Handle系列问题

3.1 介绍Handle的机制

  • Handler通过调用sendmessage方法把消息放在消息队列MessageQueue中,Looper负责把消息从消息队列中取出来,重新再交给Handler进行处理,三者形成一个循环
  • 通过构建一个消息队列,把所有的Message进行统一的管理,当Message不用了,并不作为垃圾回收,而是放入消息队列中,供下次handler创建消息时候使用,提高了消息对象的复用,减少系统垃圾回收的次数
  • 每一个线程,都会单独对应的一个looper,这个looper通过ThreadLocal来创建,保证每个线程只创建一个looper,looper初始化后就会调用looper.loop创建一个MessageQueue,这个方法在UI线程初始化的时候就会完成,我们不需要手动创建

3.2 谈谈对HandlerThread的理解

4. ListView系列问题

4.1 ListView卡顿的原因与性能优化,越多越好

  1. 重用converView: 通过复用converview来减少不必要的view的创建,另外Infalte操作会把xml文件实例化成相应的View实例,属于IO操作,是耗时操作。

  2. 减少findViewById()操作: 将xml文件中的元素封装成viewholder静态类,通过converview的setTag和getTag方法将view与相应的holder对象绑定在一起,避免不必要的findviewbyid操作

  3. 避免在 getView 方法中做耗时的操作: 例如加载本地 Image 需要载入内存以及解析 Bitmap ,都是比较耗时的操作,如果用户快速滑动listview,会因为getview逻辑过于复杂耗时而造成滑动卡顿现象。用户滑动时候不要加载图片,待滑动完成再加载,可以使用这个第三方库glide

  4. Item的布局层次结构尽量简单,避免布局太深或者不必要的重绘

  5. 尽量能保证 Adapter 的 hasStableIds() 返回 true 这样在 notifyDataSetChanged() 的时候,如果item内容并没有变化,ListView 将不会重新绘制这个 View,达到优化的目的

  6. 在一些场景中,ScollView内会包含多个ListView,可以把listview的高度写死固定下来。 由于ScollView在快速滑动过程中需要大量计算每一个listview的高度,阻塞了UI线程导致卡顿现象出现,如果我们每一个item的高度都是均匀的,可以通过计算把listview的高度确定下来,避免卡顿现象出现

  7. 使用 RecycleView 代替listview: 每个item内容的变动,listview都需要去调用notifyDataSetChanged来更新全部的item,太浪费性能了。RecycleView可以实现当个item的局部刷新,并且引入了增加和删除的动态效果,在性能上和定制上都有很大的改善

  8. ListView 中元素避免半透明: 半透明绘制需要大量乘法计算,在滑动时不停重绘会造成大量的计算,在比较差的机子上会比较卡。 在设计上能不半透明就不不半透明。实在要弄就把在滑动的时候把半透明设置成不透明,滑动完再重新设置成半透明。

  9. 尽量开启硬件加速: 硬件加速提升巨大,避免使用一些不支持的函数导致含泪关闭某个地方的硬件加速。当然这一条不只是对 ListView。

4.2 怎么实现一个部分更新的 ListView?

4.3 怎么实现ListView多种布局?

4.4 ListView与数据库绑定的实现

5. JNI系列问题

5.1 如何使用JNI

  1. JAVA中声明native 方法如private native String printJNI(String inputStr);

  2. 使用javah工具生成.h头文件这时候头文件中就会自动生成对应的函数JNIEXPORT jstring JNICALL Java_com_wenming_HelloWorld_printJNI

  3. 实现JNI原生函数源文件,新建HelloWorld.c文件,对刚才自动生成的函数进行具体的逻辑书写,例如返回一个java叫做HelloWorld的字符串等

  4. 编译生成动态链接so文件**

  5. Java中调用Sysytem.load方法把刚才的so库加载进来,就可以调用native方法了

5.2 如何通过JNI传递String对象

Java的String和C++的string是不能对等起来的,所以当我们拿到.h文件下面的jstring对象,会做一次转换我们把jstring转换为C下面的char*类型, 获取值

constchar* str;
str = env->GetStringUTFChars(prompt,false);

赋予值

char* tmpstr ="return string succeeded";
jstring rtstr = env->NewStringUTF(tmpstr);

6. OOM系列问题

6.1 什么OOM?

OOM全称是Out Of Merrory,Android系统的每一个应用程序都设置一个硬性的Dalvik Heap Size最大限制阈值,如果申请的内存资源超过这个限制,系统就会抛出OOM错误

6.2 内存泄漏有哪些场景以及解决方法

  • 类的静态变量持有大数据对象 静态变量长期维持到大数据对象的引用,阻止垃圾回收。

  • 非静态内部类存在静态实例 非静态内部类会维持一个到外部类实例的引用,如果非静态内部类的实例是静态的,就会间接长期维持着外部类的引用,阻止被回收掉。

  • 资源对象未关闭 资源性对象比如(Cursor,File文件等)往往都用了一些缓冲,我们在不使用的时候,应该及时关闭它们, 以便它们的缓冲及时回收内存。它们的缓冲不仅存在于java虚拟机内,还存在于java虚拟机外。 如果我们仅仅是把它的引用设置为null,而不关闭它们,往往会造成内存泄露。 解决办法: 比如SQLiteCursor(在析构函数finalize(),如果我们没有关闭它,它自己会调close()关闭), 如果我们没有关闭它,系统在回收它时也会关闭它,但是这样的效率太低了。 因此对于资源性对象在不使用的时候,应该调用它的close()函数,将其关闭掉,然后才置为null. 在我们的程序退出时一定要确保我们的资源性对象已经关闭。 程序中经常会进行查询数据库的操作,但是经常会有使用完毕Cursor后没有关闭的情况。如果我们的查询结果集比较小, 对内存的消耗不容易被发现,只有在常时间大量操作的情况下才会复现内存问题,这样就会给以后的测试和问题排查带来困难和风险,记得try catch后,在finally方法中关闭连接

  • Handler内存泄漏 Handler作为内部类存在于Activity中,但是Handler生命周期与Activity生命周期往往并不是相同的,比如当Handler对象有Message在排队,则无法释放,进而导致本该释放的Acitivity也没有办法进行回收。 解决办法

  • 声明handler为static类,这样内部类就不再持有外部类的引用了,就不会阻塞Activity的释放
  • 如果内部类实在需要用到外部类的对象,可在其内部声明一个弱引用引用外部类。

    public class MainActivity extends Activity {
     private CustomHandler mHandler;
    
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         mHandler = new CustomHandler(this);
     }
    
     static class CustomHandlerextends Handler {
         // 内部声明一个弱引用,引用外部类
         private WeakReference activityWeakReference;
         public MyHandler(MyActivity activity) {
             activityWeakReference= new WeakReference(activity);
         }
                 // ... ...   
     }
    }
    
  • 在Activity onStop或者onDestroy的时候,取消掉该Handler对象的Message和Runnable

    Override
    public void onDestroy() {
     //  If null, all callbacks and messages will be removed.
     mHandler.removeCallbacksAndMessages(null);
    }
    
  • 一些不良代码习惯 有些代码并不造成内存泄露,但是他们的资源没有得到重用,频繁的申请内存和销毁内存,消耗CPU资源的同时,也引起内存抖动 解决方案 如果需要频繁的申请内存对象和和释放对象,可以考虑使用对象池来增加对象的复用。 例如ListView便是采用这种思想,通过复用converview来避免频繁的GC

6.2 如何避免 OOM 问题的出现

1. 使用更加轻量的数据结构 例如,我们可以考虑使用ArrayMap/SparseArray而不是HashMap等传统数据结构。通常的HashMap的实现方式更加消耗内存,因为它需要一个额外的实例对象来记录Mapping操作。另外,SparseArray更加高效,在于他们避免了对key与value的自动装箱(autoboxing),并且避免了装箱后的解箱。

2. 避免在Android里面使用Enum Android官方培训课程提到过“Enums often require more than twice as much memory as static constants. You should strictly avoid using enums on Android.”,具体原理请参考《Android性能优化典范(三)》,所以请避免在Android里面使用到枚举。

3. 减小Bitmap对象的内存占用 Bitmap是一个极容易消耗内存的大胖子,减小创建出来的Bitmap的内存占用可谓是重中之重,,通常来说有以下2个措施:inSampleSize:缩放比例,在把图片载入内存之前,我们需要先计算出一个合适的缩放比例,避免不必要的大图载入。 decode format:解码格式,选择ARGB_6666/RBG_545/ARGB_4444/ALPHA_6,存在很大差异

4.Bitmap对象的复用 缩小Bitmap的同时,也需要提高BitMap对象的复用率,避免频繁创建BitMap对象,复用的方法有以下2个措施 LRUCache : “最近最少使用算法”在Android中有极其普遍的应用。ListView与GridView等显示大量图片的控件里,就是使用LRU的机制来缓存处理好的Bitmap,把近期最少使用的数据从缓存中移除,保留使用最频繁的数据, inBitMap高级特性:利用inBitmap的高级特性提高Android系统在Bitmap分配与释放执行效率。使用inBitmap属性可以告知Bitmap解码器去尝试使用已经存在的内存区域,新解码的Bitmap会尝试去使用之前那张Bitmap在Heap中所占据的pixel data内存区域,而不是去问内存重新申请一块区域来存放Bitmap。利用这种特性,即使是上千张的图片,也只会仅仅只需要占用屏幕所能够显示的图片数量的内存大小

4. 使用更小的图片 在涉及给到资源图片时,我们需要特别留意这张图片是否存在可以压缩的空间,是否可以使用更小的图片。尽量使用更小的图片不仅可以减少内存的使用,还能避免出现大量的InflationException。假设有一张很大的图片被XML文件直接引用,很有可能在初始化视图时会因为内存不足而发生InflationException,这个问题的根本原因其实是发生了OOM。

5.StringBuilder 在有些时候,代码中会需要使用到大量的字符串拼接的操作,这种时候有必要考虑使用StringBuilder来替代频繁的“+”。

4.避免在onDraw方法里面执行对象的创建 类似onDraw等频繁调用的方法,一定需要注意避免在这里做创建对象的操作,因为他会迅速增加内存的使用,而且很容易引起频繁的gc,甚至是内存抖动。

5. 避免对象的内存泄露 android中内存泄漏的场景以及解决办法,参考上一问

7. ANR 系列问题

7.1 什么ANR

ANR全称Application Not Responding,意思就是程序未响应。如果一个应用无法响应用户的输入,系统就会弹出一个ANR对话框,用户可以自行选择继续等待亦或者是停止当前程序。一旦出现下面两种情况,则弹出ANR对话框

  • 应用在5秒内未响应用户的输入事件(如按键或者触摸)
  • BroadcastReceiver未在10秒内完成相关的处理

7.2 ANR是怎么引起的?

  • 主线程中存在耗时的计算-
  • 主线程被IO操作(从4.0之后网络IO不允许在主线程中)阻塞。-
  • 主线程中错误的操作,比如Thread.wait或者Thread.sleep等

7.3 如何避免ANR问题的出现

基本思路就是把一些耗时操作放到子线程中处理

  • 使用AsyncTask处理耗时IO操作。

  • 降低子线程优先级使用Thread或者HandlerThread时,调用Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND)设置优先级,否则仍然会降低程序响应,因为默认Thread的优先级和主线程相同。

  • 使用Handler处理子线程结果,而不是使用Thread.wait()或者Thread.sleep()来阻塞主线程。

  • Activity的onCreate和onResume回调中尽量避免耗时的代码

  • BroadcastReceiver中onReceive代码也要尽量减少耗时操作建议使用IntentService处理。IntentService是一个异步的,会自动停止的服务,很好解决了传统的Service中处理完耗时操作忘记停止并销毁Service的问题

8. Asynctask问题

8.1 AsynTask为什么要设计为只能够一次任务?

最核心的还是线程安全问题,多个子线程同时运行,会产生状态不一致的问题。所以要务必保证只能够执行一次

8.2 AsynTask造成的内存泄露的问题怎么解决,》比如非静态内部类AsynTask会隐式地持有外部类的引用,如果其生命周期大于外部activity的生命周期,就会出现内存泄漏

  • 注意要复写AsynTask的onCancel方法,把里面的socket,file等,该关掉的要及时关掉
  • 在 Activity 的onDestory()方法中调用Asyntask.cancal方法
  • Asyntask内部使用弱引用的方式来持有Activity

8.3 若Activity已经销毁,此时AsynTask执行完并且返回结果,会报异常吗?

当一个App旋转时,整个Activity会被销毁和重建。当Activity重启时,AsyncTask中对该Activity的引用是无效的,因此onPostExecute()就不会起作用,若AsynTask正在执行,折会报 view not attached to window manager 异常

同样也是生命周期的问题,在 Activity 的onDestory()方法中调用Asyntask.cancal方法,让二者的生命周期同步

8.4 Activity销毁但Task如果没有销毁掉,当Activity重启时这个AsyncTask该如何解决?

还是屏幕旋转这个例子,在重建Activity的时候,会回掉Activity.onRetainNonConfigurationInstance()重新传递一个新的对象给AsyncTask,完成引用的更新

9. Android触摸分发机制

9.1 介绍触摸事件的分发机制

enter image description here

(1) 事件从Activity.dispatchTouchEvent()开始传递,只要没有被停止或拦截,从最上层的View(ViewGroup)开始一直往下(子View)传递。子View可以通过onTouchEvent()对事件进行处理。

(2) 事件由父View(ViewGroup)传递给子View,ViewGroup可以通过onInterceptTouchEvent()对事件做拦截,停止其往下传递。

(3) 如果事件从上往下传递过程中一直没有被停止,且最底层子View没有消费事件,事件会反向往上传递,这时父View(ViewGroup)可以进行消费,如果还是没有被消费的话,最后会到Activity的onTouchEvent()函数。

(4) 如果View没有对ACTION_DOWN进行消费,之后的其他事件不会传递过来。

(5) OnTouchListener优先于onTouchEvent()对事件进行消费。

上面的消费即表示相应函数返回值为true。

9.2 View中 setOnTouchListener的onTouch,onTouchEvent,onClick的执行顺序

追溯到View的dispatchTouchEvent源码查看,有这么一段代码

public boolean dispatchTouchEvent(MotionEvent event) {  
        if (!onFilterTouchEventForSecurity(event)) {  
            return false;  
        }  

        if (mOnTouchListener != null && (mViewFlags & ENABLED_MASK) == ENABLED &&  
                mOnTouchListener.onTouch(this, event)) {  
            return true;  
        }  
        return onTouchEvent(event);  
    }

当以下三个条件任意一个不成立时,

  • mOnTouchListener不为null
  • view是enable的状态
  • mOnTouchListener.onTouch(this, event)返回true,

函数会执行到onTouchEvent。在这里我们可以看到,首先执行的是mOnTouchListener.onTouch的方法,然后是onTouchEvent方法

继续追溯源码,到onTouchEvent()观察,发现在处理ACTION_UP事件里有这么一段代码

 if (!post(mPerformClick)) {  
                                    performClick();  
                                }

此时可知,onClick方法也在最后得到了执行

所以三者的顺序是:

  1. setOnTouchListener() 的onTouch
  2. onTouchEvent()
  3. onClick()

10. Dalvik虚拟机系列问题

10.1 什么是Dalvik虚拟机?

Dalvik虚拟机是Android平台的核心。它可以支持.dex格式的程序的运行,.dex格式是专为Dalvik设计的一种压缩格式,可以减少整体文件尺寸,提高I/O操作的速度,适合内存和处理器速度有限的系统。

10.2 Dalvik虚拟机的作用是什么?

Dalvik虚拟机主要是完成对象生命周期管理,内存回收,堆栈管理,线程管理,安全和异常管理等等重要功能。

10.3 Dalvik虚拟机与JVM有什么区别

  • Dalvik 基于寄存器,而 JVM 基于栈。基于寄存器的虚拟机对于更大的程序来说,在它们编译的时候,花费的时间更短。
  • Dalvik执行.dex格式的字节码,而JVM执行.class格式的字节码。

10.4 每个应用程序对应多少个Dalvik虚拟机

  • 每一个Android应用在底层都会对应一个独立的Dalvik虚拟机实例,其代码在虚拟机的解释下得以执行 ,而所有的Android应用的线程都对应一个Linux线程

11. 注册广播接收器有哪几种方式,有什么区别

  • 静态注册:在AndroidManifest.xml文件中进行注册,当App退出后,Receiver仍然可以接收到广播并且进行相应的处理
  • 动态注册:在代码中动态注册,当App退出后,也就没办法再接受广播了

12. 显示Intent与隐式Intent的区别

对明确指出了目标组件名称的Intent,我们称之为“显式Intent”。 对于没有明确指出目标组件名称的Intent,则称之为“隐式 Intent”。

对于隐式意图,在定义Activity时,指定一个intent-filter,当一个隐式意图对象被一个意图过滤器进行匹配时,将有三个方面会被参考到:

  • 动作(Action)
  • 类别(Category ['kætɪg(ə)rɪ] )
  • 数据(Data )

13. Android中的动画有哪些,区别是什么

  • 逐帧动画(Drawable Animation): 加载一系列Drawable资源来创建动画,简单来说就是播放一系列的图片来实现动画效果,可以自定义每张图片的持续时间

  • 补间动画(Tween Animation): Tween可以对View对象实现一系列简单的动画效果,比如位移,缩放,旋转,透明度等等。但是它并不会改变View属性的值,只是改变了View的绘制的位置,比如,一个按钮在动画过后,不在原来的位置,但是触发点击事件的仍然是原来的坐标。

  • 属性动画(Property Animation): 动画的对象除了传统的View对象,还可以是Object对象,动画结束后,Object对象的属性值被实实在在的改变了

14. 不使用动画,怎么实现一个动态的 View?

15. Postvalidata与Validata有什么区别?

16. 如何自定义ViewGroup?

17. View的绘制流程

enter image description here measure()方法,layout(),draw()三个方法主要存放了一些标识符,来判断每个View是否需要再重新测量,布局或者绘制,主要的绘制过程还是在onMeasure,onLayout,onDraw这个三个方法中

1.onMesarue() 为整个View树计算实际的大小,即设置实际的高(对应属性:mMeasuredHeight)和宽(对应属性: mMeasureWidth),每个View的控件的实际宽高都是由父视图和本身视图决定的。

2.onLayout() 为将整个根据子视图的大小以及布局参数将View树放到合适的位置上。

3. onDraw() 开始绘制图像,绘制的流程如下

  1. 首先绘制该View的背景
  2. 调用onDraw()方法绘制视图本身 (每个View都需要重载该方法,ViewGroup不需要实现该方法)
  3. 如果该View是ViewGroup,调用dispatchDraw ()方法绘制子视图
  4. 绘制滚动条

18. 数据持久化的四种方式有哪些?

  1. 文件存储: 通过java.io.FileInputStream和java.io.FileOutputStream这两个类来实现对文件的读写,java.io.File类则用来构造一个具体指向某个文件或者文件夹的对象。

  2. SharedPreferences: SharedPreferences是一种轻量级的数据存储机制,他将一些简单的数据类型的数据,包括boolean类型,int类型,float类型,long类型以及String类型的数据,以键值对的形式存储在应用程序的私有Preferences目录(/data/data/<包名>/shared_prefs/)中,这种Preferences机制广泛应用于存储应用程序中的配置信息。

  3. SQLite数据库: 当应用程序需要处理的数据量比较大时,为了更加合理地存储、管理、查询数据,我们往往使用关系数据库来存储数据。Android系统的很多用户数据,如联系人信息,通话记录,短信息等,都是存储在SQLite数据库当中的,所以利用操作SQLite数据库的API可以同样方便的访问和修改这些数据。

  4. ContentProvider: 主要用于在不同的应用程序之间实现数据共享的功能,不同于sharepreference和文件存储中的两种全局可读写操作模式,内容提供其可以选择只对哪一部分数据进行共享,从而保证我们程序中的隐私数据不会有泄漏的风险

19. fragement里面可以再嵌套fragment?

20. Socker编程的步骤

21. Activity中如何动态的添加Fragment

22. Scrollview怎么判断是否滑倒底部

23. 什么是 MVC 模式?MVC 模式的好处是什么?

24. 应用常驻后台,避免被第三方杀掉的方法,讲讲你用过的奇淫巧技?

  1. Service设置成START_STICKY kill 后会被重启(等待5秒左右),重传Intent,保持与重启前一样

  2. 通过 startForeground将进程设置为前台进程, 做前台服务,优先级和前台应用一个级别​,除非在系统内存非常缺,否则此进程不会被 kill

  3. 双进程Service: 让2个进程互相保护**,其中一个Service被清理后,另外没被清理的进程可以立即重启进程

  4. QQ黑科技: 在应用退到后台后,另起一个只有 1 像素的页面停留在桌面上,让自己保持前台状态,保护自己不被后台清理工具杀死

  5. 在已经root的设备下,修改相应的权限文件,将App伪装成系统级的应用 Android4.0系列的一个漏洞,已经确认可行

  6. 用C编写守护进程(即子进程) : Android系统中当前进程(Process)fork出来的子进程,被系统认为是两个不同的进程。当父进程被杀死的时候,子进程仍然可以存活,并不受影响。鉴于目前提到的在Android->- Service层做双守护都会失败,我们可以fork出c进程,多进程守护。死循环在那检查是否还存在,具体的思路如下(Android5.0以上的版本不可行)
  7. 用C编写守护进程(即子进程),守护进程做的事情就是循环检查目标进程是否存在,不存在则启动它。
  8. 在NDK环境中将1中编写的C代码编译打包成可执行文件(BUILD_EXECUTABLE)。主进程启动时将守护进程放入私有目录下,赋予可执行权限,启动它即可。

  9. 联系厂商,加入白名单

25.Context与ApplicationContext的区别,分别用在什么情况下

Application的Context是一个全局静态变量,SDK的说明是只有当你引用这个context的生命周期超过了当前activity的生命周期,而和整个应用的生命周期挂钩时,才去使用这个application的context。

在android中context可以作很多操作,但是最主要的功能是加载和访问资源。在android中有两种context,一种是 application context,一种是activity context,通常我们在各种类和方法间传递的是activity context。

26. 同一个应用程序的不同Activity可以运行在不同的进程中么?如果可以,举例说明;

27. Java中的线程同步有哪几种方式,举例说明;

28. dp, dip, dpi, px, sp是什么意思以及他们的换算公式?layout-sw400dp, layout-h400dp分别代表什么意思;

29. 如何让两个TextView在一个RelativeLayout水平居中显示;

30. 如何画出一个印章的图案

31. 如何实现一个字体的描边与阴影效果

32. 设计一个从网络请求数据,图片,并加载到列表的系统,画出客户端架构并简单的分析下;

33. 设计一个文件的断点续传系统;

34. 设计一个图片缓存加载机制

数据结构与算法部分:

  1. 给最外层的rootview,把这个根视图下的全部button背景设置成红色,手写代码,不许用递归
  2. 给一串字符串比如abbbcccd,输出a1b3c3d1,手写代码(注意有个别字符可能会出现十次以上的情况)
  3. 一个序列,它的形式是12349678,9是最高峰,经历了一个上升又下降的过程,找出里面的最大值的位置,要求效率尽可能高
  4. 二叉查找树的删除操作,手写代码
  5. 反转链表,手写代码
  6. 二分查找,手写代码
  7. 有海量条 url,其中不重复的有300万条,现在希望挑选出重复出现次数最高的 url,要求效率尽可能的高
  8. 一篇英语文章,去掉字符只留下k个,如何去掉才能使这k个字符字典序最小
  9. 弗洛伊德算法和 Dijkstra算法的区别?复杂度是多少?讲讲 Dijkstra算法的具体过程
  10. 反转字符串,要求手写代码,优化速度、优化空间
  11. 给出两个无向图,找出这2个无向图中相同的环路。手写代码
  12. 单例模式,手写代码
  13. 生产者与消费者,手写代码
  14. 二叉树镜像,手写代码
  15. 最长不重复子串(最长重复子串),手写代码

操作系统部分:

  1. 分别从操作系统的内存角度与进程线程角度解释分析堆,栈二者的区别
  2. 什么是事务?
  3. OSI七层模型有哪些,各层次的作用
  4. TCP的三次握手过程,四次挥手过程,为什么需要三次?
  5. 说说操作系统中进程的通信方式
  6. 浏览器输入地址之后,之后的过程
  7. 谈谈 HTTP 中Get 和 Post 方法的区别? 


一面

  1. Java对象的引用方法

  2. Java GC机制

  3. HashMap && HashTable && ConcurrentHashMap

  4. 多线程同步

  5. Synchronized && Reentrantlock

  6. Activity启动模式

  7. 两个应用能使用同一个任务栈么?

  8. Binder机制

  9. Volley源码的实现

  10. 大图加载

  11. Http && Https

  12. 常用的加密算法,对称加密和非对称加密

  13. Android里的序列化

  14. Android里的内存泄漏

  15. 求100内的素数--筛素数法

  16. Android里的设计模式

二面

二面有些问题记不住了。。。。

  1. 两个应用间Binder通信的原理

  2. OkHttp如何对链接进行复用

  3. 如何设计锁

  4. 内存泄漏如何发现(用什么工具)


Handler+Thread机制、
View绘制过程、
Activity的启动过程

一面:
1.都学过哪些课程,讲一讲编译原理
2.排序算法,手写冒泡排序及优化
3.final的用法
4.项目
5.TCP三次握手四次挥手

二面:
1.讲讲编译原理
2.数据库的主健,外健,索引
3.问了两道笔试题
4.手写链表逆置
5HTTP与HTTPS的区别
6.HTTP请求报文格式
7.cookie
8两个栈实现队列的优化
三面:
1.JAVA虚拟机的理解,我讲了GC原理
2.智力题,一天时针和分针相遇几次
3.printf的执行过程
4.两个队列实现栈
5.什么时候会发生SOF问题


1、一面

      首先是自我介绍,然后开始问基础的,项目有问,但是不多,都是针对简历中项目描述的知识点零散的问,这次面试始终没有问到(网络协议和算法)的知识

Java相关:

(1)线程池有几种用法?newFixedThreadPool是怎么执行的?--coreSize与maxSize

(2)内存泄漏和内存溢出

Android相关:

(1)有用过什么框架,看过他们的源码没?

(2)平时有用过什么开源项目?

(3)AnsycTask的原理?(我的简历里提到过AnsycTask)

(4)在纸上写了个Activity,然后在类里面定义了一个Handler,问我这个会有警告,怎么解决?--static、软引用

(5)Service的保活

一面我感觉自己太紧张了,好多问题明明都知道,也可以答深入一点的,但是当时脑子却像卡了壳似的,回答不上来,看来找工作也要多面面,次数多了就有经验了。我感觉自己一面回答的很不好,感谢我的面试官高抬贵手给了我进二面的机会。。。

2、二面:(问的基本都是项目)

(1)首先自我介绍一下,着重介绍一下你的项目的难点以及你在项目里主要负责的部分、

(2)你的listView是怎么用的,在纸上给我画一下吧?---你简历上写的优化listView你是怎么优化的?---RecyclerView和ListView的区别?

说技术点的途中提到了LRU缓存算法,他说正好我不太懂,你给我说一下原理

(3)用过什么设计模式?在纸上写一个你最熟悉的设计模式,要求功能完备不能出错---我写的Double-Check的单例模式(注意volatile的使用及线程并发控制)

(4)除了handler,子线程与UI线程还有几种通信方式?(runOnUIThread、post)

(4)启动Service的两种方式?startService和bindService的区别?对Binder的了解(这个问题我回答的比较深入,因为我看过底层Binder驱动的源码,研一的时候也研究过,答到了transaction函数这里,可惜太久没回顾当时有点忘了,事后仔细捋了捋,觉得可以将流程给他细化一点)

(5)提到另一个项目时面试官似乎觉得不太难,我“强行”给他说了一些这个项目的难点以及我遇见的问题是怎么解决的,听完以后他似乎更满意了,看来机会还是要自己争取,哈哈

(6)最后问我有没有什么问题要问他的?



  • 自我介绍一下
  • 实习经历
  • 简单问了一下项目
  • 常见的排序算法时间复杂度
  • 如何用LinkedList实现堆栈操作
  • 入栈出栈的时间复杂度,链表插入和删除的时间复杂度
  • Activity的生命周期


    一面:

    1.上来直接让写个堆排,算法还可以,无压写出

    2.Handler机制,Handler除了线程通信还有什么作用,这个我说通知吧,因为Android是消息驱动的,不是特别明白面试官要问哪点,难道是延时?

    3.Activity的启动模式,每种启动模式的使用场景,singletop中回调onNewIntent和finish掉之后onCreate()有什么不同?,这个4种的使用场景中,我singletop回答不是特别好,应该是那种频繁接受消息的activity需要使用,

    4.设计模式,适配器模式,画出类图,这个怪我,面试官说设计模式熟悉吗,我就说23种随便问(因为我也没那个特别熟悉),结果问了个适配者模式,我画出个不是特别标准的UML类图,然后面试官问我,有几种类图结构,自然不知道

    5.Fragment的生命周期,栈管理,和commit()类似的方法还有哪个,commit类似的那个之前真没注意,应该是commitAllowingStateLoss(),区别是是否能在activity保存之后调用

    6.单例模式,单例和静态方法有什么不同,区别分析的不全面

    7.实现一个文件夹列表,面试官要求5000个文件的时候才从ViewGroup转到ListView

    一面有些糟糕,每个问题的基础全部答出了,但深入拓展回答的不是很好

    二面:

    1.Rxjava在使用的时候和传统代码有什么区别

    2.强引用和弱引用同时引用一个对象是否会被回收

    3.ART和Dalvik的区别

    4.java内存分区,垃圾回收机制

    5.主键和唯一的区别,回答是否能为空,是否能做外键

    6.批量插入50条联系人,比较高效的方法,ContentProvider是否了解原理,这个问题没有回答出来

    7.自旋锁和syn关键字的区别

    8.volatile关键字的原理,我画了个工作内存和主内存的图

    9.启动一个APP的流程

    10.手写一个工厂模式,我就写了个最简单的

    11.方法加syn和syn一个对象有什么区别

    二面比一面感觉好一些,批量插入联系人和自旋锁(我忘了它就是Lock了)那2个问题没回答好,其他还可以

    HR面:

    1.说下你做的APP

    2.工作中遇到的难点

    3.工作地点要求

    4.期望薪资

    5.问题



    1.项目
    说下你觉得你做的最好的一个项目,画一下整体架构,就是哪部分代码负责哪部分功能
    说下你了解的设计模式,在你的项目里用到了哪些设计模式,具体用到的地方?
    2.java
    java学了多久?
    说下接口和抽象类的区别,在你项目中哪些地方用到了接口和抽象类?
    说下泛型,用到的集合类,说的hashMap,说一下底层的实现,如果你要往hashMap插入一个数,详细说一下插入的具体流程,如果出现hash冲突,怎么解决?
    java多线程用的多么?怎么加锁?怎样停止一个线程?
    3.你学习的方式是什么样的?
    4.Android
    android学了多久?广播分为几种?实现原理,工作原理,广播接收器有几种?
    ipc的方式
    AIDL怎么用?



    1.android四大组件
       broadcast机制
    2.java线程的各种状态
    3.线程同步
    4.hashmap与hashtable区别
    5.jvm栈
    6.gc算法
    7.手写kmp
    8.手写单例模式
    9.单例模式双重锁
    10.thread.wait()与thread.sleep()区别
    11.okhttp原理
    12.线程池机制
    13.androird进程间通信方式
    14.事件分发机制
    15.view的绘制流程


    一面: 1.项目介绍

    2.MVP的介绍

    3.设计一个游戏物品栏

    4.算法题目:一个数字字符串,长度为m,在其中添加n个加号,使其和最小,想了3分钟,说了下思路,其实就是dp,时间复杂度O(m*n),空间复杂度O(m),应该没问题

    5.说了下Android事件的分发机制



    一面:一面什么java算法啊啥都没问全程问Android啊。。。
    1、Activity的生命周期
    2、onSaveInstanceState和onRestoreInstanceState调用的过程和时机,onNewIntent方法
    3、fragment的生命周期,和Activity如何进行通信
    4、Android的事件分发机制,ACTION_DOWN和后续事件如何消耗
    5、Activity的启动方式
    6、View的绘制流程,MeasureSpec如何工作,父的MeasureSpec和自己的LayoutParams
    7、广播的两种注册方式
    8、数据库如何升级(懵逼)
    9、Handler Looper的使用方式,实现机制,设计的原因
    10、HandlerThread有没有了解(很神奇的我完全忘了当时是怎么答的了)
    11、ThreadLocal是干嘛的,使用的地方
    12、软引用和弱引用的区别
    13、熟悉哪些设计模式
    14、Sqlite的一些问题
    15、Activity A调用Activity B时,A调用什么函数(onPause)
    然后说让我等通知,然后10分钟就打过来约二面。。。

    二面:
    1、自我介绍
    2、JNI的参数ENV参数。。。
    3、JNI工作时,java 层的类如何找到C/C++层的类(懵)
    4、AIDL的工作流程
    5、知道哪些排序算法,稳定性是啥,选择排序是稳定的吗
    6、二叉查找有重复数字的排好序的数组的重复数字的起始和终点位置。O(logN)
    7、onSaveInstanceState和onRestoreInstanceState又问了一次
    8、单例模式的作用范围是线程还是进程
    9、聊一些有的没的。。。


    1.聊我的ImageLoader项目 问我如何计算一个图片所占内存,我这个之前还真没注意(绝对基础) 问我如果需要网络的任务占满线程池,而网络状态不好,那么后来有缓存的任务就拿不到线程执行,应当如何优化,这个没想出来

    2.问我关注的开源项目,我简单说了下rxjava 我又说了下mvp架构,然后问我Mvp架构的缺点,我说项目小的时候会导致项目冗余,然后他问10个activity每个500行会使用mvp吗,我说,如果是我的话会使用

    3.让我说了下单例模式,我这边把单例的演变流程说了下,他问我你的项目中使用哪一种单例,我说我使用内部类那种

    4.有什么问题,和他探讨了一些插件化的东西

    一面效果不是特别理想,主要是那个计算图片内存的基础问题没回答出来 稍等了一下之后 二面面试官过来

    二面 1.让我介绍项目,然后我介绍了一遍,问我项目中遇到的问题

    2.让我说下ConcurrentHashMap,好像那天脑袋短路了,忘了这个分段锁了,就说没看过,让实现只说了读写分离

    3.讲了一下Binder的原理,这个还是比较简单,理论上的东西

    4.让我讲了下NDK/JNI,我简单说了一些应用,他说如果多线程调用JNI会出现什么问题,做过吗,我说没有,他说Ok,流程已经讲的比较清楚了,可以下去了解下多线程调用JNI这块



    1. 关于自己做的一个项目的一些问题,问了pulltorefresh的一些状态等,现在感觉对自己的项目还是复习的不够,好多都不记得了。
    2. Service与Thread区别,这个问题应该是必问的了,一定要知道清楚。
    3. SQLite能否并发读取或者写入,自己只记得不能并发写,可以并发读,但是原因不清楚。
    4. 线程与进程的区别。
    5. 说出自己用过的设计模式,我说了单例,工厂,装饰等,本来这个问题可以回答的可以的,结果面试官转移话题了。
    6. 一个双向linkedlist有一个环,怎么找出这个这个点。这个可能是剑指offer上面的,但是我当场只给出了最笨的方法,没有想到 复杂度更低的方法。
    7. 写一个二叉树,写出insert方法和遍历方法。第一次现场写代码,这个答的不错。
    8. 写出算法计算二叉树的高度,这个没有想出来。
    9. java的多态,继承,封装,还有private protected public default的意义,这个时候已经非常累了。
    10. Activity与Service的通信问题,这里要对Binder机制和AIDL比较了解,因为自己没在项目中用过,所以回答的不是很好。这个还可以通Broadcast进行通信。
    11. 画出Activity与Fragment生命周期


    一面:activity生命周期,启动模式,service在哪个线程,service防杀死,然后问了项目相关的,问了一个设计,就是类似于美团的二级分类菜单,楼主做过相关的,回答的还行。
    二面,先问java相关的,楼主是从别的转到android的,不太会,不过看过面经,回答上来了一些,基本类型,多线程,抽象类和借口,重写和重载,然后android多线程源码,handler,动画,数据存储,设计模式


    一面
    (自我介绍两句就开始说项目)
    1.共享变量的线程安全(自旋锁和synchronized区别)
    2.sqlite如何批量插入大量数据,如何提高效率(放到一个事务里)
    3.软引用和弱引用
    创建弱引用的时候,构造方法传入一个ReferenceQueue,作用是什么
    5.binder相关
    6.启动一个应用的流程(从点击桌面的icon开始)
    7.一个进程里有五十个线程去请求一个系统服务,为什么有的线程马上就得到响应,有的会延迟多少毫秒(原因是系统服务那边是一个线程池,默认只有八个线程)
    8.volitate的实现原理(说到了内存屏障)
    9.数据库索性,底层实现,有哪些实现当方式(扯到B 树相关)
    10.B 树的实现会不会
    11.ViewPager如何判断左滑右滑
    12.activity的启动模式及在你项目里的应用
    13.View事件分发机制
    14.jvm相关
    15.view事件冲突的处理
    16.android7.0的虚拟机的优化(什么即时编译)
    (期间有些问题不会,但是我把面试官往自己会的方面引导,这样曲线救国,效果还不错)


    二面

    1.一上来就手写堆排序
    2.fragment 和activity之间如何选择(说出自己的理解)
    3.设计模式,单例模式和静态方法的区别(可以从加载时机,java面相对象方面分析)
    4.android6.0 的动态权限(聊项目时扯上去的)
    5.View的绘制过程
    6.handler相关


    一面:电话面

    大概25分钟,感觉面试官气场很足,主要关注了其中一个 个人开源项目

    1、自我介绍

    2、说说你做的这个项目

    当时谈到使用到了开源框架xtuil中的dbxutil和httptuil,然后让分析这俩个模块源码;其中详细问了httputil实现原理(主要是线程池,封装的是httpclient)

    使用到了slidingmenu_library开源控件,让分析这个开源框架的源码;

    tips:项目中使用到的开源框架一定要了解大概,给出一个比较不错的学习连接http://a.codekk.com/  

    3、说说你做过最复杂的控件

    有点不好说,扯到开机动画,追问如何实现,然后又追问了animation 和animator的区别

    干净利索没有太多的废话,直接就说“好,面试结束”直接就挂电话了 。同学问我面的咋样,我都直接说跪了没戏


    二面:杭州网易现场面 (当然报销来回动车路费)

    面了将近1小时15分钟吧

    过了一个星期接到hr电话说一面过了,需要现场面,去杭州面试确实艰苦,14个小时动车到杭州已经是半夜11点了,找个小旅馆睡下,下午俩点去面试

    面试官不关注我app项目,直接抛出大问题,慢慢讨论

    1、说说推送

    扯到长连接,心跳包,直接被面试官打断,这个我们都知道,说说保持一个长连接很简单,为什么长连接会带来很多麻烦,还提示从耗电量,微信分析

    (这个问题后来做了总结,确实是个好问题可以参考我的这篇博客http://blog.csdn.net/xsf50717/article/details/48519135)

    2、从协议栈角度分析一下推送的过程

    看了我LTE协议栈项目(本人通信专业)问的,感觉有点不搭边

    3、项目使用开源框架的源码分析讨论

    主要还是集中在httputil源码实现、讨论了线程池设计,阻塞队列;

    由于httputil封装了httpclient,然后让比较 httpclient和httpurlclient区别;

    扯到了http协议,问了http与https区别,(当时我在分析直接被打断,“这个我们都知道,简介概括”,然后我我直接说https=http+ssl+加密算法);

    加密算法是对称还是非对称的,,商量秘钥的过程是对称还是非对称

    3、android消息处理机制

    handler+loop分析;

    loop线程与普通线程区别;

    asynctask源码分析(这里有个线程池几个关键参数5,128,使用的阻塞队列,补充讲了asynctask缺陷)

    如何改进asynctask造成的内存泄露的问题,从而延伸到 jvm虚拟机四种引用

    4、说说androi 使用卡顿是什么造成的,给出优化

    主要回答了ui overdraw避免,标签,标签,标签使用,hierarchy viewer工具的使用;

    面试官追问:再从底层分析;(其实就是 16ms和60fps的追求了)

    再结合GPU操作分析一下UI过程;

    然后说到了大图加载问题,提到UIL框架,让分析内部源码(我主要从uil的缓存策略和线程池机制分析)

    5、忽然扯到并发,让分析concurrenthashmap,答了分段锁仍不满意,要求再分析一下size操作是如何做的

    6、材料设计

    从listview优化谈到recyclerview,深入分析一下recyclerview特点

    然后引申到瀑布流如何实现,不使用recyclerview如何实现瀑布流

    7、属性动画

    8、touch事件分发机制

    9、android开机过程(主要讨论了zygote)

    10、让你设计一个游戏人物,如何设计

    主要讲了抽象类+接口+mvc和mvp模式




    1.为什么用Git做代码托管,rebase用过没(rebase没用过),fetch命令和pull啥区别?这个竟然不知道(真后悔吧这个卸载简历上)

    2.C++中的虚函数是怎么实现的?我讲了一下Java的虚函数,invkevirtual查找过程以及虚函数表优化

    3.什么是多态?easy

    4.Java反射怎么使用?讲到类加载的Class怎么调用类的所有属性和方法,Android里面通过反射调用私有api。

    5.Android中的几种Context什么区别?这个问题我回答的不好,简单说了一下生命周期和Context的继承关系,以及注意事项弹对话框不能使用applicatuion的上下文

    6.Android中的内存泄露遇到过没?我讲了Handler持有Activity泄露以及google建议的嵌套类、弱引用的解决方案、Drawable的setCallback,耗时的线程可能会持有Activity,Bitmap调用recycle,因为以前bitmap在native分配,所以要调用recycle释放,现在不用了因为在堆分配,由GC回收,他问我是几点几版本开始的,我说是3.0版本。

    7.接着问我bitmap能否复用?这个我没弄懂意思,就回答不知道,最后查了一下,也是3.0以后的有个Option的inbitmap字段可以复用http://yhz61010.iteye.com/blog/1850232

    8.平时遇到过OOM没?遇到过,主要是图片加载很常见,我讲了BitmapFactory的解析Options的in...bound参数先读取图片信息进行必要的缩放,还有缓存,讲了DiskLruCache、LruCache缓存策略,以及可以加入软引用,讲了底层的LinkedHashMap实现。

    9.用过外观模式?(表示没听过)这是Android中的知识吗?面试官告诉我,是一种设计模式,我说,哦,没有,我知道的有单例模式、工厂模式、代理模式、观察者模式、装饰者模式、迭代器模式。然后让我讲一下代理模式,我就大概说了一下,然后说在Android中使用AIDL产生的的代码中当查不到本地的Binder时asInterface返回的就是一个代理对象,然后面试官说,那就是你使用过bindService调用过Service了?恩。

    10.FrameWork层看过那些源码?Java源码呢?讲了一下看过的框架层源码和java集合,没有具体讲。

    11.自定义控件做过哪些,需要注意什么?处理wrap_content的情况,ondraw不能耗时,刷新率16ms等,然后让我讲了一下圆角矩形的图片控件怎么做,降到了画笔的xferm...方法进行图面交叠。

    12.平时看不看技术文章?看,自己也经常写,简历上有博客地址,问我一般写什么文章,我说Android主要是研究Framework层源码的内容。然而。。。他的那个简历上并没有。。他又重新下载了一下pdf还是没有,我解释了一下应该是牛客网自动生成的简历,不是我自己写的那个简历。

    // 补充一个,还问到我Android动态加载了解不?我没用过,但之前看到过通过DexClassLoader使用接口实现的一种插件形式,具体不太了解。



    首先问了项目:
    1.说一下最近做的与Android有关的项目。
    2.在过去做的项目中哪一个最具代表性。(原话不太记得,大概这个意思)。
    3.项目中遇到了哪些坑?
    问Java:
    1.抽象类与接口的区别。
    2.集合类有哪些?
    3.ArrayList和LinkedList的区别。
    Android的:
    1.draw和onDraw方法区别。
    2.view和viewGroup区别。
    3.内存溢出处理。
    4.Activity能运行在别的进程中吗?

    问Java:
    1.Java的垃圾回收机制有了解过吗?
    2.GC的算法。
    3.Java的引用类型。
    Android:
    1.内存泄漏。
    2.Bitmap的recycle方法执行后会立即回收内存吗?
    3.进程间通信的方法。
    4.Activity中如何调用另一个进程Service里的方法?
    5.AIDL的方式能访问另一个进程Service里静态变量吗?
    6.Activity的四种启动模式。
    7.有用过什么框架?
    8.知道Picasso的缓存机制吗?
    9.ListView的优化。
    10.有木有在项目中用到什么设计模式?
    11.更新UI用的什么机制?(最后一个问题没听懂问的是什么,追问了面试官,面试官说了什么上层调用底层,底层再调用上层......还是没听懂,就说网络请求用的框架,在回调接口中更新UI)


    Java篇:
    1)Java中对哪个知识用的比较熟练,对你在客户端开发中作用最大。我说Collections。他就问ArrayList和LinkedList的区别是什么?底层实现是什么?

    2)HashMap和Map的区别,底层实现是什么?

    3)对二叉树了解不?我说了解啊。他问有几种遍历方式?我说三种。他就说哪三种。追问了中序遍历的实现原理是什么?

    4)多线程了解不?我说还好。他说两个进程同时要求写或者读,能不能实现?如何防止进程的同步?

    Android篇:
    5)在项目中有没有用到图片加载库?网络加载库?

    6)问我JAVA哪些先进的东西给你在Android开发带来方便?我说JSON库。知道几种JSON库,有什么区别?



        一面:

    • 自我介绍
    • 介绍一下自己做过什么项目 ps:这里会根据项目问一些问题
    • 跨线程通信 主要涉及LooperMessageHandler以及MessageQueue
    • 说一下自定义View需要注意哪些细节 主要说了一下View绘制的三大过程onDraw()不要做耗时操作 不要创建新对象 以及 怎么处理View的触摸事件
    • View的事件冲突的解决办法 ps:重写dispatchEvent()或者touch()方法
    • 手写代码:给你一个无限大的数(用字符串表示),计算这个数加一以后的结果 手写代码在这个网站进行 ps:面试官发给你一个链接 你写代码面试官会同步看到

    二面

    • 手写代码 两个有序链表合并成一个有序链表
    • Object中有哪些公有方法 ps:clone();toString();wait();notify();getClass();finalize();equals();hashCode();
    • 讲一下listView的优化方法
    • 讲一下RecycleView与listview的区别
    • view的绘制过程

    阿里

    • 问了一下大体情况 比如什么时候可以实习啊 考不考研啊
    • 都会什么算法 讲一下
    • 做过什么项目没有 讲一下项目优化的地方
    • Activity的启动模式
    • 跨线程通信
    • 夸进程通信 主要是Android的AIDL
    • 如何解析json数据和xml

    蘑菇街

    • 说说做了什么项目
    • 自定义view的几个步骤 怎么刷新view ps:onLayout(); onMeasrue();onDraw();
    • RecycleView的优化
    • 几种context的区别
    • 看过什么源码没有
    • 讲一下binder类
    • Runnable运行在哪个线程里面 ps:开启一个子线程的唯一方法就是new Thread().start();
    • HashMap和HashTable的区别
    • raw和assets文件夹的区别
    • activity关闭后尚未运行完毕的thread会怎么样 ps:会变成空进程线程,优先级最低 很容易被终止回收
    • mainfest文件的合并规则

    网易

    网易内推后笔试,过了笔试后去杭州面试 ps:报销来回车费 报销上限是600元 这个回来没记 可能不全

    一面:

    • 自我介绍
    • 跨线程通信
    • 讲了其中一个项目是怎么实现的 问jsoup怎么拼 = =
    • 用过哪些开源库 讲一下他的架构是怎样的
    • java的四种引用 虚引用的作用
    • 图片三级缓存 内存缓存满了怎么办 ps:优先级队列 满了后根据优先级主动删除一部分图片 根据LRU算法确定优先级
    • 讲一下JNI开发的过程 java怎么找到c函数 ps:JNINativeMethod保存函数对应关系 有兴趣的小伙伴可以查看我的这篇博客
    • 平时有什么爱好没有 = = ps:潜泳 可以潜好几天 然后自己浮上来

    二面:

    • activity的四中启动模式
    • service的生命周期
    • 讲一下自己的项目
    • 项目中用JNI做什么 为什么要用他呢
    • 什么是OAuth协议 做什么的
    • 其他的记不清楚了     


    2016年5月18日面的美团一面(1个小时11分钟)
    1,熟悉什么数据结构?说说各自的优缺点?数组与链表的区别?
    2,二叉树的遍历,几种遍历方式(前,中,后,深度,广度,递归,非递归)?
    3,JVM结构,内存分配,内存管理,GC
    4,四大组件,详细说
    5,handler机制(深入源码)
    6,java锁机制,线程同步
    7,java四种修饰符(private,protected,public,default)的特点
    8,静态内部类和非静态内部类的特点和区别
    9,CotentProvider的权限问题,就是怎么样使得数据对外有选择性的提供和使用


      java部分:
            1、jvm分区,GC(基本上后续所有地方面试都问了,基础中的基础)
            2、volatile和Synchronized区别
            3、原子性、可见性的概念
            4、进程与线程的区别
            5、线程池的概念、好处、常见的线程池举例
            6、Callable和Runnable的区别
            7、HashMap的内部原理
            8、ConcurrentHashMap原理
            Android部分:
            1、Android的存储方式
            2、Handler、Lopper、MessageQueue
            3、AsyncTask 为什么java已经有线程池的实现了,还要继续使用AsyncTask,AsyncTask相对于java自带的线程池的好处
            4、onTouch事件的处理机制
            5、说一下MVC以及其在Android中的应用
            6、说一下OOM以及你怎么解决的
            7、了解Android的Framework么
            8、说一下一个Android APP从点击打开开始,是怎样展示在用户面前的(Zygote、Ams、Wms等)
            网络基础部分:
            1、TCP、UDP的区别
            2、TCP的三次握手、四次挥手
            3、HTTP的特点
            4、HTTP与HTTPS的区别
            二面:
            杭州现场面,一个月了路费还没报销回来。。。现场面是一个看起来很嚣张的面试官,看你的眼神从头到尾都充满了鄙视,从一开始的感觉就很不好。。
            1、viewpager里面只能嵌套view吗 可不可以嵌套Activity
            2、假如viewpager里面的每一页都有有很大数据量的内容,那么在快速的左右滑动时,如果出现了内存被回收的情况,如何处理 假如出现了OOM,怎么处理
            3、同上情况,使用Fragment,又当如何?与viewpager有什么区别
            4、ExpandableListView的Adapter怎么写
            5、在ListView的每个item中如果可能出现的view都不一样,如何处理?动态获取view种类数量的话是不是就不能使用viewHolder进行优化?固定显示view如果不存在该种view就不显示的方法是否太耗内存
            6、ListView的Adapter的getView具体是什么机制?
            7、Activity之间传递大量的数据用什么方法
                    Binder
                    Bundle不够大
                    Socket 在同一应用中没必要使用
                    共享内存
                    static变量——同一应用中static变量如何控制,会不会并发出问题,如果Activity由于内存不足被kill掉,再重启的时候static变量的值还可靠吗:设置专门的访问类,进行读写控制,以及Activity重启后的初始化工作。
            8、SQLite在使用时 假如ActivityA是用于修改SQLite,ActivityBCDEF。。。是用来展示SQLite的内容,如何在修改SQLite的同时使得BCDEF...都立刻获得最新的数据?SQLite有没有类似于ContentObserver的这么一种监视类可以监听到SQLite内容的改变?如果广播通知所有类,那么广播可以携带多大的数据?
            9、假设把一个ActivityB向右滑动可以回到上一个ActivityA,B渐渐透明,A渐渐清晰,要怎么编写页面?说说你对android:theme的理解,说说你对alpha值的理解
            10、ListView在数据量很大图片很多的情况下怎么优化?假如一个图片,轻轻的向上滑动一丢丢,那么需要重绘吗?(什么鬼。。。)
            11、详细展开说一下所有LaunchMode的应用场景
                    假如A-》B-》C,想让C后退直接到A,使用什么样的intentflag?
                    假如A-》B-》C,C使用singleTask,C后退,后退到什么地方呢?
            12、在全屏显示高清大图的时候,网速慢的情况下如何显示?渐进式显示是怎么做到的?如果想显示下载进度圈圈,该如何实现?
            13、AsyncTask在4.x以后有什么改变?怎样改回并发执行好多个?如果一个AsyncTask结束取得结果之前Activity就因为内存原因被Destroy掉了,那会有什么情况发生?会内存泄露吗?会空指针吗?需要在Activity彻底死掉之前把AsyncTaskcancel掉吗?如果没有cancel掉,然后Activity重启了,那这个Asynctask又当如何呢?
            14、AsyncTask内部实现机理 与Thread+Handler有什么不同
            15、说一下HandlerThread
            16、你的APP里,是每个Activity都有一个Handler呢还是所有Activity共享一个Handler
            17、基于事件监听、基于事件回调 假如一个touch事件发生,那是监听器先收到还是onTouch函数先收到
            18、假如你要记录ListView滚动到的位置,要记录什么信息,view怎样获得坐标信息
            19、说一下canvas
            20、dialog和popupwindow的应用场景 如果popupwindow在没有dismiss的时候Activity finish了,会出现什么情况?
            21、了解过什么三方库?为什么不用三方库?
            22、你觉得安卓的未来在哪里?你自己为什么都用IOS了(╯‵□′)╯︵┻━┻
            23、Service和推送通知,通知有没有可能出现有推送但是通知栏收不到通知?service被kill掉会如何?如何保证service不被kill掉
            24、了不了解Scrollview scrollview和ListView有什么相似点 有什么不同 那如果这两个是继承关系 那应该是谁继承谁?
            25、dp sp px各自的应用场景是什么 换算关系是什么 使用sp的时候如果调整系统字体,显示字体会跟着调整吗?
            26、gallery为什么被废弃?为什么Google推荐使用viewpager代替gallery呢?有什么改进?
            27、handler.postAtTime不是延时post么 那handler怎么延时处理Message


    一面,40分钟,除去项目介绍等,貌似并没有问什么特殊的, 我提到我平时主要做界面,所以后面的问题大多与界面相关
            ListView的优化
            Lru如何实现的
            OOM的处理
            GC原理
            循环引用的问题
            引用计数与可达性算法
            LaunchMode 这一点我之前也是简简单单准备的有四种,每种什么意思,然后网易让我发现了,大家都知道这些,重点是要知道如何应用。美团这里问到的是我A打开了B,B打开了C,C的右上角有一个叉叉,那我怎样做到使我点击C的叉叉,就直接关闭了BC回到A,PS,不可以用startActivityForResult
            我提到我的APP中使用到了ViewPager,面试官问,假如,ViewPager里面一页的宽度超过了屏幕的宽度,ViewPager是怎么显示的,这还真没试过。。
            然后问到了app是怎么通知Android系统页面有刷新的,还有view的measure函数之类的,进而讨论到了View树,然后编程就让我写View树。。
            编程题是,因为在有的性能比较差的机型上,view树深度过大会造成crash,那么我想做一个提醒,进入APP后首先求出这个APP的最大View树深度,如果深度过大则进行提醒。其实就是二叉树的最大深度只不过换成了View树嘛,并没有什么难度。
            二面,30分钟,除去项目介绍等没有什么特殊的,期间突然看到一面面试官在操作系统那里很可爱的写了一句 忘了问了。。
            主要问了ListView的优化、HTTP与HTTPS、进程与线程,编程题是给定一个char[],然后翻转,其实就是翻转字符串啦,然后进一步的就是给出一个句子,翻转这个句子但是不翻转其中的单词,就是剑指offer那个,也很简单。
            然后问了一个智力题,说有十层楼,每层楼有一个钻石,钻石大小不一,没有规律,电梯只上不下,只能选一层下电梯,拿走该层钻石,问什么样的策略可以尽量大的拿到钻石。

    HTTPS和TCP的慢启动和拥塞控制


  • 一面 
    4月13日 16:30-16:54 电面 
    1. 网络框架实现,volley原理 
    2. 线程池原理,java提供了哪些线程池 
    3. 一个activity只能有一个进程么【对进程的理解】 
    4. activity任务栈,启动模式相关,四种启动模式 
    5. 夜间主题的实现方式 
    6. 动态加载原理,classloader理解 
    7. listview实现item左滑需要考虑的问题 
    8. view的事件分发与渲染流程 
    9. LruCache的理解,原理,以及还有哪些方式实现缓存调度 
    10. GC原理,实现方式,能否手动去控制GC回收 
    11. OOM,内存泄漏的问题有没有遇到过,如何处理

    总结: 
    问的挺广的,基本整个android包括view,到进程线程理解都问了一遍,不过只是到原理层,还没更深入到更底层源码,自己还是可以轻松应付过来的,面试官问的水平也挺棒的,挺好交流的。 
    结束的时候问了面试官对360撤出美股的看法,以及360是否会成为中国第四,哈,挺有趣的说,期待二面。

    二面 
    4月15日 10:00 45分钟 电面 
    1. mvp与mvc的区别,实现,原理 
    2. volley原理,发送五个请求(相同以及不同)时,内部所做处理?如何根据发送请求结束后,剔除相同的等待请求? 
    3. 图片缓存技术的实现,如何结合volley实现,volley自带缓存管理还是需要自己去实现,缓存的底层实现 
    4. listview原理,adapter与view是如何绑定的,如何自己设计一个类似listview的自定义view,子item复用,管理以及getView的实现 
    5. android线程模型,looper,messageQueue一套机制 
    6. 线程实现方式,thread+asynctask+handlerThread+intentService,彼此的应用场景以及原理 
    7. asynctask底层实现原理,为何不能在非主线程中实例化,其实还是跟onPre and onPost在当前线程实现有关

    总结: 
    问的其实还是比较基本的,没有特别难的问题,只要对相关的源码有一定的熟悉就能够很好回答了,看google官方的文档还是给了自己很大的帮助的,还有任玉刚的《android开发艺术探索》讲的都特别到位,啃完那本其实就能应答如流了。


    初试

    2016/4/10 上午,面试时间为1小时,喜来登酒店 
    面试官信息:从事Android底层网络框架开发

    1. 手机唯一标识方式
    2. 手机app耗电量跟什么有关,耗电优化
    3. 推送服务原理,心跳机制
    4. service使用注意事项以及原理
    5. 服务应用唤醒实现,aidl 的service更新后如何让旧的客户端兼容
    6. 多线程实现,通信原理
    7. 进程通信原理,使用订阅者模式时,服务端拿到的binder对象为何是新的实例,如何获取到真正客户端实例(RemoteCallbackList)
    8. ssl协议,握手交换密钥过程,加密算法,对称非对称加密原理

    复试

    2016/4/12 一小时 喜来登酒店 
    1. http请求,响应头内容,格式规范 
    2. tcp报头,ip报头,dns实质 
    3. lrucache原理实现,linkedhashmap底层,手写代码实现lrucache,对相关的bitmap进行管理 
    4. 线程池构造函数传参意义,手写代码实现线程池,继承方式,不能用现成的 
    5. 异步接口实现,实现跨线程通信,不能用handler,looper那一套机制 
    6. socket编程实现http请求,手写代码实现 
    7. volley原理实现


    CVTE:【offer get】

    一面:(年轻的人问的,问的挺基础的)(3月15日) 
    1. Android事件分发 
    2. scrollview特点 
    3. 处理listview图片错位方式 
    4. hashmap底层实现原理,如何处理溢出 
    5. Mvp与mvc区别,实现,架构表示 
    6. android缓存实现 
    7. 二分查找算法

    二面:(3月15日) 
    1. Java线程 run与start区别,原理实现 
    2. 打包混淆原理 
    3. volley原理,实现 
    4. jar封装的private方法能否在外部调用 
    5. 反编译方式工具及其原理 
    6. 网络请求方面如何处理 
    7. jni使用及其原理 
    8. 对称加密与非对称加密 
    9. 单例模式为什么要使用同步关键字,原理 
    10. 数学题:知道正n变形的半径,求周长,算法实现 
    11. 使用图片缓存但是服务器改了实际的图片,但url一样,如何在客户端区别



    唯品会内推

    一面(4月6日) 
    1. 线程间通信,进程间通信,binder原理 
    2. sharepreference原理 
    3. 事件分发原理 
    4. 设计模式,延迟加载实现单例模式,内部类来解决,加锁也不稳 
    5. mvp与mvc 
    6. 线程池调度实现,不能用executor(当时居然以为blockingqueue存线程呢=_=) 
    7. 动态加载,dex分包,热修复 
    8. 缓存原理实现,内存如何分配 
    9. 如何减小apk体积 
    10. 性能优化从哪几方面考虑(内存,cpu,fps,ddms灵活dump)



    阿里游戏内推【offer get】

    笔试(阿里游戏)(3月16日) 
    1. 基础数据结构与算法知识 
    2. looper,handler等原理 
    3. activity的启动模式 
    4. 与运算符 
    5. listview与recycleView的区别与优缺点 
    5. 设计模式与设计原则 
    设计模式:— 
    设计原则: 
    1)单一功能:对象仅具有一种单一功能概念 
    2)开闭原则:软件提对于拓展开放,但是对于修改封闭 
    3)里氏替换:程序中对象可以在不改变程序正确性的前提下被它的子类所替换的 
    4)接口隔离:多个特定客户端需要有宽泛用途的接口 
    5)依赖反转:依赖于抽象而不是一个实例 
    6. A向B发送消息,A能实时看到B的阅读时间,问A实现方式

    阿里内推一面:(3月18日1个小时) 
    1. volley层次结构,原理,为什么选用volley,不用其他开源框架,对开源框架的看法 
    2. MVC与MVP的区别,activity,fragment扮演的角色,presentor之间的通信问题。 
    3. 进程间的通信,binder的原理,intent与aidl的应用场景及相关比较 
    4. 图片如何缓存处理,如何处理oom 
    5. 自定义view实现,注意事项

    阿里内推二面:(3月18日1个多小时) 
    1. 发出的请求是否可以终止请求,pc网页刷新与停止的原理,跟移动浏览器的区别 
    2. 加载图片请求的超时时间设置,多少秒合适,原因,大图如何加载。 
    3. 线程间的通信,并发问题解决方案。 
    4. 快速排序为什么叫做快排,其算法复杂度,及其实现原理 
    5. 应用签名是为了什么,签名原理是什么 
    6. root之后有什么重大的变化,开发者可以操作什么 
    7. 给出九游android客户端程序,解释下相应的布局,listView做大面积的嵌套,下拉刷新的实现 
    8. 渠道提示不合法的问题,为何系统能识别渠道非法



    2. 为什么选择Android而不选iOS。(竟然没有自我介绍,直接问。。。。)
    3. 学Android多长时间了,说一说Android里你学到的知识。(顿时懵逼,我特么说的Binder机制。。。)
    4. 说一下Binder机制的底层实现。
    5. Android中进程之间通信,除了Binder还有什么?说一下底层实现原理
    6. 我看你做了几个项目,给我展示一下。说一下你项目中用到的技术 ?(千万别忘了把你写的软件装进去,别带IPhone去,我特么就是带着两个手机去的,幸亏iPhone没被发现)
    7. 给你n个数,找出出现次数最多的那个数?时间复杂度是多少?
    8. 快排的时间复杂度,最坏情况下的时间复杂度,最好情况下的时间复杂度?
    9. 手写代码:反转链表。
    10. 给你n个数,找出一个连续的数列,使数列的和最大。
    11. 你学习成绩怎么样。
    12. 计算机基础都学了哪些知识。(又懵逼。。。难道我还要挨个说大学里学的知识点么。。)
    13. 三次握手,四次挥手,为什么要用四次挥手,三次不行吗,当Client收到Server的ack后,Client还能接收来自Server的数据写入吗?
    14. 说一下Android中的事件处理流程,结合源码解释,不要直接说规律结论。
    15.系统调用的方式?系统调用发生的场景?系统调用常用函数?系统调用的具体过程?
    16. Binder的一次拷贝发生在哪里。
    17. AMS的作用?
    18. 一个Activity启动另一个Activity时函数调用流程。
    19. Android中Handler机制?
    20. 什么是ThreadLocal,一个线程可以获取到另一个线程的Looper吗?怎么获得?
    21. 使用了哈希表的数据结构有哪些?(HashTable之类的。。。)哈希表插入一个数字的时间复杂度是多少?
    22. 我看你简历里提到学过iOS,说一下iOS里有哪些知识?MRC和ARC分别指什么?详细解释一下?
    23. 你简历里提到了有过实习经历,说一下实习的公司?(一个小公司,直接没往下问了。。。)


      一面(35min).
    1. 单例模式。我答有好几种(答写过五六种),然后让我把我知道的全写出来。
    2. 从单例引到static的用法,对成员,对方法的作用,包括初始化的过程。然后问一个static对象只初始化一次需要怎么做?
    3. 构造函数的的修饰符在单例中的表现。
    4. transient关键字的作用。答序列化时不存。
    5. 序列化怎么实现?答安卓端有Serializable和Parcelable。然后问这两个有什么区别,分别怎么实现。
    6. 回到单例,synchronized关键字的作用。怎么实现的。
    7. 算法题,两个链表找相交的第一个节点。
    8. 有哪些锁,blabla我说了一大堆。
    9. 你说的这么多锁有什么区别?各自的应用场景是什么?
    10. 线程池怎么调度的知道吗?
    11. volatile的内存语义怎么解释,禁止重排序是如何保证的?

    二面 (40min)
    1. 先介绍项目,收获最大或者最想介绍的,选一个。
    2. 问fragmentPagerAdapter和fragmentStateAdapter的区别。
    3. fragment和fragment怎么通信?
    4. listview怎么优化?
    5. 网络通信怎么做的?volley的实现?
    6. http和https的区别?
    7. 有看过开源第三方库吗?
    8. 登陆注册这块的逻辑一般怎么做?
    9. canvas画了个线,怎么撤销?
    10. 性能优化怎么做?
    11. 写了多少代码?有开源项目吗?有参与开源项目吗?
    12. bitmap的本质?答到了cpp层。
    13. 阻塞队列知道吗?blockingQueue。
    14. arrayBlockingQueue和linkedBlockingQueue的区别?
    15. arrayBlockingQueue的实现?
    16. 如果要你自己实现arrayBlockingQueue怎么做?
    17. classLoader? 如何打破双亲委托?


    1activity的异常退出和启动调用的方法
    2activity和service的区别
    3service启动方式以及区别,以及service的作用
    4activity的launchmode
    5过滤规则在manifest和代码中注册有啥区别
    6布局中优化常用方法,以及分析工具,我答的时候基本围绕层级优化答得,考官建议我从过度绘制等加强学习
    7屏幕适配问题,老生常谈啦
    8bitmap加载一个100张图片的优化处理
    9lrucache和disklrucache,其中还问到软引用和弱引用的使用
    10listview的优化
    11自己用过什么开源框架,还有看过源码吗
    12react-native的通信机制
    13arraylist和hashmap的原理及区别
    14有什么想要了解的?

    三面问题:
    1react-native的通信机制
    2react-native和phonegap的区别
    3自己在项目中开发遇到的坑关于react-native
    4有没有看过react-native的源码,能否讲讲最熟悉的源码
    5线程和进程的区别,线程自己有没有自己的内存
    6多线程带来的影响
    7binder的机制
    8android为什么使用binder进行跨进程通信


    1.Andorid四大组件
    2.anroid生命周期,opause,onStop区别
    3.Fragment,是否看过源码,如何启动
    4.Service有哪几种
    5.隐式启动和显示启动
    6.Service两种启动方式
    6.启动线程方式有哪几种
    7.handle消息队列相关
    8.几种常用布局,布局到group树过程。。。。
    9.weight属性
    10.布局优化相关
    11.Arraylist LinkList
    12.线程进程区别
    13.一个app能否是多进程?(大概)

    阿里巴巴一面(2016.3.17)

    1. 如何开启多个网络异步请求
    2. 线程池内线程的数量如何确定
    3. 说说OKHTTP的实现
    4. UIM的实现
    5. 如何学习android
    6. 前沿技术
    7. 完全二叉树、满二叉树、平衡二叉树的区别
    8. arraylist与hashmap的底层实现
    9. converview一些知识点
    10. oom如何发现
    11. handler出现oom如何解决
    12. 页式管理和段页式管理出现缺页情况怎么办
    蘑菇街一面(2016.3.18)——蘑菇街忘了很多
    1. 介绍自己和项目
    2. 在项目中遇到的问题如何解决
    3. UIM的实现
    4. 几个算法题:给个链表,寻找倒数第K个节点;给一个升序数组和数值,找到数组内的两个数值相加等于给定数值
    5. tcp和udp什么区别
    CVTE一面(2016.3.21)
    1. 介绍一下自己最满意的项目
    2. 讲一下mvp,mvp和mvc区别
    3. 讲一下用过的开源项目,说一下如何实现
    4. 设计模式
    5. asynctask实现
    6. 线程池如何使用
    7. 如何实现多进程,进程间如何通信,具体讲一下socket
    8. surfaceView
    9. 如何进行界面优化
    10. 如何实现缓存
    11. 三分钟写一个算法:给一句话the sky is blue 实现逆转 blue is sky the


    1、listview的原理,底层实现
    2、volley框架原理
    3、插件化开发原理以及在项目中应用
    4、ImageLoader中内存分几级?这个我说lrucache和diklrucache,面试官告诉我不对
    5、arraylist和hashmap的实现
    6、react-native相关开发技术


    1 有没有用android做过什么项目 的?

    2 IoC的思想?

    3 AOP的思想?

    4 为什么用mvp?mvp与mvc的区别?

    5 问了一个C++的问题, 没听清楚啊。。。。我就说我对c++了解限于在用c++做算法题的;

    6、平时用什么做异步任务啊?

    7、 为什么android要推出handler啊?handlder能不能用在线程中创建啊?

    8、AysnTask的源码分析,能不能在其他线程中创建的?
        面试官竟然说他没听清楚的啊。。。第一次面试,到底是紧张了啊。。。

    9、问我是怎么学android的?

    10、看过哪些的技术文章啊?
    好像忘了一个关于android进程的问题,哪些android进程不能被杀死的?








    你可能感兴趣的:(常见题集锦)