码迷,mamicode.com
首页 > 移动开发 > 详细

Android客户端面试题集锦

时间:2015-10-05 20:44:52      阅读:677      评论:0      收藏:0      [点我收藏+]

标签:

声明:本文问题来自但不限于Xoper.ducky大牛的面试总结,网址:http://www.nowcoder.com/discuss/3043,欢迎各位进行补充

JAVA SE

1. 九种基本数据类型的大小,以及他们的封装类。

int                  Integer

short              Short

long                Long

byte                Byte

float               Float

double           Double

char              Char

boolean        Boolean

String(不算基本数据类型) Stringbuffer、Stringbuilder(非线程安全)

2. Switch能否用string做参数?

Java 1.7之前只能支持byte、short、int、char或其封装类及enum类型,1.7及以上才支持string,boolean类型也是不支持的,会报以下错误:Cannot switch on a value of type boolean. Only convertible int values or enum constants are permitted

3. equals==的区别。

(1) 对字符串变量来说:==比较两个对象的地址是否一致,equals比较两个对象的值.

String s3 = “abc”, s4 = “abc”

String s1 = new String(“abc”);

String s2 = new String(“abc”);

s1 == s2 //false 因为两个对象存放的地址不一致

s1.equals(s2) // true 因为两个对象的值都是”abc”

(2) 对于基本数据类型,只能用==判断,不能用equals(),而对于基本数据类型的封装类或者其他自定义类(没有重写equals方法)来说,==比较的是地址,equals()比较的是内容

(3) s3 == s4 // true,因为s3和s4指向的都是同一块内存地址

(4) StringBuffer s5 = new StringBuffer(“a”) ;

StringBuffer s6 = new StringBuffer(“a”) ;

s5.equals(s6) // false ,因为StringBuffer没有重写equals()方法,比较的还是内存地址,显然两个对象内存地址是不一样的。

4. Object有哪些公用方法?

wait()、notify()、notifyAll()、equals()---用来比较两个对象地址是否一致

hashCode() – 标志对象的唯一值

toString() – 对象的字符串表达形式

5. Java的四种引用,强弱软虚,用到的场景。

强引用(StrongReference)--- 强引用是使用最普遍的引用。如果一个对象具有强引用,那垃圾回收器绝不会回收它。当内存空间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足的问题。

软引用(SoftReference)---如果一个对象只具有软引用,则内存空间足够,垃圾回收器就不会回收它;如果内存空间不足了,就会回收这些对象的内存。只要垃圾回收器没有回收它,该对象就可以被程序使用。软引用可用来实现内存敏感的高速缓存。

软引用可以和一个引用队列(ReferenceQueue)联合使用,如果软引用所引用的对象被垃圾回收器回收,Java虚拟机就会把这个软引用加入到与之关联的引用队列中。SoftReference是强引用,它保存的对象实例,除非JVM即将OutOfMemory,否则不会被GC回收。这个特性使得它特别适合设计对象Cache。对于Cache,我们希望被缓存的对象最好始终常驻内存,但是如果JVM内存吃紧,为了不发生OutOfMemoryError导致系统崩溃,必要的时候也允许JVM回收Cache的内存,待后续合适的时机再把数据重新Load到Cache中

弱引用(WeakReference)---WeakReference是弱引用,其中保存的对象实例可以被GC回收掉。这个类通常用于在某处保存对象引用,而又不干扰该对象被GC回收,通常用于Debug、内存监视工具等程序中。因为这类程序一般要求即要观察到对象,又不能影响该对象正常的GC过程。

虚引用(PhantomReference)---就是形同虚设,与其他几种引用都不同,虚引用并不会决定对象的生命周期。如果一个对象仅持有虚引用,那么它就和没有任何引用一样,在任何时候都可能被垃圾回收器回收。

虚引用主要用来跟踪对象被垃圾回收器回收的活动。虚引用与软引用和弱引用的一个区别在于:虚引用必须和引用队列 (ReferenceQueue)联合使用。当垃圾回收器准备回收一个对象时,如果发现它还有虚引用,就会在回收对象的内存之前,把这个虚引用加入到与之 关联的引用队列中。

