-
集合分类:
单列集合(Collection): 每次存储1个元素
双列集合(Map): 每次存储2个元素
(有对应关系的数据—用Map双列集合存储) -
Collection(接口)基本方法:
add(元素): 添加元素 clear清空集合元素 size(): 集合长度
contains判断是否包含某元素 toArray 将集合转为数组 forEach 逐一处理(遍历)
集合1.addAll(集合2): 将后集合的元素 加到前集合后面 eg. list1.addAll(list2)
isEmpty判断是否为空集合 (size为0的是空集合) ( !list.isEmpty() 表示集合不是空 )
remove(元素)—删除出现元素, 集合中可能没有该元素, 所以返回boolean值
注意:
要删除的元素是小于集合长度的整数时, 要将元素转为包装类Integer.valueOf(元素)
父类定义的是共性内容, Collection没有带索引的方法, List才有带索引的方法(增删改查)
集合存储的是对象时, 元素是地址, 将地址和对象关联起来—类类型变量 = 角标值 -
Collection接口:
List—ArrayList / LinkedList
Set—HashSet / LinkedHashSet -
List集合:
add (角标, 新元素): 将新元素插入到指定角标
(其他元素顺延) (插入到最后—直接用add(元素)
remove(角标)—后续元素向前挪1位(i–) 返回被删除的元素
set(角标, 新元素): 将指定角标改为新元素 (返回修改前的元素)
get(角标): 获取角标值
(add直接调用 size输出调用 set/get/remove用赋值调用时 类型就是元素类型) -
ArrayList数组集合 (增 删 改 查 / 长度)
格式: ArrayList<类型> 集合名 = new ArrayList<>(); -
LinkedList链表集合: LinkedList link = new LingkedList()
addFirst(元素): 将元素添加到链表头 (addFirst是倒序存储数据)
addLast(元素): 将元素添加到链表尾 (常规存储方式addLast)
getFirst(): 获取链表头元素
getLast(): 获取链表尾元素
removeFirst(): 删除链表头元素, 返回被删除的元素
removeLast(): 删除链表尾元素, 返回被删除的元素
LinkedList查找元素:
角标<长度/2时, 从链表头开始查, 否则 从链表尾开始查 (内部有算法, 会自动识别) -
Map集合:
put(键, 值): 添加/修改键值对 (一般直接调用) eg. map.put(“001”, “jack”)
get(键): 获取键对应的值 (键不存在 返回null) eg. map.get(key)
remove(键): 删除指定键的键值对, 返回键对应的值, 如果键不存在, 返回null
(Map增删查 返回的都是原来的值, 没有—返回null)
要增减键值对的值:
直接用map.put() 添加 eg. map.put(“柳岩”, map.get(“柳岩”) + 300);
clear(): 清空集合
size(): 获取Map集合的键值对个数
isEmpty(): 判断集合是否为空 (键值对个数为0, 就是空集合)
containsKey(键): 判断集合中是否包含指定的键
- HashMap: (哈希表结构) 无序 无索引 元素不可重复
无序: 指不是按添加顺序存储, 而是按哈希值的取模值存储
创建格式: Map<键类型, 值类型> 集合名 = new HashMap<>();
键值对—键唯一, 值可以重复 (不能重复的是键)
键类型是对象时, 对象类要重写equals和hashCode方法 (键要唯一)
键类型不是对象时, 对象类可以不重写这2个方法 (值可以重复)
9. LinkedHashMap: (哈希表+链表结构) 跟HashMap功能一样, 可以让元素存取有序
Stream流 操作集合/数组
每个数组/集合 都可以转为流对象
数组/集合: 筛选/转型/抽前/删前/拼接—用Stream流 (链式编程)
单列集合转流对象: 集合名.stream()
双列集合转流对象: 键集合/值集合/entry集合.stream()
数组转流对象: Stream.of(数组名/同类数据) — 同类数据就是可变参, 可变参就是数组
(转为流对象, 要指明元素类型)
流对象转List集合: 流对象.collect(Collectors.toList())
流对象转Set集合: 流对象.collect(Collectors.toSet())
流对象转数组: 流对象.toArray(类型[ ] :: new)
转化成了其他流, 原来的流就被关闭了, 后续不能再使用
调用了concat拼接, 它的子流就被关闭了, 后续不能再使用子流
调用了count / forEach方法, 该流就被关闭了, 后续不能在使用该流对象
链式方法: (返回流对象的方法)
limit(n): 抽取前n个元素
skip(n): 删除前n个元素
(n不能是负数, 否则会报异常)
map(Lambda): 转换类型
filter(Lambda): 筛选符合要求的元素
Stream.concat(流1, 流2): 按顺序拼接元素
(concat是静态方法, 要用类名调用 // concat要链式编程的话, 必须写在最前面)
终结方法:
count(): 流的长度
forEach(System.out :: println): 逐一打印
(count 和 forEach是终结方法, 要链式编程的话, 必须写在最后面)
没有元素的流 是空流
打印 流对象内容: 要调用forEach(Lambda)方法 (直接打印 流对象 显示的是地址)
Stream流的分类
串行流:在当前线程 按顺序执行操作 (不开线程)
并行流:开启多个线程 和当前线程一起执行操作
转为并行流:
集合名. parallelStream() 流对象. parallel()
(注意: 只在涉及到IO 且 数据间没依赖关系时, 才用并行流, 其他场景串行流效率更高)