• UID15
  • 登录2017-07-17
  • 粉丝48
  • 关注40
  • 发帖447
  • 主页
  • 金币1848枚
社区居民
喜欢达人
原创写手
janking 发布于2016-02-01 17:16
25/22566

Android工程师面试题大全

楼层直达
校招的日子结束了,结果也算圆满。忙碌了一阵子,现在终于可以安安静静的做做项目看看书写写论文了。下面对这段时间面试遇到的问题并结合网上各位的大神秒下的面试题做个总结,本文会持续更新,希望能在面试中助各位一臂之力!

Java基础:
1、内存泄露的原因:
  1. 资源对象没关闭。
    如Cursor、File等资源。他们会在finalize中关闭,但这样效率太低。容易造成内存泄露。
    SQLiteCursor,当数据量大的时候容易泄露
  2. 使用Adapter时,没有使用系统缓存的converView。
  3. 即时调用recycle()释放不再使用的Bitmap。
    适当降低Bitmap的采样率,如:
    BitmapFactory.Options options = newBitmapFactory.Options();    
    options.inSampleSize = 2;//图片宽高都为原来的二分之一,即图片为原来的四分之一    
    Bitmap bitmap =BitmapFactory.decodeStream(cr.openInputStream(uri), null, options); preview.setImageBitmap(bitmap);
  4. 使用application的context来替代activity相关的context。
    尽量避免activity的context在自己的范围外被使用,这样会导致activity无法释放。
  5. 注册没取消造成内存泄露
    如:广播
  6. 集合中的对象没清理造成的内存泄露我们通常把一些对象的引用加入到了集合中,当我们不需要该对象时,并没有把它的引用从集合中清理掉,这样这个集合就会越来越大。如果这个集合是static的话,那情况就更严重了。
  7. Handler应该申明为静态对象, 并在其内部类中保存一个对外部类的弱引用。如下:
static class MyHandler extends Handler 
{
       WeakReference<Activity > mActivityReference;
       MyHandler(Activity activity)
      { 
            mActivityReference= new WeakReference<Activity>(activity);
      }
     @Override
     public void handleMessage(Message msg)
    {
           final Activity activity = mActivityReference.get();
           if (activity != null)
          {
                 mImageView.setImageBitmap(mBitmap);
          }    
     }
}


2、ArrayList和LinkedList的区别
  • ArrayList初试大小为10,大小不够会调用grow扩容:length = length + (length >> 1)
  • LinkedList中Node first,last。分别指向头尾
  • ArrayList和LinkedList在性能上各 有优缺点,都有各自所适用的地方,总的说来可以描述如下:

  1. 对ArrayList和LinkedList而言,在列表末尾增加一个元素所花的开销都是固定的。对
    ArrayList而言,主要是在内部数组中增加一项,指向所添加的元素,偶尔可能会导致对数组重新进行分配;而对LinkedList而言,这个开销是
     统一的,分配一个内部Entry对象。
  2. 在ArrayList的 中间插入或删除一个元素意味着这个列表中剩余的元素都会被移动;而在LinkedList的中间插入或删除一个元素的开销是固定的。
  3. LinkedList不 支持高效的随机元素访问。
  4. ArrayList的空 间浪费主要体现在在list列表的结尾预留一定的容量空间,而LinkedList的空间花费则体现在它的每一个元素都需要消耗相当的空间
     可以这样说:当操作是在一列
    数据的后面添加数据而不是在前面或中间,并且需要随机地访问其中的元素时,使用ArrayList会提供比较好的性能;当你的操作是在一列数据的前面或中
     间添加或删除数据,并且按照顺序访问其中的元素时,就应该使用LinkedList了。


