Android应用开发之我经历的一些Android面试题及答案
凌雪 2018-09-21 来源 :网络 阅读 741 评论 0

摘要:本文将带你了解Android应用开发之我经历的一些Android面试题及答案,希望本文对大家学Android有所帮助。

本文将带你了解Android应用开发之我经历的一些Android面试题及答案,希望本文对大家学Android有所帮助。


最近在考虑换工作,连续面试了几家公司,这里整理一些比较有意思的面试题(普通面试题和算法题,本人算法基础比较薄,算法题不是强项)。
    面试题
    Java中static静态代码块的调用时机。
Java中的静态变量和静态代码块是在类加载的时候就执行的,实例化对象时,先声明并实例化变量再执行构造函数。如果子类继承父类,则先执行父类的静态变量和静态代码块,再执行子类的静态变量和静态代码块。同样,接着在执行父类和子类非静态代码块和构造函数。
      注意:(静态)变量和(静态)代码块的也是有执行顺序的,与代码书写的顺序一致。在(静态)代码块中可以使用(静态)变量,但是被使用的(静态)变量必须在(静态)代码块前面声明。
    最后给出执行步骤:
    1、父类静态变量和静态代码块(先声明的先执行);
2、子类静态变量和静态代码块(先声明的先执行);
3、父类的变量和代码块(先声明的先执行);
4、父类的构造函数;
5、子类的变量和代码块(先声明的先执行);
6、子类的构造函数。
   
    Android数据库结构升级容易遇到哪些问题,如何解决?
Android 数据库升级完整解决方案
Android运行时权限。
Android6.0权限机制(一):介绍
Android6.0权限机制(一):封装
Android6.0权限机制(三):6.0以前国产手机权限处理
Android进程保活手段。
    实现传言中的黑科技-1像素保活
AMS、WMS它们之间的关系以及协作状态。
Android系统服务-AMS和WMS
    Android内存问题,造成内存泄漏的原因,如何避免内存泄漏。
    内存泄漏与排查流程——安卓性能优化
ThreadLocal是什么,有什么作用。
Android的消息机制之ThreadLocal的工作原理
    算法题
    简述几种排序算法和它们的时间复杂度。
   
    我回答了冒泡、快速、选择和堆排,这里索性把几种排序的Java实现也写一下,查漏补缺。
    冒泡排序
    /** * 冒泡排序 * @param array 目标数组 */public static void bubbleSort(int []array) {for(int i   =0;iarray[j+1]) {int temp =   array[j]; array[j]=array[j+1]; array[j+1]=temp;  } }}}</array.length-1;i++)>
快速排序
/** * 快速排序 * @param array 目标数组 * @param low 快排起始坐标 * @param high 快排终止坐标 */private static void quickSort(int[] array,int low,int   high) {if(low > high) { return;}//进行第一次快排,将目标区间一分为2int i = low;int j = high;int key = array[low];while(i < j)   { //从右往左找到第一个比目标值小的数值位置,标记为j while(i < j && array[j] >= key)   {  j--; } //从左往右找到第一个比目标数值大的数值位置,标记为i while(i < j && array[i] <= key)   {  i++; } //互换位置 if(i < j) {  int temp =   array[i];  array[i] = array[j];  array[j] =   temp; }}//调整目标基准值的位置array[low]   = array[i];array[i] =   key;quickSort(array,low,i-1);quickSort(array,i+1,high);}
选择排序
/** * 选择排序 * @param array 目标数组 */public static void selectSort(int[] array) {for(int i =   0;i < array.length;i++) { int min = array[i];//假定起始位置的数值为最小数值 int   pivotPosition = i;//记录起始位置坐标 for(int j = i;j < array.length;j++) {  //找出剩余数组中最小的值,记录其坐标  if(array[j]   < min) {pivotPosition = j;min =   array[pivotPosition];  } } //将最小值放入起始位置 if(i != pivotPosition) {  array[pivotPosition]   = array[i];  array[i] = min; }}}
插入排序
/** * 插入排序 * @param array 目标数组 */public static void insertSort(int[] array) {//从第二个数据开始做循环,我们假定第一条数据已经在它应在的位置了for(int   i = 1;i < array.length;i++) { //取出目标位置的数值 int j = i; int target = array[i];  //对比目标位置的数值,与左侧排好序的数组比较,若发现有比目标值大的数,将比目标值大的数位置的数值往前提,游标后移 while(j > 0 && target < array[j - 1])   {  array[j] = array[j - 1];  j--; } //跳出循环后将当前target插入游标位置 if(j != i)   {  array[j] = target; }}}
实现一个链表的反转。
public class Node {private int index;private   Node next; public Node(int index, Node next) { this.index =   index; this.next = next;} public int getIndex() { return   index;} public void setIndex(int index) { this.index = index;} public   Node getNext() { return next;} public void setNext(Node next)   { this.next = next;} //非递归public static  Node reverseList(Node head) { Node   prev = null; while(head!=null){  Node tmp =   head.next;  head.next = prev;  prev =   head;  head = tmp; } return prev;} //递归public static Node   reverseList2(Node head) { if(head==null || head.next ==null)   {  return head; } Node prev =   reverseList2(head.next); head.next.next = head; head.next =   null; return prev;} }
实现排序数组的二分查找。061public   class SearchUtils { /** * 二分查找,递归 * @param array 目标数组 * @param target 查找内容 * @param low 查找起始位置 * @param high 查找结束位置 * @return 内容所在位置,-1代表不存在 */public   static int recursionBinarySearch(int[] array,int target,int low,int high)   { if(low > high) {  //起始位置大于结束位置,未找到,返回-1  return -1; } if(low == high)   {  //起始位置等于结束位置,判断是否等于目标值  if(array[low] == target) {return low;  }   else {return -1;  } } int middle = (high + low)/2;//初始化中间位置 if(array[middle] >   target) {  return   recursionBinarySearch(array,target,low,middle-1); } else   if(array[middle] < target) {  return   recursionBinarySearch(array,target,middle+1,high); } else   {  return middle; }} /** * 二分查找,非递归 * @param array 目标数组 * @param target 查找内容 * @return 内容所在位置,-1代表不存在 */public   static int binarySearch(int[] array,int target) { int low = 0; int   high = array.length - 1; int middle = 0;  while(high > low)   {  middle = (high + low)/2;//获取中间位置  if(array[middle] > target) {high = middle -   1;  } else if(array[middle] < target) {low = middle +   1;  } else {return middle;  } } if(array[low]   == target) {  return low; } else {  return   -1; }}}
实现二叉树的按层遍历。
/** * 按层遍历二叉树 * @param root 需要遍历的二叉树 */public static void levelTree(TreeNode root){if(root ==   null) return;Queue<treenode> queue = new LinkedList<treenode>()   ;queue.add(root);while(queue.size() != 0){ int len =   queue.size(); for(int i=0;i </treenode></treenode>    

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注移动开发之Android频道!

本文由 @凌雪 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程