集合
-
集合:用来存放一组数据的数据结构
-
数组的缺点
1. 长度固定 2. 执行一些数据操作时,比较繁琐,如:插入数据,删除前面的数据
-
集合提供方便的数据操作方法
<> 泛型
限制集合中存放的数据类型
不支持基本类型,要使用包装类型
例如:List<Object> list = new List<>;
集合继承结构
集合有很多接口:
Collection 接口
|- List 接口
|- ArrayList
|- LinkedList
|- Set 接口
|- HashSet
|- TreeSet
Map 接口
|- HashMap
|- TreeMap
Iterator 接口
Collections 工具类
LinkedList
LinkedList<O> list = new LinkedList<>();
O指定存放数据类型
特点
- 双向链表
- 相邻节点相互引用
- 首尾节点相互引用
- 两端效率高
方法 - add(data); 在末尾添加数据
- get(index); 获取指定位置数据
双向链表效率低,每次访问下标都从头开始 - remove(index); 移除指定位置数据
- remove(data); 移除第一个相等数据
- size(); 数据数量
- addFirst();
- addLast();
- getFirst();
- getLast();
- removeFirst();
- removeLast();
Interator
Interator iter = list.interator();
- interator(); 辅助创建迭代器对象,来对当前集合进行遍历,效率高
- 使用集合的 iterator() 方法创建的迭代器对象,都是接口的子类型对象
- 在使用迭代器遍历时,不能使用集合的方法来移除数据(list.remove()),只能用迭代器自己的方法来移除数据(iter.remove());
- 方法:
- iter.next();访问数据
- iter.hasNext();判断是否还有下一个数据
- iter.remove();移除数据
ArrayList
ArrayList<O> list = new ArrayList<>();
O指定存放数据类型
**特点: **
- ArrayList 内部封装一个数组
- 用数组存放数据
- 默认初始容量是 10
- 放满后,会新建1.5 倍长度的新数组
- 访问任意位置效率高
- 增删数据,效率可能低
**创建对象: ** - new ArrayList();默认长度为10
- new ArrayList(number);手动设置内部数组容量
**方法: ** - add(data); 在末尾添加数据
- get(index); 获取指定位置数据
- remove(index); 移除指定位置数据
- remove(data); 移除第一个相等数据
- size(); 数据数量
- 没有两端操作数据的方法
HashMap
HashMap<K,V> map = new HashMap<>();
M指定键的类型,V指定值的类型
特点:
- 哈希表,散列表
- 存放键值对数据
- 作用:用键,快速查找数据
- 键:不重复,无序
方法:
- put(key,value); 设置键值对,设置已有的键值时会覆盖原来的值
- get(key); 获取键对应的值,键不存在返回null
- size();数据数量
- remove(key);移除该键,返回移除键的值
- keySet();获得所有的键,创建成一个Set类型集合
哈希算法
哈希模型:
- 有若干哈希桶,每个桶有一个哈希值
- 放入的数据,先获得数据的哈希值,放入对应的哈希桶
- 相同哈希值的数据,会被放入同一个哈希桶
HashMap 内部算法
用数组存放数据,初始长度16
存放数据的过程:
- 先获得键的哈希值,key.hashCode();
- 用哈希值来计算一个下标值 index
- 将键和值,封装成一个 Entry 对象
- Entry 对象,放入index位置
- 空位置,直接放入
- 有数据,依次用 equals()比较键是否相等
- 找到相等的,覆盖值
- 没有相等的,链表连在一起
- 负载率、加载因子到0.75
- 新建容量翻倍的新数组
- 所有数据,重新哈希,放入数组
- jdk1.8
- 链表产长度到8,转成红黑树,
- 红黑树数据数量减少到6,转回成链表
hashCode()
Set 接口
| - HashSet
- 内部使用 HashMap 的键,存放数据
- 不重复
- 无序
- 方法
- add(数据);
- remove(数据);
- size();
- iterator();
Collections 工具类
以下几个方法都不支持HashMap,只支持List
- Collections.addAll(集合,值1,值2,值3···); 对集合一次性添加多个数据
- sort(List); 对集合进行排序
- sort(List,比较器);
- binarySearch(List,目标值); 对集合数据进行二分法查找(集合必须有序)
- binarySearch(List,目标值,比较强);
- swap(List,i,j); 对集合进行数据交换
比较器
new Comparator<Integer>(){
重写比较器的方法
}
for - each 循环格式
- for - each 循环,是对数组遍历访问、集合迭代遍历访问的语法简化
- 数组迭代:
for(int i=0;i<array.length;i++){ String s = array[i]; //处理s System.out.println(s); } //for - each 语法简化 for(String s : array){ //处理s System.out.println(s); }
- 集合迭代
for(Iterator<String> it = list.iterator(); it.hasNext();){ String s = it.next(); //处理s } //for - each简化语法 for(String s : list){ //处理s }