Android面试题-最新

来源:互联网 发布:牙周医生 知乎 编辑:程序博客网 时间:2024/05/27 06:53

其实面试题并不是只有需要面试的朋友看的,平时看看巩固一下,加强记忆也是很好的,下面我在网上查找了一些Android面试题,希望可以帮到大家,也为自己温习起到帮助。
Java部分

  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都是用来对给定对象进行线程同步的

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

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

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

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

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

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

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

  11. JAVA 垃圾回收机制
    什么是垃圾回收机:释放那些不再持有引用的对象的内存
    怎么判断一个对象是否需要收集?
    引用计数(最简单古老的方法):指将资源(可以是对象、内存或磁盘空间等等)的被引用次数保存起来,当被引用次数变为零时就将其释放的过程
    对象引用遍历(现在大多数 jvm 使用的方法):对象引用遍历从一组对象开始,沿着整个对象图上的每条链接,递归确定可到达(reachable)的对象。如果某对象不能从这些根对象的一个(至少一个)到达,则将它作为垃圾收集
    几种垃圾回收机制
    标记回收法:遍历对象图并且记录可到达的对象,以便删除不可到达的对象,一般使用单线程工作并且可能产生内存碎片
    标记-压缩回收法:前期与第一种方法相同,只是多了一步,将所有的存活对象压缩到内存的一端,这样内存碎片就可以合成一大块可再利用的内存区域,提高了内存利用率
    复制回收法:把现有内存空间分成两部分,gc运行时,它把可到达对象复制到另一半空间,再清空正在使用的空间的全部对象。这种方法适用于短生存期的对象,持续复制长生存期的对象则导致效率降低。
    分代回收发:把内存空间分为两个或者多个域,如年轻代和老年代,年轻代的特点是对象会很快被回收,因此在年轻代使用效率比较高的算法。当一个对象经过几次回收后依然存活,对象就会被放入称为老年的内存空间,老年代则采取标记-压缩算法

  12. 讲讲 Java 中的集合有多少种,区别是什么?
    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.
    HashMap和 HashTable 的区别:
    HashTable比较老,是基于Dictionary 类实现的,HashTable 则是基于 Map接口实现的
    HashTable 是线程安全的, HashMap 则是线程不安全的
    HashMap可以让你将空值作为一个表的条目的key或value