6. HashCode的作用

对象区别于其他对象的标识

7. ArrayListLinkedListVector的区别

ArrayList类似于C中的数组,查找方便,插入复杂,LinedList类似于C中的链表,插入简单,查找复杂度较高。而Vector类似于ArrayList,但是在Java 1.5以后就不推荐使用了。

8. String、StringBuffer与StringBuilder的区别。

StringBuffer是String的封装类,都是线程安全的,如果字符串的内容经常改变,则最好用,StringBuffer,而StringBuilder也是可变字符串,但是非线程安全,因此正常情况下会比StringBuffer快。

9. Map、Set、List、Queue、Stack的特点与用法。

map 根据key 找value

set 元素不能重复

list 类似数组

Queue 队列,先进先出

Stack 栈,后进先出

10. HashMap和HashTable的区别。

1. 当需要同步时,用Hashtable,反之用HashMap。但是,因为在需要时,HashMap可以被同步,HashMap的功能比Hashtable的功能更多,而且它不是基于一个陈旧的类的,所以有人认为,在各种情况下,HashMap都优先于Hashtable。

2. 只有HashMap可以让你将空值作为一个表的条目的key或value。HashMap中只有一条记录可以是一个空的key,但任意数量的条目可以是空的value

11. HashMap和ConcurrentHashMap的区别,HashMap的底层源码。

有并发访问的时候用ConcurrentHashMap,效率比用锁的HashMap好。

HashMap底层源码用(Entry)数组+链表的形式实现,详情请看这里:

http://liaokang-java.iteye.com/blog/1098404

12. TreeMap、HashMap、LindedHashMap的区别。

LinkedHashMap也是一个HashMap,但是内部维持了一个双向链表,可以保持顺序

TreeMap 可以用于排序(根据键排序,默认是升序),HashSet是通过HashMap实现的,TreeSet是通过TreeMap实现的,只不过Set用的只是Map的key,Map的key和Set都有一个共同的特性就是集合的唯一性.TreeMap更是多了一个排序的功能.

13. Collection包结构,与Collections的区别。

Collection ---List ---ArrayList, LinkedList, Vector

Set ---HashSet, TreeSet

Map—HashMap,TreeMap,HashTable

Collection是集合类的上级接口,子接口主要有Set 和List、Map。

Collections是针对集合类的一个帮助类,提供了操作集合的工具方法:一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。

14. try catch finally,try里有return,finally还执行么?

必须执行.如果try里有return,finally也有return,会执行finally中的return.

15. Excption与Error包结构。OOM你遇到过哪些情况,SOF你遇到过哪些情况。

16. Java面向对象的三个特征与含义。

继承

封装

多态.

17. Override和Overload的含义去区别。

override --- 重写父类的函数

overload – 是函数重载,根据传入的参数(个数、类型)不同来区别

18. Interface与abstract类的区别。

interface 是接口,可以有常量,所有方法都默认是public,而且不能实现

abstract类 比其他普通类多了个抽象方法,而且是必须有抽象方法

19. Static class 与non static class的区别。

内部静态类不需要有指向外部类的引用。但非静态内部类需要持有对外部类的引用。非静态内部类能够访问外部类的静态和非静态成员。静态类不能访问外部类的非静态成员。他只能访问外部类的静态成员

20. java多态的实现原理。

java中 实例方法才有多态的,在运行时动态绑定,类的成员变量是在编译时就决定了。

class A { 

int a =1; 

int method() { 

return a ; 

} 

} 

class B extends A { 

int a = 2 ; 

int Method() { 

return a ; 

} 

} 

B bb = new B() ; 

System.out.println(bb.a) //结果是2 

System.out.println(bb.method() ) //结果是2 

A aa =(B) new B() ; 

System.out.println(aa.a ) // 结果是1 

System.out.println(aa.method() ) //结果还是是2,多态

21. 实现多线程的两种方法:Thread与Runable。

1. 继承Thread类,重写run方法

2. 实现Runnable接口

3. 想要有返回值,用FutureTask,和Callable接口

