Android面试总结

1 .面向对象的特征:封装    继承  多态。

多态的两种表现形式:重载和重写。
重载:是发生在同一类中,具有相同的方法名,主要是看参数的个数,类型,顺序不同实现方法的重载的,返回值的类型可以不同。
重写:是发生在两个类中(父类和子类),具有相同的方法名,主要看方法中参数,个数,类型必须相同,返回值的类型必须相同。

2. 常见的排序算法(面试的过程中,面试官可能会当面让你写一种排序算法,从大到小或从小到大。当时我就用的冒泡排序排序写的)

   列举几种常见的排序算法(从小到大排序)具体代码大家可以百度在此不一一列举

   2.1 冒泡法排序 原理:第一轮冒泡比较把最大值放在了最后,第二轮比较次大又放在了最后然后比较n - 1 轮(可以形象的比喻近视眼只认识相邻的)

   2.2 选择法排序 原理:类似于排队时体育老师挨个敲把最小的放在最前面

   2.3 插入法排序 原理:类似于摸牌

   2.4 二分查找 前提是已排序的数组中查找

 

3. int 和 integer的区别

Java 提供两种不同的类型:引用类型和原始类型(或内置类型)。Int是java的原始数据类型,Integer是java为int提供的封装类。Java为每个原始类型提供了封装类。
原始类型封装类
booleanBoolean
charCharacter
byteByte
shortShort
intInteger
longLong
floatFloat
doubleDouble
引用类型和原始类型的行为完全不同,并且它们具有不同的语义。引用类型和原始类型具有不同的特征和用法,它们包括:大小和速度问题,这种类型以哪种类型的数据结构存储,当引用类型和原始类型用作某个类的实例数据时所指定的缺省值。对象引用实例变量的缺省值为 null,而原始类型实例变量的缺省值与它们的类型有关。

4. String  StringBuffer  StringBuilder的区别(笔试中常见)

    String(JDK1.0时代)          不可变字符序列
    StringBuffer(JDK1.0时代)    线程安全的可变字符序列,里面的方法是同步的
    StringBuilder(JDK1.5时代)   非线程安全的可变字符序列 ,里面的方法是不同步的

5. list列表和set列表存储特点等(面试时候可以说是必问的,面试官可能会问你比较熟悉的一种存储方式简单介绍一下存储过程和原理)

    List存储特点:有序可重复;Set存储特点:无序不可重复

    List中常见的ArrayList和LinkList

    ArrayList:采用的是数组的形式来保存对象的,这种方式将对象放在连续的位置上,所以最大的缺点就是插入删除时非常麻烦。

    LinkList:采用的是将对象放在独立的空间中,而且在每个空间中还保存下一个链接的索引,但缺点是查找非常麻烦,要从第一个索引开始。

    Set存储 :hashSet 无序不可重复无下标;TreeSet 有序不可重复无下标

6. 抽象类和接口的区别

    6.1 首先根据java继承的特征只支持单继承,不允许多继承,一个子类只能有一个父类。所以一个类只能继承一个抽象类,而一个类可以实现多个接口

    6.2  抽象类中可以有各种类型的变量和方法而接口中的成员变量只能是public static final类型的

    6.3 抽象类中可以有静态代码块和静态方法;接口中不能有静态代码块和静态方法

    6.4 抽象类中可以含有抽象方法和非抽象的方法并且可以提供成员方法的实现细节,含有抽象方法的类肯定是抽象类,而接口中都是抽象的方法


