System类
java.lang包下,不用导包
System类:包含一些有用的类字段和方法, 不能被实例化
类字段:静态成员
err: 标准错误输出流
in: 标准输入流
out: 标准输出流
常用静态方法
static void arrayCopy(Object src,int srcPos,Object dest,int destPos,int length)复制数组
static long currentTimeMillis()返回当前系统时间的毫秒值,从0时区的1970-01-01 00:00:00开始 1秒是1000毫秒,可以应用在测试某段代码执行了多长时间
static void exit(int status)终止虚拟机的运行.传入0是正常退出,非0是异常退出
Date(日期)类
表示特定的瞬间,精确到毫秒,他可以通过方法来设定自己所表示的时间,可以表示任意的时间.
要导包: java.util.Date
构造方法:
Date Date() 创建Date对象,并表示当前系统时间
Date Date(long timestamp) 创建Date对象, 使用指定的时间;这个指定时间就是指定的毫秒数.
注意,无论何时调用,都是获取Date对象中已经存储的那一瞬间的时间,而不是调用方法时的时间
成员方法:
String toLocalString(): (已过时)转换为本地时间格式的字符串
void setTime(long time): 设置Date对象的时间
long getTime(): 获取Date对象中保存的时间毫秒值.
SimpleDateFormat类
作用:
String转Date
Date转String
构造方法:
SimpleDateFormat SimpleDateFormat(String pattern)创建对象同时指定格式;
括号里填写的就是使用的指定的模式进行对象的构建,括号内就是字符串类型的指定的模式这个模式的写法在API中有y表示年M表示月d表示月中的天H是小时m是分钟s是秒
模式的意思就是用什么方式,可以用年月日分割或者是用-隔开,解析的字符串模式必须和构建对象的模式一样
如:new SimpleDateFormat("yyyy-MM-dd")和new SimpleDateFormat("yyyy年MM月dd日")两个对象的模式就不一样
常用的2个成员方法
String format(Date date): 格式化Date对象返回字符串
Date parse(String source): 将字符串解析为Date对象
字符串必须符合模式, 否则抛出异常
格式化时间就是日期 -> 文本
解析时间就是文本-> 日期
* 常用日期模式
* `y`: 年
* `M`: 月
* `m`: 分
* `D`: 年中的天
* `d`: 月中的天
* `H`: 小时(24小时制)
* `K`: 小时(12小时制)
* `S`: 毫秒
* `s`: 秒
* `E`: 星期
Calendar(日历)类
Calendar(日历)类提供了一些操作年月日的方法,用于替代Date类
创建对象
因为这个类是抽象的类没法创建对象我们就可以利用他的静态方法来获取他的对象,用下面的方法
静态方法: static Calendar getInstance(); 获取日历对象
示例: Calendar c = Calendar.getInstance();
* 静态字段: 表示时间的某个部分(直接类名调用)
* `static YEAR`: 年份
* `static MONTH`: 月份. 注意月份数值是0-11
* `static DAY_OF_MONTH`: 日期
* `static HOUR`: 小时(12小时制)
* `static HOUR_OF_DAY`: 小时(24小时制)
* `static MINITE`: 分钟
* `static SECOND`: 秒
成员方法:
int get(int field):返回给定日历字段的值
例如:
获取日期: int day = calendar.get(Calendar.DAY_OF_MONTH);
void set(int field, int value): 将给定的日历字段设置为给定值
例如:
设置年:calendar.set(Calendar.YEAR, 2000);
设置月:calendar.set(Calendar.MONTH, 0);
void add(int field, int amount):为给定的日历字段添加或减去指定的时间量,如时间字段是天,增加n天,时间字段是秒,增加n秒.减少用负数
例如:
当前日期增加一天:calendar.add(Calendar.DAY_OF_MONTHY, 1);
当前日期减少一天:calendar.add(Calendar.DAY_OF_MONTHY, -1);
包装类的概述和基本使用
包装类是封装了基本数据类型的类, 提供了更多复杂的方法和变量
同时将基本类型的使用转换为了类的面向对象方式
* 基本数据类型与其包装类的对应关系
* 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:
1 static int parseInt(String s): 将字符串转换为int
2 static Integer valueOf(String s)
int转String
1 int + ""
2 Integer对象的toString()方法
3 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类
方法:
String[] split(String regex):按照正则表达式切分当前字符串为多个部分,返回每个部分组成的字符串数组,其中不包含分隔符(括号写指定的正则表达式)
boolean matches(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次
集合的体系结构
集合:
是一个统称, 包含很多集合的实现类. 根据不同数据结构, 提供了不同的集合类
数据结构:
数据的组织和存储方式
体系结构:
将不同的集合实现类的共性向上抽取出父类, 从而形成一种体系
如何学习一种体系结构:
从顶层开始学习共性
从底层使用具体实现
集合体系的方法和介绍
Collection接口(单列集合体系的顶层)
| * boolean add(E e): 添加元素, 添加成功返回true, 否则false
| * void clear(): 清空集合中的元素
| * boolean contains(Object o): 判断集合中是否包含指定的对象
| * boolean isEmpty(): 判断集合中是否没有元素. 与null区分
| * boolean remove(Object o): 从集合中删除一个元素, 删除成功返回true, 否则false
| * int size(): 获取集合的长度(元素的数量)
| * Object[] toArray(): 将集合转换为Object[]数组
| * Iterator<E> iterator(): 获取集合的迭代器对象
|- List接口(有序, 可重复, 有索引)
| * void add(int index, E e): 添加元素到指定索引上
| * E remove(int index): 删除索引上的元素, 并返回
| * E set(int index, E e): 修改指定索引上的元素, 并返回被替换的元素
| * E get(int index): 获取指定索引上的元素
| * ListIterator listIterator(): 获取List特有的迭代器对象
|- ArrayList类(底层是数组, 查询快, 增删慢)
| * boolean add(E e) 把指定的元素添加到元素的最后
| * boolean addAll(Collection<? extends E> c) 把参数集合的所有元素添加到当前的集合中
to | * <T> T[] toArray(T[] a)方法,传一个指定类型的数组,将集合中的元素存储到该数组
|- LinkedList类(底层是链表, 查询慢, 增删快)
| * void addFirst(E e): 添加元素到集合的开头
| * void addLast(E e): 添加元素到集合的末尾
| * E getFirst(): 获取集合开头的元素
| * E getLast(): 获取集合末尾的元素
| * E removeFirst(): 删除开头的元素, 并返回
| * E removeLast(): 删除末尾的元素, 并返回
|- Set接口(元素存取无序, 元素不可重复, 无索引)
| * `boolean add(E e)`: 添加成功返回true; 添加失败(重复了)返回false
|- HashSet类(底层哈希表)
|-LinkedHashSet类: 具有HashSet的元素不可重复特点, 同时具有链表的有序的特点
Map接口: 双列集合的根接口, 规定了公共的功能
|_ HashMap类: Hash特性针对key, key无序不可重复, 可以存入null键和null值, 线程不安全, 效率高
|_ Hashtable类: Hash特性针对key, key无序不可重复, 不可以存入null键和null值, 线程安全, 效率低
|_ TreeMap类: Tree特性针对key, 可以按照key排序, 要求key具备比较性
|_ LinkedHashMap类: key具有HashSet的元素不可重复特点, 同时具有Linked链表的有序特点
|_ 遍历
|_ 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
|_ 迭代器
Map接口(双列集合体系的顶层, 以键值对方式存储,键不可重复,值可以重复;一个键对应(映射),一个值,其中key是无序的)
| * `V put(K key, V value)`: 添加键值对(如果有重复的值会覆盖原来的值,(判断是否重复是根据键来判断))
| * `V get(Object key)`: 通过指定键获取值
| * `int size()`: 获取集合长度
| * `containsKey(Object key)`: 是否包含指定的键
| * `containsValue(Object value)`: 是否包含指定的值
| * `boolean isEmpty()`: 是否为空
| * `void clear()`: 清空集合
| * `V remove(Object key)`: 删除指定键的值(key和value都会删除)返回的是值
| * `Set<Map.Entry<K, V>> entrySet()`: 获取键值对的Set集合,返回一个Ste集合
| * `Set<K> keySet()`: 获取所有键的Set集合
| * `Collection<V> values()`: 获取所有值得Collection集合
|- Map.Entry(Map内部接口, 表示键值对对象)
| * `K getKey()`: 获取键
| * `V getValue()`: 获取值
|- HashMap类(Map接口的实现类可以用他的方法)
迭代器(接口 Iterator<E>)
Iterator接口
| * boolean hasNext(): 判断是否有下一个元素
| * E next(): 获取下一个元素
| * void remove(): 删除迭代器返回的最后一个元素
|- ListIterator接口
* void add(E e): 使用迭代器添加元素到集合
* void remove(): 使用迭代器删除元素
泛型
作用:
约束集合中元素的数据类型
将运行时发生的类型转换异常提前到了编译时期
Collections工具类(提供Collection类的一些工具方法,静态的都是可以类名调用)
* 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): 将集合中的元素按照元素的自然顺序排序
* static void swap(List list,int i, int j)`: 将指定列表中的两个索引进行位置互换
异常
解释:就是不正常的情况,是代码编译或运行时发生的错误
异常的集成体系:
java.lang.Throwable(最顶层)
Error(不能处理的异常,只能重新编写代码)
Exception(可以处理的异常,(是编译时期发生的异常))
RuntimeException(运行时期发生的异常)
Throwable常用方法
- String getMessage(): 获取异常的原因, 没有原因则返回null,有的话返回一个String类型的数据
- String toString(): 返回异常的类型和原因,返回一个String类型的数据;
- void printStackTrace(): 使用标准错误输出流打印异常详情,没有返回值;(记住不用syso输出语句,也不能用)
异常的分类:
编译时异常:编译时发生的的异常,必须在编译时期处理
运行时异常:编译时正常,运行时发生的异常,可以选择自己处理,或交给jvm处理
自定义异常:
自己编译一个类,让他继承Exception类或其子类(非RuntimeException),重写他的构造方法,生成一个编译时期的异常
自己编译一个类,让他继承RuntimeException类或其子类,重写他的构造方法,生成一个运行时期的异常
处理异常的方式:
JVM默认的处理方式:把异常的具体信息打印在控制台,终止程序运行,异常后的代码不会在执行.
手动处理异常的方式:
捕获异常:try...catch (可以处理多个异常格式如下)
try...catch 格式:
try {
// 可能发生异常的代码
} catch (异常类型1 变量名) { (如果不知道异常类型可以先跑一下看控制台输出什么类型)
// 处理异常
} catch (异常类型2 变量名) {
// 处理异常
}
注意:
在try代码块中发生异常,则会从发生异常的代码直接跳转到catch语句中,不在执行try下的代码,其他catch代码块也不会执行,但是程序不会停掉之下的一些代码还会执行
如果多个异常之间没有继承关系,顺序无所谓;如果有继承关系,子类异常在上,父类异常在下;
因为父类包含子类的异常, 如果上方被父类异常的catch捕获了,那么捕获子类异常的catch永远也不会用到,没有定义的意义了
finally
解释:是一个关键字
作用:和try...catch配合,无论是否发生异常,无论是否捕获异常都会执行finally代码块中的代码
应用场景:IO流释放资源时候,将close()方法方在finally代码块中; (这是一种规范,不写在里面也会执行,不过要写在catch外)
格式:
try {
// 可能发生异常的代码
} catch (异常类型1 变量名) {
// 处理异常
} catch (异常类型2 变量名) {
// 处理异常
} finally {
// 无论是否发生异常, 都会执行
// 一般用于释放资源的操作
}
抛出异常方式:
throws:
解释:是个关键字; 用于抛出编译时异常,在方法声明上使用
作用:用来抛出异常;是处理异常的一种方式,方法内部不处理,由方法的调用者处理
定义位置:方法形参后,如果抛出多个异常,可以用,逗号分隔
格式:方法小括号后 throws 异常类型1,异常类型2{}
throw:
解释:是一个关键字;用于主动抛出运行时异常,在方法中使用(自己制造异常时使用)
作用:自己制造异常,抛出一个异常对象;
格式:throw new 异常类型的构造方法();记住要定义一个异常类重写他的构造方法,上面有自定义异常;
递归
- 原理: 将大的问题拆分为小问题, 再将小问题拆分为更小的问题, 解决了最小的问题后, 更大的问题也可以解决, 最终整个问题得到解决
- 在代码中指的是方法自己调用自己
- 注意事项
- 递归必须有出口, 否则内存溢出 (错误提示StackOverFlowError)
- 递归次数不能太多, 否则也会内存溢出 (不建议使用递归因为太占内存)
- 补充: 递归和循环的相互转换
- 递归都可以转换为循环实现
- 循环不一定能转换为递归 |
|