Collections
作用
对集合操作的工具类
常用的方法
static void sort(List<T> list): 排序
按照存储的数据的hasnCode值进行排序
static void sort(LIst<T> list, Comparator<? super T> c): 排序
按照指定的比较器进行排序
static void reverse(List<?> list): 反转
static void shuffle(List<?> list): 打乱
static boolean addAll(Collection c, T... elements)
作用: 给集合中添加多个元素
参数:
c: 集合
elements: 添加的元素
static void copy(List 新集合, List 旧集合): 拷贝
注意: 新集合中的元素个数要大于等于旧集合
int binarySearch(List 查找的集合, T 目标数据): 查找
返回值: 目标数据在集合中的位置,如果不存在返回-1
注意: 该方法使用二分查找法,所以在使用该方法时集合必须是有序的
二分查找法使用的要求: 数组必须是有序的
Map
简介
中文名: 字典
作用: 存储一组数据类型相同的数据
特点:
按照键值对的方式存储
名词:
键(Key): 类似于标记,如人的名字
值(Value): 如人本身
键值对: 一个键与一个值成为一个键值对
要求
键: 不允许重复
值: 可以重复
Map体系结构
Map
HashMap
特点: key不能重复,允许null作为键或值,线程不安全的,JDK1.2出现
Hashtable
特点: key不能重复,不允许null作为键或值,线程安全的,JDK1.0出现
TreeMap
特点: 键要么拥有比较性,要么创建TreeMap时指定比较器
Properties(了解)
Hashtable的子类
注意:
Map的底层是用Set实现的
Set的底层是用Map实现的
Map提供的方法
增
V put(K key, V value): 将该键值对存储到字典中
void putAll(Map m): 添加多个
删
V remove(Object key): 删除该key所在的键值对
返回值: 删除的键值对中的值
void clear(): 清空
改
V put(K key, V value)
注意: 如果字典中不存在该key,那么本次就是添加,如果存在就是修改
查
int size(): 查询字典中存储的键值对的个数
boolean isEmpty(): 查询字典是否为空
boolean containsKey(Object key): 判断指定的key是否存在
boolean containsValue(Object value): 判断指定的值是否存在
V get(Object key): 获取key对应的value
Set<K> keySet(): 获取所有key的集合
Collection<V> values(): 获取所有值的集合
Set<Entry> entrySet(): 获取所有键值对的集合
Entry: 键值对
提供的方法
K getKey(): 获取该键值对的键
V getValue(): 获取该键值对的值
V setValue(V value): 给该键值对修改值
Properties的特点
可以将字典中的数据存储到文件中
也可以读取指定类型文件的数据到字典中
Properties特有方法
void store(OutputStream out, String comments)
作用: 将字典中的数据存储到文件中
参数:
out: 输出流,表示数据的存储位置
comments: 提交信息
void load(InputStream inStream)
作用: 加载文件,读取文件中的数据到字典中
参数:
inStream: 输入流,表示读取的文件地址
String getProperty(String key)
作用: 通过key获取字典中存储对应的value,类似于Map的get方法
优点:
getProperty返回值是String类型的,get方法返回值是Value的泛型,而Properties并没有定义泛型,所以返回值为Object类型,需要手动转换为String
String getProperty(String key, String defaultValue)
作用: 通过key获取对应的value
参数:
key: 键
defaultValue: 默认值
注意:
如果取值时,字典中不存在该key,则返回默认值,如果存在该key,那么返回key对应的value
异常
引入
因为硬件或思考不全面导致程序出现问题,这种问题就是异常
异常的分类
Throwable: 所有错误的顶级接口
Error: 错误
原因: 因为硬件问题引起软件崩溃
处理方式: 不处理
OutOfMemoryError: 内存溢出异常,一般来说现在计算机的硬件不会导致该问题,所以当程序出现OutOfMemoryError时程序员可以通过对内存的优化,解决该问题,这个错误简称为OOM
Exception: 异常
CheckedException: 检查时异常
原因: 因为代码编写未按照规定的语法格式去编写,无法通过开发工具的检查
处理方式: 正确书写语法
RuntimeException: 运行时异常
原因: 在代码编写时考虑不足导致的
处理: 修改不足或进行容错
异常出现后情况
程序闪退,不会再向下继续进行
常见的异常
空指针异常: NullPointerException
原因: 使用null调用了属性或方法
数组下标越界异常: IndexOutOfBoundsException
原因: 操作的下标不在集合下标的取值范围内
算法异常: ArithmeticException
原因: 代码中的数学运算不符合数学规律,比如除数为0
类型转换异常: ClassCastException
原因: 转换的对象并不是目标对象所属的类
数字格式异常: NumberFormatException
类不存在异常: ClassNotFoundException
异常的传递
如果在异常传递过程中,没有处理异常,异常最终会传递给JVM
JVM对异常的处理方式是让程序退出
异常的处理
1.修改代码
2.try catch
语法:
try{
有可能导致异常的代码
}catch(异常种类1 变量名){
//当try中的代码产生异常种类1的异常时,会执行此处代码
}catch(异常种类2 变量名){
//当try中的代码产生异常种类2的异常时,会执行此处代码
}...
finally{
必须要执行的代码
}
注意:
1.try中的代码不要写太多
2.finally可有可无
3.当有多个catch时,有继承关系先写子类异常,再写父类异常,没有继承关系顺序无所谓
3.声明异常与抛出异常
throws: 声明异常
使用语法:
访问权限修饰符 修饰符 返回值类型 方法名(形参列表) throws 异常类1, 异常类2...{
}
throw: 抛出异常
使用语法:
throw 异常对象;
使用位置:
方法体
面试题:
1.throws与throw的区别?
throws: 声明异常,在方法定义时使用
throw: 抛出异常,在方法体中使用
2.finally,final,finalize的区别?
finally: 配合try catch使用,表示必须执行的代码
final: 不可变的,可以修饰类,属性,方法,变量
finalize: Object类提供的方法,当对象被销毁时,由系统调用
自定义异常
步骤:
1.创建一个类
2.使用该类继承于异常类
3.提供无参构造函数,在无参构造函数中调用父类无参构造函数
4.提供有参构造函数,参数为String,其参数就是错误信息,在该构造函数中调用父类有参构造
练习
1.使用Collections对存储以下数据的集合进行排序,要求从大到小
10,19,12,8,6,3,7,15
2.使用Map存储以下数据
221001 焦龙飞
221002 王羽洋
221010 郑恩浩
221006 张涛
并使用四种方式遍历
import java.util.ArrayList;
import java.util.Collections;
public class Test01 {
public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<Integer>();
Collections.addAll(list, 10,19,12,8,6,3,7,15);
System.out.println("排序前: " + list);
Collections.sort(list);
Collections.reverse(list);
System.out.println("排序后: " + list);
}
}
运行结果
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map.Entry;
import java.util.Set;
public class Test02 {
public static void main(String[] args) {
HashMap<String, String> map = new HashMap<String, String>();
map.put("221001", "焦龙飞");
map.put("221002", "王羽洋");
map.put("221010", "郑恩浩");
map.put("221006", "张涛");
System.out.println(map);
System.out.println("--------------------");
Set<Entry<String, String>> entrySet = map.entrySet();
for (Entry<String, String> entry : entrySet) {
String key = entry.getKey();
String value = entry.getValue();
System.out.println(key + "------" + value);
}
System.out.println("--------------------");
Iterator<Entry<String, String>> iterator = entrySet.iterator();
while(iterator.hasNext()) {
Entry<String, String> entry = iterator.next();
String key = entry.getKey();
String value = entry.getValue();
System.out.println(key + "------" + value);
}
System.out.println("--------------------");
Set<String> keySet = map.keySet();
for (String key : keySet) {
String value = map.get(key);
System.out.println(key + "------" + value);
}
System.out.println("--------------------");
Iterator<String> iterator2= keySet.iterator();
while(iterator2.hasNext()) {
String key = iterator2.next();
String value = map.get(key);
System.out.println(key + "------" + value);
}
}
}
运行结果