Exception:叫异常,是程序员可以捕捉的。异常又分为了2类:
解决异常有2种方式:
自定义异常类
同样,也分为两大类,自定义运行时异常继承自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是用在函数体中的。
这一部分是重点内容,在学习的时候,最好搭配力扣食用,学以致用才能最好的掌握。
在Java中,集合分为了2大类,分别是Collection和Map,而Collection又分为了List和Set等。
Java的迭代器主要有2个常用方法:
boolean hasNext()
:询问当前位置是否有元素存在E next()
:获取当前位置的元素,并将迭代器对象指向下一个元素处Iterator<Integer> it = c.iterator();
while(it.hasNext()) {
System.out.println(it.next());
}
这个就和C++11的for循环一样,很好理解,数组和集合都可以。
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);
}
List集合特点:有序、可重复、有索引
ArrayList和LinkList底层采用的数据结构不同,应用场景不同
无序说明不能通过get
方法获取元素。
JDK8之前,HashSet都是:数组 + 链表。
JDK8之后的HashSet是由:数组 + 链表(哈希冲突)+ 红黑树(链表修改)组成的。
当链表长度超过8,且数组长度>=64时,自动将链表转成红黑树。
是由数组 + 链表(哈希冲突)+ 红黑树(链表修改)组成的。
每个元素都额外多了一个双链表机制记录了他前后元素的位置。
相当于是LinkedList多了一个HashSet,LRU就是基于此。
是由红黑树实现的。
自定义排序,采用Lambda:
Set<Student> st = new TreeSet<>((o1, o2)->Double.compare(o1.height, o2.height));
// 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);
});
在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);
// stream
List<String> list2 = names.stream().filter(s -> s.startsWith("j"))
.filter(a -> a.length() == 5).collect(Collectors.toList());
System.out.println(list2);
}
Stream流代表以跳流水线,并能与数据源建立连接。通过调用流水线的各种方法对数据进行处理、计算。最后,将获取的结果进行遍历、统计、收集到一个集合中。