本帖最后由 小石姐姐 于 2018-11-22 09:03 编辑
集合,异常,线程
一 , 集合 :
(一):单列集合 :
1,List集合特点 : 元素存取有序 ,可以存储重复元素 , 有索引
2,栈 : 出入口在一年, 先进后出(入栈 :将元素存入栈中 ; 弹栈 : 从栈中取出元素)
3,队列 : 队列出入口在两边 , 先进先出 .
4,数组 : 查询快 : 通过 (第一个元素地址值 + 索引)就可以快速计算出该索引元素的地址值
增删快 : 增加一个元素 ,要创建长度 + 1的新数组 ,然后将原数组元素复制到新数组 ,然后存入新元素 : 删除类似
5,链表 : 链表是由多个节点组成的 .
6,单向链表 : 每个节点存储 数据 和下一个节点的地址值 .
7,链表的特点 : 查询慢 : 要找到其中的某个节点 , 只能从开始的节点 ,一个一个向后找去
增删快 : 只需要修改保存的下一个节点的地址值,就可以快速完成增删 .
8,红黑树 : 是一种 平衡 二叉 查找 树 .趋近于平衡树 ,查询叶子点最大次数不能超过最小次数的二倍 .
9,平衡 : 左子节点和右子节点数量相等 .
10 ,二叉 : 每个节点最多有2个子节点
11 ,查找 : 节点存储的元素都是按照大小顺序存储的
12 ,特点 : 元素存储过程中就完成了大小排序 ,查询比链表快 ,增删比数组快
13 ,ArrayList : 最底层的数据结构其实还是数组 .
14 ,set : 存储不能重复 ,没有索引
-----------------------------------------------------------------------------------------------------------------------------------
(二)双列集合 :
1 ,Map : 双列集合 , 有两种遍历方式 ,自定义对象座位key(键) ,value(值).
2 ,三个子类 : HashMap , LinkedHashMap , Hashtable .
3 ,Map : 是双列集合 , 一个元素包含了两个值(键 : key , 值 : value)键值对
4 ,key和value的类型可以相同 , 也可以不相同 .
5 ,HashMap : 底层是哈希表 ,key存取无序不可重复
6 ,LinkedHasMap :底层是哈希表 + 链表 . key 存取有序不可重复
7 ,LinkedHashMap :底层是哈希表 + 链表 .key存取有序不可重复
8 ,映射 :键和值得对应关系 mapping
9 ,HasSet底层使用的就是HasMap.
10 ,keySet()方法是通过键找值
11 ,Entry对象就是一个节点 ,节点中存储了key和value .拿到了一个Entry对象就可以从中获取key和value .
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------
二 ,异常 :
1 ,异常: 异常指的是程序在执行中 ,出现的非正常的情况 , 最终导致JVM的非正常停止 .
2 ,Error: 不应该试图捕获的严重问题 ,不能处理的错误 .
3 ,Exception :可以处理的异常
4 ,编译时异常 :编译时期就会发生的异常 ,必须在编译时期处理 Unhandled exception XxxxEception
5 ,运行时异常 :便已正常,运行时才会发生的异常 .
6 ,当执行的代码发生异常操作时 ,JVM会创建一个对应的异常类对象 ,包含异常的内容 ,原因,位置 .
7 ,如果执行代码的方法没有对异常进行try...catch处理 ,则该异常会被JVM按默认的处理方式处理
8 ,JVM对于异常的默认处理方式是:1,将异常信息(内容,原因,位置)打印到控制台 .
2,终止当前的程序
9 ,throw关键字作用 : 在方法中抛出指定的异常对象 .
10 ,throws :声明抛出(方法自己不处理,交给方法调用者处理 ,"帅锅给别人")
作用 : 告诉方法的调用者 ,调用此方法有可能发生异常 ,是FileNotFoundException的父类
11 ,捕获异常 try .... catch : 捕获并处理异常(方法内部自己处理异常,不交给别人,"自己背锅").
12 ,try中可能会抛出多种异常 ,就可以写多个catch分别处理各种异常 .
13 ,如果try中产生了异常 ,就会从产生异常的哪一行代码直接跳转到对应的catch中执行处理代码 ,然后继续执行,try...catch之后的其他代码 ;如果没有产 生异常,那就不会执行catch,执行完try中的代码后,继续执行try..catch之后的其他代码
14 ,多个异常分别try ..catch处理
15 ,一个try多个catch,如果异常存在继承关系 ,子类异常在上, 父类异常在下
16 ,多个异常 ,一次捕获一次处理,用Exception多态捕获
17 ,finally :无论如何都会运行 ,
18 ,finally中的return语句 :如果finally代码块中有ruturn语句,则永远返回finally中的return语句的值
19 ,如果子父类继承关系如下 ,子类重写父类带有throws的方法 :
1:如果子类抛出多个异常 ,子类重写父类方法时可以有3中方式 :
a :抛出和父类相同的异常
b :抛出父类异常的子类
c :不抛出异常
2:父类没有抛出异常,子类重写父类该方法时也不可抛出异常,此时子类产生该异常,只能捕获处理,不能声明抛出
20 ,一般情况下,父类声明的异常时什么样的,子类重写的方法就是什么样的,保持一致即可
21 ,Java提供的异常类不足以满足我们的需求,我们也可以自己定义异常类
定义编译时异常 :继承 Exception
定义运行时异常 :继承 RuntimeException
多线程 :
22 ,并发 :交替执行 . 指两个或多个事件在"同一时间断内"发生
23 ,并行 :同时执行 . 指两个或多个事件在"同一时刻"发生(同时发生).
24 ,进程 :一个应用程序在内存中的一次执行过程 .
25 ,线程 :是进程内的一个独立的执行单元(一条代码执行路径)
26 ,分时调度 :所有线程轮流使用CPU ,平方占用CPU的时间
27 ,抢占式调度 :优先让优先级高的线程使用CPU ,如果优先级相同,则随机选择一个线程执行 ,只是优先的可能性大,而不是一定优先
28 ,主线程 :同一个线程内的代码 ,从上往下依次执行
------------------------------------------------------------------------------------------------------------------------------------------------------