Android部分

  1. Android中五种数据存储方式分别是什么?他们的特点?
    Android提供了五种存取数据的方式
    1)SharedPreference,存放较少的五种类型的数据,只能在同一个包内使用,生成XML的格式存放在设备中;
    2)SQLite数据库,存放各种数据,是一个轻量级的嵌入式数据库;
    3)File文件,通过读取写入方式生成文件存放数据;
    4)ContentProvider,主要用于让其他应用程序使用保存的数据;
    5)通过网络获取数据和写入数据到网络存储空间。

  2. 说说 android 中 mvc 的具体体现
    mvc是model,view,controller的缩写,mvc包含三个部分:
    模型(model)对象:是应用程序的主体部分,所有的业务逻辑都应该写在该层。
      视图(view)对象:是应用程序中负责生成用户界面的部分。也是在整个mvc架构中用户唯一可以看到的一层,接收用户的输入,显示处理结果。
      控制器(control)对象:是根据用户的输入,控制用户界面数据显示及更新model对象状态的部分,控制器更重要的一种导航功能,响应用户出发的相关事件,交给m层处理。
      android鼓励弱耦合和组件的重用,在android中mvc的具体体现如下:
    1)视图(view):一般采用xml文件进行界面的描述,使用的时候可以非常方便的引入。
    2)控制层(controller):android的控制层的重任通常落在了众多的acitvity的肩上,这句话也就暗含了不要在activity中写过多的代码,要通过activity交割model业务逻辑层处理,这样做的另外一个原因是android中的activity的响应时间是5s,如果耗时的操作放在这里,程序就很容易被回收掉。
    3)模型层(model):对数据库的操作、对网络等的操作都应该在model里面处理,当然对业务计算等操作也是必须放在的该层的。

  3. 简述SharedPreferences存储方式以及SharedPreferences与SQLite数据库的区别。
    SharedPreferences也是一种轻型的数据存储方式,它的本质是基于XML文件存储key-value键值对数据,通常用来存储一些简单的配置信息。其存储位置在/data/data/<包名>/shared_prefs目录下。SharedPreferences对象本身只能读取数据而不支持写入数据,存储修改是通过Editor对象实现。SharedPreferences对象与SQLite数据库相比,免去了创建数据库,创建表,写SQL语句等诸多操作,相对而言更加方便,简洁。但是SharedPreferences也有其自身缺陷,比如其职能存储boolean,int,float,long和String五种简单的数据类型,比如其无法进行条件查询等。所以不论SharedPreferences的数据存储操作是如何简单,它也只能是存储方式的一种补充,而无法完全替代如SQLite数据库这样的其他数据存储方式。

  4. 描述handler 机制的原理
    andriod提供了 Handler 和 Looper 来满足线程间的通信。
    Handler 先进先出原则。Looper类用来管理特定线程内对象之间的消息交换(Message Exchange)。
    1)Looper: 一个线程可以产生一个Looper对象,由它来管理此线程里的Message Queue(消息队列)。
    2)Handler: 你可以构造Handler对象来与Looper沟通,以便push新消息到Message Queue里;或者接收Looper从Message Queue取出)所送来的消息。
    3)Message Queue(消息队列):用来存放线程放入的消息。
    4)线程:UI thread 通常就是main thread,而Android启动程序时会替它建立一个Message Queue。

  5. 显式intent和隐式intent的区别是什么(Android)
    Intent定义:Intent是一种在不同组件之间传递的请求消息,是应用程序发出的请求和意图。作为一个完整的消息传递机制,Intent不仅需要发送端,还需要接收端。
    显式Intent定义:对于明确指出了目标组件名称的Intent,我们称之为显式Intent;
      隐式Intent定义:对于没有明确指出目标组件名称的Intent,则称之为隐式Intent。
      说明:Android系统使用IntentFilter 来寻找与隐式Intent相关的对象。

  6. 简述通过contentResolver获取ContentProvider内容的基本步骤
    1)得到ContentResolver类对象:ContentResolver cr = getContentResolver();
    2)定义要查询的字段String数组;
    3)使用cr.query();返回一个Cursor对象;
    4)使用while循环得到Cursor里面的内容。

  7. 描述4 种 activity 的启动模式
    1)standard :系统的默认模式,一次跳转即会生成一个新的实例。假设有一个activity命名为MainActivity,执行语句:
    startActivity(new Intent(MainActivity.this, MainActivity.class))后,MainActivity将跳转到另外一个MainActivity,也就是现在的Task栈里面有MainActivity的两个实例。按返回键后你会发现仍然是在MainActivity(第一个)里面。
    2)singleTop:singleTop 跟standard 模式比较类似。如果已经有一个实例位于Activity栈的顶部时,就不产生新的实例,而只是调用Activity中的newInstance()方法。如果不位于栈顶,会产生一个新的实例。例:当MainActivity为 singleTop 模式时,执行跳转后栈里面依旧只有一个实例,如果现在按返回键程序将直接退出。
    3)singleTask: singleTask模式和后面的singleInstance模式都是只创建一个实例的。在这种模式下,无论跳转的对象是不是位于栈顶的activity,程序都不会生成一个新的实例(当然前提是栈里面已经有这个实例)。这种模式相当有用,在以后的多activity开发中,经常会因为跳转的关系导致同个页面生成多个实例,这个在用户体验上始终有点不好,而如果你将对应的activity声明为 singleTask 模式,这种问题将不复存在。
    4)singleInstance: 设置为 singleInstance 模式的 activity 将独占一个task(感觉task可以理解为进程),独占一个task的activity与其说是activity,倒不如说是一个应用,这个应用与其他activity是独立的,它有自己的上下文activity。

  8. Android中如何访问自定义ContentProvider?
    通过ContentProvider的Uri访问开放的数据。
    1)ContenResolver对象通过Context提供的方法getContenResolver()来获得。
    2)ContenResolver提供了以下方法来操作:insert delete update query这些方法分别会调用ContenProvider中与之对应的方法并得到返回的结果。

  9. Android中的动画有哪几类,它们的特点和区别是什么?
    Android中动画可以分为两大类:帧动画、补间动画
    1)补间动画:你定义一个开始和结束,中间的部分由程序运算得到。主要有:旋转、平移、放缩和渐变;AlphaAnimation(渐变型动画)、scaleAnimation(缩放型动画)、 TranslateAnimation(平移型动画)、 RotateAnimation(旋转型动画)、
    2)逐帧动画:Frame(把一连串的图片进行系列化连续播放,如同放电影的效果),它是通过播放一张一张图片来达到动画的效果。

  10. View的绘制流程
    View的绘制流程

    measure()方法,layout(),draw()三个方法主要存放了一些标识符,来判断每个View是否需要再重新测量,布局或者绘制,主要的绘制过程还是在onMeasure,onLayout,onDraw这个三个方法中
    1.onMesarue() 为整个View树计算实际的大小,即设置实际的高(对应属性:mMeasuredHeight)和宽(对应属性: mMeasureWidth),每个View的控件的实际宽高都是由父视图和本身视图决定的。
    2.onLayout() 为将整个根据子视图的大小以及布局参数将View树放到合适的位置上。
    3.onDraw() 开始绘制图像,绘制的流程如下
    首先绘制该View的背景
    调用onDraw()方法绘制视图本身 (每个View都需要重载该方法,ViewGroup不需要实现该方法)
    如果该View是ViewGroup,调用dispatchDraw ()方法绘制子视图
    绘制滚动条

更多Android Java面试题:http://download.csdn.net/detail/chengliang0315/9717089

1 0
原创粉丝点击