黑马程序员技术交流社区

标题: 笔记 [打印本页]

作者: 花亦ぃ水无情    时间: 2018-4-15 18:49
标题: 笔记
Day 05

Object
   是所有类的根类, 所有类默认都直接或间接的继承自它
   成员方法:
     String toString(): 返回对象的字符串表示方式
       重写toString()的作用: 改变对象的字符串显示方式
     boolean equals(Object o): 比较两个对象是否"相等"
       Object类中实现方式: ==, 比较对象的地址值是否相同
       重写equals()方法: 改变比较的规则. 可以直接生成
  获取字节码的3种方式
     Class 对象.getClass()
     类名.class
     Class Class.forName("类的全名")
类的字节码对象注意点:
    同一个类的字节码对象只有一个, 地址值也是相同的
    区分Class和class, 前者是类, 后者是关键字
System类
   java.lang包下, 不用导包
   常用静态方法
     static void arrayCopy(Object src, int srcPos, Object dest, int destPos, int length): 复制数组
     static long currentTimeMillis(): 返回当前系统时间的毫秒值, 从1970-01-01 00:00:00
     static void exit(int status): 终止虚拟机的运行. 传入0是正常退出, 非0是异常退出
Date类
   注意导包: java.util.Date
   表示特定的瞬间
   构造方法
     Date Date(): 创建Date对象, 并表示当前系统时间
     Date Date(long timestamp): 创建Date对象, 使用指定的时间
   成员方法
     String toLocalString(): (已过时)转换为本地时间格式的字符串
     void setTime(long time): 设置Date对象的时间
     long getTime(): 获取Date对象中保存的时间毫秒值.
SimpleDateFormat类
   作用:
    String转Date
    Date转String
  构造方法
     SimpleDateFormat(String pattern): 创建SimpleDateFormat对象, 并设置指定的格式
   常用2个成员方法
     String format(Date date): 格式化Date对象返回字符串
     Date parse(String source): 将字符串解析为Date对象
       字符串必须符合模式, 否则抛出异常
  常用日期模式
     y: 年
     M: 月
     m: 分
     D: 年中的天
     d: 月中的天
     H: 小时(24小时制)
     K: 小时(12小时制)
     S: 毫秒
     s: 秒
     E: 星期
Calendar类
   替代Date类
   创建对象
     static Calendar getInstance(): 获取日历对象
   静态字段: 表示时间的某个部分
     Calendar.YEAR: 年份
     Calendar.MONTH: 月份. 注意月份数值是0-11
     Calendar.DAY_OF_MONTH: 日期
     Calendar.HOUR: 小时(12小时制)
     Calendar.HOUR_OF_DAY: 小时(24小时制)
     Calendar.MINITE: 分钟
     Calendar.SECOND: 秒
  成员方法
     get(时间字段): 获取指定的时间部分
     set(时间字段, 指定数值): 使用指定数值设置指定的时间部分
     add(时间字段, 增加的时间值): 根据时间字段的单位增加指定的时间值, 如时间字段是天, 增加n天, 时间字段是秒, 增加n秒. 减少用负数
包装类
   作用:
     封装了基本数据类型的类, 提供了更多了方法和变量
     把基本数据类型的使用方式转换为面向对象的使用方式
   基本数据类型和引用数据类型的对应关系
     byte: Byte
     short: Short
     char: Character
     int: Integer
     long: Long
     float: Float
     double: Double
     boolean: Boolean
  Integer类的转换方法
     int转Integer: Integer Integer(int value)
     String转Integer: Integer Integer(String s)
     Integer转int:
       int intValue(): 将Integer对象的值转换为int类型
     String转int:
       static int parseInt(String s): 将字符串转换为int
       static Integer valueOf(String s)
     int转String
       "" + int
       Integer对象的toString()方法
       static String toString(int i): 将int转换为String
   包装类是引用类型, 所以默认值是null
   自动装箱
     基本数据类型可以自动转换为包装类
     举例: Integer i = 10; 相当于 Integer i = new Integer(10);或Integer i = Integer.valueOf(10);
   自动拆箱
     包装类可以自动转换为基本数据类型
     举例: int a = i.intValue();
   自动装箱拆箱的应用场景
     集合存储基本数据类型就是自动装箱, 本质上集合中存储的都是引用数据类型
