Android面试题目总结

最近刚换了工作,在这里把各互联网公司问到的题目做下总结。涉及的内容都是Android研发应该掌握的基础问题,我把题目大概分为Java,设计模式,Android,网络,算法五类。最后边列一下自己看过的技术书籍,希望大家都能提高自己,找到心仪的工作。

JAVA篇

  1. JAVA内存回收机制 
    需要了解引用计数法,可达性分析法。 
    需要知道标记清除,标记复制,标记整理。 
    JVM分代回收算法流程。 
    Java7的的新垃圾回收器。 
    详细可以去看《深入理解JAVA虚拟机》这本书

  2. JAVA中的引用,强引用,软引用,弱引用,虚引用 
    能说清各个引用的意思,了解ReferenceQueue,square公司的LeakCanary框架,MAT工具等。

  3. final关键字使用场景 
    修饰类,修饰方法,修饰变量的意义

  4. static关键字使用场景 
    修饰类,修饰变量,修饰方法,静态块,静态导入。

  5. 集合类相关 
    ArrayList,LinkedList,HashMap,TreeMap等内部实现原理。 
    ArrayList与LinkedList区别,ArrayList与Vector的区别,HashMap与HashTable区别。

  6. 内部类,静态内部类,局部内部类简介,及内部类为什么默认持有外部类的引用 
    JAVA编译器会在内部类中加入类型为外部类的成员变量,并提供相关参数的构造函数

  7. JAVA中如何实现多继承 
    通过实现多个接口及内部类的方式

  8. 线程池相关 
    搞清Executor,ExecutorService,ThreadPoolExecutor关系。ThreadPoolExecutor中的参数使用。可以结合Executors工具类的newFixedThreadPool,newSingleThreadExecutor,newCachedThreadPool等方法说一说 
    简述下线程池原理,当时没看过源码,结合Volley中自己实现的线程池说了说,主要涉及到BlockingQueue,核心线程,最大线程等概念,需要多看源码

  9. JAVA线程的几种状态,如何终止线程,进程与线程的区别。 
    创建,就绪,运行,阻塞(同步块,IO阻塞),主动睡眠,主动等待,销毁。

  10. JAVA的wait,notify,notifyAll的用法,wait与sleep的区别 
    wait挂起当前线程,等待sychronized的对象,notify唤醒一个wait的线程,notifyAll唤醒所有wait的线程。wait后线程会放弃锁,sleep会持有锁。

  11. 什么是线程安全,如何保证线程安全

  12. JAVA的concurrent中的一些类,JAVA的锁 
    一些原子操作类,一些并发操作的集合类,一些更灵活的锁

  13. JAVA并发内存模型,三大特性(原子性,可见性,有序性),volatile,synchronized关键字 
    注意volatile的作用使用场景,原理,

  14. 什么是多态,多态的使用场景,使用多态的意义

  15. switch中可以使用的类型 
    int,byte,short,char,枚举,JAVA7以上String,case后必须final的变量

  16. JAVA的ClassLoader,双亲委派 
    判断一个类是否相同,类加载器与类全名称都得相同,优先委托父类加载器来加载类

  17. JAVA对象的初始化顺序 
    加载类 
    初始化父类静态变量 
    执行父类静态块 
    初始化子类静态变量 
    执行子类静态块 
    初始化父类成员变量 
    执行父类构造函数 
    初始化子类成员变量 
    执行子类构造函数

  18. try,catch,finally执行顺序,finalize的调用时机,作用。

  19. JAVA的异常 
    都实现Throwable接口,分Error,Exception两类

  20. instanceof与getClass的区别 
    object是否可以强转为某类型,可以用instanceof判断。getClass获得即某对象的Class对象

  21. Iterator,foreach,for,效率与线程安全 
    Iterator迭代器可以在迭代过程中调用remove方法,做移除操作。foreach类似于迭代器,缺陷是不能移除,会出现并发异常。for过程中可以移除操作,注意一个问题索引问题。

  22. String,StringBuilder,StringBuffer

  23. object类中都有什么方法,重写equals方法也要重写hashcode方法。

  24. long是否可以移位操作

