Day15
----------------------------------------------------------------------------------
今天内容:
(1)Set集合
(2)Map集合
1.Set集合(重点、相对来说用的较少)
1.1 基本概念
java.util.Set接口是Collection接口的子接口,与List接口是平级关系。
该接口与List接口相比元素没有先后放入次序,并且不允许重复,因此用于去重处理。 该接口的主要实现类:HashSet类 和 TreeSet类。
其中HashSet类的底层是采用哈希表进行数据管理的。
其中TreeSet类的底层是采用二叉树进行数据管理的。
1.2 常用的方法
参考Collection集合的方法即可;
Iterator<E> iterator()- 用于获取当前集合的迭代器对象,用于迭代/访问/遍历所有元素
其中Iterator是一个接口类型,具体常用方法如下:
boolean hasNext() - 用于判断集合中是否拥有可以访问的元素。
E next() - 用于获取一个元素并指向下一个位置。
void remove() - 用于删除迭代器调用next()方法返回的最后一个元素。
注意:
当使用迭代器访问集合中的所有元素时,不允许使用集合的remove()方法进行元素的删除操作,否则会引发ConcurrentModificationException并发修改异常,应该使用迭代器自己的remove()方法处理。
1.3 增强版的for循环(for each结构 推荐使用)
(1)语法格式
for(元素类型 变量名 : 集合/数组的名称){
循环体;
}
(2)执行流程
不断地从集合/数组中取出元素赋值给变量名后执行循环体,直到取出所有元素循环结束。
总结:
对于Set集合来说,访问所有元素的方式有3种:toString()、迭代器、增强版for循环
对于List集合来说,访问所有元素的方式有4种:
toString()、迭代器、增强版for循环、get()方法。
1.4 元素放入HashSet的原理分析(尽量理解)
(1)使用元素调用hashCode()方法得到该元素的哈希码值;
(2)将哈希码值交给哈希算法算出该元素在哈希表中的索引位置;
(3)若该位置没有元素,则直接将新元素放入该位置;
(4)若该位置有元素,则需要使用新元素调用equals()方法与已有元素依次比较;
(5)若相等,则放弃新元素的插入操作保留旧元素;
(6)若不相等,则将新元素放入已有元素的后面;
思考:
为什么重写equals()方法后需要重写hashCode()方法呢?
解析:
为了确保equals()相等的两个元素生成的索引位置相同。
1.5 TreeSet类
(1)什么是二叉树?
二叉树主要指每个节点最多只有两个子节点的树形结构。
(2)什么是有序二叉树?
满足以下三个条件的二叉树叫做有序二叉树。
a.要求左子树中的所有节点元素值都要小于根节点元素值;
b.要求右子树中的所有节点元素值都要大于根节点元素值;
c.要求左子树和右子树的内部也要遵循上述规则;
(3)元素放入TreeSet的原理分析
由于TreeSet类的底层是采用有序二叉树管理的,因此放入元素时需要指定元素之间比较大小的规则来确定新元素的位置,具体指定规则方式如下:
a.使用自然排序指定规则,让元素类型实现java.lang.Comparable接口并重写抽象方法;
b.使用比较器指定规则,构造TreeSet对象时传入java.util.Comparator接口并重写抽象方法
注意:
自然排序只能按照一种规则排序,而比较器可以进行多元化排序,当构造TreeSet对象时没有指定比较器,则默认采用自然排序规则,若指定比较器,则优先使用比较器的规则。
扩展:
java.util.Arrays类中提供了大量操作数组元素的工具方法。
java.util.Collections类中提供了大量操作集合中元素的工具方法。
2.Map集合(重点)
2.1 基本概念
java.util.Map<K,V>接口主要指用于存放基本单位为单对元素的容器,具体类型参数如下:
K - 此映射所维护的键(Key)的类型
V - 映射值(Value)的类型
该集合中不能包含重复的键,每个键最多只能映射一个值。
该集合的主要实现类有:HashMap类 和 TreeMap类。
2.2 常用的方法
V put(K key, V value) - 用于将参数指定的key和value组成一对放入集合中。
- 若实现增加的功能则返回null;若实现修改的功能则返回key原来对应的value。
boolean containsKey(Object key) - 用于判断当前集合是否包含参数指定的key。
boolean containsValue(Object value) - 用于判断当前集合是否包含参数指定的value。
V get(Object key) - 根据参数指定的key来返回对应value,若key不存在则返回null。
V remove(Object key) - 根据参数指定的key来删除元素,返回key对应的value。
Set<Map.Entry<K,V>> entrySet() - 用于将Map集合转换为Set集合。
其中Entry<K,V>为Map接口的内部接口,该接口类型变量用于描述一组键值对,常用方法如下
K getKey() - 用于获取当前键值对中的key并返回。
V getValue() - 用于获取当前键值对中的value并返回。
Set<K> keySet() - 用于将Map集合中的所有Key转换为Set集合。
作业:
1.准备一个List集合依次放入数据10、20、30、40、50,然后采用四种方式遍历。
2.查询和尝试使用Map集合中的方法。