java集合
java 集合
java 集合 从大类上分为以下两种
- 单列集合 Collection
- 双列集合 Map
单列集合
List


遍历方式:
当collection 因为没有索引,因此不支持普通for循环。
- 迭代器循环(只能遍历集合)

演示代码:
1 | |
- 增强for循环 (数组和集合都能遍历)

本质就是迭代器遍历集合的简化写法
1 | |
- Lambda 表达式
1 | |
Set
hashSet :数组 + 链表
LinkedHashSet:元素之间通过双向链表来记录存储的顺序
HashTree: JDK8中,如果一个链表的元素个数超过8,并且table的大小 >= 64 就会变成红黑树
JDK1.8 以后的 HashMap 在解决哈希冲突时有了较大的变化,当链表长度大于阈值(默认为 8)时,会首先调用 treeifyBin()方法。这个方法会根据 HashMap 数组来决定是否转换为红黑树。只有当数组长度大于或者等于 64 的情况下,才会执行转换红黑树操作,以减少搜索时间。否则,就是只是执行 resize() 方法对数组扩容


Set集合中每个元素都会有自己的hashcode
如果没有重写hashCode方法 ,不同对象计算出来的哈希值是不同的。
HashSet 集合去重复的机制
如果希望Set集合认为2个内容一样的对象是重复的,必须重写对象的hashcode() 和 equals() 方法

TreeSet

TreeSet 排序

排序时关于返回值的规则

双列集合map

Map集合常用方法

Map集合遍历方式

- 键找值方式 keyset
需要用到 keyset方法 和 get方法
使用map.get() 之前要先判断是否有该key ;使用map.containsKey();
流程:
- 将Map集合的全部键放到一个Set集合中
- 遍历Set集合,得到每一个键
- 根据键去找值
- 键值对方法遍历 entrySet
需要用到 entrySet()方法 获取所有“键值对”的集合
流程:把Map集合转换成Set集合,里面的元素类型都是键值对类型( Map.Entry<String,Integer> )
使用Lambda表达式

keys() && values()
并发修改异常问题
遍历集合的同时又存在增删集合元素的行为时 , 会导致可能出现业务异常
增强for循环和Lambda方法只能遍历元素,不适合 同时做 遍历增删 操作。
解决方法:
当集合有索引时,可以使用普通for循环倒着遍历去删除元素
当集合没有索引时,使用迭代器对象去删除元素
1 | |
hash表原理

int index = (arr.length - 1) @ 哈希值
Collections 工具类
一个用来操作集合的工具类
