Map集合
Map集合的特点
1.一个键对应一个值
2.键不能重复,值可以重复
Map常用方法
V put(K key,V value)添加元素
V remove(Object key)根据键删除键值对元素
void clear()移除所有的键值对元素
boolean containsKey(Object key)判断集合是否包含指定的键
boolean containsValue(Object value)判断集合是否包含指定的值
boolean isEmpty()判断集合是否为空
int size()集合的长度,也就是集合中键值对的个数
V get(Object key)根据键获取值
Set keySet()获取所有键的集合
Collection values()获取所有值的集合
Set<Map.Entry<K,V>> entrySet()获取所有键值对对象的集合
Map集合的三种遍历方式
- keySet()获取所有键的集合
遍历Set 根据键拿到值 - Set<Map.Entry<K,V>> entrySet() 获取所有键值对对象的集合
getKey()获取键
getValue()获取值
3.forEach() forEach循环 中间是lambda表达式 直接获得键和值
HashMap集合 .
HashMap集合的特点:
1.键和值可以为null
2. HashMap底层是哈希表结构的
3.依赖hashCode方法和equals方法保证键的唯一
4.如果键要存储的是自定义对象,需要重写hashCode和equals方法
TreeMap集合
TreeMap集合的特点
1.底层数据结构是红黑树
2. 依赖自然排序或者比较器排序,对键进行排序
3.如果键存储的是自定义对象,需要实现Comparable接口或者在创建TreeMap对象时候给出比较器排序规则
4.Key不能为null Value可以为null
可变参数
格式:
修饰符 返回值类型 方法名(数据类型…变量名){}
注意事项:
1.一个方法中可变参数只能存在一个
2.可变参数必须放在参数列表的最后
3.可变参数实际是一个数组
不可变集合
JDK1.9版本之后
在List、Set、Map接口中,都存在of方法,可以创建一个不可变的集合
- 这个集合不能添加,不能删除,不能修改
- 但是可以结合集合的带参构造,实现集合的批量添加
- 在Map接口中,还有一个ofEntries方法可以提高代码的阅读性
- 首先会把键值对封装成一个Entry对象,再把这个Entry对象添加到集合当中
Stream流
Stream流的好处
- 直接阅读代码的字面意思即可完美展示无关逻辑方式的语义:获取流、过滤姓张、过滤长度为3、逐一打印
- Stream流把真正的函数式编程风格引入到Java中
- 代码简洁
生成Stream流的方式:
- Collection集合:
通过默认的stream()获得流对象
ArrayList list = new ArrayList();
list.stream() - Map集合:
需要通过转换为Set集合来间接获得流对象
Map <K,V> map =new HashMap<>();
Set keys = map.keySet();
keys.stream(); - 数组:
通过Arrays类中的静态方法stream生成流
int [] arr ={1,2,3,4,5,6}
Arrays.stream(arr); - 同种类型的数据:
通过Stream接口的静态方法of(T… values)生成流
Stream.of(1,2,3,4,5,6,7,8,9)
Stream流的中间方法(过滤数据)
filter :指定条件过滤数据 true通过继续下一个条件 false被过滤掉
map:将类型转换为指定另外一个的类型
limit:截取流中指定的元素个数(限制个数)
skip:跳过流中指定元素个数返回由该流的剩余元素组成的流
concat:将两个流合并 返回一个新的流
distinct():返回流的不同元素(去重)
sorted(比较器) 排序
Stream流的终结方法
forEach:对流中的每个元素操作
count:返回流中的元素数
Stream流中的收集操作
R collect(Collector collector)把结果收集到集合中
toSet:将流中过滤通过的数据收集到Set集合中
toList:将流中过滤通过的数据收集到List集合中
toMap:将流中过滤通过的数据收集到Map集合中
Stream流的注意事项:
流都是单向的 使用到终结方法就结束了 再使用这个流就会爆出非法操作流的异常