三 , 线程 ,同步 ,线程间通信 :
1 ,线程执行的随机性 : CPU执行哪个线程是随机的, 不能人为干预
2 ,Java线程调度是抢占式的, 多个线程互相抢夺CPU的执行权
3 ,创建线程的第2种方式:
1. 定义类, 实现Runnable接口
2. 重写 run() 方法, 要执行的代码(任务)
3. 创建Runnable实现类对象 (任务对象)
4. 创建Thread类对象, 在构造方法中传入Runnable实现类对象 (将任务和线程绑定)
5. 通过Thread对象调用 start() 方法启动线程
4 ,Thread和Runnable的区别 :
1. 避免单继承的局限性
2. 增强了程序的扩展性, 降低了程序的耦合性(解耦)
3. 线程是Thread, 任务是Runnable实现类对象. 相当于将线程和任务分离
5 , 解决线程安全问题方式 :
解决多线程操作共享数据的安全问题的3种方式:
1. 同步代码块 : 同步代码块: 使用 synchronized 关键字修饰的代码块, 并传入一个当作锁的对象
2. 同步方法 :非静态同步方法的锁对象: this
3. Lock锁机制 : void lock(): 获取锁 , void unlock(): 释放
-----------------------------------------------------------------------------------------------------------------------------------------
6 ,同步技术解决线程安全问题的原理 :
线程进入同步代码块前, 会"争夺锁对象", "只有一个线程"会抢到锁对象
进入同步代码块的线程, 会"持有锁对象", 并执行同步代码块中的代码
此时同步代码块外的线程, 处于"阻塞"状态, 只能等待
当同步代码块内的线程执行完代码块, 会离开同步代码块, 并"归还锁对象"给同步代码块
等在同步代码块外的其他线程就可以继续争夺锁对象
--------------------------------------------------------------------------------------------------------------------------------------------------------
(二)线程间的通信 :
void notify(): 随机唤醒在同一个锁对象上的某一个处于等待状态的线程
void notifyAll(): 唤醒所有在同一个锁对象上处于等待状态的线程
void wait(): 让当前线程处于"无限等待"状态
void wait(long timeout): 让当前线程处于"计时等待"状态, 时间到或被唤醒后结束此状态
void wait(long timeout, int nanos): 让当前线程处于计时等待状态, 时间到或被唤醒后结束此状态
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

(三)线程部分涉及到的API :
Thread Thread(): 创建Thead对象
Thread Thread(String threadName): 创建Thead对象并指定线程名
Thread Thread(Runnable target): 通过Runnable对象创建Thread对象
Thread Thread(Runnable target, String threadName): 通过Runnable对象创建对象并指定线程名
// 成员方法
void run(): 用于让子类重写, 表示该线程要执行的任务.不能直接调用
void start(): 启动线程, 即让线程开始执行run()方法中的代码
String getName(): 获取线程的名称
void setName(String name): 设置线程名称
// 静态方法
static Thread currentThread(): 返回对当前正在执行的线程对象的引用
static void sleep(long millis): 让所在线程睡眠指定的毫秒
java.lang.Object类:
// 成员方法 (只能通过"锁对象"调用)
void notify(): 随机唤醒在同一个锁对象上的某一个处于等待状态的线程
void notifyAll(): 唤醒所有在同一个锁对象上处于等待状态的线程
void wait(): 让当前线程处于无限等待状态
void wait(long timeout): 让当前线程处于计时等待状态, 时间到或被唤醒后结束此状态
void wait(long timeout, int nanos): 让当前线程处于计时等待状态, 时间到或被唤醒后结束此状态

|
|