2017年 Android面试题 总结

来源:互联网 发布:知乎提问没人浏览 编辑:程序博客网 时间:2024/05/21 04:23

1、关于创建对象

1)Integer对象

           Integer j = 123;Integer h = 123;   

           then   j==h   true;

           

       Integer i = new Integer(123);

       Integer j = new Integer(123);

       System.out.println(i==j);   false

       Integer j = 130;Integer h = 130;   

       then   j==h   false;

         关于Integer对象的缓存机制:http://blog.csdn.net/losetowin/article/details/49968365

         

 
public static void main(String[] args) {         Integer num1 = new Integer(100);    Integer num2 = new Integer(100);    System.out.println("num1==num2 " + (num1 == num2));         Integer num3 = 100;    Integer num4 = 100;    System.out.println("num3==num4 " +(num3 == num4));         Integer num5 = 128;    Integer num6 = 128;    System.out.println("num5==num6 " + (num5 == num6));         Integer num7 = 100;    Integer num8 = new Integer(100);    System.out.println("num7==num8 " + (num7 == num8));         int num9 = 100;    Integer num10 = new Integer(100);    Integer num11 = 100;    System.out.println("num9==num10 " + (num9 == num10));    System.out.println("num9==num11 " + (num9 == num11));}

创建Integer对象时,直接调用Integer.valueOf()方法。而Integer对象和int类型的数值比较时,会进行拆箱操作。


2、操作字符串

     subString()和subStr()的区别;两个方法的参数都是从第一个参数0开始,最后一个参数不包括。

    public String substring(int beginIndex, int endIndex)
   第一个int为开始的索引,对应String数字中的开始位置,
   第二个是截止的索引位置,对应String中的结束位置
   1、取得的字符串长度为:endIndex - beginIndex;
   2、从beginIndex开始取,到endIndex结束,从0开始数,其中不包括endIndex位置的字符

3、影响hashmap性能的因素:加载因子和初始容量;
     hashmap是根据key值的hashcode来决定存储在哪里的,hashmap的底层是采用了散列表(数组+链表)的形式;hashmap解决冲突的方法:拉链法,还有哪些?链地址冲突法;

4、Thread和Runnable的区别?用哪个会更好?

     在程序开发中只要是多线程肯定永远以实现Runnable接口为主,因为实现Runnable接口相比继承Thread类有如下好处:

    避免点继承的局限,一个类可以继承多个接口;适合于资源的共享。

5、handler的作用: 如果没有多线程handler是否还有用?

      1.运行在某个线程上,共享线程的消息队列; 

      2.接收消息、调度消息,派发消息和处理消息; 

      3.实现消息的异步处理;

6、异步消息处理需要注意的事情:
     1)消息同步,消息并发处理;2)消息的重发,消息的撤销机制;3)消息是全双工的,即activity可以给service发消息,那么service也可以给activity发消息。
7、UI线程与其他线程的区别?
8、ListView的优化?
9、ListView与RecyclerView的区别?
10、GC算法有哪些?
11、Minor GC、Majro GC 和Full GC的区别?  以下答案并不好
       1. Full GC定义是相对明确的,就是针对整个新生代、老生代、元空间(metaspace,java8以上版本取代perm gen)的全局范围的GC;

      2. Minor GC和Major GC是俗称,在Hotspot JVM实现的Serial GC, Parallel GC, CMS, G1 GC中大致可以对应到某个Young GC和Old GC算法组合;

     3. 最重要是搞明白上述Hotspot JVM实现中几种GC算法组合到底包含了什么。

     3.1 Serial GC算法:Serial Young GC + Serial Old GC (敲黑板!敲黑板!敲黑板!实际上它是全局范围的Full GC);

     3.2 Parallel GC算法:Parallel Young GC + 非并行的PS MarkSweep GC / 并行的Parallel Old GC(敲黑板!敲黑板!敲黑板!这俩实际上也是全局范围的Full GC),选PS MarkSweep GC 还是 Parallel Old GC 由参数UseParallelOldGC来控制;

     3.3 CMS算法:ParNew(Young)GC + CMS(Old)GC (piggyback on ParNew的结果/老生代存活下来的object只做记录,不做compaction)+ Full GC for CMS算法(应对核心的CMS GC某些时候的不赶趟,开销很大);

     3.4 G1 GC:Young GC + mixed GC(新生代,再加上部分老生代)+ Full GC for G1 GC算法(应对G1 GC算法某些时候的不赶趟,开销很大);

     4. 搞清楚了上面这些组合,我们再来看看各类GC算法的触发条件。

         简单说,触发条件就是某GC算法对应区域满了,或是预测快满了。比如,

     4.1 各种Young GC的触发原因都是eden区满了;

     4.2 Serial Old GC/PS MarkSweep GC/Parallel Old GC的触发则是在要执行Young GC时候预测

        其promote的object的总size超过老生代剩余size;

     4.3 CMS GC的initial marking的触发条件是老生代使用比率超过某值;

     4.4 G1 GC的initial marking的触发条件是Heap使用比率超过某值,跟4.3 heuristics 类似;

     4.5 Full GC for CMS算法和Full GC for G1 GC算法的触发原因很明显,就是4.3 和 4.4 的fancy算法不赶趟了,只能全局范围大搞一次GC了(相信我,这很慢!这很慢!这很慢!);

