A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 小石姐姐 于 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): 让当前线程处于计时等待状态, 时间到或被唤醒后结束此状态


0 个回复

您需要登录后才可以回帖 登录 | 加入黑马