3、hashmap和hashtable的不同
  1. 继承不同。
    public class Hashtable extends Dictionary implements Map
    public class HashMap extends AbstractMap implements Map
  2. Hashtable 中的方法是同步的,而HashMap中的方法在缺省情况下是非同步的。在多线程并发的环境下,可以直接使用Hashtable,但是要使用HashMap的话就要自己增加同步处理了。
  3. Hashtable中,key和value都不允许出现null值。
    在HashMap中,null可以作为键,这样的键只有一个;可以有
    一个或多个键所对应的值为null。当get()方法返回null值时,即可以表示
    HashMap中没有该键,也可以表示该键所对应的值为null。因此,在HashMap中不能由get()方法来判断HashMap中是否存在某个键,
     而应该用containsKey()方法来判断。
  4. 两个遍历方式的内部实现上不同。
    Hashtable、HashMap都使用了 Iterator。而由于历史原因,Hashtable还使用了Enumeration的方式 。
  5. 哈希值的使用不同,HashTable直接使用对象的hashCode。而HashMap重新计算hash值。
    6.Hashtable和HashMap它们两个内部实现方式的数组的初始大小和扩容的方式。HashTable中hash数组默认大小是11,增加的方式是 old*2+1。HashMap中hash数组的默认大小是16,而且一定是2的指数。

  6. 4、Iterator和Enumeration的不同

  1. 函数接口不同
    Enumeration只有2个函数接口。通过Enumeration,我们只能读取集合的数据,而不能对数据进行修改。       Iterator只有3个函数接口。Iterator除了能读取集合的数据之外,也能数据进行删除操作。
  2. Iterator支持fail-fast机制,而Enumeration不支持。       Enumeration 是JDK
    1.0添加的接口。使用到它的函数包括Vector、Hashtable等类,这些类都是JDK
    1.0中加入的,Enumeration存在的目的就是为它们提供遍历接口。Enumeration本身并没有支持同步,而在Vector、
    Hashtable实现Enumeration时,添加了同步。而Iterator 是JDK
    1.2才添加的接口,它也是为了HashMap、ArrayList等集合提供遍历接口。Iterator是支持fail-fast机制的:当多个线程对
    同一个集合的内容进行操作时,就可能会产生fail-fast事件。

ail-fast 机制是java集合(Collection)中的一种错误机制。当多个线程对同一个集合的内
容进行操作时,就可能会产生fail-fast事件。例如:当某一个线程A通过iterator去遍历某集合的过程中,若该集合的内容被其他线程所改变
了;那么线程A访问集合时,就会抛出ConcurrentModificationException异常,产生fail-fast事件。

5、接口的注意点
  1. 接口中的字段全部默认为 public static类型。
  2. 接口中的方法全部默认为 public类型。
  3. 接口中可以申明内部类,而默认为public static,正因为是static,只是命名空间属于接口,代码逻辑不属于接口。所以不违法接口定义。
  4. 接口本身可以申明为public或者缺省。
  5. 抽象类继承自某接口。如果在抽象类中实现了父类(接口)中的方法,在其子类可以不用实现,否则在子类必须实现。


6、final方法
将方法声明为final那有两个原因,第一就是说明你已经知道这个方法提供的功能已经满足你要求,不需要进行扩展,并且
也不允许任何从此类继承的类来覆写这个方法,但是继承仍然可以继承这个方法,也就是说可以直接使用。第二就是允许编译器将所有对此方法的调用转化为
inline调用的机制,它会使你在调用final方法时,直接将方法主体插入到调用处,而不是进行例行的方法调用,例如保存断点,压栈等,这样可能会使
你的程序效率有所提高,然而当你的方法主体非常庞大时,或你在多处调用此方法,那么你的调用主体代码便会迅速膨胀,可能反而会影响效率,所以你要慎用
final进行方法定义。



Android知识点

