异常
当程序没有按照设计的逻辑运行时,产生了不可预知的错误,就叫异常
异常的分类
所有异常的根类Throwable,又分为Error和Exception两个大类
- Error,一般为虚拟机错误,这种错误我们的代码没有办法处理
- Exception,我们可以用通过代码抛出异常或处理异常,Exception又能分为运行时异常(RuntimeException)和非运行时异常
异常的处理
在Java中处理异常有两种方式抛出异常和捕获异常
- throws和throw抛出异常
//在方法名后面添加throws申明后面跟异常类型,异常的类型必须要比代码中抛出的异常类型大
public void fun() throws Exception{
//用throw关键字抛出异常,后面跟异常的类型,括号中的字符串就是异常的信息
throw new Exception("出现异常");
}
- try catch捕获异常
try{ //会出现异常的代码 } //catch语句可以有多个,如果只要一个catch语句,它包含的异常类型要大于等于出现异常代码中最大的异常类型 catch(异常类型 e){ e.printStackTrace(); } //finally语句中的代码是一定会执行的,不管有没有异常,finally语句是可选的,try catc是必须有的 finally{ }
集合
List
List是列表,用来存储一组数据的数据结构
List可变长的数据结构, 可以知道List里面存有多少个数据
List里面可以保存不同类型的数据
List是有序列表, 数据可以重复
ArrayList
ArrayList是采用数组方式实现的
读和遍历比较快, 插入和删除数据比较慢
- ArrayList的使用
//用ArrayList创建一个List类型的对象
List list = new ArrayList();//默认长度为10,可扩展
//add()添加方法,list中可以存放不同数据类型的数据
list.add(1);
list.add("张三");
list.add(5.1);
//get()返回返回指定下标的元素,下标从0开始,未指定泛型返回的是Object类型的数据
Integer i = (Integer)list.get(0);
String str = (String)list.get(1);
//size()返回列表中实际数据个数
list.size();
//在指定下标位置插入一个数据,原来位置的数据往后面移动一位
list.add(2, 3.14);
//替换指定下标位置的元素
list.set(4, true);
//删除指定下标的元素
list.remove(3);
//判断是否包含某个元素,如果包含返回true
list.contains("abc");
//返回指定的元素在列表中的序号;没有找到返回-1
list.indexOf("abc");
list.lastIndexOf("abc");
//截取子列表,左闭右开区间
List listSub = list.subList(1, 3);
//列表转换为数组
Object[] array = list.toArray();
System.out.println("数组长度:" + array.length);
//通过Arrays工具类把一个数组转为List
List objectList = Arrays.asList(array);
//清除列表的所有数据
list.clear();
//判断列表是否是空的(没有元素),是空返回true;否则返回false
list.isEmpty();
- LinkedList
采用双向链表实现
- 插入和删除速度快
- 查找和遍历速度慢
- 链表里面的数据是保存的地址
- 每个节点除了自身数据的地址外,还保存下一个和下一个节点的地址
- LinkedList一些特殊方法
LinkedList list = new LinkedList();
list.add(5);
//在列表的最前面插入元素
list.addFirst(1);
//在列表的最后插入元素
list.addLast(9);
//获取第一个元素
System.out.println(list.getFirst());
//获取最后一个元素
System.out.println(list.getLast());
//删除第一个节点
list.removeFirst();
//删除最后一个节点
list.removeLast();
list.add(7);
list.add(9);
//出栈, 弹出第一个元素(会从列表中删除)
System.out.println("弹出元素:" + list.pop());
//入栈(压栈),在最前面插入一个元素
list.push(3);
泛型
因为集合可以存各种类型的数据,但是取出来都是Object,所以需要进行强制类型转换。
泛型就是用来解决这个问题,在创建List对象时指定存储的类型,在add和get自动就采用泛型指定的类
型
泛型不能时基本类型,只能是引用类型
//使用泛型,定义变量时,类型后面跟上尖括号,尖括号写上数据类型,
// new对象时候,类后面也要有尖括号,尖括号里不写类型,默认跟定义变量泛型一致
//泛型只能使用引用类型,不能用基本类型
List<String> listStr = new LinkedList<>();
//一旦指定泛型后,相关方法的参数,返回类型都跟泛型的类型一样
listStr.add("aaa");
listStr.add("bbb");
String s = listStr.get(0);
System.out.println(s);
Set
无序集合,元素不重复
没有索引(序号),不能通过下标访问
HashSet
采用hash表实现
元素不重复, 无序的, 允许存null
不能按下标读取元素,只能遍历
- HashSet常用方法
//创建HashSet。 默认长度16, 加载因子为0.75
HashSet<String> set = new HashSet<>();
//往set添加元素
set.add("Java");
set.add("Html");
set.add("SQL");
set.add("Java");//重复的内容,在set里面只有一个
//返回元素的个数
System.out.println(set.size());
//遍历set的元素
for (String str : set) {
System.out.println(str);
}
//查找是否包含某个对象(对象要重写hashCode和equals)
System.out.println(set.contains("Java"));
//删除set的集合
set.remove("Java");
//清空set
set.clear();
//判断set是否是空的
System.out.println(set.isEmpty());
TreeSet
TreeSet的特性:
- TreeSet采用红黑树数据结构来实现的。
- 不能添加null
- 不能添加重复的元素
- 添加的元素会被排序,遍历出来是按顺序排列的
- TreeSet的元素必须要实现Comparable (如果没有实现Comparable 接口,运行时抛类型转换错
误异常ClassCastException)
常用方法 :
TreeSet<Integer> set = new TreeSet<>();
set.add(20);
set.add(25);
set.add(8);
set.add(16);
//返回元素的个数
System.out.println("元素个数:" + set.size());
//返回排序后的第一个元素
System.out.println("first: " +set.first());
//返回排序后最后一个元素
System.out.println("last: " + set.last());
//返回比指定元素大的最小元素
System.out.println("ceiling: " + set.ceiling(18));
//返回比指定元素小的最大元素
System.out.println("floor: " +set.floor(18));
//遍历是按元素排序显示
for (Integer i : set) {
System.out.println(i);
}
//删除指定的对象
set.remove(20);
//清空所有元素
set.clear();
//判断是否是空(没有元素)
System.out.println("判断是否是空:" + set.isEmpty());
Map
- 保存键值对数据(key - value)
- key不能重复, value可以重复
- key和value都可以为null
HashMap
采用数组+链表+红黑树的数据结构来实现的
先根据hash code保存数组中
如果出现hash碰撞,用链表
链表长度超过8,改用红黑树
基本使用方法:
//默认长度为16,加载因子0.75
HashMap<String, String> map = new HashMap<>();
//往map插入数据,第一个参数是Key,第二个参数是value
map.put("yyds", "永远的神");
map.put("emo", "抑郁了");
map.put("u1s1", "有一说一");
//根据key查询对象value
System.out.println(map.get("yyds"));
//判断map中是否存在某个key
System.out.println("containsKey: " + map.containsKey("yyds"));
System.out.println("containsValue: " + map.containsValue("永远的神"));
//返回map元素的个数
System.out.println("size: " + map.size());
//遍历map
System.out.println("=======遍历value=====");
Collection<String> values = map.values();//以Collection数据类型返回所有的 value
for (String str : values) {
System.out.println(str);
}
System.out.println("========遍历key=======");
Set<String> strings = map.keySet();
//以set数据类型返回所有的key
for (String str : strings) {
System.out.println(str);
}
System.out.println("========遍历Entry======");
Set<Map.Entry<String, String>> entries = map.entrySet();
for (Map.Entry<String, String> entry : entries) {
System.out.println(entry.getKey() + ", " + entry.getValue());
}
//删除key为指定值的元素
map.remove("yyds");
//清除所有元素
map.clear();
//判断map是否为空
System.out.println("isEmpty: " + map.isEmpty());