正则表达式
   概念: 一种用于匹配字符串的规则
   String类
     boolean matches(String regex): 是否匹配指定的正则
     String[] split(String regex): 按照正则表达式分割字符串
   转义:
     转义使用\, 正则中有的字符需要转义(. + - *, 预定义字符要写两个斜杠)
   常用规则(查看API中的Pattern类)
     字符:
       x: 一个字符x
       \\: 表示\反斜杠.
         为什么有2个? 第一个\是转义的作用
       [abc]: a或b或c, 即中括号字母中的其中一个
       [^abc]: 除a, b, c之外的任何字符.
         ^表示否定
       [a-zA-Z]: 小写英文a到z, 以及大写英文A到Z.
        - -表示范围
     预定义字符
       .: 任何字符(对于行结束符, 可能匹配, 也可能不匹配)
       \d: 数字0-9. 相当于[0-9]
        d是digital的缩写
       \D: 非数字. 相当于[^0-9]
       \s: 空白字符. 相当于[ \t\n\x0b\f\r], 包括空格(第一个空就是空格)
         s是space的缩写
       \S: 非空白字符. 相当于[^\s]
       \w: 单词字符. 相当于[a-zA-Z_0-9]
         w是word的缩写
       \W: 非单词字符. 相当于[^\w]
     Greedy数量词
      X?: X这个字符出现一次或零次
      X*: X这个字符出现零次或多次, 包括一次
      X+: X这个字符出现一次或多次
      X{n}: X这个字符恰好出现n次
      X{n, }: X这个字符至少出现n次
      X{n, m}: X这个字符至少出现n次, 但不超过m次

          
Day 06
          
集合
   包含了不同的实现类, 向上抽取出了很多共性的接口, 形成了一个体系结构
   数据的组织和存储方式
迭代器
   作用: 遍历集合
   并发修改异常:
     原因: 迭代集合时改变了集合的长度
     解决:
       不使用迭代器
       使用迭代器对象中的修改方法
泛型
   作用:
     约束集合中元素的数据类型
     将运行时发生的类型转换异常提前到了编译时期
遍历集合的3种方式
   普通for循环
   迭代器
   增强for循环
    优点: 快速简便的遍历集合元素
    缺点: 不能在遍历过程中修改集合, 也没有索引可以使用
常见的数据结构
   数组
     特点:
       长度一旦确定则不可改变
       有整数索引
       只能存储同一个数据类型的元素
       既能存储基本数据类型, 又能存储引用数据类型
       增删慢, 查询快
   链表
     特点:
       增删快, 查询慢
   栈
     特点: 先进后出, FILO
  队列
    特点: 先进先出, FIFO

Day07

Set接口:
   继承自Collection接口
   特点
     元素无序(存入和取出的顺序不一致)
     元素不能重复(元素唯一)
     没有索引
注意:
   无序: 指的是存入的顺序和取出的顺序不一样, 而不是说每次取出来是随机顺序, 存入后每次取出来的顺序都一样, 但和存入的顺序不一样
   直接打印和获取元素都属于取出, 所以不要把打印当成是HashSet内部存储的样子

HashSet存储自定义对象并遍历
HashSet类: 是Set接口的实现类
  成员方法
   boolean add(E e): 添加成功true, 添加失败(重复了)返回false
判断对象是否相同要根据2个方法:
1. hashCode()
    如果判定哈希值不相同, 则认为不重复
    如果判定哈希值相同, 则需要继续使用equals()方法判断
2. equals()
    如果判定不相同, 则认为不重复
    如果判定相同, 则认为重复
HashSet的add()方法, 首先将新添加的元素和当前集合中的已有元素进行hash值比较, 依靠对象的"hashCode()"
     如果hash值不一样, 则认为不重复, 直接添加新元素
     如果hash值一样, 则继续与已有元素比较"地址值"或使用"equals()方法"进行比较
     如果比较结果一样, 则认为重复, 不添加
         如果和所有的已有元素比较都不一样, 则认为不重复, 添加元素
         所以, 自定义对象的hashCode()和equals()方法决定了该对象能否被去重
去重的2个判断方法
   先调用元素的hashCode()方法判断哈希值是否相同
   如果相同, 再调用元素的equals()方法判断
注意:
   重写的是元素的类中的hashCode()和equals()方法, 因为比较的是元素
   让hashCode()方法返回所有成员变量之和.
   基本数据类型直接相加
   引用数据类型获取该成员变量的hashCode方法返回值后再相加(boolean不能参与运算)
优化equals方法
   提高效率: this == obj  return true
   提高向下转型的安全性: this.getClass() == obj.getClass()  return false

Collections工具类
Collection和Collections有什么区别?
   Collection是接口, 是单列集合的顶层, 包含一些共性方法
   Collections是类, 提供操作Collection的一些工具方法, 类似的还有操作数组的Arrays工具类