1、Handler机制
  1. Handler对Activity finish影响。
    在开发的过程中碰到一个棘手的问题,调用Activity.finish函数
    Acitivity没有执行生命周期的ondestory函数,后面查找半天是因为有一个handler成员,因为它有一个delay消息没有处理,调用
    Activity.finish,Activity不会马上destory,所以记得在Ativity
    finish前清理一下handle中的未处理的消息,这样Activity才会顺利的destory
  2. Looper
    通过调用Looper.prepare()创建Looper()对象并绑定到ThreadLocal变量中。
    Looper里面包含了messageQueue。
    构造器如下:
    private Looper()
    {
         mQueue = new MessageQueue();
         mRun = true;
         mThread = Thread.currentThread();
    }
  3. loop()函数
    1)从Looper中取出MessageQueue;
    2)循环从MessageQueue中取出Message;
    3)从Message中取出Target(Handler对象);
    4)调用tartget的dispatchMessage分发消息。
  4. Handler对象
     重要成员变量:
    final MessageQueue mQueue;
    final Looper  mLooper;
    final Callback mCallback;   //用于回调

    Handler对象在发送消息的时候,将MSG的target变量设为自己。这样在Looper对象循环取出msg的时候就可以调用对应handler的dispatchMessage()。此函数分发消息的优先级如下:
    Message在创建的时候调用Obtain设置了Callback。
    Handler在创建的时候传入了Callback。
    交给Handler子类的HandleMessage处理(通常的做法)。


2、Android启动模式

standard和singleTop模式。
这两种比较简单。创建Activity放入当前的任务栈中,若当前是singleInstace,则放入设置的任务栈中。其中如果Activity在栈顶,则调用onNewIntent。
singletask:栈内复用模式。不是在当前任务栈中查找是否存在,实际过程如下:
  1. 查找该Activity所需的任务栈是否存在(由taskAffinity控制,或者默认为包名)。
  2. 在任务栈当中查找该Activity是否存在。
    这里面存在任务栈的切换,也就是当开启的singtask类型的Activity不属于当前任务栈时,则会切换到其任务栈。
singleInstance:单实例模式。
包含了singleTask的所有特性,另外加上:设置为该模式的Activity,只能单独存在于一个任务栈中。当有两个singleInstace的Activity设置成同样的任务栈时,会出现两个同名的任务栈,分别用来存放同名的Activity。
注:在任何跳转的时候,首先调用本Activity的onPause,然后跳转。如果被跳转的activity由于启动方式而没创建新的实例,则会先调用onNewIntent,然后按照正常的生命周期调用。

1:A→B,A:onPause;B:onCreate,onStart,onResume。
2:A(singleTop)→A,A:onPause;A:onSaveInstanceState;A:onResume。

3、View的绘制

推荐郭霖大神的博客:
http://blog.csdn.net/guolin_blog/article/details/16330267

4、canvas的使用
推荐以下博客:
http://blog.csdn.net/qinjuning/article/details/6936783

5、ActivityManagerService的相关知识点
推荐以下博客:
http://wiki.jikexueyuan.com/project/deep-android-v2/activity.html

6、Activity切换时生命周期交集
Activity之间的协作当一个activity A启动了另外一个activity B,它们的生命周期是有交叉的;
首先A的onPause()被调用;
之后B的onCrate(), onStart()及onResume() 方法会被调用(此时B拥有用户焦点);
最后,如果A在屏幕上不可见,onStop()方法被调用;
因此,我们在两个activities中传递数据,或者共享资源时(如数据库连接),需要在前一个activity的onPause()方法而不是onStop()方法中进行;


7、Hybrid(重要加分项)
  1. java和JS的交互
    http://droidyue.com/blog/2014/09/20/interaction-between-java-and-javascript-in-android/
    http://rensanning.iteye.com/blog/2043049
  2. WebView开启JavaScript脚本执行
  3. WebView设置供JavaScript调用的交互接口。


