Android 知识点总结 持续更新

Java篇

1、ArrayList和LinkedList区别


相同点:1、都实现List

            2、都是线程不安全的

不同点:1、ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。 

            2、对于随机访问get和set,ArrayList比较占优势,因为LinkedList要移动指针。

            3、对于新增和删除操作add和remove,LinkedList比较占优势,因为ArrayList要移动数据。 

            4、ArrayList初始化大小10,扩容50%+1,LinkedList 是一个双向链表,没有初始化大小,也没有扩容的机制,

                 就是一直在前面或者后面新增就好。 

类型 内部结构 顺序遍历速度 随机遍历速度 追加代价 插入代价 删除代价 占用内存
ArrayList 数组

LinkedList 双向链表

 中


2、ArrayLis和Vector区别


相同点:1、都实现List

            2、初始化大小都是10

不同点:1、ArrayList线程不安全的,Vector线程安全,单线程中ArrayList性能更好

            2、ArrayList默认扩容50%+1,Vector扩容100%


3、fori 与foreach性能比较



100条数据
fori    遍历ArrayList花费时间0
fori    遍历LinkedList花费时间0
foreach 遍历ArrayList花费时间0
foreach 遍历LinkedList花费时间0

1000条数据
fori    遍历ArrayList花费时间2
fori    遍历LinkedList花费时间3
foreach 遍历ArrayList花费时间5
foreach 遍历LinkedList花费时间6

10000条数据
fori    遍历ArrayList花费时间24
fori    遍历LinkedList花费时间145
foreach 遍历ArrayList花费时间3
foreach 遍历LinkedList花费时间105

100000条数据
fori    遍历ArrayList花费时间3
fori    遍历LinkedList花费时间11062
foreach 遍历ArrayList花费时间13

foreach 遍历LinkedList花费时间11107

200000条数据
fori    遍历ArrayList花费时间12
fori    遍历LinkedList花费时间80598
foreach 遍历ArrayList花费时间29
foreach 遍历LinkedList花费时间80035

1000000条数据
fori    遍历ArrayList花费时间39
fori    遍历LinkedList花费时间太久
foreach 遍历ArrayList花费时间143
foreach 遍历LinkedList花费时间太久

时间单位毫秒,根据打印,可以知道数据量1000条内两种循环几乎无差别,10000条左右foreach出现了短暂优势

更多条数据时还是fori 更有优势


4、HashMap原理



HashMap详解


5、容器类继承关系



6、http有几种请求方法,他们有何区别


HTTP1.0定义了三种请求方法: GET, POST 和 HEAD方法

HTTP1.1新增了五种请求方法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法

最常用的是GET、POST

区别: 1、GET 主要用于获取数据,POST主要用于提交数据,比如表单、文件。

           2、GET通过URL传值,POST通过body传值,理论上数据都无限制,其限制取决于操作系统、浏览器、

                服务器的支持。

           3、GET方式需要使用Request.QueryString来取得变量的值,而POST方式通过Request.Form来获取变量的值。

           4、POST的安全性要比GET的安全性高,不过只高那么一点点,两者都是明文形式传输。如果你把关键数据

                放在GET里面,被人偷窥了浏览器,或者WEB服务器被入侵,日志被人倒去了,基本泄露可能性100%。

                而POST来说,日志没有记录,只要数据库服务器不被入侵,基本还是安全的。当然如果被抓了包,这一切

                都没有什么卵用,所以,HTTPS该用还是得用。


7、Object有哪些非私有方法及作用

11个方法

public final native Class<?> getClass();

public native int hashCode();

public boolean equals(Object obj) {
      return (this == obj);

}

protected native Object clone() throws CloneNotSupportedException;

public String toString() {
      return getClass().getName() + "@" + Integer.toHexString(hashCode());

}

public final native void notify();

public final native void notifyAll();

public final native void wait(long timeout) throws InterruptedException;

public final void wait(long timeout, int nanos) throws InterruptedException {
        if (timeout < 0) {
            throw new IllegalArgumentException("timeout value is negative");
        }


        if (nanos < 0 || nanos > 999999) {
            throw new IllegalArgumentException(
                                "nanosecond timeout value out of range");
        }


        if (nanos > 0) {
            timeout++;
        }


        wait(timeout);

}