Collections类
  常用静态方法
     static int binarySearch(List list, T key): 使用二分查找来查找元素在指定列表的索引位置
     二分查找的前提是集合已经排序, 查找原理类似猜数字
     static void copy(List dest, List src): 将源列表中的数据复制到目标列表
     注意: 目标列表的长度至少等于源列表的长度
     static void fill(List list, Object obj): 使用指定对象填充指定列表的所有元素
     static void reverse(List list): 反转集合中的元素
     static void shuffle(List list): 随机打乱集合中元素的顺序
     static void sort(List list): 将集合中的元素按照元素的自然顺序排序
       自然顺序: 元素要具有比较性
         A-Z, 0-9本身就具有自然顺序
        自定义的对象, 如Student等, 需要自己定义如何进行比较
     static void swap(List list, int i, int j): 将指定列表中的两个索引进行位置互换

       
Map接口的概述
Map<K, V>接口
   是双列集合的顶层, 和Collection属于同级
   特点
     存储方式是key-value(键值对)方式, 即一个键对应一个值
     一个键只能映射一个值
     键不能重复, 值可以重复
     键是无序的
Map和Collection的区别
   Map是双列集合, 用于处理有一一对应关系的数据,键不能重复且键无序
   Collection是单列集合, 有不同的子体系, List允许重复且有序, Set不允许重复且无序
HashMap类

多态创建对象: (也可以不使用多态)
   Map<K, V> map = new HashMap<>();
常用方法:
   增和改
     V put(K key, V value): 添加键值对.
       注意: 如果key已经存在, 则会使用新的value覆盖原有value, 并将原有value返回
   删
     void clear(): 清空集合
     V remove(Object key): 删除指定键的值(key和value都会删除)
   查
     V get(Object key): 通过指定键获取值
     int size(): 获取集合长度
   判断
     boolean containsKey(Object key): 是否包含指定的键
     boolean containsValue(Object value): 是否包含指定的值
     boolean isEmpty(): 是否为空
   遍历
     Set<Map.Entry<K, V>> entrySet(): 获取键值对的Set集合
     Set<K> keySet(): 获取所有键的Set集合
     Collection<V> values(): 获取所有值得Collection集合
遍历步骤1
   通过map.keySet()方法获取到key的Set集合
   遍历key的set集合
   通过get(K key)方法获取key对应的value
遍历步骤2
   通过map.entrySet()获取到Entry<K, V>的Set集合
   遍历Set集合获取到每一个Entry<K, V>
   使用Entry的getKey()获取key, 使用Entry的getValue()获取value
注意:
   Entry是Map接口中的内部类, 包为java.util.Map.Entry, 不要导错包


Day08

异常
   概念: 不正常的情况, 是代码编译或运行时发生的错误
   异常的集成体系:
     java.lang.Throwable(最顶层)
     Error: 不应该试图捕获的异常
     Exception: 可以处理的异常(编译时异常, 除了运行时异常)
     RuntimeException: 运行时异常
   异常的分类
     编译时异常: 编译时就发生的异常. 必须在编译时期处理
     运行时异常: 编译时正常, 运行时发生的异常. 自己选择是否处理
   自定义异常
     自定义编译时异常: 继承Exception类, 重写构造方法
     自定义运行时异常: 继承RuntimeException, 重写构造方法
异常的处理方式
     JVM默认的异常处理方式
     把异常信息打印到控制台, 终止程序的运行, 发生异常之后的代码都不会执行
     手动处理异常的方式(2种)
       捕获异常: try catch
         try catch格式(见下方)
         多异常的处理
           catch代码块的顺序
             如果多个异常没有继承关系, 顺序无所谓
             如果多个异常有继承关系, 子类异常在上, 父类异常在下
         捕获异常的执行逻辑
           如果try代码块中发生异常, 则会从发生异常的代码直接跳转到catch语句中
         finally
           是一个关键字, 与final区分
           作用: 与try catch配合, 无论是否发生异常, 无论是否捕获异常, 都会执行finally代码块
           应用:
             IO流释放资源时, 将close()方法放在finally代码块中
       抛出异常:
         throws:
           定义在方法声明上
           是处理异常的一种方式, 方法内部不处理, 由方法的调用者处理
           格式: 方法声明 throws 异常类型1, 异常类型2 {}
         throw
           用在方法中
           制造异常, 抛出一个异常对象
           格式: throw new 异常类型构造方法();
Throwable常用方法
     String getMessage(): 获取异常的原因, 没有原因则返回null
     String toString(): 返回异常的类型和原因
     void printStackTrace(): 使用标准错误输出流打印异常详情
递归
   原理: 将大的问题拆分为小问题, 再将小问题拆分为更小的问题, 解决了最小的问题后, 更大的问题也可以解决, 最终整个问题得到解决
   在代码中指的是方法自己调用自己
   注意事项
     递归必须有出口, 否则内存溢出 StackOverFlowError
     递归次数不能太多, 否则也会内存溢出
   补充: 递归和循环的相互转换
     递归都可以转换为循环实现
     循环不一定能转换为递归







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