8、网络编程
      volley
  1. https://bxbxbai.github.io/2014/09/14/android-working-with-volley/
    http://blog.csdn.net/guolin_blog/article/details/17656437
  2. 如何控制TCP连接时的拥塞
    http://blog.csdn.net/yechaodechuntian/article/details/25429143
  3. 三次握手
    http://blog.csdn.net/whuslei/article/details/6667471
  4. Android客户端和服务端如何使用Token和Session
    http://wyong.blog.51cto.com/1115465/1553352
  5. 移动端获取网络数据优化的几个点连接复用 :
    节省连接建立时间,如开启 keep-alive。
    对于 Android 来说默认情况下 HttpURLConnection 和 HttpClient 都开启了    keep-alive。只是 2.2 之前 HttpURLConnection 存在影响连接池的 Bug,具体可见:Android HttpURLConnection 及 HttpClient 选择
  6. 请求合并:
    即将多个请求合并为一个进行请求,比较常见的就是网页中的 CSS Image Sprites。如果某个页面内请求过多,也可以考虑做一定的请求合并。
  7. 减少请求数据的大小:
    对于post请求,body可以做gzip压缩的,header也可以作数据压缩(不过只支持http 2.0)。
  8. 返回的数据的body也可以作gzip压缩,body数据体积可以缩小到原来的30%左右。(也可以考虑压缩返回的json数据的key数据的体积,尤其是针对返回数据格式变化不大的情况,支付宝聊天返回的数据用到了)
  9. 根据用户的当前的网络质量来判断下载什么质量的图片(电商用的比较多)。


9、android开发中,可能会导致内存泄露的问题
  1. 不要让生命周期长于Activity的对象持有到Activity的引用
  2. 尽量使用Application的Context而不是Activity的Context
  3. 尽量不要在Activity中使用非静态内部类,因为非静态内部类会隐式持有外部类实例的引用(具体可以查看细话Java:”失效”的private修饰符了解)。如果使用静态内部类,将外部实例引用作为弱引用持有。
  4. 垃圾回收不能解决内存泄露,了解Android中垃圾回收机制
    **更多内容可以参考以下博客:
    http://spencer-dev.lofter.com/post/d7b9e_6faf120


10、activity的启动过程:
http://www.cloudchou.com/android/post-788.html

以上是我遇到和搜集到的各类题目以及相应的解答,接下来一段时间也会持续更新,大家遇到什么经典或者不会的问题也可以给我留言,在此统一分享给大家。祝大家能够找到自己心仪的工作,前途一片光明!



文章转自简书原文)         感谢作者:超低空

0人打赏
  • UID569
  • 登录2016-02-02
  • 粉丝2
  • 关注1
  • 发帖1
  • 主页
  • 金币10枚
社区居民
w670268787 发布于2016-02-02 16:09
沙发F
收藏了, 挺好的! 谢谢
  • UID15
  • 登录2017-07-17
  • 粉丝48
  • 关注40
  • 发帖447
  • 主页
  • 金币1848枚
社区居民
喜欢达人
原创写手
janking 发布于2016-02-03 09:21
板凳F
w670268787:收藏了, 挺好的! 谢谢回到原帖
  还有不错的话,可以补充一下哈
  • UID276
  • 登录2016-02-18
  • 粉丝1
  • 关注1
  • 发帖1
  • 主页
  • 金币9枚
123456 发布于2016-02-18 15:21
地板F
lz辛苦了,谢谢分享
  • UID15
  • 登录2017-07-17
  • 粉丝48
  • 关注40
  • 发帖447
  • 主页
  • 金币1848枚
社区居民
喜欢达人
原创写手
janking 发布于2016-02-18 15:30
4楼F
123456:lz辛苦了,谢谢分享回到原帖
多谢支持啊
  • UID7461
  • 登录2016-06-08
  • 粉丝1
  • 关注0
  • 发帖211
  • 主页
  • 金币191枚
社区居民
忠实会员
android_chao 发布于2016-02-18 15:31
5楼F
学习了,多谢分享。
  • UID7296
  • 登录2016-11-13
  • 粉丝0
  • 关注0
  • 发帖2
  • 主页
  • 金币32枚
社区居民
晋国武士 发布于2016-02-18 16:05
6楼F
学习了,多谢分享
雄关漫道真如铁,而今迈步从头越
  • UID15
  • 登录2017-07-17
  • 粉丝48
  • 关注40
  • 发帖447
  • 主页
  • 金币1848枚