5 题主说的 “Full GC会先触发一次Minor GC” - 指的应该是

5.1 (说错了,我删了)

5.2 PS MarkSweep GC/Parallel Old GC(Full GC)之前会跑一次Parallel Young GC;

原因就是减轻Full GC 的负担。

Major gc 和full gc 都会触发stop the world

Minor gc 会清理年轻代内存


12、触发GC的时机:


1、fragment的使用:

2、java的erro有哪些情况:一般error是与虚拟机相关的问题,比如系统崩溃,虚拟机错误,内存空间不足,方法调用栈溢出;

Exception表示程序可以处理的异常,可以捕获并且可能恢复。

可检查异常:要求编译器必须处置的异常,编译器可以检查到的异常。需要在方法头部声明可能抛出的异常类型,程序在throws语句后立即终止,它后面的语句执行不到,然后在包含它的所有trycatch块中(可能在上层函数)从里向外寻找与之相关的catch块。

不可检查异常(编译器不要求强制处理的异常):包括运行时异常以及错误。常见的checkexception有:io异常以及sql异常;

常见的运行时异常:可以不处理,出现此类异常时,总是虚拟机接管。例如:NullPointerException,没有人处理这个问题。ClassCastException,IndexOutOfBoundsException、ArrayStoreException等

3、线程同步机制:sychronized、volatile、lock、threadlocal等

4、MVP:使得view和model完全解耦。

5、http中header包括的内容:

6、

7、activityA启动activityB:oncreate-onstart-onresume-onpause-oncreateB-onstartB -onresumeB-onstopA;

activityA 按home键:onsumeA-onpause-onstop

8、何时执行onsaveInstance:按home键,来了一个电话,横竖屏切换,按电源键关闭屏幕时;

9、onsaveInstanceState和onrestoreInstanceState方法不一定成对调用,onrestoreInstanceState会在onstart和onresume之间执行;

onsaveInstanceState调用时,activity可能销毁也可能没有销毁,所以只有activity销毁重建时,onRestoreInstanceState才会调用

10、1. Activity被系统撤销后重新建立时,保存以及恢复数据的函数调用顺序是:onSaveInstanceState(保存数据)-->onCreate(恢复数据allstate)-->onRestoryInstanceState(恢复数据HierarchyState)



1、C++和java的区别:

     指针 :C++具有指针功能,java没有。

     多重继承:C++支持多重继承,java用接口来替代

     自动内存管理:java所有对象都是用new操作符建立在堆上的。java自动进行内存回收操作,不需要程序员释放内存资源。

2、异常的抛出:

import java.util.*;

public class Main{

private static Object object = new Object();

public static ArrayList<ArrayList<Integer>> list = new ArrayList<ArrayList<Integer>>();

public static void main(String[] args) 

{

try{

System.out.println("hello ");

func();

}catch(Exception e)

{

System.out.println("catch ");

}finally{

System.out.println("caught ");

}

System.out.println("final");

}

public static void func() throws NumberFormatException

{

String s="abc";

if(s.equals("abc"))

throw new NumberFormatException();

//System.out.println(Double.parseDouble(s));

}

执行结果:

hello 

catch 

caught 

final


public classZeroTest {

    publicstatic void main(String[] args) {

     try{

       inti = 1000;

       System.out.print(i);

  }catch(Exception e){

       System.out.print(1);

       thrownew RuntimeException();

  }finally{

       System.out.print(2);

  }

      System.out.print(3);

 }

 }


执行结果:12。 

当分子为0时抛出异常,直接到catch,里面的输出I不会执行,catch之后输出1,然后又抛出runtimeException,执行finally的内容,之后的都不会执行。

3、List是接口,所以不能实例化,只能靠linkedArrayList或者ArrayList实现

所以new List()方法错误。其实List list = new ArrayList()类似于父类引用指向子类实现。

4、静态广播与动态广播对比:静态广播生存周期长,很多静态广播都是对系统进行监听。而动态广播随着context的终止而终止。

优先级动态广播比静态广播高。

动态广播无需在AndroidMainfest.xml中声明直接使用即可。

同一优先级动态广播快?????广播用sendOrderBroadcast方法发送,接收者凭借优先级,intent-filter android:priority=“n”或者setPriority设置。另外可以调用abortBroadcast()方法结束即可。并且可以使用setResultExtras(Bundle)方法将数据存入broadcast,并将broadcast发送给下一级接收者,

4、通过contentresolver获取contentprovider对象,contentprovider用于跨进程间访问数据