第一章 集合的介绍
1.1 集合的定义
概述:
java集合类存放在java.util包中,是一个用来存放对象的容器。
1.2 集合框架的定义
概述:
java集合框架是为表示和操作集合而规定的一种统一的体系结构,任何集合框架都包含三部分内容,分别是对外的接口、接口的实现和集合运算的算法。
1.3 数组和集合的区别
相同点:
都是容器,都可以存储多个数据。
不同点:
数组的长度是不可变的,集合的长度是可变的。
数组可以存储基本数据类型和引用数据类型,集合只能存储引用数据类型,要存储基本数据类型只能将它们转化成包装类才能存储。
第二章 Collection集合
2.1 Collection集合介绍
概述:
是单列集合的顶层接口,它表示一组对象,这些对象也可以叫做Collection元素。
JDK不提供此接口的任何直接实现,它提供更具体的子接口(List和Set)实现。
创建Collection对象方式:
多态的方式。
具体的实现类ArrayList。
Collection遍历方式:
迭代器介绍:
迭代器是集合的专用遍历方式。
Iterator<E>Iterator(); 返回此集合中元素的迭代器。
Iterator的常用方法:
boolean hasNext();判断当前位置是否有元素可以被取出。
E next();获取当前位置的元素,将迭代器对象移向下一个索引位置。
增强for循环:
介绍:
它是JDK5之后出现的,其内部原理是一个Iterator迭代器。
实现Iterable接口的类才可以使用迭代器和增强for。
简化数组和Collection集合的遍历。
格式:
for(集合/数组中元素的数据类型 变量名 : 集合/数组名) {
// 已经将当前遍历到的元素封装到变量中了,直接使用变量即可
}
2.2 List集合介绍
概述:
有序集合,这里指存取有序。
有索引,按索引访问元素。
与Set集合不同,元素允许重复。
List集合的实现类子类:
ArrayList集合底层为数组,查询快增删慢。
LinkedList集合底层为链表,查询慢增删快。
2.3 泛型
概述:
泛型是JDK5引入的特性,它提供了编译时类型安全检查机制。
好处:
把运行时期的问题提前到编译时期。
避免了强制类型转换。
泛型类:
修饰符 class 类名<类型>{}
泛型方法:
修饰符 <类型> 返回值类型 方法名(类型 变量名){ }
泛型接口:
修饰符 interface 接口名<类型>{}
类型通配符:
类型通配符: <?>
ArrayList<?>:表示元素类型未知的ArrayList,它的元素可以匹配任何类型。
但是并不能把元素添加到ArrayList中,获取出来也是父类类型。
类型通配符上限:<?extends 类型>
ArrayList<?extends Number>:它表示Number或其子类。
类型通配符下限:<?super类型>
ArrayList<?super Number>:它表示Number或其父类。
2.4 Set集合介绍
概述:
不可以存储重复元素,无序。
没有索引,不能使用for循环遍历。
TreeSet集合:
不可以存储重复元素,没有索引,无序。
可以将元素按照规则进行排序:
TreeSet():根据元素自然排序进行排序。
TreeSet(Comparator comparator):根据指定的比较器进行排序。
上述两个排序方式小结:
自然排序:自定义实现类Comparable接口,重写compareTo方法,根据返回值进行排序。
比较器排序:创建TreeSet对象时传递Comparator的实现类对象,重写compare方法,根据返回值进行排序。
在使用时默认使用自然排序,当自然排序不能满足现状的需求时,必须使用比较器排序。
两种方式中返回值的规则:
如果返回值为负数,表示当前存入的元素是较小值,存左边。
如果返回值为0,表示当前存入的元素跟集合中元素重复了,不存。
如果返回值为正数,表示当前存入的元素是较大值,存右边。
HashSet集合:
底层数据结构哈希表。
存储无序。
元素不重复。
没有索引,不能使用普通for循环遍历。
哈希值简介:
是JDK根据对象的地址或者字符串或者数字算出来的int类型的数值 。
如何获取哈希值:
Object类中的public int hashCode():返回对象的哈希码值 。
哈希值的特点:
同一个对象多次调用hashCode()方法返回的哈希值是相同的。
默认情况下,不同对象的哈希值是不同的。而重写hashCode()方法,可以实现让不同对象的哈希值相同。
总结:
HashSet集合存储自定义类型元素,要想实现元素的唯一,要求必须重写hashCode方法和equals方法。
第三章 Map集合介绍
3.1 Map集合概述
概述:
interface Map<K,V> K:键的类型 V:值的类型
特点:
双列集合,一个键对应一个值。
键不可以重复,值可以重复。
3.2 HashMap集合
HashMap底层是哈希表结构。
依赖hashCode方法和equals方法保证键唯一。
如果键要存储的是自定义对象,需要重写hashCode方法和equals方法。
3.3 TreeMap集合
TreeMap底层是红黑树结构。
依赖自然排序或比较器排序,对键进行排序。
如果键要存储的是自定义对象,需要实现Comparable接口或者在创建TreeMap对象时给出比较器排序规则。
3.4 可变参数
可变参数介绍:
可变参数又称参数可变,用作方法的形参出现,那方法参数个数是可变的。
方法的参数类型确定,个数不确定,可以使用可变参数。
格式:
修饰符 返回值类型 方法名(数据类型... 变量名){}
注意:
这里的变量其实是一个数组。
如果方法有多个参数,包含可变参数,可变参数要放在最后。
3.5 创建不可变集合
方法介绍:
在List,Set,Map接口中,都存在of方法,可以创建一个不可变集合。
这个集合不能添加,不能删除,不能修改。但是可以结合集合的带参构造,实现集合的批量添加。
在Map接口中,还有一个ofEntries方法可以提高代码的阅读性。
首先把键值对封装成一个Entry对象,再把这个Entry对象添加到集合中。
第四章 Stream流
4.1 Stream流思想
4.2 Stream流的三类方法
获取Stream:
创建一条流水线,并把数据放到流水线上准备操作。
中间方法:
流水线上的操作。
一次操作完毕之后,还可以继续进行其它操作。
终结方法:
一个Stream流只能有一个终结方法。
是流水线的最后一个操作。
4.3 生成Stream流的方式
Collection体系集合
使用默认方法stream()生成流,default Stream<E>stream()
Map体系集合
把Map转成Set集合,间接生成流。
数组
通过Arrays中静态方法stream生成流。
同种数据类型的多个数据
通过Stream接口静态方法of(T..values)生成流。