设计模式篇

  1. 面向对象的六大原则 
    单一职责原则 
    里氏替换原则 
    依赖倒置原则 
    接口隔离原则 
    开闭原则 
    迪米特原则

  2. 单例模式,最常被要求手写的设计模式 
    一般写懒汉式:双重判断的写法(使用了volatile关键字,由于禁用指令重排优化,有一定的性能损耗),内部静态类写法(利用了JAVA类加载机制保证了线程安全),枚举写法(简单逼格高,出现在effective java中,支持序列化),最好能说出他们的各种优势缺点

  3. 观察者模式

  4. 工厂模式:简单工厂,工厂方法,抽象工厂

  5. 代理模式(代理模式的意义与作用)

  6. 装饰模式(Context,JAVA的流相关类,装饰模式与代理模式区别)

  7. 组合模式(Android的View与ViewGroup)

  8. 建造者模式(AlertDialog)

  9. 上述只是列出了几个简单常用的,还有其他自己应用过的设计模式(创建型,结构型,行为型),最好结合自己的项目说一说,或者结合Android源码讲讲,推荐书籍《Head First Design Pattern》《Android源码设计模式解析与实战》

  10. MVP,MVC,MVVM等等,结合自己的项目讲讲。

Android篇

  1. 消息机制

    • Handler,Looper,Message原理(几乎所有技术面都会问到,最好详细阅读下源码,能讲清各个类的关系,他的消息处理流程,最好详细看懂MessageQueue的next 方法,了解native层的消息机制。epoll机制等等,我自己阅读源码的分析(写的不好请大家多多包涵)http://blog.csdn.net/industriously/article/details/50933315
    • 被问到的几个Handler的问题:Activity内部Handler是否可以创建多个,Looper会把消息发给哪个Handler;子线程是否可以直接创建Handler,可以了解下HandlerThread与IntentService这两个类;
    • Message队列是个链表,插入删除如何保证线程安全,非线程安全会出现什么后果,画图描述下;Message.obtain()为啥效率高。
  2. Activity生命周期(onSaveInstanceState 的调用时机,onWindowFocusChange调用时机,onConfigurationChanged)

  3. Activity的四中启动模式,与onNewIntent回调

  4. Fragment生命周期(结合实际例子分析)

  5. Fragment与Activity通信

  6. Fragment使用中踩过的坑 
    (必须有一个参数为空的public构造函数,getActivity()空指针,与viewPager使用生命周期函数不会被调用,show,hide方法在被回收后恢复的fragment重叠问题等等,纯fragment架构坑比较多)

  7. Service的生命周期(start,bind两种)

  8. Service的onStartCommand方法的返回值,及其意义(START_STICKY,START_NO_STICKY,START_REDELIVER_INTENT,START_STICKY_COMPATIBILITY)

  9. Service运行在哪个进程,哪个线程。

  10. Android的事件派发机制,画出一些View嵌套之后,能讲清DOWN,MOVE,UP是怎么传递的。dispatchTouchEvent,onInterceptTouchEvent,onTouchEvent。如何处理事件冲突。 
    《Android开发艺术探索》中有一章专门介绍了事件的传递,与冲突处理。 
    requestDisallowInterceptTouchEvent,onInterceptTouchEvent两个方法

  11. 事件是如何知道要派发到哪个view上的 
    MotionEvent中有点击的x,y坐标,结合view自身的坐标大小,应该可以判断。

  12. Android的绘制流程,如何使用onMeasure,onLayout,onDraw方法,ViewGroup的onDraw在没有背景下不调用,可以调用dispatchDraw。结合自己写过的自定义控件说一说。

  13. Android实现View移动的方法 
    Scroller(注意移动的是子view),layout等等,详细在《Android群英传》中有一章做了详细介绍。

  14. AsyncTask的原理(Handler,线程池,Future),AsyncTask使用过程的坑。

  15. HandlerThread的原理,与IntentService的原理。

  16. 说一说Android中的动画

  17. 视频播放涉及到的,MediaPlayer的生命周期

  18. SurfaceView与View的区别

  19. RemoteView的用处 
    桌面小部件,通知栏的自定义布局。

  20. Android进程优先级 
    前台进程,可见进程,服务进程,后台进程,空进程

  21. Android的夸进程通信 
    AIDL,Messager,Binder,其实都是基于Binder,有兴趣可以阅读Binder源码,很有挑战性。 
    其他:文件,数据库,xml,socket等

  22. Android插件化原理,结合流行的插件原理,与自家公司的插件框架讲讲。还有插件如何通信。

  23. Android常见的框架OKHttp,Volley,Retrofit,OrmLite,ImageLoader,Fresco,LeakCanary,Rx Java,React Native,fastjson等自己熟悉的,最好看过他们源码,能讲清原理。

  24. ListView如何优化 
    adapter的优化,Android群英传,中有讲。

  25. UI优化(内存优化,绘制优化,布局优化)

  26. 内存泄露处理,一般Context的泄露。如何发现,处理。

  27. Intent-Filter过滤规则,显示意图,隐式意图。

  28. 常用adb命令

  29. Android的大图载入 
    保证不OOM; 
    LRU cache; 
    先Decode基本信息,在Decode具体数据; 
    RegionBitmapDecoder加载局部图形数据。

  30. 图形矩阵变换,颜色矩阵变换

  31. 如何避免ANR

  32. JAVA对象序列化与Android序列化

  33. apk的打包流程

  34. sqlite数据库相关的

  35. 看过哪些Android源码(加分项) 
    结合自己看过的源代码说一说,面试官很喜欢有钻研精神的人。推荐书籍邓凡平《深入理解Android源码》,老罗博客悠然红茶的博客(感觉这个比老罗的源码分析写的通俗易懂),鸿洋博客

  36. 开放问题:关注过哪些Android新技术,对Google IO大会关注,你如何做性能优化的。

网络篇

  1. TCP协议三次握手过程及其的目的。TCP断开4次挥手。

  2. TCP,UDP的区别。

  3. http属于哪一层

  4. http请求的时候都发生了什么

  5. http协议分为几部分,请求行(GET,POST,PUT,DELETE等方式,协议版本号,请求路径),请求头(包含的字段),请求体;响应行(返回状态码),响应头(包含的字段),响应体。

  6. Get,Post区别

  7. http请求头响应头都有哪些字段,说说keep-alive,trunk,range字段

  8. 优酷面试被问到:http的pipeline(这个之前没听过),移动wap的代理,发送一个http请求会有什么区别

  9. http断点下载原理

  10. push服务原理,xmpp协议

算法篇

  1. 基本排序算法:快速排序,堆排序,归并排序,冒泡排序,插入排序,选择排序,希尔排序。(能任意默写,并说出原理,还有各种排序算法衍生的算法题目)

  2. 查找算法:二分查找,哈希查找

  3. 总结下常见面试题的算法,有些是面试被问到的。大部分摘自剑指offer,按照数据结构分了下类,前边的标号表示书内的第几个面试题。

    • 链表 
      从尾到头打印链表 
      16:反转链表 
      17:合并两个排序的链表 
      判断链表是否有环 
      37:两个链表的第一个公共节点 
      15:求链表的倒数第k个节点 
      O1时间内删除链表节点 
      26:复杂链表的复制 
      56:链表中环的入口结点 
      57:删除链表中重复的结点(复杂点,需要考虑头节点删除,使用了指针的指针)

    • 栈,队列 
      两个栈实现一个队列,两个队列实现一个栈 
      包含min函数的栈 
      栈的压入弹出序列

    • 二叉树 
      二叉树的遍历,先序,中序,后序。递归,非递归。(深度优先遍历) 
      6:重建二叉树 
      23:从上往下打印二叉树(层序遍历二叉树,广度优先遍历) 
      18:树的子结构 
      19:二叉树的镜像(先序遍历,先判断空,首先赋值交换两个孩子) 
      59:对称的二叉树(先序遍历,判断是不是都未null,返回true,返回一个为null返回FALSE,判断两个不相等,返回FALSE ) 
      24:二叉搜索树的后序遍历序列(递归判断,很类似于重建二叉树,主要是找到根元素,然后划分左子树序列,右子树序列,在递归重复上述过程) 
      25:二叉树中和为某一值的路径(进入的时候value压入栈,最后方法返回的时候,弹出value,递归前判断left,right不为空) 
      二叉搜索树与双向链表(中序便利) 
      39:二叉树的深度(递归,判断left与right的大小,大的加1,node为null返回0);判断二叉树是否平衡,后序遍历求深度同时判断是否平衡,两个子树高度差绝对值小于等于1才能深度加1,返回TRUE,否则返回FALSE。 
      树中两个节点的最低公共祖先 
      二叉树的下一个结点 
      60:把二叉树打印成多行(用两个变量,一个表示当前剩余多少没打印,另一个表示下一行有多少个元素) 
      按之字形顺序打印二叉树 
      序列化二叉树 
      二叉搜索树的第k个结点 
      数据流中的中位数

    • 字符串 
      字符串的排列,字符的组合http://blog.csdn.net/industriously/article/details/51525630 
      最长子串 
      回文串(左右扫描);回文数(反转数字是否等于原来数字);字符串中回文串的个数;串中的最长回文子串。 
      替换字符串中的空格(先求出替换结果的数组长度,然后从后往前替换) 
      把字符串转换成整数(注意判断正负数,判断是否溢出,0x7FFF FFFF 0x8000 0000,判断非法字符,判断Null,空字符) 
      正则表达式匹配(都到结尾匹配成功;pattern串到结尾,text串到结尾匹配失败;单独判断*的情况(text走1步,pattern走两步,text走1步,pattern不走,text不走,pattern走2步),在判断.与普通字符情况) 
      53:表示数值的字符串 
      字符流中第一个不重复的字符(初始化hash为-1,hash存储字符位置,再次出现更新为-2,最后打印hash表中最小的大于等于0的值的位置的字符) 
      35:第一个只出现一次的字符(哈希存储次数,然后遍历获取次数,打印第一个为1的字符) 
      42:翻转单次顺序VS左旋字符串(先反转整体,在反转局部)

    • 数组 
      数组中重复的数字 
      构建乘积数组 
      3:二维数组中的查找 
      4:替换空格(先求出替换结果的数组长度,然后从后往前替换) 
      14:调整数组顺序使奇数位于偶数前边(两个指针两端扫描,不变顺序可以采用插入排序思想) 
      20:顺时针打印矩阵 
      31:连续子数组的最大和 
      33:把数组排成最小的数字(前边的数字小的放到前边,mn与nm比较大小,然后快排,从小到大,输出的就是最小数字) 
      36:数组中的逆序对(归并排序,并统计) 
      38:数字在排序数组中出现的次数(二分查找,查找头尾) 
      40:数组中只出现一次的数字(哈希表存储,或者,其他出现偶数次,这样可以异或,单数异或为1) 
      41:和为s的两个数字VS和为s的连续正数序列(哈希存储;小于s逐渐递增,大于s删除最前边的数字)

    • 排序,查找 
      七大基本排序算法 
      二分查找 
      哈希查找 
      旋转数组的最小数字 
      数组中出现次数超过一般的数字 
      最小,最大的k个数 
      38:数字在排序数组中出现的次数(二分) 
      3:二维数组中的查找 
      大文件(假设内存不能全部载入)中有很多int类型的数字,所有数字中有一个出现了两次,其他的只出现了一次。求出现了两次的数字。 
      大文件中有一个数字出现频率超过了百分之五十,找到这个数字。 
      使用位向量法解决大文件问题。

    • 回溯法 
      66:矩阵中的路径 
      67:机器人的运动范围

    • 动态规划 
      0-1背包问题 
      最长公共子序列 
      连续子数组最大和 
      斐波那契数列,青蛙跳台阶,地板砖排列。

    • 其他 
      位运算,二进制中1的个数 
      11:数值的整数次方(考虑特殊情况,正负次方,任何0以外的数的0次方都是1) 
      12:打印1到最大的n位数(n可能超出表示范围,字符串全排列) 
      32:从1到n整数中1出现的次数 
      34:丑数 
      43:n个骰子的点数 
      44:扑克牌的顺子 
      45:圆圈中最后剩下的数字 
      汉诺塔

书单

  1. Java书籍 
    Head First Java 
    Core Java 
    Think in Java(以上书籍都可以做JAVA的基础知识扫盲强化) 
    Effective Java(很薄的一本书,适合有了一定JAVA经验的看,做相关总结) 
    深入理解Java虚拟机(理解JAVA虚拟机原理)
  2. Android书籍 
    第一行代码(Android基础学习) 
    Android开发艺术探索 
    Android群英传 
    Android研发录 
    Android应用性能优化 
    深入理解Android源码 卷1 2 
    Android系统源代码情景分析(老罗的书籍,比较晦涩) 
    Android内核剖析(有点老)
  3. 设计模式 
    Head First Design Pattern 
    大话设计模式(入门书籍) 
    Android源码设计模式解析与实战
  4. 数据结构算法 
    数据结构-严蔚敏 
    大话数据结构 
    数据结构与算法分析:Java语言描述 
    算法的乐趣 
    剑指offer(70多道算法题,涵盖了互联网公司面试的大多数算法面试题) 
    编程之美(比剑指offer稍微难一些的算法题) 
    编程珠玑
  5. 其他(学习的乱七八糟的其他知识) 
    数学之美(科普数学,算法,工程等相关知识的原理,让非专业读者也能领略数学的魅力) 
    鸟哥的Linux私房菜(基础学习篇)(主要是为了学习shell) 
    Linux内核设计与实现(讲述Linux系统的原理) 
    c++ Primer Plus 
    Python基础教程 
    JavaScript高级程序设计(在校学习web前端买的,系统讲了js)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
基于vue健身小程序正是采用微信小程序和网络设计的新型系统,可以有效的把健身信息与网络相结合,为用户提供工作帮助和管理需求。本系统采用mysql数据库存储数据,兼容性更强,可跨越多种平台,采用的框架为ssm。主要设计的内容包括课程信息、教练信息、健身视频。教练可以上传健身视频,学员可以购买课程和预约教练以及在线充值、发帖。为了可以给用户更多的提醒,本系统中加入了当前登录角色的提示内容。管理员在系统中可以更新各种数据信息。本系统是信息化社会发展的必然产物,可以为用户提供更为高效的管理以及辅助,同时也可以改变健身房管理的局面,提高效率。 登录功能为管理员、教练和学员登录,在登录界面设计中包括用户名和密码、权限的检验。用户名和密码、权限的检验过程由数据库自动完成,此过程需要1秒左右。首先由用户填写账号和密码,选择权限,然后点击登录系统,数据库自行对用户名和密码进行对比,所填写数据正确方能进行登录,所填写数据错误则需要返回登录界面重新登录。首页界面是最直接的展示,用户可以对系统进行最直接的了解。在本功能界面里可以看到背景图片、功能导航栏,视频信息、课程信息、教练信息等。学员信息是健身房的重要组成部分,管理员可以添加学员信息,查询学员信息.。教练信息管理功能分为管理员管理教练信息和登记、查询教练信息,管理员可以看到教练的各项基本信息,可以删除教练的基本信息。系统里展示的健身视频都可以由管理员进行审核和添加管理,教练也可以发布视频。管理员可以输入视频名称和上传视频来实现健身视频的添加。管理员和教练可以上传培训课程,学员可以浏览课程信息。管理员和教练都可以管理预约信息,学员在看到教练后可以进行预约。管理员可以审核帖子信息。管理员、教练和学员都可以管理订单信息。学员在课程详情里可以购买课程。学员在教练详情里可以评价、收藏以及预约。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值