22. 线程同步的方法:synchronized、lock、reentrantLock等。

lock.lock(),加锁,lock.unlock()释放锁,

reentrantLock,可重入锁

synchronized 只有单一条件,不能设置加锁时间等,也不能设置多个锁

23. 锁的等级:方法锁、对象锁、类锁。

对象锁是用于对象实例方法,或者一个对象实例上的,类锁是用于类的静态方法或者一个类的class对象上的,我们知道,类的对象实例可以有很多个,但是每个类只有一个class对象,所以不同对象实例的对象锁是互不干扰的,但是每个类只有一个类锁。

24. 写出生产者消费者模式。

25. ThreadLocal的设计理念与作用。

26. ThreadPool用法与优势。

27. Concurrent包里的其他东西:ArrayBlockingQueue、CountDownLatch等等。

28. wait()和sleep()的区别。

1. sleep()不释放同步锁,wait()释放同步锁.

2. sleep是Thread类的方法,wait是Object的方法。wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用

29. foreach与正常for循环效率对比。

使用for,更高效率。 使用foreach,更安全。

如果在使用foreach遍历对象的过程中,其他线程修改了List的内容,例如添加或者删除,就会出现不可知的错误,而使用foreach则能够正确抛出错误信息。

30. Java IO与NIO。

31. 反射的作用与原理。

32. 泛型常用特点,List<String>能否转为List<Object>。

33. 解析XML的几种方式的原理与特点:DOM、SAX、PULL。

34. Java与C++对比。

35. Java1.7与1.8新特性。

1.7

1. map集合支持并发请求,且可以写成 Map map = {name:"xxx",age:18};

2.switch中可以使用字串了

3. 运用List<String> tempList = new ArrayList<>(); 即泛型实例化类型自动推断

4. 两个char间的equals bool Character.equalsIgnoreCase(char ch1, char ch2)

1.8

1. lambda 表达式:

原来代码:

List<String> names = Arrays.asList("peter", "anna", "mike", "xenia");
Collections.sort(names, new Comparator<String>() {
    @Override
    public int compare(String a, String b) {
        return b.compareTo(a);
    }
});
加入lambda表达式:
Collections.sort(names, (String a, String b) -> {
    return b.compareTo(a);
});

加入lambda表达式:

Collections.sort(names, (String a, String b) -> { 

return b.compareTo(a); 

});

更简洁:

Collections.sort(names, (String a, String b) -> b.compareTo(a));

更更简洁:

Collections.sort(names, (a, b) -> b.compareTo(a));

2 函数式接口:

 

更多请看这里:http://www.jb51.net/article/48304.htm

 

36. 设计模式:单例、工厂、适配器、责任链、观察者等等。

37. JNI的使用。

JVM

1. 内存模型以及分区,需要详细到每个区放什么。

2. 堆里面的分区:Edensurvival from to,老年代,各自的特点。

3. 对象创建方法,对象的内存分配,对象的访问定位。

4. GC的两种判定方法:引用计数与引用链。

5. GC的三种收集方法:标记清除、标记整理、复制算法的原理与特点,分别用在什么地方,如果让你优化收集方法,有什么思路?

6. GC收集器有哪些?CMS收集器与G1收集器的特点。

7. Minor GCFull GC分别在什么时候发生?

8. 几种常用的内存调试工具:jmapjstackjconsole

9. 类加载的五个过程:加载、验证、准备、解析、初始化。

10. 双亲委派模型:Bootstrap ClassLoaderExtension ClassLoaderApplicationClassLoader

11. 分派:静态分派与动态分派。

操作系统

1. 进程和线程的区别。

2. 死锁的必要条件,怎么处理死锁。

3. Window内存管理方式:段存储,页存储,段页存储。

4. 进程的几种状态。

5. IPC几种通信方式。

6. 什么是虚拟内存。

7. 虚拟地址、逻辑地址、线性地址、物理地址的区别。

计算机网络

1. OSITCP/IP各层的结构与功能,都有哪些协议。

2. TCPUDP的区别。

3. TCP报文结构。

