一、JAVA异常分类
1.1 Error
指java运行时系统内出现错误和资源耗尽错误。是程序无法处理的错误
资源耗尽错误指的是 超过idea设置编译器内存默认范围时会报这个错。
1.2 Exception
是程序本身可以处理得异常
①RuntimeException (运行时异常)
一定是程序员的错误,代表程序员的代码存在bug
解决办法:修改bug
②CheckedException(检查异常:编译时出现异常)
解决办法:这个要用try-catch捕获异常或者throws抛出异常
二、List
1.1 ArrayList
内部是通过动态数组实现,它允许对元素进行快速随机访问
扩容机制:当不够内存时,就会创建一个length为当前的1.5倍的数组,然后进行复制,移动,成为一个新的数组。
优点:利于查询和遍历,
缺点:不利于删除插入,因为进行增删操作需要对已知数组元素进行移动,操作繁杂。
/**
* 扩容机制:当不够内存时,就会扩大为当前数组长度的1.5倍
* ArrayList是有序的,ArrayList使用线性顺序存储结构,和数组一致,
* 每个对象有一个index,index本身是有序的,所以你添加的时候,
* index有序增长,遍历的时候,按照index遍历,也是有序的。
*/
public class ArrayListTest {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
list.add("1"); //坐标为0
list.add("5");
list.add("3");
System.out.println(list);//[1,5,3]
//插入坐标为2的元素2
list.add(2,"2");
System.out.println("插入坐标数组链表为:"+list);//1 5 2 3
int size = list.size();
System.out.println("数组链表长度为:"+size);//4
String s = list.get(0);
System.out.println("坐标为0的元素是"+s);//1
boolean contains = list.contains("5");
System.out.println("元素5是否在数组链表中?"+contains);//true
boolean empty = list.isEmpty();
System.out.println("该数组链表是否为空?"+empty);//false
//遍历数组元素及坐标
//①for循环
for (int i =0;i<list.size();i++){
//坐标为0的元素是1 坐标为1的元素是5 坐标为2的元素是2 坐标为3的元素是3
System.out.println("坐标为"+i+"的元素是"+list.get(i));
}
//②foreach循环:顺序遍历所有元素
for (String s1: list){
//没有坐标显示的,但是是顺序遍历出来数组
//坐标为0的元素是1
//坐标为1的元素是5
//坐标为2的元素是2
//坐标为3的元素是3
System.out.println("遍历数组为:"+ s1);
}
//③使用迭代器
list.remove("1");//删除元素1 //5 2 3
list.remove(2);//删除坐标为2的元素 // 1 2
list.indexOf("5");
System.out.println("删除后数组为:" + list); // 1 2
}
}
1.2 Vector
是通过数组实现的,不过它支持线程的同步访问,即同一时间内,只能做一件事情。
优点:避免多线程同时进行带来的不一致性
缺点:但实现同步需要花费时间很多,而且只能做完一个事件才能进行下一个,访问速度慢
1.3 LinkList
双向链表,链表的每个元素都是具有两个节点的,每当移动或者删除时,就会同时变更
优点:适合增删
缺点:查询遍历慢,因为需要一个一个的往下查找遍历,所以时间复杂度为O(n)。
public class LinkedListTest {
public static void main(String[] args) {
LinkedList<String> linkedList = new LinkedList<>();
linkedList.add("2");//坐标为0
linkedList.add("6");
linkedList.add("4");
linkedList.add("8");
System.out.println("增加元素后链表为" + linkedList);//2 6 4 8
linkedList.add(2,"3");
System.out.println("插入坐标为2的元素3时,链表为" + linkedList); // 2 6 3 4 8
String index3 = linkedList.get(3);
System.out.println("坐标为3的元素为:" + index3); //4
boolean contains = linkedList.contains("4");
System.out.println("元素4是否在链表中?" + contains);//true
boolean linkedListEmpty = linkedList.isEmpty();
System.out.println("链表是否为空?" +linkedListEmpty); //false
//遍历第一种方法
for(int i=0 ; i<linkedList.size();i++){
//坐标为0的元素为2
//坐标为1的元素为6
//坐标为2的元素为3
//坐标为3的元素为4
//坐标为4的元素为8
System.out.println("坐标为"+i+"的元素为"+linkedList.get(i));
}
//遍历第二种方法,str是每次取一个元素出来
for(String str: linkedList){
System.out.println(str);//2 6 3 4 8
}
System.out.println("第一个元素" + linkedList.getFirst());//2
System.out.println("最后一个元素" + linkedList.getLast());//8
linkedList.remove(1);//删除坐标为1的元素
linkedList.set(0,"0"); //把坐标为0的元素改为0
System.out.println(linkedList); //0 3 4 8
}
}
三、Map
1.HashMap
基于哈希表的 Map 接口的实现。此实现提供所有可选的映射操作,并允许使用 null 值和 null 键。
存储的内容是键值对,就是key-value,是无序的。适合查询,因为根据hash值能快速定位到数组的具体下标。
2.HashTable
常用功能和Has和Map类似,但它的线程是安全的,所以在某个时间段只有一个线程能写HashTable,所以访问速度会慢很多。
3.TreeMap
是通过红黑树实现的,默认是根据键值的升序排序,是可排序的Map。