黑马程序员技术交流社区

标题: javaSE第二阶段笔记 [打印本页]

作者: 平凡的小叔叔    时间: 2018-9-20 14:28
标题: javaSE第二阶段笔记

day06  线程 同步 线程间通信

1、能够描述Java中多线程运行原理

CPU高速在多个线程之间切换 (本质)

多个线程抢夺CPU的执行时间

2、能够使用继承类的方式创建多线程

继承Thread

1. 定义类继承Thread类

2. 重写run()方法

3. 创建子类的对象

4. 调用start()方法启动线程

3、能够使用实现接口的方式创建多线程

实现Runnable接口

1. 定义类实现Runnable接口

2. 重写run()

3. 创建Runnable实现类对象

4. 创建Thread对象, 并将Runnable实现类对象传入

5. 调用Thread对象的start()

4、能够说出实现接口方式的好处

1. 避免单继承的局限性

2. 增强了程序的扩展性, 降低了程序的耦合性(解耦)

  线程是Thread, 任务是Runnable实现类对象.相当于将线程和任务分离

3.线程池只能放入实现Runable或Callable类线程,不能直接放入继承Thread的类。

4.适合多个相同的程序代码的线程去共享同一个资源。

5、能够解释安全问题的出现的原因

多线程操作共享变量

6、能够使用同步代码块解决线程安全问题

synchronized (锁对象) {

    // 操作共享变量的代码(可能发生安全问题的代码)   

}

7、锁对象:

   1. 类型可以是任意类型

    2. 锁对象必须是多个线程共享的唯一的同一个对象

8、能够使用同步方法解决线程安全问题

非静态:

public synchronized 返回值类型 方法名(参数列表) {

   //  操作共享变量的代码(可能发生安全问题的代码)   

}

锁对象: this


静态:

public static synchronized 返回值类型 方法名(参数列表) {

   //  操作共享变量的代码(可能发生安全问题的代码)   

}

锁对象: 当前类的字节码对象 Class对象 (同一个类, 字节码对象只有唯一的一个)

   对象.getClass()

   类名.class

   Class.forName("类的全名字符串")

9、能够说出线程6个状态的名称

NEW 新建

RUNNABLE 可运行

BLOCKED 锁阻塞

WAITING 无限等待

TIMED_WAITING 计时等待

TERMINATED 终止


day05  异常 多线程


1、异常的分类

//异常的体系结构

java.lang.Throwable  // 体系最顶层

       |_ Error                  // 错误

       |_ Exception              // 编译时异常

                |_ RuntimeException   // 运行时异常

2、JVM对于异常的默认处理方式是:

  1. 将异常信息(内容, 原因, 位置)打印到控制台

  2. 终止当前的程序

3、异常的处理方式

    throws声明抛出异常

    格式:

        修饰符 返回值类型 方法名() throws 异常类名1, 异常类名2, ... {                          }

    捕获异常

try {

        // 可能产生异常的代码

    }catch(异常类名 变量名) {

        // 处理异常的代码

        // 一般会将异常信息存储到日志中

    }

        ...

        }catch(异常类名 变量名) {

        // 处理异常的代码

        // 一般会将异常信息存储到日志中

    }

4、异常注意事项1: 捕获多个异常的3种方式

捕获多个异常:

   1. 多个异常分别 try...catch 处理

   2. 一个 try 多个 catch

      如果异常存在继承关系, 子类异常在上, 父类异常在下

   3. 多个异常, 一次捕获一次处理。用Exception多态捕获

4. 如果 finally 代码块中有 return 语句, 则永远返回 finally 中的return语句的值,应该避免在 finally 中写 return 语句

5. 子父类继承关系下, 子类重写父类带有throws的方法:

    1. 如果父类抛出多个异常, 子类重写父类方法时可以有3种方式:

           a: 抛出和父类相同的异常

           b: 抛出父类异常的子类

           c: 不抛出异常

     2. 父类方法没有抛出异常, 子类重写父类该方法时也不可抛出异常

            此时子类产生该异常, 只能捕获处理, 不能声明抛出

父类方法声明的异常是什么样的, 子类重写的方法声明异常就什么样, 保持一致即可。

5、多线程计算机基本概念: 并发与并行

并发: (交替执行) 指两个或多个事件在"同一时间段内"发生

并行: (同时执行) 指两个或多个事件在"同一时刻"发生 (同时发生)


并发的实现, 是依靠电脑CPU快速地在多个任务之间切换执行实现的

计算机基本概念: 进程

进程: 一个应用程序在内存中的一次执行过程







day04 【Map】


1、Map双列集合总结