4. TCP的三次握手与四次挥手过程,各个状态名称与含义,TIMEWAIT的作用。

5. TCP拥塞控制。

6. TCP滑动窗口与回退N针协议。

7. Http的报文结构。

8. Http的状态码含义。

9. Http request的几种类型。

10. Http1.1Http1.0的区别

11. Http怎么处理长连接。

12. CookieSession的作用于原理。

13. 电脑上访问一个网页,整个过程是怎么样的:DNSHTTPTCPOSPFIPARP

14. Ping的整个过程。ICMP报文是什么。

15. C/S模式下使用socket通信,几个关键函数。

16. IP地址分类。

17. 路由器与交换机区别。

Android

1. ActivityFragment的生命周期。

2. Acitivty的四中启动模式与特点。

3. Activity缓存方法。

4. Service的生命周期,两种启动方法,有什么区别。

5. 怎么保证service不被杀死。

6. 广播的两种注册方法,有什么区别。

7. Intent的使用方法,可以传递哪些数据类型。

8. ContentProvider使用方法。

9. ThreadAsycTaskIntentService的使用场景与特点。

10. FrameLayout , LinearLayout  AbsoluteLayout RelativeLayout TableLayout各自特点及绘制效率对比。

11. Android的数据存储形式。

12. Sqlite的基本操作。

13. Android中的MVC模式。

14. MergeViewStub的作用。

15. Json有什么优劣势。

16. 动画有哪两类,各有什么特点?

17. HandlerLoop消息队列模型,各部分的作用。

18. 怎样退出终止App

19. Asset目录与res目录的区别。

20. Android怎么加速启动Activity

21. Android内存优化方法:ListView优化,及时关闭资源,图片缓存等等。

22. Android中弱引用与软引用的应用场景。

23. Bitmap的四中属性,与每种属性队形的大小。

24. ViewView Group分类。自定义View过程:onMeasure()onLayout()onDraw()

25. Touch事件分发机制。

26. Android长连接,怎么处理心跳机制。

27. Zygote的启动过程。

28. Android IPC:Binder原理。

29. 你用过什么框架,是否看过源码,是否知道底层原理。

30. Android5.06.0新特性。

数据结构于算法

1. 链表与数组。

2. 队列和栈,出栈与入栈。

3. 链表的删除、插入、反向。

4. 字符串操作。

5. Hash表的hash函数,冲突解决方法有哪些。

6. 各种排序:冒泡、选择、插入、希尔、归并、快排、堆排、桶排、基数的原理、平均时间复杂度、最坏时间复杂度、空间复杂度、是否稳定。

7. 快排的partition函数与归并的Merge函数。

8. 对冒泡与快排的改进。

9. 二分查找,与变种二分查找。

10. 二叉树、B+树、AVL树、红黑树、哈夫曼树。

11. 二叉树的前中后续遍历:递归与非递归写法,层序遍历算法。

12. 图的BFSDFS算法,最小生成树prim算法与最短路径Dijkstra算法。

13. KMP算法。

14. 排列组合问题。

15. 动态规划、贪心算法、分治算法。(一般不会问到)

16. 大数据处理:类似10亿条数据找出最大的1000个数.........等等

项目

1. XXX(某个比较重要的点)是怎么实现的?

2. 你在项目中遇到的最大的困难是什么,怎么解决的?

3. 项目某个部分考虑的不够全面,如果XXXX,你怎么优化?

4. XXX(一个新功能)需要实现,你有什么思路?

其他(问面试官的问题)

1. 贵公司一向以XXX著称,能不能说明一下公司这方面的特点?

2. 贵公司XXX业务发展很好,这是公司发展的重点么?

3. 对技术和业务怎么看?

4. 贵公司一般的团队是多大,几个人负责一个产品或者业务?

5. 贵公司的开发中是否会使用到一些最新技术?

6. 对新人有没有什么培训,会不会安排导师?

7. Full Stack怎么看?

8. 你觉得我有哪些需要提高的地方?

Android客户端面试题集锦

标签:

原文地址:http://www.cnblogs.com/jasonkent27/p/4856209.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!