文章目录
- 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
- 3. Stream
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的差不多。
Map的遍历方式
// 1. 获取全部的键
for(String key : keys) {double val = map.get(key);System.out.println(key + "_____" + val);
}// 2. entrySet()获取键值对
Set<Map.Entry<String, Double>> set = map.entrySet();for(Map.Entry<String, Double> entry : set) {String key = entry.getKey();Double value = entry.getValue();System.out.println(key + "___" + value);
}
// 3, Lambda JDK8之后才有,非常简单,推荐使用
map.forEach((k, v) -> {System.out.println(k + "--" + v);
});
3. Stream
在java.util.stream.*
中,可以用于操作集合或者数组的数据。
优势:Stream流大量的结合了Lambda的语法风格来编程,提供了一种更强大、更简单的方式操作集合或者数组中的数据,代码更简洁,可读性更好。
public static void main(String[] args) {List<String> names = new ArrayList<>();Collections.addAll(names, "jehan", "rio", "Kong", "keyl", "jiahan");List<String> list = new ArrayList<>();for(String name : names) {if(name.startsWith("j"))list.add(name);}System.out.println(list);// streamList<String> list2 = names.stream().filter(s -> s.startsWith("j")).filter(a -> a.length() == 5).collect(Collectors.toList());System.out.println(list2);}
Stream流代表以跳流水线,并能与数据源建立连接。通过调用流水线的各种方法对数据进行处理、计算。最后,将获取的结果进行遍历、统计、收集到一个集合中。
如何获取