Map接口: 双列集合的根接口, 规定了共性的方法

    |_ HashMap类: 哈希表=数组+链表+红黑树. key无序不可重复, 可存null键null值, 线程不安全效率高

    |   |_ LinkedHashMap类: 哈希表+链表.哈希表实现key不可重复, 链表实现key存取有序

    |

    |_ Hashtable类: 哈希表. Hash特性针对key, key无序不可重复, 不可存null键null值, 线程安全效率低

    |_ TreeMap类: 红黑树结构(存入时就排序). Tree特性针对key, 可以按照key排序, 要求key具备比较性

    |_ 遍历

        |_keySet(): 获取所有key组成的Set集合, 遍历Set集合拿到key, 通过Map的get(key)得到value,也叫做“键找值”

        |   |_ 对于Set<Key>的遍历

        |       |_ 增强for

        |       |_ 迭代器

        |_entrySet(): 获取所有的key和value组成的Entry对象的Set集合, 遍历出entry对象, 通过entry对象的getKey()获取对应的key, 通过Entry对象的getValue方法获取对应的value

也叫做“键值对”

            |_ 对Set<Entry>的遍历

                |_toArray()

                |_ 增强for

                |_ 迭代器/

2、Debug调试模式介绍

断点:

    breakpoint, 在debug模式下, 程序运行到断点会暂停住, 便于我们在程序运行过程中查看

Debug调试程序:

    可以让代码逐行执行,查看代码执行的过程,调试程序中出现的bug

使用方式:

    在行号的右边,鼠标左键单击,添加断点(每个方法的第一行,哪里有bug添加到哪里)

    右键,选择Debug执行程序

    程序就会停留在添加的第一个断点处

执行程序:

    f8:逐行执行程序

    f7:进入到方法中

    shift+f8:跳出方法

    f9:跳到下一个断点,如果没有下一个断点,那么就结束程序

    ctrl+f2:退出debug模式,停止程序

Console:切换到控制台


day03【List、Set、数据结构、Collections】

1、能够说出常见的数据结构

栈        先进后出,出口入口在同一侧

队列     先进先出,出口入口在两端

数组     查询快,增删慢

链表     查询慢,增删快

红黑树  存入时数据有序,查询快

哈希表 = 数组 + 链表/红黑树

2、能够说出哈希表的特点

哈希表 = 数组 + 链表/红黑树

先调用 hashCode()算出哈希值, 根据哈希值判断数组中是否有重复元素

    如果要没有, 就添加

    如果有元素, 哈希值冲突

        则调用元素的 equals() 遍历 链表/红黑树 依次比较

            如果有重复的, 则不添加

            如果没有重复的, 则添加

3、使用HashSet集合存储自定义元素

去重

    重写 hashCode()

    重写 equals()

4、能够说出可变参数的格式


方法名(参数类型... 变量名) {

    // 当作数组来使用

}


方法名();  // 数组


注意事项:

只能有1个可变参数, 必须放在最后



5、能够使用集合工具类

Collections类

    static addAll(Collection c, T...t)

    static shuffle(List list)

    static sort(List list)

    static sort(List list,Comparator c)

能够使用Comparator比较器进行排序

static sort(List list, Comparatorc)

     

传递Comparator实现类对象, 重写compare(T o1, T o2)

     规则:

       o1 - o2 升序

       o2 - o1 降序

6、单列集合体系:

Collection接口: 单列集合的根接口, 规定了公共的功能

   |

   |_ List接口: 特点元素存取有序, 可重复, 有索引

   |   |_ Vector类:底层数组, 有索引, 内存空间连续分配, 查询快, 增删慢, 线程安全, 效率低

   |   |_ ArrayList类: 底层数组, 有索引, 内存空间连续分配, 查询快, 增删慢, 线程不安全, 效率高

   |   |_ LinkedList类: 底层链表, 查询慢, 增删快

   |   |_ 遍历

   |      - toArray(): 可以

   |      - 普通for: 可以

   |      - 增强for: 可以

   |      - 迭代器: 可以

   |

   |_ Set接口:特点 元素不可重复, 无索引

       |_ HashSet类: 底层哈希表, 元素无序, 元素不可重复(用hashCode()和equals()方法来判断)

       |   |_ LinkedHashSet类: 哈希表+链表,同时具有HashSet的元素不重复, 链表存取有序的特点

       |

       |_ TreeSet类: 底层红黑树结构(存入元素时就会按照元素自然顺序排序).

       |   

       |_ 遍历

          -toArray(): 可以

          - 普通for: 不可以, 没有索引, 不能用!

          - 增强for: 可以

          - 迭代器: 可以







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