本帖最后由 小石姐姐 于 2018-4-20 09:28 编辑
是时候展示真正的技术了
# 学习笔记
## API(Object,System,日期,包装类,正则表达式)
### Object的toString()方法
- Object类
- Object是所有类的根类
- 所有类**直接或间接**继承Object类
- 成员方法
- String toString():返回对象的字符串形式
- 重写toString()方法
- 作用:重写自定义输出格式,查看对象随属性
- 快捷键 Alt + Shift + s > Generatr toStroing()...
----------
### 获取字节码对象
- **方法一:**
- Object类的getClass()方法
1. 示例: Class c = new Student.getClass();
- **方法二:**
- 类名.class属性
1. 示例: Class c = Student.class;
2. 扩展: 实际上 .class 是一种特殊形式, 称为 类字面常量 , class是关键字不能作为属性名, 且Object类 中并没有定义这个属性
- **方法三(最常用)**
- Class类的静态方法Format(String className)
1. 示例:Class c = Class.Format("itheima.Student");
2. 注意: 因为该方法使用字符串来寻找类, 有可能并没有该字符串对应的类, 所以会抛出 ClassNotFoundException 类无法找到的异常
- **注意**
- 同一个类的字节码对象只有一个,地址值是相同的,无论创建多少对象
- Class和class的区别
1. Class是一个类,表示字节码文件的类
2. class是一个关键字,用于定义类
- 获取类全名快捷键
1. 光标放在类名上,右击鼠标,点击Copy qualified Name
----------
### Object的equals方法
- Object类
- boolean equals(Object obj):比较两个对象的是否"相等"
- String类和Object类的equals方法的区别
- String类的equals方法:比较两个字符串是否相同,重写了Object的equals方法
- Object类的equals方法:基本数据类型比较值,引用数据类型比较对象的地址值
- 快捷键生成equals方法
- Alt + Shift + s > Generate hashCode() and equals()...
----------
### System类概述
- java.lang包下的类,不用导包就能使用
- System类:包含一些有用的类字段和方法,不能被实例化
- 类字段:静态成员
- **err:**标准错误输出流(输出结果为红色字体):System.err
- **in:**标准输入流:System.in
- **out:**标准输出流:System.out
- 常用静态方法
- static void arrayCopy(Object src, int srcPos, Object dest, int destPos, int destPos);
- Object src:源数组(被复制的额数组)
- Object dest:目标数组 (接收数据的数组)
- int srcPos:源数组索引(从此索引开始复制)
- int destPos:目标索引(从此索引开始赋值接收数据)
- int destPos:复制长度(要复制的长度)
- static long currentTimeMillis():返回当前系统的毫秒值,从1997-01-01 00:00:00开始计算
- static void exit(int status):终止虚拟机运行.0表示正常退出,非0表示异常退出
----------
### Date类的概述和构造
- 注意:不要导错包,Date有两个类一个java.sql.Date,一个java.util.Date,这里我们用java.util.Date包
- Date类
- 构造方法
- Date Dat():无参构造->>创建对象,表示当前系统时间
- Date Date(long date):有参构造->>创建对象,使用指定时间(毫秒值)
- 成员方法
- String tolocalString():已过时,用于转化本地时间格式化字符串
----------
###Date类常用方法
- void setTime(long time):设置Date对象时间
- long getTime():获取Date对象中保存的时间毫秒值
----------
###SimpleDateFormat类概述
----------
- SimpleDateFormat用于格式化时间和解析时间
- 构造方法
- SimpleDateFormat SimpleDateFormat(String patter):创建对象同时指定时间格式
- 成员方法
- 格式化:Date对象 转成 字符转
- String format(Date date):格式化Date对象返回字符串
- 解析: 字符串 转成 Date对象
- Date parse(String str):将字符串转化成Date对象
- 主要该方法需要抛出 ParseException 异常,因为字符串可能不匹配指定格式
- 常用日期模式:详见API
- 注意:每个SimpleDateFormat对象都有对应的格式,无论format()还是parse()方法都用这个模式
----------
### Calebdar概述和测试
- Calendar 类: 日历类, 也是处理时间和日期的类, 用于替代Date类
- 创建对象
- 静态方法: static Calendar getInstance()
- 示例: Calendar c = Calendar.getInstance();
- 静态字段: 表示时间的某个部分(详见API)
- 成员方法:
- int get(int field) : 返回给定日历字段的值
- void set(int field, int value) : 将给定的日历字段设置为给定值
- void add(int field, int amount) : 为给定的日历字段添加或减去指定的时间量, 如时间字段是 天, 增加n天, 时间字段是秒, 增加n秒. 减少用负数
----------
### 包装类的概述和基本使用
----------
- 什么是包装类
- 包装类是封装了基本数据类型的类, 提供了更多复杂的方法和变量
- 同时将基本类型的使用转换为了类的面向对象方式
- 基本数据类型与其包装类的对应关系
- byte: Byte
- short: Short
- char: **Character**
- int: **Integer**
- long: Long
- float: Float
- double: Double
- boolean: Boolean
- Integer
- 构造方法
- Integer(int value) : int转Intege
- Integer(String value) : String转Integer
- 成员方法
- int intValue() : Integer转int
- String toString() : Integer转String
- static int parseInt(String value) : String转Integer
- 整数基本类型和包装类转换
- int转Integer
- 利用Integer的构造方法: Integer Integer(int value)
- Integer转int
- 利用Integer的成员方法: int intValue()
- 字符串和整数转换
- String转int/Intege
- 方式1: Integer Integer(String s)
- 方式2: static int parseInt(String s)
- 方式3: static Integer valueOf(String s)
- int/Integer转String
- 方式1: "" + int值
- 方式2: String toString()
- 方式3: static String toString(int i)
----------
### 包装类的自动装箱和自动拆
- 自动装箱
- 示例: Integer i = 10;
- 原理: 相当于执行 Integer i = new Integer(10); 或 Integer i = Integer.valueOf(10);
- 自动拆箱
- 概念: 包装类可以自动转换为基本数据类型
- 示例: Integer i = 10; int a = i;
- 原理: 相当于执行 int a = i.intValue();
----------
###正则表达式(参考API)
----------
## 集合(Collection,迭代器,增强For,泛型,List子集)
### Collection接口中常用的功
- Collection 接口:是单列集合体系的顶层
- 创建对象:
- 本身是接口, 实际使用的是子类对象. 使用多态, Collection c = new ArrayList<>(); 常用方法
- 常用方法
- 增
- boolean add(E e) : 向集合中添加元素, 添加成功返回true, 添加失败返回false. 永远能够添加 成功
- 删
- boolean remove(Object o) : 删除元素中的指定元素, 删除成功返回true, 删除失败返回false
- void clear() : 清空集合中的元素
- 判断
- boolean contains(Object o) : 判断集合中是否包含指定元素, 包含返回true, 否则false
- boolean isEmpty() : 判断集合是否为空集合, 即没有元素. 没有元素返回true, 否则false
- 获取
- int size() : 获取集合中元素的个数
- 转换
- Object[] toArray() : 将集合转换为Object[]
----------
###迭代器的概述和测
- Iterator 接口:
- 作用:
- 提供遍历集合的安全方式 获取迭代器:
- 使用集合对象调用 Interator<E> iterator() 方法
- 成员方法
- boolean hasNext() : 是否有下一个元素
- E next() : 返回下一个元素
- void remove() : 从迭代器指向的 collection 中移除迭代器返回的后一个元素
----------
### 并发修改异
- ConcurrentModificationException
- 发生原因: 迭代器依赖于集合, 相当于集合的一个副本, 当迭代器在操作时, 如果发现迭代器的副本和集合不一 样, 则抛出并发修改异常
- 如何避免:
- 方式1: 不使用迭代器
- 方式2: 在使用迭代器遍历时, 使用迭代器的方法修改
- 添加元素: List接口中的 ListIterator listIterator() 获取用于List的迭代器, 然后调用 ListIterator的add()方法
- 删除元素: remove()
- List接口
- 列表, 是Collection的子接口
- 特点: 元素存取有序, 元素可以重复, 有索引
----------
###泛型
- 泛型的出现:由于集合可以存储任意类型的对象, 所以可以按照Object类型存入, 如果我们向集合中存储不同类型 的对象后再遍历出来元素, 都是Object类型, 若要使用该类型的方法, 必须进行类型转换, 有可能发生 类型转换错误
- 好处:(1)避免类型转换问(2)减少警(3)简化代码书写
- 作用:(1)用于明确数据类型 (2)将运行时才发生的类型转换问题, 提前到了编译时期
----------
### foreach的概述(也叫增强for循环)
- 作用:遍历数组和集合
- 格式:
- for (元素类型 变量名: 数组或集合对象) { }
- 注意:增强for循环中不能修改集合(改变集合长度), 会发生 并发修改异常
- 原因: 因为增强for循环内部使用的是迭代器进行迭代
- 优点: 简单快捷的拿到每一个元素
- 缺点: (1)循环过程中不能修改集合 (2)不能像普通for循环那样使用索引
----------
### 常见数据结构
- 数组
- 数组的特点:
- 长度一旦确定则不可改变
- 元素有整数索引
- 只能存储同一类型的元素
- 既可以存储基本数据类型, 也可存储引用数据类型
- 总结:增删慢 查询快
- 链表
- 链接列表, 好比通过链子链接起来的一些结点
- 由 本结点地址值 , 值 , 下一个结点的地址值 这三部分组成
- 增删快 查询慢
- 栈和队列
- 栈
- 先进后出(FILO, First In Last Out). 或后进先出(LIFO, Last In First Out)
- 队列
- 先进先出(FIFO, First In First Out).
----------
### List的特点和特有功能
----------
- 继承自 Collection 接口. 在 java.util 包下
- 特点:(1)元素有序(存入和取出的顺序一样) (2)有整数的索引 (3)元素可以重复
- 特有功能 (都是按索引进行操作的)
- void add(int index, E element) : 添加元素
- E remove(int index) : 删除元素
- E set(int index, E element) : 修改元素
- E get(int index) : 获取元素
----------
###List的子类概述, LinkedList特有功能
- List的子类
- ArrayList : 底层数组结构. 查询快, 增删慢
- LinkedList : 底层链表结构. 查询慢, 增删快
- 特有方法 (用于处理开头和结尾的元素)
- void addFirst(E e) : 将元素添加到开头
- void addLast(E e) : 将元素添加到末尾
- E getFirst() : 获取开头的元素
- E getLast() : 获取结尾的元素 4
- E removeFirst() : 删除第一个元素, 并返回删除的元素
- E removeLast() : 删除后一个元素, 并返回删除的元素
## 集合(HashSet, HashMap, Map集合嵌套)
###Set体系的特点
- Set接口: 继承自Collection接口
- 特点
- 元素无序(存入和取出的顺序不一致)
- 元素不能重复(元素唯一)
- 没有索引
- 注意:
- 无序: 指的是存入的顺序和取出的顺序不一样, 而不是说每次取出来是随机顺序, 存入后每次取出来的顺序 都一样, 但和存入的顺序不一样
- 直接打印和获取元素都属于取出, 所以不要把打印当成是HashSet内部存储的样子
----------
###HashSet存储自定义对象并遍历
- HashSet类: 是Set接口的实现类
- 成员方法: boolean add(E e) : 添加成功true, 添加失败(重复了)返回fals
- 重写hashCode()和equals()方法让HashSet可以去掉属性重复
-
----------
### 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属于同级
- 特点 (1)存储方式是 key-value (键值对)方式, 即一个键对应一个值 (2)一个键只能映射一个值 (3)键不能重复, 值可以重复 (4)键是无序的
- Map和Collection的区别
- Map是双列集合, 用于处理有 一一对应 关系的数据,键不能重复且键无序
- Collection是单列集合, 有不同的子体系, List允许重复且有序, Set不允许重复且无序
- 多态创建对象: (也可以不使用多态) 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集合
----------
## 异常,递归
###异常概述和体系
- 异常:就是不正常的情况下,是代码编译或运行时发生的错误
- 常见异常:
- NullPointerExxeption
- ArrayIndexOutBoundException
- 异常处理方式:JVM默认处理方式,try...catch()
- 处理异常的方式有两种:
- 捕捉异常
- try...catch()...
- 提前对可能发生的异常进行处理, 纠正错误并避免程序终止.
- 抛出异常
- throws
- 不捕获异常, 当发生异常时向方法外界抛出, 直到最顶层的方法, 最终终止程序
- 一般在无法处理异常, 或希望外界处理异常时使用
- 声明自定义异常
- 关键字:throw
- 多异常处理
- 多异常的捕获: 可以写多个catch代码块来分别处理同一个try代码块中的多个异常
- 多异常捕获中catch的顺序
- 如果被捕获的异常类没有继承关系, 则catch的顺序可以随意定义
- 如果异常是继承关系的类, 必须子类异常在上, 父类异常在下
- 原因: 因为父类包含子类的异常, 如果上方被父类异常的catch捕获了, 那么捕获子类异常的catch永 远也不会用到
- 多个catch代码块的执行逻辑
- try代码块中抛出的异常, 如果catch中有对应的具体异常, 则执行对应的catch代码块. 其他catch代码块不 会执行(类似于if...else if, switch...case)
- try代码块中抛出的异常, 如果catch中没有对应的具体异常, 则所有catch代码块都不会执行. 相当于异常 没有捕获, 仍然会导致程序终止
----------
###Throwable的常用方法
- 常用成员方法
- String getMessage() : 异常的信息. 没有原因返回 null
- String toString() : 异常的类型和原因 void
- printStackTrace() : 使用标准错误输出流打印异常信息
###finally概述和引用场景
- finally关键字
- 作用:与try... catch配合,无论异常是否被捕获,最终都会执行finally代码
- 应用场景:IO流的关流操作,无论IO操作过程中是否出现异常,最终都要关流,避免程序占用资源,所以一般都在finally代码中进行关流操作
- 格式: try{ }catch(){ }finally{ }
###异常分类
- 异常的分类
- 编译时异常: 编译时就发生的异常
- Exception 及其子类(除RuntimeException体系)
- 处理方式: 编译时期必须处理(try...catch或throws)
- 运行时异常: 编译时正确, 但运行时发生的异常
- RuntimeException 类及其子类
- 处理方式: 编译时期可以自由选择处理或不处理
###递归
- 递归
- 递归思想: 将大问题拆为小问题, 将小问题继续拆为小问题, 所有的小问题解决了, 大问题也就解决了
- 在Java代码中的实现方式: 方法自己调用自己 (所以必须要定义方法)
- 作用: 简化代码书写
- 注意事项: 必须要定义方法的结束方式(出口). 无法结束的方法会导致内存溢出 递归次数要注意. 递归次数太多会导致内存溢出
|
|