Collection接口下类与类的关系及特有的方法,IO流的分类,多线程 Collection接口(单列集合体系的顶层)
| boolean add(E e): 添加元素, 添加成功返回true, 否则false
| void clear(): 清空集合中的元素
| boolean contains(Object o): 判断集合中是否包含指定的对象
| boolean isEmpty(): 判断集合中是否没有元素. 与null区分
| boolean remove(Object o): 从集合中删除一个元素, 删除成功返回true, 否则false
| int size(): 获取集合的长度(元素的数量)
| Object[] toArray(): 将集合转换为Object[]数组
| Iterator<E> iterator(): 获取集合的迭代器对象
|- List接口(元素存取有序, 元素可重复, 有索引)
| | void add(int index, E e): 添加元素到指定索引上
| | E remove(int index): 删除索引上的元素, 并返回
| | E set(int index, E e): 修改指定索引上的元素, 并返回被替换的元素
| | E get(int index): 获取指定索引上的元素
| | ListIterator listIterator(): 获取List特有的迭代器对象
| |- ArrayList类(底层是数组, 查询快, 增删慢)
| |- LinkedList类(底层是链表, 查询慢, 增删快)
| void addFirst(E e): 添加元素到集合的开头
| void addLast(E e): 添加元素到集合的末尾
| E getFirst(): 获取集合开头的元素
| E getLast(): 获取集合末尾的元素
| E removeFirst(): 删除开头的元素, 并返回
| E removeLast(): 删除末尾的元素, 并返回
|- Set接口(元素存取无序, 元素不可重复, 无索引)
| `boolean add(E e)`: 添加成功返回true; 添加失败(重复了)返回false
|- HashSet类(底层哈希表)
Map接口(双列集合体系的顶层, 以键值对方式存储, 键不可重复, 值可以重复)
| `V put(K key, V value)`: 添加键值对
| `V get(Object key)`: 通过指定键获取值
| `int size()`: 获取集合长度
| `containsKey(Object key)`: 是否包含指定的键
| `containsValue(Object value)`: 是否包含指定的值
| `boolean isEmpty()`: 是否为空
| `void clear()`: 清空集合
| `V remove(Object key)`: 删除指定键的值(key和value都会删除)
| `Set<Map.Entry<K, V>> entrySet()`: 获取键值对的Set集合
| `Set<K> keySet()`: 获取所有键的Set集合
| `Collection<V> values()`: 获取所有值得Collection集合
|- Map.Entry(Map内部接口, 表示键值对对象)
| `K getKey()`: 获取键
| `V getValue()`: 获取值
|- HashMap类
Iterator接口(迭代器)
| boolean hasNext(): 判断是否有下一个元素
| E next(): 获取下一个元素
| void remove(): 删除迭代器返回的最后一个元素
|- ListIterator接口(List体系专用迭代器)
void add(E e): 使用迭代器添加元素到集合
void remove(): 删除迭代器返回的最后一个元素
文件输入输出流
|_ 字节流
|_ FileInputStream
|_ FileOutputStream
|_ 字符流
|_ FileReader
|_ FileWriter
缓冲输入输出流
|_ 字节流
|_ BufferedInputStream
|_ BufferedOutputStream
|_ 字符流
|_ BufferedReader
|_ BufferedWriter
对象输入输出流
|_ ObjectInputStream
|_ ObjectOutputStream
打印输出流
|_ 字节流
|_ PrintStream
|_ 字符流
|_ PrintWriter
多线程:
进程:当前正在运行的程序,一个应用程序在内存中的执行区域
线程:进程中的一个执行控制单元,执行路径
单线程:安全性高,效率低
多线程:安全性低,效率高
多线程的实现方式
1. 继承`Thread`类, 重写run方法
2. 实现`Runnable`接口(仍然是创建Thread类对象), 重写run方法
`java.lang.Thread`类: 实现了`Runnable`接口
Thread:
构造方法
`Thread()`: 创建线程
`Thread(Runnable r)`: 通过Runnable对象创建线程
`Thread(Runnable r, String threadName)`: 通过Runnable对象创建线程并指定线程名
成员方法
`String getName()`: 获取线程的名称
`void setName(String name)`: 设置线程名称
`void start()`: 启动线程, 即让线程开始执行`run()`方法中的代码
静态方法
`static Thread CurrentThread()`: 静态方法, 获取当前线程对象
`static void sleep(long millis)`: 让所在线程睡眠指定的毫秒
CPU执行程序是随机的切换
主方法是单线程
synchromizd:同步,可以修饰代码块和方法,被修饰的代码块和方法一旦被某个线程访问,则直接锁住,其他的线程无法访问
同步代码块
synchromizd(锁对象){
}
注意:锁对象需要被所有的线程访问
同步:安全性高,效率低
非同步:安全性低,效率高
同步方法:使用关键字synchromizd修饰的方法,一旦被一个线程访问,
多线程中的常见问题
1. 资源共享: 卖票问题
共享资源定义位置: 共享资源要定义在多个线程能够共同使用的地方, 如:
多个Thread共用同一个Runnable实现类对象, 则定义为Runnable实现类的非静态成员变量
如果只用Thread子类, 则可以定义为Thread子类的静态成员变量
操作共享数据的线程安全问题: 使用同步解决
同步代码块
`synchronized (锁对象) {}`
锁对象
必须是多个线程共享的对象:
一个类的Class对象
如果是实现Runnable, 则可以是this
同步方法
`public (static) synchronized void method() {}`
锁对象
静态同步方法, 锁对象是: 方法所在类的Class对象
非静态同步方法, 锁对象是: this
2. 不同线程之间通信:
wait(), notify(), notifyAll()
这三个方法必须在同步代码块中, 用锁对象来调用, 否则会抛异常
3. 死锁: 同步代码块中的线程不出来, 也不释放锁; 同步代码块外的线程拿不到锁, 只能等在外面.
发生死锁的原因:
同步代码块内的线程, 可能处在死循环, IO阻塞, 或sleep状态
多个线程互相持有锁又不释放锁
|