本帖最后由 小石姐姐 于 2018-4-20 09:11 编辑
就业班前几天总结
一、获取class字节码对象的方法
1.通过Object类的getClass()方法获取
2.通过类名调用属性class来获取
3. 通过Class类的静态方法forName()来获取(注意:方法中应传入类的全名“字符 串”)
二、String toString()方法:
默认返回对象的字符串表示,如果想要表示出对象的属性,需在对象的类中重写toString ()方法【此方法为根类Object中的方法】【例:一个学生对象s,syso(s),默认输出 对象地址,如果类中 重写了toString方法,则输出姓名,年龄等信息】
三、equals(Object obj)方法
用于比较两个对象是否相等,Object类中默认使用“==”来比较两 个对象的地址值; 如果想要比较对象属性是否相同,需要在类中重 写此方法。。用“==”直接比较两个 对象时,比较的是地址值,如 果比较两个对象的class,会发现同一个类的对象共用 一个class文件
Stsyem
system:包含一些有用的类字段和方法,它不能被实例化
static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
复制数组
src:源数组
srcPos:指定从哪个索引位置开始复制
dest:目标数组
destPos:指定目标数组接收元素的索引位置
length:目标数组接收元素的个数
例子:int[]src={1,2,3,4,5};
int []dest=new int[5];
//System.arraycopy(src, srcpos, dest, destpos, length);
System.arraycopy(src, 0, dest, 0, 5);
for(int i=0;i<dest.length;i++){
System.out.print(dest);
}
集合
包含了不同的实现类, 向上抽取出了很多共性的接口, 形成了一个体系结构
数据结构
数据的组织和存储方式
迭代器
作用: 遍历集合
并发修改异常:
原因: 迭代集合时改变了集合的长度
解决:
不使用迭代器
使用迭代器对象中的修改方法
泛型
作用:
约束集合中元素的数据类型
将运行时发生的类型转换异常提前到了编译时期
遍历集合的3种方式
普通for循环
迭代器
增强for循环
优点: 快速简便的遍历集合元素
缺点: 不能在遍历过程中修改集合, 也没有索引可以使用
常见的数据结构
数组
特点:
长度一旦确定则不可改变
有整数索引
只能存储同一个数据类型的元素
既能存储基本数据类型, 又能存储引用数据类型
增删慢, 查询快
链表
特点:
增删快, 查询慢
栈
特点: 先进后出, FILO
队列
特点: 先进先出, FIFO
Set
Set是一个接口, 继承自Collection接口
Set特点
元素无序(存入和取出顺序不一样)
元素不能重复(元素唯一)
没有索引
HashSet类
是Set接口的实现类
方法
boolean add(E e): 添加成功返回true; 添加失败(重复了)返回false
保证元素唯一性的原理(hashCode()方法和equals()方法)
HashSet的add()方法, 首先使用当前集合中的每一个元素和新添加的元素进行hash值比较
如果hash值不一样, 则不重复, 直接添加新元素
如果hash值一样, 则继续比较地址值或使用equals方法进行比较
如果比较结果一样, 则认为重复, 不添加
如果for循环所有比较都不一样, 则不重复, 添加元素
如何让自定义对象去重?
重写hashCode()和equals()方法
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): 将指定列表中的两个索引进行位置互换
Map接口
Map<K, V>是接口, 是双列集合的顶层
Map的特点
存储方式是key-value(键值对)方式, 即一个键对应一个值
每个键只能映射一个值
Map中的键不能重复, 值可以重复
key是无序的
Map和Collection的区别
Map是双列集合, 用于处理有对应关系的数据, key不能重复且无序
Collection是单列集合, 有不同的子体系, 有的允许重复且有序, 有的不允许重复且无序
创建对象
Map<K, V> map = new HashMap<>(); 多态
HashMap<K, V> map = new HashMap<>(); 正常
方法
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集合
Set<K> keySet(): 获取所有键的Set集合
Collection<V> values(): 获取所有值得Collection集合
Map遍历的2种方式
方式1:
map.keySet()获取key的Set集合
遍历Set集合获取每一个key
通过map.get(K key)获取value
方式2:
map.entrySet(K,V)获取Entry<K,V>的Set集合
遍历Entry的Set集合, 得到一个Entry对象
调用Entry对象的getKey()获得key, 调用Entry对象的getValue()获取value
可变参数
原理: 底层是根据参数长度创建的数组(JVM操作)
格式: 形参数据类型... 形参名
注意事项:
可变参数的数量可以从0个到多个
可变参数只能是一种数据类型
可变参数的定义位置必须在方法形参列表的最后一个
如何使用可变参数: 把可变参数的形参名作为一个数组变量名, 遍历获取元素
异常
概念: 不正常的情况, 是代码编译或运行时发生的错误
异常的集成体系:
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
递归次数不能太多, 否则也会内存溢出
补充: 递归和循环的相互转换
递归都可以转换为循环实现
循环不一定能转换为递归 |
|