public final void wait() throws InterruptedException {
        wait(0);

 }

protected void finalize() throws Throwable { }

          


Android篇


1、APP启动过程


2、Activity启动过程


3、ClassLoader

ClassLoader是一个对象,主要是对类的请求提供服务,当jvm需要某个类时它根据名称向ClassLoader请求这个类,然后ClassLoader返回这个类的class对象。 

1)引导类加载器(Bootstrap ClassLoader):它用来加载java的核心库,使用源生代码来实现的。 
2)扩展类加载器(Extensions ClassLoader):用来加载java的扩展库。jvm的实现会提供一个扩展库目录,该类加载器在目录中寻找并加载java类。 
3)系统类加载器(System ClassLoader):一般来讲,java应用的类都是由它加载完成的,是根据java的应用类路径来加载java类。

在java应用程序开发中,只有被jvm装载的class类型才能在程序中使用。只要生成的字节码符合jvm指令集和文件格式,就可以在jvm上运行,这为java的跨平台性提供条件。 
字节码的装载过程分为3个阶段:加载,连接,初始化。其中连接包括3个步骤(验证,准备,解析)。 


1)加载:处于class装载的第一个阶段,这时jvm必须完成通过类的全面获取类的二进制数据流,解析类的二进制数据流为方法区内的数据结构,创建java.lang.Class的实例。

2)连接:

验证:验证字节码文件,保证加载的字节码是符合规范的。
准备:正式为类变量(static修饰的变量)分配内存,并设置内变量的初始值,这些内存都将在方法区进行分配(不包括实例变量)。
解析:将类,接口,方法和字段的应用转为直接引用。


3)初始化:如果前面的步骤都没有出现问题,那么表示类可以顺利的装载到系统中。这个时候才会执行java字节码。初始化阶段的主要工作是执行类的初始化方法。


4、Android消息机制

点击打开链接


5、View绘制流程

基本分为measure、layout、draw 过程

http://blog.csdn.net/msn465780/article/details/79421559    点击打开链接


6、事件传递机制

http://blog.csdn.net/msn465780/article/details/47173405     点击打开链接


7、进程优先级

1、前台进程(Foreground process)。它表明用户正在与该进程进行交互操作,android系统依据下面的条件来将一个进程标记为前台进程:


该进程持有一个用户正在与其交互的Activity(也就是这个activity的生命周期方法走到了onResume()方法)。
该进程持有一个Service,并且这个Service与一个用户正在交互中的Activity进行绑定。
该进程持有一个前台运行模式的Service(也就是这个Service调用了startForegroud()方法)。
该进程持有一个正在执行生命周期方法(onCreate()、onStart()、onDestroy()等)的Service。
该进程持有一个正在执行onReceive()方法的BroadcastReceiver。
一般情况下,不会有太多的前台进程。杀死前台进程是操作系统最后无可奈何的做法。当内存严重不足的时候,前台进程一样会被杀死。


2、可见进程(Visible process)。它表明虽然该进程没有持有任何前台组件,但是它还是能够影响到用户看得到的界面。android系统依据下面的条件将一个进程标记为可见进程:


该进程持有一个非前台Activity,但这个Activity依然能被用户看到(也就是这个Activity调用了onPause()方法)。例如,当一个activity启动了一个对话框,这个activity就被对话框挡在后面。
该进程持有一个与可见(或者前台)Activity绑定的Service。


3、服务进程(Service process)。除了符合前台进程和可见进程条件的Service,其它的Service都会被归类为服务进程。


4、后台进程(Background process)。持有不可见Activity(调用了onStop()方法)的进程即为后台进程。通常情况下都会有很多后台进程,当内存不足的时候,在所有的后台进程里面,会按照LRU(最近使用)规则,优先回收最长时间没有使用过的进程。


5、空进程(Empty process)。不持有任何活动组件的进程。保持这种进程只有一个目的,就是为了缓存,以便下一次启动该进程中的组件时能够更快响应。当资源紧张的时候,系统会平衡进程缓存和底层的内核缓存情况进行回收。


8、Activity生命周期、service生命周期

9、序列化Serializable和Parcelable的理解和区别


   http://blog.csdn.net/msn465780/article/details/79388087     点击打开链接


10、Context继承关系



猜你喜欢

转载自blog.csdn.net/msn465780/article/details/79248533