day3
数据储存结构
栈结构
先进后出 入口出口在同侧
使用场景 栈内存,反转内容
队列
先进先出 入口出口在两侧
使用场景 秒杀 抢购 在线售票 处理高并发场景
数组结构
查询快 有索引 增删慢 需创建新数组复制
链表
查询慢 从第一个节点依次查找 增删快 节点对接
红黑树
是一种平衡 二叉 查找树
元素在储存时就已经排序
查询比链表快 增删比数组快哈希表
数组链表红黑树组合
LIst集合
元素储存取出有序 元素可以重复 有索引
add()添加
get()获取
remove()移除指定位置元素 并返回
set() 指定元素替换指定位置元素
ArrayList集合
查询快 增删慢 线程不安全 高效率
LinkedList集合
链表结构存储 查询慢 增删快 线程不安全 效率高
addFirst() push addLast()添加至开头,末尾
getFirst getLast 获取开头或末尾元素
removeFirst pop removeLast 移除开头或末尾元素并返回
Vector集合
数组结构 查询慢增删快 同步线程 效率低 几乎么人使用
Set集合
元素不可重复 没有索引 存取元素无序 底层使用哈希表结构
哈希表等于 数组和链表 或红黑树组合 jdk1.8
add() 添加元素 重复返回false
HashSet集合
hashCode() 调用本地C/C++ 计算出对象地址哈希值
哈希冲突所以需要 equals 继续判断
自定义类使用该集合需要重新上两个方法
LinkedHashSet集合
元素存取变得有序 不可以重复 没有索引
储存结构多一个链表用来存着元素存取顺序
可变参数
方法参数可以存多个
方法名(int... 变量名){可以当做数组处理}
Collections集合工具类 区分和Collection
静态方法
addAll(集合 ,元素)集合添加多个元素
shuffle()打乱顺序
sort()默认升序排列
将集合中元素按照指定规则排序
sort(List<T>?list,new Comparator<??super?T>?c): 需要实现compare()方法
自定义类需要排序时 实现Comparable<>接口 重写compareTo()方法 + -
day4
Map集合
双列集合 一个元素包含两个值 键 值 对 可以相同可以不同
键不能重复 值可以重复 两者一一对应
成员方法
put(k,v) 添加键值对 存在替换 不存在添加
remove(k) 根据键删除键值对 有返回删除值 没有返回false
get(k)用键获取值
containsKey(k) 判断是否有该键
keySet() 获取所有键 返回到set集合中
entrySet()获取所有键值对组合 返回到set集合中 类型entry 可以调用gat键get值方法
LinkedHashMap类
存储类型 哈希表和链表组合 不允许重复但存取有序
Hashtable类
哈希表组成 不予许存空值 线程效率低 但其子类Properties集合 IO流使用较多
JDK9 新方法 快速添加元素 list set map of(E ..e)
day5
异常的概念和体系
Error 错误类不能捕获处理 需要改写源码
Exception 异常 可以处理
throw 制造一个异常
throw 异常类() 运行时异常可以不管 可以捕获 编译时异常必须处理 或者向上抛出或者捕获处理
throws 异常类型
try...catch
Objects的静态方法requireNonNull() 检查是否为空 抛出异常
throws 必须写在方法声明上
throws 后面的异常类名, 一般是 Exception 或 Exception的子类
(RuntimeException及其子类也行, 但是没有什么意义)
方法内部如果抛出了多个异常对象, throws 后也必须声明多个异常
如果抛出的异常对象有子父类关系, 那么直接声明父类异常即可
调用了一个带有 throws 声明抛出异常的方法, 就必须处理该异常:
异常捕获后处理
getMessage 异常的信息. 没有原因返回null
toString异常的类型和原因信息
printStackTrace使用标准错误输出流打印异常信息
finally代码块
添加在try-catch之后 无论是否报错必定执行内部 通常用来释放资源
自定义异常 可以继承Exception或者RuntimeException
day6
多线程
并发 交替进行 高速切换
并行 两个线程 同时在运行
进程: 一个应用程序在内存中的一次执行过程 每个进程有独立栈内存
线程 是进程运行的时候基本单位
线程调度 轮流使用资源平分 抢占式调度 优先级区分1-10
创建多线程方式
继承Thread类重写run方法 该类创建对象调用start方法开启
方法getsetName获取设置线程名称
currentThread()返回当前线程对象
sleep 睡觉
Thread(Runnable target,name) 添加Runnable对象任务创建线程且设置名称
创建多线程方式2
定义类实现接口Runnable 重写run 在主方法创建其对象 并且用作Thread 的对象参数 用Thread对象调用start开启
好处 解耦 防止单继承
多线程安全问题
同步代码块
synchronized (锁){}
同步方法
public synchronized void method(this)
public static synchronized void method(.class)
Lock锁
lock(): 获取锁
unlock(): 释放锁
线程方法
wait()无线等待
notify()唤醒等待
notifyAll()唤醒所有
wait(时间)计时等待
只能用共同的锁调用 且只能在同步代码中执行
线程生命周期六个状态
"NEW 新建"
线程被创建, 但没有调用 start() 启动
"RUNNABLE 可运行"
调用 start()方法后已启动, 但可能正在执行 run() 方法的代码, 也可能正在等待CPU的调度
"BLOCKED (锁)阻塞"
线程试图获取锁, 但此时锁被其他线程持有
"WAITING 无限等待"
通过锁对象调用无参的 wait() 进入此状态.
等待其他线程通过锁对象执行 notify() 或 notifyAll() 才能结束这个状态
"TIMED_WAITING 计时等待"
如通过锁对象调用有参的 wait(long millis) 或 sleep(long millis), 则进入此状态.
直到时间结束之前被其他线程通过锁对象执行 notify()或 notifyAll()唤醒, 或时间结束自动唤醒
"TERMINATED 终止"
run()方法结束(执行结束, 或内部出现异常), 则进入此状态
|
|