7. java四种引用类型(问到的可能性也很大,面试官也可能会问你怎样理解gc垃圾回收机制,当时我就是被这么问到的,还好没有被问懵为未自己的机智回答点个赞哈哈)

  7.1 强引用(必不可少)  垃圾回收器绝对不会回收它。如Object obj = new Object(); obj便是内存不足时,java虚拟机宁愿抛出OutofMemorryError错误导致程序崩溃异常终止,也 不会回收强引用的对象。

  7.2 软引用(可有可无)如果内存空间足够,垃圾回收就不会回收它,如果内存空间不足了,就会回收这些对象的内存

  7.3 弱引用(可有可无)垃圾回收器一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存,当发生GC的时候,弱引用的对象总是被回收

  7.4 虚引用 当垃圾回收器准备回收一个对象时,如果发现它还有虚引用,就会在回收对象的内存之前把这个虚引用加入到与之前关联的引用队列中。与弱引用不同点就是虚引用必须和引用队列联合使用。

 

8. hashMap和hashTable的区别

    8.1 hashMap 是map接口的一个实现类; hashTable是Dictionary的子类

    8.2 hashMap中的方法是非同步的(多线程中需要同步处理);hashTable的方法是同步的(多线程应用程序中不用专门的操作就可以安全的使用)

    8.3 hashMap允许null键和null值;

    比较:HashMap比HashTable功能更多,而且它不是基于一些陈旧的类所以一般情况下HashMap优于HashTable

 

接下来总结一下Android相关的面试题:

 1.  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

 

2.Android四大组件(重点看下广播和服务)
①activity 提供用户界面  用于与用户交互的组件,(活动窗体)它需要为保持各界面的状态,做很多持久化的事情,妥善管理生命周期以及一些跳转逻辑
②content Provider 
   为应用程序之间访问提供的接口的组件,实现数据共享,结构化数据集合,以表的形式对外提供数据,可以像数据库一样记性选择排序
③BroadCastReceiver (广播)
 采用异步机制完成组件之间消息的传递,异步是指广播的发送方将消息标记后发出,不需要得到对方的回应,可以继续做自己的操作
默认情况下,所有的组件都有接收广播的能力,组件想要接收广播就注册与发送方一致的标记
包括普通广播和有序广播:
发送有序广播:sendOrderedBroadCast(...);     
sendBroadCast();
有序广播可以进行应用程序之间传递消息,可以根据manifest文件中注册的优先级的高低判断接收的顺序。
实现过程:
创建一个类继承BroadCastReceiver,重写其中的onReceiver()方法,进行接收广播之后的操作。
广播 的生命周期:

④server(服务)
不需要提供用户界面,在后台运行服务于activity,执行长时间耗时操作的组件

 

3. 网络存储方式

    3.1 使用SharedPreferences存储数据
     适用范围:保存少量的数据,且这些数据的格式非常简单:字符串型、基本类型的值。比如应用程序的各种配置信息(如是否打开音效、是否使用震动效果、小游戏的玩家积分等),解锁口 令密码等

    3.2 文件存储数据
     核心原理: Context提供了两个方法来打开数据文件里的文件IO流 ,FileInputStream openFileInput(String name); FileOutputStream(String name , int mode),这两个方法第一个参数 用于指定文件名,第二个参数指定打开文件的模式。

    3.3 SQLite存储数据
    SQLite是轻量级嵌入式数据库引擎,它支持 SQL 语言,并且只利用很少的内存就有很好的性能。

    3.4 网络存储

    可以调用webService返回的数据或是解析http协议实现网络数据交互等等

    3.5 ContentProvider 

     为应用程序之间访问提供的接口组件,实现数据共享结构化数据集合,以表的形式对外提供数据,可以像数据库一样选择排序

