Java
Java基础
- 一、数据类型
- [基本类型](https://github.com/CyC2018/CS-Notes/blob/master/notes/Java 基础.md#基本类型)
- [包装类型](https://github.com/CyC2018/CS-Notes/blob/master/notes/Java 基础.md#包装类型)
- [缓存池](https://github.com/CyC2018/CS-Notes/blob/master/notes/Java 基础.md#缓存池)
- 二、String
- [概览](https://github.com/CyC2018/CS-Notes/blob/master/notes/Java 基础.md#概览)
- [不可变的好处](https://github.com/CyC2018/CS-Notes/blob/master/notes/Java 基础.md#不可变的好处)
- [String, StringBuffer and StringBuilder](https://github.com/CyC2018/CS-Notes/blob/master/notes/Java 基础.md#string-stringbuffer-and-stringbuilder)
- [String Pool](https://github.com/CyC2018/CS-Notes/blob/master/notes/Java 基础.md#string-pool)
- [new String(“abc”)](https://github.com/CyC2018/CS-Notes/blob/master/notes/Java 基础.md#new-stringabc)
- 三、运算
- [参数传递](https://github.com/CyC2018/CS-Notes/blob/master/notes/Java 基础.md#参数传递)
- [float 与 double](https://github.com/CyC2018/CS-Notes/blob/master/notes/Java 基础.md#float-与-double)
- [隐式类型转换](https://github.com/CyC2018/CS-Notes/blob/master/notes/Java 基础.md#隐式类型转换)
- [switch](https://github.com/CyC2018/CS-Notes/blob/master/notes/Java 基础.md#switch)
- 四、关键字
- [final](https://github.com/CyC2018/CS-Notes/blob/master/notes/Java 基础.md#final)
- [static](https://github.com/CyC2018/CS-Notes/blob/master/notes/Java 基础.md#static)
- 五、Object 通用方法
- [概览](https://github.com/CyC2018/CS-Notes/blob/master/notes/Java 基础.md#概览)
- [equals()](https://github.com/CyC2018/CS-Notes/blob/master/notes/Java 基础.md#equals)
- [hashCode()](https://github.com/CyC2018/CS-Notes/blob/master/notes/Java 基础.md#hashcode)
- [toString()](https://github.com/CyC2018/CS-Notes/blob/master/notes/Java 基础.md#tostring)
- [clone()](https://github.com/CyC2018/CS-Notes/blob/master/notes/Java 基础.md#clone)
- 六、继承
- [访问权限](https://github.com/CyC2018/CS-Notes/blob/master/notes/Java 基础.md#访问权限)
- [抽象类与接口](https://github.com/CyC2018/CS-Notes/blob/master/notes/Java 基础.md#抽象类与接口)
- [super](https://github.com/CyC2018/CS-Notes/blob/master/notes/Java 基础.md#super)
- [重写与重载](https://github.com/CyC2018/CS-Notes/blob/master/notes/Java 基础.md#重写与重载)
- [七、反射](https://github.com/CyC2018/CS-Notes/blob/master/notes/Java 基础.md#七反射)
- [八、异常](https://github.com/CyC2018/CS-Notes/blob/master/notes/Java 基础.md#八异常)
- [九、泛型](https://github.com/CyC2018/CS-Notes/blob/master/notes/Java 基础.md#九泛型)
- [十、注解](https://github.com/CyC2018/CS-Notes/blob/master/notes/Java 基础.md#十注解)
JAVA 容器
[Java 容器](https://github.com/CyC2018/CS-Notes/blob/master/notes/Java 容器.md#java-容器)
- 一、概览
- [Collection](https://github.com/CyC2018/CS-Notes/blob/master/notes/Java 容器.md#collection)
- [Map](https://github.com/CyC2018/CS-Notes/blob/master/notes/Java 容器.md#map)
- 二、容器中的设计模式
- [迭代器模式](https://github.com/CyC2018/CS-Notes/blob/master/notes/Java 容器.md#迭代器模式)
- [适配器模式](https://github.com/CyC2018/CS-Notes/blob/master/notes/Java 容器.md#适配器模式)
- 三、源码分析
- [ArrayList](https://github.com/CyC2018/CS-Notes/blob/master/notes/Java 容器.md#arraylist)
- [Vector](https://github.com/CyC2018/CS-Notes/blob/master/notes/Java 容器.md#vector)
- [CopyOnWriteArrayList](https://github.com/CyC2018/CS-Notes/blob/master/notes/Java 容器.md#copyonwritearraylist)
- [LinkedList](https://github.com/CyC2018/CS-Notes/blob/master/notes/Java 容器.md#linkedlist)
- [HashMap](https://github.com/CyC2018/CS-Notes/blob/master/notes/Java 容器.md#hashmap)
- [ConcurrentHashMap](https://github.com/CyC2018/CS-Notes/blob/master/notes/Java 容器.md#concurrenthashmap)
- [LinkedHashMap](https://github.com/CyC2018/CS-Notes/blob/master/notes/Java 容器.md#linkedhashmap)
- [WeakHashMap](https://github.com/CyC2018/CS-Notes/blob/master/notes/Java 容器.md#weakhashmap)
JAVA并发
[Java 并发](https://github.com/CyC2018/CS-Notes/blob/master/notes/Java 并发.md#java-并发)
- 一、使用线程
- [实现 Runnable 接口](https://github.com/CyC2018/CS-Notes/blob/master/notes/Java 并发.md#实现-runnable-接口)
- [实现 Callable 接口](https://github.com/CyC2018/CS-Notes/blob/master/notes/Java 并发.md#实现-callable-接口)
- [继承 Thread 类](https://github.com/CyC2018/CS-Notes/blob/master/notes/Java 并发.md#继承-thread-类)
- [实现接口 VS 继承 Thread](https://github.com/CyC2018/CS-Notes/blob/master/notes/Java 并发.md#实现接口-vs-继承-thread)
- 二、基础线程机制
- [Executor](https://github.com/CyC2018/CS-Notes/blob/master/notes/Java 并发.md#executor)
- [Daemon](https://github.com/CyC2018/CS-Notes/blob/master/notes/Java 并发.md#daemon)
- [sleep()](https://github.com/CyC2018/CS-Notes/blob/master/notes/Java 并发.md#sleep)
- [yield()](https://github.com/CyC2018/CS-Notes/blob/master/notes/Java 并发.md#yield)
- 三、中断
- [InterruptedException](https://github.com/CyC2018/CS-Notes/blob/master/notes/Java 并发.md#interruptedexception)
- [interrupted()](https://github.com/CyC2018/CS-Notes/blob/master/notes/Java 并发.md#interrupted)
- [Executor 的中断操作](https://github.com/CyC2018/CS-Notes/blob/master/notes/Java 并发.md#executor-的中断操作)
- 四、互斥同步
- [synchronized](https://github.com/CyC2018/CS-Notes/blob/master/notes/Java 并发.md#synchronized)
- [ReentrantLock](https://github.com/CyC2018/CS-Notes/blob/master/notes/Java 并发.md#reentrantlock)
- [比较](https://github.com/CyC2018/CS-Notes/blob/master/notes/Java 并发.md#比较)
- [使用选择](https://github.com/CyC2018/CS-Notes/blob/master/notes/Java 并发.md#使用选择)
- 五、线程之间的协作
- [join()](https://github.com/CyC2018/CS-Notes/blob/master/notes/Java 并发.md#join)
- [wait() notify() notifyAll()](https://github.com/CyC2018/CS-Notes/blob/master/notes/Java 并发.md#wait-notify-notifyall)
- [await() signal() signalAll()](https://github.com/CyC2018/CS-Notes/blob/master/notes/Java 并发.md#await-signal-signalall)
- 六、线程状态
- [新建(NEW)](https://github.com/CyC2018/CS-Notes/blob/master/notes/Java 并发.md#新建new)
- [可运行(RUNABLE)](https://github.com/CyC2018/CS-Notes/blob/master/notes/Java 并发.md#可运行runable)
- [阻塞(BLOCKED)](https://github.com/CyC2018/CS-Notes/blob/master/notes/Java 并发.md#阻塞blocked)
- [无限期等待(WAITING)](https://github.com/CyC2018/CS-Notes/blob/master/notes/Java 并发.md#无限期等待waiting)
- [限期等待(TIMED_WAITING)](https://github.com/CyC2018/CS-Notes/blob/master/notes/Java 并发.md#限期等待timed_waiting)
- [死亡(TERMINATED)](https://github.com/CyC2018/CS-Notes/blob/master/notes/Java 并发.md#死亡terminated)
- 七、J.U.C - AQS
- [CountDownLatch](https://github.com/CyC2018/CS-Notes/blob/master/notes/Java 并发.md#countdownlatch)
- [CyclicBarrier](https://github.com/CyC2018/CS-Notes/blob/master/notes/Java 并发.md#cyclicbarrier)
- [Semaphore](https://github.com/CyC2018/CS-Notes/blob/master/notes/Java 并发.md#semaphore)
- 八、J.U.C - 其它组件
- [FutureTask](https://github.com/CyC2018/CS-Notes/blob/master/notes/Java 并发.md#futuretask)
- [BlockingQueue](https://github.com/CyC2018/CS-Notes/blob/master/notes/Java 并发.md#blockingqueue)
- [ForkJoin](https://github.com/CyC2018/CS-Notes/blob/master/notes/Java 并发.md#forkjoin)
- [九、线程不安全示例](https://github.com/CyC2018/CS-Notes/blob/master/notes/Java 并发.md#九线程不安全示例)
- 十、Java 内存模型
- [主内存与工作内存](https://github.com/CyC2018/CS-Notes/blob/master/notes/Java 并发.md#主内存与工作内存)
- [内存间交互操作](https://github.com/CyC2018/CS-Notes/blob/master/notes/Java 并发.md#内存间交互操作)
- [内存模型三大特性](https://github.com/CyC2018/CS-Notes/blob/master/notes/Java 并发.md#内存模型三大特性)
- [先行发生原则](https://github.com/CyC2018/CS-Notes/blob/master/notes/Java 并发.md#先行发生原则)
- 十一、线程安全
- [不可变](https://github.com/CyC2018/CS-Notes/blob/master/notes/Java 并发.md#不可变)
- [互斥同步](https://github.com/CyC2018/CS-Notes/blob/master/notes/Java 并发.md#互斥同步)
- [非阻塞同步](https://github.com/CyC2018/CS-Notes/blob/master/notes/Java 并发.md#非阻塞同步)
- [无同步方案](https://github.com/CyC2018/CS-Notes/blob/master/notes/Java 并发.md#无同步方案)
- 十二、锁优化
- [自旋锁](https://github.com/CyC2018/CS-Notes/blob/master/notes/Java 并发.md#自旋锁)
- [锁消除](https://github.com/CyC2018/CS-Notes/blob/master/notes/Java 并发.md#锁消除)
- [锁粗化](https://github.com/CyC2018/CS-Notes/blob/master/notes/Java 并发.md#锁粗化)
- [轻量级锁](https://github.com/CyC2018/CS-Notes/blob/master/notes/Java 并发.md#轻量级锁)
- [偏向锁](https://github.com/CyC2018/CS-Notes/blob/master/notes/Java 并发.md#偏向锁)
JAVA虚拟机
[Java 虚拟机](https://github.com/CyC2018/CS-Notes/blob/master/notes/Java 虚拟机.md#java-虚拟机)
- 一、运行时数据区域
- [程序计数器](https://github.com/CyC2018/CS-Notes/blob/master/notes/Java 虚拟机.md#程序计数器)
- [Java 虚拟机栈](https://github.com/CyC2018/CS-Notes/blob/master/notes/Java 虚拟机.md#java-虚拟机栈)
- [本地方法栈](https://github.com/CyC2018/CS-Notes/blob/master/notes/Java 虚拟机.md#本地方法栈)
- [堆](https://github.com/CyC2018/CS-Notes/blob/master/notes/Java 虚拟机.md#堆)
- [方法区](https://github.com/CyC2018/CS-Notes/blob/master/notes/Java 虚拟机.md#方法区)
- [运行时常量池](https://github.com/CyC2018/CS-Notes/blob/master/notes/Java 虚拟机.md#运行时常量池)
- [直接内存](https://github.com/CyC2018/CS-Notes/blob/master/notes/Java 虚拟机.md#直接内存)
- 二、垃圾收集
- [判断一个对象是否可被回收](https://github.com/CyC2018/CS-Notes/blob/master/notes/Java 虚拟机.md#判断一个对象是否可被回收)
- [引用类型](https://github.com/CyC2018/CS-Notes/blob/master/notes/Java 虚拟机.md#引用类型)
- [垃圾收集算法](https://github.com/CyC2018/CS-Notes/blob/master/notes/Java 虚拟机.md#垃圾收集算法)
- [垃圾收集器](https://github.com/CyC2018/CS-Notes/blob/master/notes/Java 虚拟机.md#垃圾收集器)
- 三、内存分配与回收策略
- [Minor GC 和 Full GC](https://github.com/CyC2018/CS-Notes/blob/master/notes/Java 虚拟机.md#minor-gc-和-full-gc)
- [内存分配策略](https://github.com/CyC2018/CS-Notes/blob/master/notes/Java 虚拟机.md#内存分配策略)
- [Full GC 的触发条件](https://github.com/CyC2018/CS-Notes/blob/master/notes/Java 虚拟机.md#full-gc-的触发条件)
- 四、类加载机制
- [类的生命周期](https://github.com/CyC2018/CS-Notes/blob/master/notes/Java 虚拟机.md#类的生命周期)
- [类加载过程](https://github.com/CyC2018/CS-Notes/blob/master/notes/Java 虚拟机.md#类加载过程)
- [类初始化时机](https://github.com/CyC2018/CS-Notes/blob/master/notes/Java 虚拟机.md#类初始化时机)
- [类与类加载器](https://github.com/CyC2018/CS-Notes/blob/master/notes/Java 虚拟机.md#类与类加载器)
- [类加载器分类](https://github.com/CyC2018/CS-Notes/blob/master/notes/Java 虚拟机.md#类加载器分类)
- [双亲委派模型](https://github.com/CyC2018/CS-Notes/blob/master/notes/Java 虚拟机.md#双亲委派模型)
- [自定义类加载器实现](https://github.com/CyC2018/CS-Notes/blob/master/notes/Java 虚拟机.md#自定义类加载器实现)
JAVA I/O
[Java IO](https://github.com/CyC2018/CS-Notes/blob/master/notes/Java IO.md#java-io)
- [一、概览](https://github.com/CyC2018/CS-Notes/blob/master/notes/Java IO.md#一概览)
- [二、磁盘操作](https://github.com/CyC2018/CS-Notes/blob/master/notes/Java IO.md#二磁盘操作)
- 三、字节操作
- [实现文件复制](https://github.com/CyC2018/CS-Notes/blob/master/notes/Java IO.md#实现文件复制)
- [装饰者模式](https://github.com/CyC2018/CS-Notes/blob/master/notes/Java IO.md#装饰者模式)
- 四、字符操作
- [编码与解码](https://github.com/CyC2018/CS-Notes/blob/master/notes/Java IO.md#编码与解码)
- [String 的编码方式](https://github.com/CyC2018/CS-Notes/blob/master/notes/Java IO.md#string-的编码方式)
- [Reader 与 Writer](https://github.com/CyC2018/CS-Notes/blob/master/notes/Java IO.md#reader-与-writer)
- [实现逐行输出文本文件的内容](https://github.com/CyC2018/CS-Notes/blob/master/notes/Java IO.md#实现逐行输出文本文件的内容)
- 五、对象操作
- [序列化](https://github.com/CyC2018/CS-Notes/blob/master/notes/Java IO.md#序列化)
- [Serializable](https://github.com/CyC2018/CS-Notes/blob/master/notes/Java IO.md#serializable)
- [transient](https://github.com/CyC2018/CS-Notes/blob/master/notes/Java IO.md#transient)
- 六、网络操作
- [InetAddress](https://github.com/CyC2018/CS-Notes/blob/master/notes/Java IO.md#inetaddress)
- [URL](https://github.com/CyC2018/CS-Notes/blob/master/notes/Java IO.md#url)
- [Sockets](https://github.com/CyC2018/CS-Notes/blob/master/notes/Java IO.md#sockets)
- [Datagram](https://github.com/CyC2018/CS-Notes/blob/master/notes/Java IO.md#datagram)
- 七、NIO
- [流与块](https://github.com/CyC2018/CS-Notes/blob/master/notes/Java IO.md#流与块)
- [通道与缓冲区](https://github.com/CyC2018/CS-Notes/blob/master/notes/Java IO.md#通道与缓冲区)
- [缓冲区状态变量](https://github.com/CyC2018/CS-Notes/blob/master/notes/Java IO.md#缓冲区状态变量)
- [文件 NIO 实例](https://github.com/CyC2018/CS-Notes/blob/master/notes/Java IO.md#文件-nio-实例)
- [选择器](https://github.com/CyC2018/CS-Notes/blob/master/notes/Java IO.md#选择器)
- [套接字 NIO 实例](https://github.com/CyC2018/CS-Notes/blob/master/notes/Java IO.md#套接字-nio-实例)
- [内存映射文件](https://github.com/CyC2018/CS-Notes/blob/master/notes/Java IO.md#内存映射文件)
- [对比](https://github.com/CyC2018/CS-Notes/blob/master/notes/Java IO.md#对比)
Android知识
Android 系统启动流程
loader(引导程序加载到RAM)-> kenerl初始化(start_kener和reset_kener),启动initi进程->init fork一个zygote进程,管理所有的java进程->zygote fork SystemServer,管理AMS,PMS,WMS;
APP启动流程
-
获取AMS的引用,startActivity ->socket发送信息,zygote fork创建进程->ActivityThread main 创建application
-
用Socket原因是,怕父进程binder线程有锁,然后子进程的主线程一直在等其子线程(从父进程拷贝过来的子进程)的资源,但是其实父进程的子进程并没有被拷贝过来,造成死锁,所以fork不允许存在多线程。而非常巧的是Binder通讯偏偏就是多线程,所以干脆父进程(Zgote)这个时候就不使用binder线程
PMS
- 管理安装包,安装APK,管理APK;
- 扫描app,获取AndroidManifest.xml,解析Manifest,加载入口activty(AMS查)
为什么要PMS
- 每次开启app需要遍历/data/app ,跳转的app;
- I/O操作获取AndroidManifest.xml;
- dom解析Manifest,Activity标签(找到入口activity);
- 加载入口Activity;
Handler
①先说handler导致activity内存泄露的原因: handler发送的消息在当前handler的消息队列中,如果此时activity finish掉了,那么消息队列的消息依旧会由handler进行处理,若此时handler声明为内部类(非静态内部类),我们知道内部类天然持有外部类的实例引用,那么就会导致activity无法回收,进而导致activity泄露。 ②为何handler要定义为static? 因为静态内部类不持有外部类的引用,所以使用静态的handler不会导致activity的泄露 ③为何handler要定义为static的同时,还要用WeakReference 包裹外部类的对象? 这是因为我们需要使用外部类的成员,可以通过"activity. "获取变量方法等,如果直接使用强引用,显然会导致activity泄露。
BroadcastReceiver
- 不能做耗时操作(ANR),也不能用子线程完成耗时操作,因为一旦广播结束,在进程中很容易优先被杀死,此时工作线程也会被杀死,只能在onreceive内开启Service,交给service处理;
Android系统启动流程
android的启动流程是从底层开始进行的,具体如下所示:
Android是基于Linux内核的系统,Android的启动过程主要分为两个阶段,首先是Linux内核的启动,然后是Android框架的启动。
可以将Andorid系统的启动流程分为以下五个层进行展开,分别是Loader层,Kernel层,Native层,Framework层,Application层。
Loader层
1.首先按开机键后,引导芯片将引导程序从ROM中加载到RAM中
2.引导程序(Bootloader)的主要作用就是将操作系统映像文件拷贝到RAM中
Kernel层
3.接着通过start_kernel函数和reset_kernel函数完成对kernel的初始化操作,同时启动用户空间的init进程
4.init进程是是一个十分重要的祖先进程,linux中的所有进程都是由init进程直接或者间接fork出来的,init进程一启动时就会读取init.rc脚本文件
Native层(包括利用surfaceflinger创建动画,孵化zygote进程,以及用户守护进程)
5.init进程创建后,会fork出一个zygote进程,这个进程是所有Java进程的父进程,所有的服务都会向其进行请求来fork出java进程
6.init还会创建servicemanager进程,它是Binder IPC通信过程中的守护进程,并会集中管理系统内的所有服务
Framework层
7.由zygote进程通过startSystemServer()方法fork出SystemServer进程,该进程同样是Andorid系统内重要的进程,AMS,PMS,WMS等多个进程都是由Systemserver进程fork出来的,SystemServer包含了startBootstrapServices(),startCoreServices(),startOtherServices()创建服务的方法:具体见wiki: