黑马程序员技术交流社区

标题: Collection接口下类与类的关系及特有的方法,IO流的分类,多线程 [打印本页]

作者: ...句号    时间: 2018-1-4 17:12
标题: Collection接口下类与类的关系及特有的方法,IO流的分类,多线程
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状态
                         多个线程互相持有锁又不释放锁






欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2