4.服务如何启用Service,如何停用Service。Android中的service类似于windows中的service,service一般没有用户操作界面,它运行于系统中不容易被用户发觉,

  可以使用它开发如监控之类的程序。
      首先服务的特点:1 没有界面用户不可见 2 程序在后台运行做耗时操作

      服务分三类:startService()  bindService() intentService

  一。步骤

  第一步:继承Service类

  public class SMSService extends Service { }

  第二步:在AndroidManifest.xml文件中的节点里对服务进行配置:

  二。Context.startService()和Context.bindService

  服务不能自己运行,需要通过调用Context.startService()或Context.bindService()方法启动服务。这两个方法都可

  以启动Service,但是它们的使用场合有所不同。

  4.1 使用startService()方法启用服务,调用者与服务之间没有关连,即使调用者退出了,服务仍然运行。

  使用bindService()方法启用服务,调用者与服务绑定在了一起,调用者一旦退出,服务也就终止。

  4.2 采用Context.startService()方法启动服务,在服务未被创建时,系统会先调用服务的onCreate()方法,

  接着调用onStart()方法。如果调用startService()方法前服务已经被创建,多次调用startService()方法并

  不会导致多次创建服务,但会导致多次调用onStart()方法。

  采用startService()方法启动的服务,只能调用Context.stopService()方法结束服务,服务结束时会调用

  onDestroy()方法。

  4.3 采用Context.bindService()方法启动服务,在服务未被创建时,系统会先调用服务的onCreate()方法,

  接着调用onBind()方法。这个时候调用者和服务绑定在一起,调用者退出了,系统就会先调用服务的onUnbind()方法,

  。接着调用onDestroy()方法。如果调用bindService()方法前服务已经被绑定,多次调用bindService()方法并不会

  导致多次创建服务及绑定(也就是说onCreate()和onBind()方法并不会被多次调用)。如果调用者希望与正在绑定的服务

  解除绑定,可以调用unbindService()方法,调用该方法也会导致系统调用服务的onUnbind()-->onDestroy()方法。

  三。Service的生命周期

  4.4 Service常用生命周期回调方法如下:

  onCreate() 该方法在服务被创建时调用,该方法只会被调用一次,无论调用多少次startService()或bindService()方法,

  服务也只被创建一次。 onDestroy()该方法在服务被终止时调用。

  4.5 Context.startService()启动Service有关的生命周期方法

  onStart() 只有采用Context.startService()方法启动服务时才会回调该方法。该方法在服务开始运行时被调用。

  多次调用startService()方法尽管不会多次创建服务,但onStart()方法会被多次调用。

  4.6 Context.bindService()启动Service有关的生命周期方法

  onBind()只有采用Context.bindService()方法启动服务时才会回调该方法。该方法在调用者与服务绑定时被调用,

  当调用者与服务已经绑定,多次调用Context.bindService()方法并不会导致该方法被多次调用。

  onUnbind()只有采用Context.bindService()方法启动服务时才会回调该方法。该方法在调用者与服务解除绑定时被调用。

  备注:

  4.7 采用startService()启动服务
  Intent intent =new Intent(DemoActivity.this, DemoService.class);
  startService(intent);

  4.8 Context.bindService()启动
  Intent intent =new Intent(DemoActivity.this, DemoService.class);
  bindService(intent, conn, Context.BIND_AUTO_CREATE);
  //unbindService(conn);//解除绑定

      4.9 intentService()

           大部分的service不需要同时处理多个请求(处理多个请求是一个比较危险的多线程场景)这样的情况下最好使用intentService类去实现

           原因:intentService会直接创建默认的工作线程,在服务中无须再自己写线程,自带一个重写的onhandleIntent()方法,该方法对意图的处理是按照顺序一个个处理有多个intent请求这个方法暂时会把别的请求挂起,但是不会阻塞别的事情,当处理完所有intent后该方法会自动调用stopself()所以不需要手动调用。

最新问题:

1.Activity、view、wms的关系
2.内存泄漏有哪些?原因?
3.卡顿的根本原因?怎么处理?
4.mvc、mvp、mvvm
5.RxJava特点
6.如何判断对象可以被GC
7.性能优化有哪些
8.如何保活
9.Webview问题简述
10.As编译慢,怎么提速
11.String和Stringbuilder区别
12.Handler内存泄漏原因
13.弱引用、强引用用途
14.ListView优化
15.如何提高引用扩展性
16.重构准则

未完,待续~~~

posted @ 2017-02-15 14:58  静待花开*^_^*  阅读(197)  评论(0编辑  收藏  举报