目录
1.Map和Set在Java集合框架中的位置
Java
集合框架
Java Collection Framework
,又被称为容器
container
,是定义在
java.util
包下的一组接口
interfaces和其实现类
classes 。
类和接口总览图如下,Set继承自collection,Map没有继承自collection。
2.Map接口
2.1关于Map
Map
是一个接口类,该类没有继承自
Collection
,该类中存储的是
<K,V>
结构的键值对,并且
K
一定是唯一的,不能重复
。
2.2关于Map.Entry<K,V>
Map.Entry<K, V> 是
Map
内部实现的用来存放
<key, value>
键值对映射关系的内部类
,该内部类中主要提供了<key, value>
的获取,value的设置以及Key的比较方式。
方法 | 解释 |
K getKey() | 返回 entry 中的 key |
V getValue() | 返回 entry 中的 value |
V setValue(V value) | 将键值对中的value替换为指定value |
2.3Map的常用方法说明
方法 | 解释 |
V
get
(Object key)
|
返回
key
对应的
value
|
V
getOrDefault
(Object key, V defaultValue)
|
返回
key
对应的
value
,
key
不存在,返回默认值
|
V
put
(K key, V value)
|
设置
key
对应的
value
|
V
remove
(Object key)
| 删除 key 对应的映射关系 |
boolean
containsKey
(Object key)
|
判断是否包含
key
|
boolean
containsValue
(Object value)
|
判断是否包含value
|
注意:
1.
Map
是一个接口,不能直接实例化对象
,如果
要实例化对象只能实例化其实现类
TreeMap
或者
HashMap
2.
Map
中存放键值对的
Key
是唯一的,
value
是可以重复的
3.
在
TreeMap
中插入键值对时,
key
不能为空,否则就会抛
NullPointerException
异常
,
value
可以为空。但是
HashMap
的
key
和
value
都可以为空。
4.
Map
中的
Key
可以全部分离出来,存储到
Set
中
来进行访问
(
因为
Key
不能重复
)
。
5.
Map
中的
value
可以全部分离出来,存储在
Collection
的任何一个子集合中
(value
可能有重复
)
。
6. Map
中键值对的
Key
不能直接修改,
value
可以修改,如果要修改
key
,只能先将该
key
删除掉,然后再来进行重新插入。
2.4 HashMap的使用案例
2.4.1添加
使用mao.put()添加元素。
public class MapUsage {
public static void main(String[] args) {
Map<String,String>map=new HashMap<>();
//增加 put
map.put("白柳","黑桃");
map.put("谢怜","花城");
map.put("江添","盛望");
//添加顺序和保存顺序无关
System.out.println("增添了三组<k,v>:");
System.out.println(map);
//put的两个用法:添加+更新,若k不存在,将新的键值对加入,若k存在,则更新对应v
System.out.println("若k不存在,将新的键值对加入:");
map.put("白六","红桃");
System.out.println(map);
map.put("白六","无");
System.out.println("若k存在,则更新对应v:");
System.out.println(map);
}
}
2.4.2查询
使用map.get()和map.getOrDefault()进行查询。
//查询
//根据k返回v
System.out.println("查询key=白柳时的value:");
System.out.println(map.get("白柳"));
//根据k查询v,若查不到,返回默认值
System.out.println("根据k查询v,若查不到,返回默认值:");
System.out.println(map.getOrDefault("小女巫","修女"));
2.4.3遍历
由于Map没有继承自Collection,所以需要将Map先转为Set,才能进行遍历。
使用entry.getKey()和entry.getValue()获取key集合,value集合。
//遍历 先转为set类才能遍历
Set<Map.Entry<String,String>>set=map.entrySet();
for(Map.Entry<String,String>entry:set){
System.out.println(entry.getKey()+"->"+entry.getValue());
}
3.Set接口
3.1关于Set
Set
与
Map
主要的不同有两点:
Set
是继承自
Collection
的接口类,
Set
中只存储了
Key
。
Set是保存单个不重复元素的集合!
3.2常见方法说明
方法
| 解释 |
boolean add(E e) |
添加元素,但重复元素不会被添加成功
|
boolean
contains
(Object o)
|
判断
o
是否在集合中
|
注意:
1. Set
是继承自
Collection
的一个接口类
2. Set
中只存储了
key
,并且要求
key
一定要唯一
3. TreeSet
的底层是使用
Map
来实现的,其使用
key
与
Object
的一个默认对象作为键值对插入到
Map
中的
4. Set
最大的功能就是对集合中的元素进行去重
5.
实现
Set
接口的常用类有
TreeSet
和
HashSet
,还有一个
LinkedHashSet
,
LinkedHashSet
是在
HashSet
的基础
上维护了一个双向链表来记录元素的插入次序。
6. Set
中的
Key
不能修改,如果要修改,先将原来的删除掉,然后再重新插入
7. TreeSet
中不能插入
null
的
key
,
HashSet
可以。
3.3LinkedHashSet的使用案例
3.3.1添加
使用set.add()添加元素。(重复元素不会添加)
public static void main(String[] args) {
Set<Integer>set=new HashSet<>();
set.add(1);
set.add(2);
set.add(3);
System.out.println(set.add(3));
System.out.println(set);
}
3.3.2判断是否包含某个元素
使用map.contains()判断。
public static void main(String[] args) {
Set<Integer>set=new HashSet<>();
set.add(1);
set.add(2);
set.add(3);
System.out.println(set.add(3));
System.out.println(set);
System.out.println(set.contains(1));
System.out.println(set.contains(5));
}