文章目录
- 1. 异常
- 2. 集合
- 2.1 遍历
- 2.1.1 迭代器
- 2.1.2 增强for循环
- 2.1.3 Lambda
- 2.2 List
- 2.3 Set
- 2.3.1 HashSet
- 2.3.2 LinkedHashSet
- 2.3.3 TreeSet
- 2.4 Map
1. 异常
Exception:叫异常,是程序员可以捕捉的。异常又分为了2类:
- 运行时异常:运行时出现的异常(数组索引越界),继承自RuntimeException
- 编译时异常:编译阶段出现错误提醒(日期解析异常)
解决异常有2种方式:
- 在方法上使用throws关键字,可以讲方法内部出现的异常跑出去给调用者处理
- 捕获异常(try…catch)
自定义异常类
同样,也分为两大类,自定义运行时异常继承自RuntimeException;自定义编译时异常继承自Exception
// 继承自runtimeexception
public class AgeillegalRuntimeException extends RuntimeException{
public AgeillegalRuntimeException() {
}
public AgeillegalRuntimeException(String message) {
super(message);
}
}
public class Main2 {
public static void main(String[] args) {
try {
saveAge(160);
System.out.println("底层执行成功");
} catch (Exception e) {
e.printStackTrace();
System.out.println("底层出现了bug");
}
}
public static void saveAge(int age) {
if(age > 0 && age < 150)
System.out.println("年龄成功保存: " + age);
else {
// 用一个异常对象封装这个问题
// 抛出异常
throw new AgeillegalRuntimeException("age is illegal, your age is " + age);
}
}
}
这里记得区分throws是用在方法上的,throw是用在函数体中的。
2. 集合
这一部分是重点内容,在学习的时候,最好搭配力扣食用,学以致用才能最好的掌握。
在Java中,集合分为了2大类,分别是Collection和Map,而Collection又分为了List和Set等。
- List系列集合:添加的元素是有序、可重复、有索引
- Set系列集合:添加的元素是无序、不重复、无索引
- HashSet:无序、不重复、无索引(对应unordered_set)
- LinkedHashSet:有序、不重复、无索引
- TreeSet:按照大小默认升序排序、不重复、无索引(对应set)
由于Collection是相当于祖宗类,所以Collection有的一些方法,它的子类都有,比如isEmpty
、add
等等
2.1 遍历
2.1.1 迭代器
Java的迭代器主要有2个常用方法:
boolean hasNext()
:询问当前位置是否有元素存在E next()
:获取当前位置的元素,并将迭代器对象指向下一个元素处
Iterator<Integer> it = c.iterator();
while(it.hasNext()) {
System.out.println(it.next());
}
2.1.2 增强for循环
这个就和C++11的for循环一样,很好理解,数组和集合都可以。
2.1.3 Lambda
JDK8开始有了Lambda,就有了这个遍历方式。用到的是forEach,但本质其实还是增强for循环。
public static void test2() {
Collection<Integer> c = new ArrayList<>();
c.add(1);
c.add(2);
c.add(3);
c.add(5);
c.forEach(System.out::println);
}
2.2 List
List集合特点:有序、可重复、有索引
ArrayList和LinkList底层采用的数据结构不同,应用场景不同
- ArrayList:C++的vector,动态数组,添加第一个元素时数组大小为10,后续1.5倍扩容
- LinkList:C++的list,双向链表,不是连续存储的
- LinkList有一些特有方法
- 我们一般也是用LinkList来实现队列、栈的。
2.3 Set
- Set系列集合:添加的元素是无序、不重复、无索引
- HashSet:无序、不重复、无索引(对应C++的unordered_set)
- LinkedHashSet:有序、不重复、无索引
- TreeSet:按照大小默认升序排序、不重复、无索引(对应C++的set)
无序说明不能通过get
方法获取元素。
2.3.1 HashSet
JDK8之前,HashSet都是:数组 + 链表。
JDK8之后的HashSet是由:数组 + 链表(哈希冲突)+ 红黑树(链表修改)组成的。
当链表长度超过8,且数组长度>=64时,自动将链表转成红黑树。
2.3.2 LinkedHashSet
是由数组 + 链表(哈希冲突)+ 红黑树(链表修改)组成的。
每个元素都额外多了一个双链表机制记录了他前后元素的位置。
相当于是LinkedList多了一个HashSet,LRU就是基于此。
2.3.3 TreeSet
是由红黑树实现的。
自定义排序,采用Lambda:
Set<Student> st = new TreeSet<>((o1, o2)->Double.compare(o1.height, o2.height));
2.4 Map
- HashMap:无序、不重复、无索引(用的最多)(C++的unordere_map)
- LinkedHashMap:有序、不重复、无索引
- TreeMap:按照大小默认升序排序、不重复、无索引(C++的map)
关于用法,基本都和Set的差不多。