Java学习之路 —— 异常、集合、Stream

文章目录

  • 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)
      Java学习之路 —— 异常、集合、Stream_第1张图片
      由于Collection是相当于祖宗类,所以Collection有的一些方法,它的子类都有,比如isEmptyadd等等

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来实现队列、栈的。
      Java学习之路 —— 异常、集合、Stream_第2张图片

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的差不多。
Java学习之路 —— 异常、集合、Stream_第3张图片
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);

        // stream
        List<String> list2 = names.stream().filter(s -> s.startsWith("j"))
                .filter(a -> a.length() == 5).collect(Collectors.toList());
        System.out.println(list2);
    }

Stream流代表以跳流水线,并能与数据源建立连接。通过调用流水线的各种方法对数据进行处理、计算。最后,将获取的结果进行遍历、统计、收集到一个集合中。

如何获取
Java学习之路 —— 异常、集合、Stream_第4张图片
常见的中间方法(支持链式编程)
Java学习之路 —— 异常、集合、Stream_第5张图片

你可能感兴趣的:(#,A,New,Journey,of,Java,java,学习,开发语言)