社区居民
喜欢达人
原创写手
janking 发布于2016-02-18 16:12
7楼F
晋国武士:学习了,多谢分享回到原帖
嗯  大家共勉    有好的东西  共享
  • UID1427
  • 登录2016-03-01
  • 粉丝0
  • 关注0
  • 发帖2
  • 主页
  • 金币8枚
社区居民
GE159 发布于2016-02-19 10:15
8楼F
正好准备年后找工作  谢谢分享
  • UID15
  • 登录2017-07-17
  • 粉丝48
  • 关注40
  • 发帖447
  • 主页
  • 金币1848枚
社区居民
喜欢达人
原创写手
janking 发布于2016-02-19 10:38
9楼F
GE159:正好准备年后找工作  谢谢分享回到原帖
嗯  正确对待找工作这件事
  • UID7849
  • 登录2016-02-20
  • 粉丝0
  • 关注0
  • 发帖4
  • 主页
  • 金币16枚
qq_dLqmsal14559 发布于2016-02-20 09:11
10楼F
正好需要,看看
  • UID7904
  • 登录2016-02-20
  • 粉丝0
  • 关注0
  • 发帖1
  • 主页
  • 金币13枚
qq_Wi6flF514559 发布于2016-02-20 21:43
11楼F
32个攒
  • UID8074
  • 登录2016-02-22
  • 粉丝0
  • 关注0
  • 发帖5
  • 主页
  • 金币8枚
S.H.I.E.L.D. 发布于2016-02-22 13:47
12楼F
不错齇,都是面试时候的心得体会,日后有用,thx
  • UID15
  • 登录2017-07-17
  • 粉丝48
  • 关注40
  • 发帖447
  • 主页
  • 金币1848枚
社区居民
喜欢达人
原创写手
janking 发布于2016-02-22 14:27
13楼F
S.H.I.E.L.D.:不错齇,都是面试时候的心得体会,日后有用,thx回到原帖
  • UID8688
  • 登录2016-03-18
  • 粉丝0
  • 关注0
  • 发帖4
  • 主页
  • 金币10枚
qq_IE7djop14564 发布于2016-02-26 01:01
14楼F
挺好的.............
  • UID15
  • 登录2017-07-17
  • 粉丝48
  • 关注40
  • 发帖447
  • 主页
  • 金币1848枚
社区居民
喜欢达人
原创写手
janking 发布于2016-02-26 09:37
15楼F
qq_IE7djop14564:挺好的.............回到原帖
多谢支持  
  • UID8696
  • 登录2016-02-26
  • 粉丝0
  • 关注0
  • 发帖3
  • 主页
  • 金币2枚
社区居民
csj 发布于2016-02-26 10:04
16楼F
挺好的
  • UID1804
  • 登录2016-03-07
  • 粉丝0
  • 关注0
  • 发帖7
  • 主页
  • 金币0枚
Android_Mr.施 发布于2016-03-02 11:47
17楼F
挺好的 感谢分享
1 2
您没填页码……^^页码应该是数字才对吧!^^零页?你当我是实体书……^^负数页……你又调皮了!^^帖子君一共才 ^^ 页……^^本页就是第 ^^ 页。
perv die Page1of2 next
您需要登录后才可以回帖
发表回复
极贡献
技术问答
专题荟萃
程序人生
视觉设计
Android开发
iOS开发
编程语言
前端开发
后端开发
服务器架构
软件测试
运维方案
创业路上



