1.《Android面试宝典》

来源:互联网 发布:冰川网络远征ol官网 编辑:程序博客网 时间:2024/06/05 03:22

先看了看Andoird面试宝典这本书。讲一讲吧

先是JAVA的一些内容

1.Collection框架。ArrayList是线程不安全的,效率较高。Vector是线程安全的。但是基于Object[]实现的,都拥有自增长机制。Vector不够了扩容1倍,Arraylist扩容50%,后者效率更高。

2.HashMap,这个哈希的实习,和我之前看到的底层是一样的。通过Key算一个序号,然后找到,冲突就通过链表往后走。但是这里加了句话,假如冲突(即链表长度达到8默认),则使用红黑树替代链表,从而提高速度。内部是存着Entry(hash,key,value,next)。

3.IO主要分字节流字符流。然后就分很多类啦。。我感觉我用的应该是字节流。

4.NIO,传统IO都是阻塞的,无法有效的使用CPU,NIO改写以前的IO部分。IO是面向流的,NIO是面向缓冲区。的确我的read,read什么也好,都是阻塞的,readObject。

5.多线程的实现方式,继承Thread,实现Runnable接口,使用ExecutorService,Callable,Future实现由返回结构的多线程。Thread本质是实现了Runnable的一个实例。第三个是线程池相关的好像,没怎么学过,有空可以搞搞。

6.线程的状态,新建状态,就绪状态,运行状态,阻塞状态(阻塞时,虚拟机不会给他分配CPU,所以read的时候是不怎么消耗资源的是吧。。我以为隔三差五就要去看看有没有数据(看到后面阻塞三种情况,1执行某个对象的wait(),放入这个对象的等待池2.位于对象锁的阻塞,会放入锁池3执行sleep或者join,或者发出IO请求)属于第三种)。这几个池我感觉可以好好看,是深入理解的关键感觉。

7.终止线程(1,线程run执行完了2,thread的interrupt打断。3,thread的stop打断(不推荐。。))。

8.sleep和yield区别。sleep()会给其他线程机会,不考虑优先级;yield只会个相同优先级以及更高优先级的机会。sleep进入阻塞状态,yield进入就绪状态(随时有机会再运行是吧。。)。sleep抛interrupt的异常,yieldbupao。sleep移植性更好(这个咋理解。。)。

9.sleep和wait区别,sleep完了后,自己恢复,wait需要别人notify。参考6,他俩属于不同的阻塞情况。

10.Synchronized和lock的异同,刚刚看到Vector的源码,用到了前者,想起之前自己看的ArrayBlockingQueue的数据结构,用的是ReentrantLock,百度了下就是lock。lock范围比前者更大,前者持有锁资源,且会自动释放。lock必须手动释放,且得在finally从句中释放。效率上比,前者,竞争不紧张的时候是轻量级的,效率高些;激烈的时候,编程重量级锁,效率就比lock慢了。所以一般倾向lock。

11.JAVA的堆栈,JVM有2个重要的控件,栈内存、堆内存。一般的函数变量啊,代码块的变量啊,都在栈内存,超过作用于java自动释放。堆内存用于存放new的对象和数组,虚拟机自动垃圾回收期来管理。

12.单例模式,单例类智能有一个实例,必须自己创建自己的唯一实例,提供这一实例。单例模式的实现:饿汉式;懒汉式;枚举;静态内部;静态代码块。我应该是用前2种。

13.工厂模式:工厂模式的主要目的是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽并隔离起来,达到提高灵活性的目的。大体分3类:1.简单工厂模式(不利于产生系列产品)2.工厂方法模式:又称多形性工厂。3抽象工厂模式:又称工具箱,产生产品族,但不利于产生新的产品。这12、13也是我想往项目中试验的点。


然后是Android的内容

1.系统架构,高到低分4层,应用程序层、应用程序框架层、核心类库、linux内核

2.Activity之前传递数据,1)基本类型的数据,直接Intent;2)大量数据,通过Bundle封装,然后传Bundle;3)序列化对象接口

3.Activity回传。利用startActivityForResult(),说不定之后会用。

4.PendingIntent是对Intent的包装。处理非即时Intent,供当前App和外部App调用。典型应用,通知栏跳转到某个页面。与Intent的区别。随着Activity消失而消失;PendingIntent在程序结束后依然有效;PendingIntent自带Context。Intent在原Task中运行,而PendingIntent在新的Task中运行。Intent一般用于在Activity、service、broadcastReceiver之间传递数据,PendingIntent一般用于消息通知。

5.假如调用了多个Activity。安全退出所有,比如在打开的第五个里面,退出全部。方法:1抛异常退出(low,体验差)2.记录Activity,然后kill,感觉有点复杂3.发送特定广播,是个办法4.一个标志位,利用3那个回传,都处理这个flag,递归退出。后俩种办法实际用到会多点。

6.后台的Activity被回收怎么办,调用OnSaveInstanceState(bundle obj),销毁时,放到bundle里面,然后oncreate时候,通过bundle,做数据恢复。

7.Service,是一个运行在后天没有用户界面的组件,用于执行耗时操作,运行于宿主进程的主线程中,既不自己创建进程。如果服务要执行播放MP3或者网络,应该在服务中创建一个新的线程来执行这些工作。service启动2种方式。startservice(长期在后台运行,资源不足会被杀,足够了又会起);bindService,一个bind的service提供一个允许组件与Service交互的接口。常用混合模式处理服务。start->bind->unbind->stop。

8.广播分为无序广播和有序广播,无序不能拦截,都能收到。有序广播,高优先级可以截断低优先级。

9:广播注册,静态注册、动态注册。

10:ContentProvider是4大组件之一,用于不同的应用程序之间的数据共享。

11:UI和网络,不能同一个线程,UI是单线程操作模型。因此通信靠handler与Looper处理。

12:线程池,新建一堆处于睡眠的线程,在队列里。

13:handler机制,书上这图还行。

14:事件驱动程序设计模型:典型应用是在GUI系统中。GUI的程序要在不确定的时间内去响应用户的UI事件。如果是传统的编程模型,应用程序必须有个线程去轮番询问,太浪费(的确是我的困惑,不太懂机制)。其特点,1)消息队列2)轮询器,看有无消息,否则休眠(不停看和休眠不矛盾么?)3)有消息实体,生命周期短。多个线程可以发送到这个消息队列里,然后统一处理,统一修改UI。恩,所以这个线程主要就是改UI的(我还让他干起他的不太好)

15:Android中有哪些引用:强引用。有他就不会被回收。软引用,内存不足时会被回收。弱引用,垃圾回收机制发现就回收。虚引用,是跟踪的目的。

16:Android的内存泄漏,DDMS-Heap。解决办法,单例模式。避免在非静态内部类中创建静态实例(我好想是这么干的)。及时关闭,等等。

原创粉丝点击