本帖最后由 小石姐姐 于 2018-4-20 10:04 编辑
【石家庄校区】课堂笔记
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
递归次数不能太多, 否则也会内存溢出
补充: 递归和循环的相互转换
递归都可以转换为循环实现
循环不一定能转换为递归
|
|