最热文章墙

  • 79397/378   【精品推荐】200多种Android动画效果的强悍框架,太全了,不看这个,再有动画的问题,不理你了^@^

  • 45296/191   情人节福利,程序员表白的正确姿势:改几行代码就变成自己的表白了

  • 44990/0   Python爬虫:常用浏览器的useragent

  • 41473/260   【精品推荐】Android版产品级的音乐播放器源码,功能太强大了,最好的产品原型有木有?

  • 38683/145   省时省力的Android组件群来了,非常棒的原型参考

  • 30061/142   2016抢红包软件及源码

  • 29293/2   超全!整理常用的iOS第三方资源

  • 29289/71   原创表白APP,以程序员的姿势备战新年后的7夕,持续完善中!

  • 24354/160   Android版类似UC浏览器:非常赞,产品级的源码

  • 22868/30   麻省理工的一帮疯子,真的实现了随意操控万物!(绝对黑科技)

  • 22566/25   Android工程师面试题大全

  • 22492/27   2016程序员跳槽全攻略

  • 21953/9   GitHub上排名前50的iOS项目:总有一款你用得着

  • 20910/20   码魂:程序员的牛B漫画

  • 19063/85   Android小而全的博客源码:非常适合全面掌握开发技巧

  • 19051/73   【持续更新中】Android福利贴(二):资料源码大放送

  • 19018/10   2016年最全的Android面试考题+答案 精编版

  • 18920/42   一个绚丽的loading动效分析与实现!

  • 18765/3   吐槽那些程序员的搞笑牛逼注释

  • 17640/45   惊艳的App引导页:背景图片切换加各个页面动画效果

  • 17633/1   iOS 动画总结

  • 17510/82   仿京东商城客户端Android最新版,不错的原型和学习资料

  • 17470/104   Android带弹幕的视频播放器源码,来自大名鼎鼎的Bilibili弹幕网站

  • 17148/23   个人收集的Android 各类功能源代码

  • 16688/5   新一代Android渠道打包工具:1000个渠道包只需要5秒

  • 16618/21   Android福利第三波【Android电子书】

  • 16438/53   基于瀑布流的美女图片浏览App,有注释的源代码

  • 16418/81   【精品推荐】类似360安全卫士安Android源码:非常赞的产品原型

  • 16404/10   女程序员的梦,众网友的神回复

  • 16363/0   iOS中文版资源库,非常全

  • 16341/17   用JavaScript 来开发iOS和Android 原生应用:React Native开源框架中文版来啦

  • 16094/11   年会上现场review代码是怎么样的体验!

  • 16042/23   珍藏多年的素材,灵感搜寻网站

  • 15524/18   65条最常用正则表达式,你要的都在这里了

  • 14853/15   基于Android支付宝支付设计和开发方案

  • 14258/11   有木有这样一张酷图帮你集齐所有git命令超实用

  • 14189/17   什么是真正的黑客:收获12200+Stars,人气远超微软开源VS

  • 13970/46   在线音乐播放器完整版(商用级的源码):非常赞,可听免费高品质专辑

  • 13719/0   GitHub iOS 库和框架Top100 

  • 13671/61   【技巧一】搭配Android Studio,如何实现App远程真机debug?

  • 13566/7   用程序员的姿势抢过年的火车票

  • 13522/7   一张图搞定iOS学习路线,非常全面

  • 13149/10   成为Java顶尖程序员 ,看这11本书就够了

  • 13107/10   微信支付终于成功了(安卓,iOS),在此分享

  • 12998/18   一张图搞定Android学习路线,非常全面

  • 12810/29   【持续更新中】Android福利贴(一):资料源码

  • 12745/3   基于Node.js的强大爬虫,能直接发布抓取的文章哦

  • 12490/4   46 个非常有用的 PHP 代码片段

  • 12013/3   即时通信第三方库

  • 11452/8   流媒体视频直播方案

  • 11382/18   八个最优秀的Android Studio插件

  • 11256/9   B站建开源工作组:APP想支持炫酷弹幕的看过来

  • 11046/9   烧了5亿美金,这家神秘的公司即将颠覆人类未来!

  • 11031/2   【精品推荐】高质量PHP代码的50个实用技巧:非常值得收藏

  • 10952/10   中国黑客的隐秘江湖:攻守对立,顶尖高手月入千万美元

  • 10226/6   开箱即用!Android四款系统架构工具

  • 10016/10   十大技巧快速提升Android应用开发性能

  • 9973/3   10款GitHub上最火爆的国产开源项目——可以媲美西半球

  • 9919/1   Android性能优化视频,文档以及工具

  • 9808/0   基于node-webkit跨平台应用案例集之(一)

  • 返回顶部